OSDN Git Service

Implement error handling for backup and restore
authorBraden Farmer <farmerbb@gmail.com>
Thu, 5 Mar 2020 05:49:18 +0000 (22:49 -0700)
committerBraden Farmer <farmerbb@gmail.com>
Thu, 5 Mar 2020 05:49:18 +0000 (22:49 -0700)
12 files changed:
app/src/main/java/com/farmerbb/taskbar/activity/ImportSettingsActivity.java
app/src/main/java/com/farmerbb/taskbar/activity/MainActivity.java
app/src/main/java/com/farmerbb/taskbar/fragment/ManageAppDataFragment.java
app/src/main/java/com/farmerbb/taskbar/util/U.java
app/src/main/res/values-de/strings.xml
app/src/main/res/values-ja/strings.xml
app/src/main/res/values-nl/strings.xml
app/src/main/res/values-pl/strings.xml
app/src/main/res/values-ru/strings.xml
app/src/main/res/values-tr/strings.xml
app/src/main/res/values-zh-rCN/strings.xml
app/src/main/res/values/strings.xml

index 1b2455e..4284d10 100644 (file)
@@ -25,6 +25,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 import com.farmerbb.taskbar.BuildConfig;
 import com.farmerbb.taskbar.R;
+import com.farmerbb.taskbar.util.U;
 
 public class ImportSettingsActivity extends Activity {
 
@@ -33,12 +34,7 @@ public class ImportSettingsActivity extends Activity {
     private BroadcastReceiver settingsReceivedReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            Intent restartIntent = new Intent(ImportSettingsActivity.this, MainActivity.class);
-            restartIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
-            startActivity(restartIntent);
-            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
-
-            System.exit(0);
+            U.restartApp(ImportSettingsActivity.this, true);
         }
     };
 
index 6738733..4527bbe 100644 (file)
@@ -222,7 +222,22 @@ public class MainActivity extends AppCompatActivity {
         if(savedInstanceState == null) {
             U.initPrefs(this);
 
-            if(!getIntent().hasExtra("theme_change"))
+            File restoreInProgress = new File(getFilesDir(), "restore_in_progress");
+            File restoreSuccessful = new File(getFilesDir(), "restore_successful");
+
+            if(restoreInProgress.exists() || restoreSuccessful.exists()) {
+                if(restoreInProgress.exists()) {
+                    U.showToastLong(this, R.string.tb_restore_failed);
+                    restoreInProgress.delete();
+                }
+
+                if(restoreSuccessful.exists()) {
+                    U.showToast(this, R.string.tb_restore_successful);
+                    restoreSuccessful.delete();
+                }
+
+                getFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new ManageAppDataFragment(), "ManageAppDataFragment").commit();
+            } else if(!getIntent().hasExtra("theme_change"))
                 getFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new AboutFragment(), "AboutFragment").commit();
             else
                 getFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new AppearanceFragment(), "AppearanceFragment").commit();
index 4c9489f..6b0ae1c 100644 (file)
@@ -28,11 +28,10 @@ import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
 
 import com.farmerbb.taskbar.R;
-import com.farmerbb.taskbar.activity.MainActivity;
 import com.farmerbb.taskbar.backup.BackupUtils;
 import com.farmerbb.taskbar.backup.JSONBackupAgent;
+import com.farmerbb.taskbar.util.U;
 
-import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.io.BufferedInputStream;
@@ -40,7 +39,6 @@ import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.text.SimpleDateFormat;
@@ -92,24 +90,24 @@ public class ManageAppDataFragment extends SettingsFragment {
             case "backup_settings":
                 Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
                 intent.addCategory(Intent.CATEGORY_OPENABLE);
-                intent.setType("*/*");
+                intent.setType("application/octet-stream");
                 intent.putExtra(Intent.EXTRA_TITLE, "Taskbar-" + dateFormat.format(new Date()) + ".bak");
 
                 try {
                     startActivityForResult(intent, EXPORT);
                 } catch (ActivityNotFoundException e) {
-                    // TODO
+                    U.showToastLong(getActivity(), R.string.tb_backup_restore_not_available);
                 }
                 break;
             case "restore_settings":
                 Intent intent2 = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                 intent2.addCategory(Intent.CATEGORY_OPENABLE);
-                intent2.setType("*/*");
+                intent2.setType("application/octet-stream");
 
                 try {
                     startActivityForResult(intent2, IMPORT);
                 } catch (ActivityNotFoundException e) {
-                    // TODO
+                    U.showToastLong(getActivity(), R.string.tb_backup_restore_not_available);
                 }
                 break;
         }
