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"