Skip to content

Commit f1deb49

Browse files
committed
Import/export keys as JSON
1 parent e49b051 commit f1deb49

File tree

3 files changed

+132
-2
lines changed

3 files changed

+132
-2
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
<uses-permission android:name="android.permission.VIBRATE" />
66
<uses-permission android:name="android.permission.INTERNET" />
7+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
78

89
<application
910
android:allowBackup="true"

app/src/main/java/com/adgad/kboard/PrefsActivity.java

Lines changed: 129 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,28 @@
1515
import android.view.MenuItem;
1616
import android.widget.Toast;
1717

18+
import com.google.gson.Gson;
19+
20+
import java.io.FileNotFoundException;
21+
import java.io.IOException;
22+
import java.io.InputStream;
23+
import java.io.InputStreamReader;
24+
import java.io.OutputStream;
25+
import java.io.Reader;
26+
import java.io.UnsupportedEncodingException;
27+
import java.util.ArrayList;
28+
1829
/**
1930
* Created by arjun on 14/03/15.
2031
*/
32+
33+
2134
public class PrefsActivity extends PreferenceActivity {
2235
/**
2336
* Adds intent extras so fragment opens
2437
*/
2538

39+
2640
@Override
2741
protected boolean isValidFragment (String fragmentName) {
2842
return SettingsFragment.class.getName().equals("com.adgad.kboard.PrefsActivity$SettingsFragment");
@@ -72,16 +86,129 @@ public boolean onCreateOptionsMenu(Menu menu) {
7286
public static class SettingsFragment extends PreferenceFragment
7387
implements SharedPreferences.OnSharedPreferenceChangeListener {
7488

89+
private final Gson gson = new Gson();
90+
SharedPreferences prefs = null;
91+
private final int EXPORT_REQUEST_CODE = 1;
92+
private final int IMPORT_REQUEST_CODE = 2;
93+
94+
7595

7696
@Override
7797
public void onCreate(Bundle savedInstanceState) {
7898
super.onCreate(savedInstanceState);
79-
80-
99+
prefs = PreferenceManager.getDefaultSharedPreferences(this.getActivity());
81100
// Load the preferences from an XML resource
82101
addPreferencesFromResource(R.xml.prefs);
83102
initSummary(getPreferenceScreen());
84103

104+
Preference importKeys = (Preference) findPreference("importKeys");
105+
106+
importKeys.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
107+
@Override
108+
public boolean onPreferenceClick(Preference preference) {
109+
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
110+
intent.addCategory(Intent.CATEGORY_OPENABLE);
111+
intent.setType("application/json");
112+
startActivityForResult(intent, IMPORT_REQUEST_CODE);
113+
return true;
114+
}
115+
});
116+
117+
Preference exportKeys = (Preference) findPreference("exportKeys");
118+
119+
exportKeys.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
120+
@Override
121+
public boolean onPreferenceClick(Preference preference) {
122+
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
123+
intent.addCategory(Intent.CATEGORY_OPENABLE);
124+
intent.setType("application/json");
125+
intent.putExtra(Intent.EXTRA_TITLE, "kboard-keys.json");
126+
startActivityForResult(intent, EXPORT_REQUEST_CODE);
127+
return true;
128+
}
129+
130+
});
131+
132+
133+
134+
135+
}
136+
137+
public String isToString(InputStream inputStream) {
138+
final int bufferSize = 1024;
139+
final char[] buffer = new char[bufferSize];
140+
final StringBuilder out = new StringBuilder();
141+
Reader in = null;
142+
try {
143+
in = new InputStreamReader(inputStream, "UTF-8");
144+
} catch (UnsupportedEncodingException e) {
145+
e.printStackTrace();
146+
}
147+
for (; ; ) {
148+
int rsz = 0;
149+
try {
150+
rsz = in.read(buffer, 0, buffer.length);
151+
} catch (IOException e) {
152+
e.printStackTrace();
153+
}
154+
if (rsz < 0)
155+
break;
156+
out.append(buffer, 0, rsz);
157+
}
158+
return out.toString();
159+
}
160+
161+
@Override
162+
public void onActivityResult(int requestCode, int resultCode, Intent data) {
163+
super.onActivityResult(requestCode, resultCode, data);
164+
OutputStream outputStream = null;
165+
InputStream inputStream = null;
166+
if (requestCode == EXPORT_REQUEST_CODE) {
167+
168+
String currentVals = prefs.getString(KboardIME.Keys.STORAGE_KEY, "");
169+
170+
// Note: you may use try-with resources if your API is 19+
171+
try {
172+
// InputStream constructor takes File, String (path), or FileDescriptor
173+
// data.getData() holds the URI of the path selected by the picker
174+
Uri uri = data.getData();
175+
outputStream = this.getActivity().getContentResolver().openOutputStream(uri);
176+
outputStream.write(currentVals.getBytes());
177+
outputStream.close();
178+
Toast.makeText(this.getActivity(), "Exported keys to " + uri.getPath(), Toast.LENGTH_LONG).show();
179+
} catch (FileNotFoundException e) {
180+
e.printStackTrace();
181+
} catch (IOException e) {
182+
e.printStackTrace();
183+
} finally {
184+
try {
185+
outputStream.close();
186+
} catch (IOException e) {
187+
e.printStackTrace();
188+
}
189+
}
190+
} else if (requestCode == IMPORT_REQUEST_CODE) {
191+
try {
192+
inputStream = this.getActivity().getContentResolver().openInputStream(data.getData());
193+
String keys = isToString(inputStream);
194+
ArrayList<String> keysAsJson = gson.fromJson(keys, ArrayList.class);
195+
SharedPreferences.Editor editor = prefs.edit();
196+
editor.putString(KboardIME.Keys.STORAGE_KEY, keys);
197+
editor.apply();
198+
Toast toast = Toast.makeText(this.getActivity(), "Imported " + keysAsJson.size() + " keys!", Toast.LENGTH_SHORT);
199+
toast.show();
200+
} catch (FileNotFoundException e) {
201+
e.printStackTrace();
202+
} catch (IOException e) {
203+
e.printStackTrace();
204+
} finally {
205+
try {
206+
inputStream.close();
207+
} catch (IOException e) {
208+
e.printStackTrace();
209+
}
210+
}
211+
}
85212
}
86213

87214
@Override

app/src/main/res/xml/prefs.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
<Preference android:title="Custom Keys" >
1212
<intent android:action="com.adgad.kboard.CustomKeysActivity"/>
1313
</Preference>
14+
<Preference android:title="Import Keys" android:key="importKeys"/>
15+
<Preference android:title="Export Keys" android:key="exportKeys"/>
1416

1517
<PreferenceCategory
1618
android:title="Options">

0 commit comments

Comments
 (0)