@@ -119,21 +117,14 @@ public class ManageAppDataFragment extends SettingsFragment {
 
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
-        if(resultCode != Activity.RESULT_OK || resultData == null) return;
+        if(resultCode != Activity.RESULT_OK || resultData == null)
+            return;
 
         if(requestCode == EXPORT)
             exportData(resultData.getData());
 
-        if(requestCode == IMPORT) {
+        if(requestCode == IMPORT)
             importData(resultData.getData());
-
-            Intent restartIntent = new Intent(getActivity(), MainActivity.class);
-            restartIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
-            startActivity(restartIntent);
-            getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
-
-            System.exit(0);
-        }
     }
 
     private void exportData(Uri uri) {
@@ -168,15 +159,20 @@ public class ManageAppDataFragment extends SettingsFragment {
             }
 
             output.close();
+
+            U.showToast(getActivity(), R.string.tb_backup_successful);
         } catch (Exception e) {
-            // TODO
+            U.showToastLong(getActivity(), R.string.tb_backup_failed);
         }
     }
 
     private void importData(Uri uri) {
         File importedFile = new File(getActivity().getFilesDir(), "temp.zip");
+        File statusFile = new File(getActivity().getFilesDir(), "restore_in_progress");
 
         try {
+            statusFile.createNewFile();
+
             InputStream is = getActivity().getContentResolver().openInputStream(uri);
             byte[] zipData = new byte[is.available()];
 
@@ -192,15 +188,18 @@ public class ManageAppDataFragment extends SettingsFragment {
             ZipEntry backupJsonEntry = zipFile.getEntry("backup.json");
             ZipEntry customImageEntry = zipFile.getEntry("tb_images/custom_image");
 
-            if(backupJsonEntry != null) {
-                byte[] data = new byte[(int) backupJsonEntry.getSize()];
-                InputStream input = zipFile.getInputStream(backupJsonEntry);
-                input.read(data);
-                input.close();
-
-                BackupUtils.restore(getActivity(), new JSONBackupAgent(new JSONObject(new String(data))));
+            if(backupJsonEntry == null) {
+                // Backup file is invalid; fail immediately
+                throw new Exception();
             }
 
+            byte[] data = new byte[(int) backupJsonEntry.getSize()];
+            InputStream input = zipFile.getInputStream(backupJsonEntry);
+            input.read(data);
+            input.close();
+
+            BackupUtils.restore(getActivity(), new JSONBackupAgent(new JSONObject(new String(data))));
+
             File imagesDir = new File(getActivity().getFilesDir(), "tb_images");
             imagesDir.mkdirs();
 
@@ -208,8 +207,8 @@ public class ManageAppDataFragment extends SettingsFragment {
             if(customImage.exists()) customImage.delete();
 
             if(customImageEntry != null) {
-                byte[] data = new byte[(int) customImageEntry.getSize()];
-                InputStream input = zipFile.getInputStream(customImageEntry);
+                data = new byte[(int) customImageEntry.getSize()];
+                input = zipFile.getInputStream(customImageEntry);
                 input.read(data);
                 input.close();
 
@@ -219,10 +218,13 @@ public class ManageAppDataFragment extends SettingsFragment {
                     output.close();
                 }
             }
+
+            statusFile.renameTo(new File(getActivity().getFilesDir(), "restore_successful"));
         } catch (Exception e) {
-            // TODO
+            // no-op
         } finally {
             importedFile.delete();
+            U.restartApp(getActivity(), false);
         }
     }
 }
\ No newline at end of file
index 82f1cd1..a618392 100644 (file)
@@ -19,6 +19,7 @@ import android.Manifest;
 import android.accessibilityservice.AccessibilityService;
 import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
+import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.AlertDialog;
@@ -65,6 +66,7 @@ import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.activity.ContextMenuActivity;
 import com.farmerbb.taskbar.activity.DummyActivity;
 import com.farmerbb.taskbar.activity.InvisibleActivityFreeform;
+import com.farmerbb.taskbar.activity.MainActivity;
 import com.farmerbb.taskbar.activity.TouchAbsorberActivity;
 import com.farmerbb.taskbar.activity.dark.ContextMenuActivityDark;
 import com.farmerbb.taskbar.service.DashboardService;
@@ -1791,4 +1793,17 @@ public class U {
         return getInstalledPackage(context, "com.android.tv.settings") != null
                 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P;
     }
+
+    public static void restartApp(Activity activity, boolean shouldFade) {
+        Intent restartIntent = new Intent(activity, MainActivity.class);
+        restartIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
+        activity.startActivity(restartIntent);
+
+        activity.overridePendingTransition(
+                shouldFade ? android.R.anim.fade_in : 0,
+                shouldFade ? android.R.anim.fade_out : 0
+        );
+
+        System.exit(0);
+    }
 }
index 05f91cb..d567d7e 100644 (file)
     <string name="tb_manage_app_data_description">@string/tb_clear_pinned_apps</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>
index 1f3585f..8b78485 100644 (file)
     <string name="tb_manage_app_data_description">@string/tb_clear_pinned_apps</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>
index b99491c..701b311 100644 (file)
     <string name="tb_manage_app_data_description">@string/tb_clear_pinned_apps</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>
index 8df4abb..553656d 100644 (file)
@@ -413,6 +413,11 @@ W takim przypadku może być konieczne flashowanie niestandardowego ROM-u w celu
     <string name="tb_manage_app_data_description">@string/tb_clear_pinned_apps</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>
index c1bf316..9f5f876 100644 (file)
     <string name="tb_manage_app_data_description">@string/tb_clear_pinned_apps</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>
index 6684182..5d9fe29 100644 (file)
@@ -388,6 +388,11 @@ Bu durumda, bu cihazdaki serbest biçimli modu kullanmak için özel bir ROM fla
     <string name="tb_manage_app_data_description">@string/tb_clear_pinned_apps</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>
index de998a5..e9b4516 100644 (file)
     <string name="tb_manage_app_data_description">@string/tb_clear_pinned_apps</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>
index 28de798..88596d3 100644 (file)
     <string name="tb_manage_app_data_description">Backup and restore settings, or reset per-app preferences</string>
     <string name="tb_backup_settings">Backup settings to file&#8230;</string>
     <string name="tb_restore_settings">Restore settings from file&#8230;</string>
+    <string name="tb_backup_successful">Backup successful</string>
+    <string name="tb_restore_successful">Restore successful</string>
+    <string name="tb_backup_failed">An error occurred when creating backup</string>
+    <string name="tb_restore_failed">An error occurred when restoring backup</string>
+    <string name="tb_backup_restore_not_available">Backup and restore is not available on this device</string>
 
     <string name="tb_new_shortcut">Launch app</string>
     <string name="tb_allow_freeform_mode">Launch app in freeform mode</string>