diff --git a/app/build.gradle b/app/build.gradle
index e0c2d64..a8ea15f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -39,8 +39,8 @@ android {
minSdkVersion 14
//noinspection OldTargetApi
targetSdkVersion 23
- versionCode 7
- versionName "1.3.0"
+ versionCode 8
+ versionName "1.4.0"
}
buildTypes {
release {
diff --git a/app/src/main/java/akhil/alltrans/AppListFragment.java b/app/src/main/java/akhil/alltrans/AppListFragment.java
index 567ef21..f19b6ec 100644
--- a/app/src/main/java/akhil/alltrans/AppListFragment.java
+++ b/app/src/main/java/akhil/alltrans/AppListFragment.java
@@ -78,6 +78,7 @@ public void onStart() {
super.onStart();
context = this.getActivity();
//noinspection deprecation,deprecation
+ BackupSharedPreferences.backupSharedPreferences(this.getActivity());
settings = this.getActivity().getSharedPreferences("AllTransPref", MODE_WORLD_READABLE);
mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
diff --git a/app/src/main/java/akhil/alltrans/BackupSharedPreferences.java b/app/src/main/java/akhil/alltrans/BackupSharedPreferences.java
new file mode 100644
index 0000000..4729833
--- /dev/null
+++ b/app/src/main/java/akhil/alltrans/BackupSharedPreferences.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017 Akhil Kedia
+ * This file is part of AllTrans.
+ *
+ * AllTrans is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AllTrans is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AllTrans. If not, see .
+ *
+ */
+
+package akhil.alltrans;
+
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Environment;
+import android.widget.Toast;
+
+import java.io.DataOutputStream;
+
+
+public class BackupSharedPreferences {
+ public static void backupSharedPreferences(Context context) {
+ @SuppressLint("SdCardPath")
+ String sharedPath = "/data/data/akhil.alltrans/shared_prefs/";
+ String externalPath = Environment.getExternalStorageDirectory().getAbsolutePath();
+ if (!isExternalStorageWritable()) {
+ return;
+ }
+
+ try {
+ Process su = Runtime.getRuntime().exec("su");
+ DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());
+ utils.debugLog("cp -R" + " " + sharedPath + " " + externalPath + "/AllTransBackup/" + "\n");
+ outputStream.writeBytes("cp -R" + " " + sharedPath + " " + externalPath + "/AllTransBackup/" + "\n");
+ outputStream.writeBytes("exit\n");
+ outputStream.flush();
+ outputStream.close();
+ su.waitFor();
+
+ CharSequence text = context.getString(R.string.backup_pref_success);
+ int duration = Toast.LENGTH_SHORT;
+ Toast toast = Toast.makeText(context, text, duration);
+ toast.show();
+ } catch (Exception e) {
+ CharSequence text = context.getString(R.string.backup_pref_error);
+ int duration = Toast.LENGTH_SHORT;
+ Toast toast = Toast.makeText(context, text, duration);
+ toast.show();
+ }
+ }
+
+ /* Checks if external storage is available for read and write */
+ private static boolean isExternalStorageWritable() {
+ String state = Environment.getExternalStorageState();
+ return Environment.MEDIA_MOUNTED.equals(state);
+ }
+}
diff --git a/app/src/main/java/akhil/alltrans/LocalPreferenceFragment.java b/app/src/main/java/akhil/alltrans/LocalPreferenceFragment.java
index d9d97e6..61bcee0 100644
--- a/app/src/main/java/akhil/alltrans/LocalPreferenceFragment.java
+++ b/app/src/main/java/akhil/alltrans/LocalPreferenceFragment.java
@@ -103,7 +103,14 @@ public boolean onPreferenceClick(Preference preference) {
outputStream.writeBytes("exit\n");
outputStream.flush();
+ outputStream.close();
su.waitFor();
+
+ Context context = preference.getContext();
+ CharSequence text = getString(R.string.clear_cache_success);
+ int duration = Toast.LENGTH_SHORT;
+ Toast toast = Toast.makeText(context, text, duration);
+ toast.show();
} catch (Exception e) {
Context context = preference.getContext();
CharSequence text = getString(R.string.clear_cache_error);
@@ -112,12 +119,6 @@ public boolean onPreferenceClick(Preference preference) {
toast.show();
}
- Context context = preference.getContext();
- CharSequence text = getString(R.string.clear_cache_success);
- int duration = Toast.LENGTH_SHORT;
- Toast toast = Toast.makeText(context, text, duration);
- toast.show();
-
return false;
}
});
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 55de264..c557666 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -25,6 +25,8 @@
"Loading List of Applications - Please Wait"
"Some Error. Could not clear translation cache!"
"Translate Cache for this app has been erased!"
+ "Some Error. Could not backup preferences! Did you grant SuperUser Access?"
+ "Preferences have been backed up to External Storage!"
"Could not load the Per-app preference page. Close and re-open application again."
"App Icon"