فهرست منبع

Fix #487

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 6 سال پیش
والد
کامیت
d8e6b9f6ef
2فایلهای تغییر یافته به همراه86 افزوده شده و 23 حذف شده
  1. 84 23
      app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java
  2. 2 0
      app/src/main/res/values/strings.xml

+ 84 - 23
app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java

@@ -62,6 +62,7 @@ import com.nextcloud.talk.jobs.AccountRemovalWorker;
 import com.nextcloud.talk.models.RingtoneSettings;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.utils.ApiUtils;
+import com.nextcloud.talk.utils.DisplayUtils;
 import com.nextcloud.talk.utils.DoNotDisturbUtils;
 import com.nextcloud.talk.utils.SecurityUtils;
 import com.nextcloud.talk.utils.bundle.BundleKeys;
@@ -70,6 +71,8 @@ import com.nextcloud.talk.utils.glide.GlideApp;
 import com.nextcloud.talk.utils.preferences.AppPreferences;
 import com.nextcloud.talk.utils.preferences.MagicUserInputModule;
 import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder;
+import com.yarolegovich.lovelydialog.LovelySaveStateHandler;
+import com.yarolegovich.lovelydialog.LovelyStandardDialog;
 import com.yarolegovich.mp.*;
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
@@ -178,6 +181,8 @@ public class SettingsController extends BaseController {
     @Inject
     Context context;
 
+    private LovelySaveStateHandler saveStateHandler;
+
     private UserEntity currentUser;
     private String credentials;
 
@@ -190,6 +195,8 @@ public class SettingsController extends BaseController {
     private Disposable profileQueryDisposable;
     private Disposable dbQueryDisposable;
 
+    private static final int ID_REMOVE_ACCOUNT_WARNING_DIALOG = 0;
+
     @Override
     protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
         return inflater.inflate(R.layout.controller_settings, container, false);
@@ -210,6 +217,10 @@ public class SettingsController extends BaseController {
 
         getCurrentUser();
 
+        if (saveStateHandler == null) {
+            saveStateHandler = new LovelySaveStateHandler();
+        }
+
         appPreferences.registerProxyTypeListener(proxyTypeChangeListener = new ProxyTypeChangeListener());
         appPreferences.registerProxyCredentialsListener(proxyCredentialsChangeListener = new ProxyCredentialsChangeListener());
         appPreferences.registerScreenSecurityListener(screenSecurityChangeListener = new ScreenSecurityChangeListener());
@@ -302,7 +313,6 @@ public class SettingsController extends BaseController {
                     .popChangeHandler(new VerticalChangeHandler()));
         });
 
-
         String host = null;
         int port = -1;
 
@@ -338,6 +348,78 @@ public class SettingsController extends BaseController {
                 ()));
     }
 
+    private void showLovelyDialog(int dialogId, Bundle savedInstanceState) {
+        switch (dialogId) {
+            case ID_REMOVE_ACCOUNT_WARNING_DIALOG:
+                showRemoveAccountWarning(savedInstanceState);
+                break;
+            default:
+                break;
+        }
+    }
+
+    @Override
+    protected void onSaveViewState(@NonNull View view, @NonNull Bundle outState) {
+        saveStateHandler.saveInstanceState(outState);
+        super.onSaveViewState(view, outState);
+    }
+
+    @Override
+    protected void onRestoreViewState(@NonNull View view, @NonNull Bundle savedViewState) {
+        super.onRestoreViewState(view, savedViewState);
+        if (LovelySaveStateHandler.wasDialogOnScreen(savedViewState)) {
+            //Dialog won't be restarted automatically, so we need to call this method.
+            //Each dialog knows how to restore its state
+            showLovelyDialog(LovelySaveStateHandler.getSavedDialogId(savedViewState), savedViewState);
+        }
+    }
+
+    private void showRemoveAccountWarning(Bundle savedInstanceState) {
+        if (getActivity() != null) {
+            new LovelyStandardDialog(getActivity(), LovelyStandardDialog.ButtonLayout.HORIZONTAL)
+                    .setTopColorRes(R.color.nc_darkRed)
+                    .setIcon(DisplayUtils.getTintedDrawable(getResources(),
+                            R.drawable.ic_delete_black_24dp, R.color.white))
+                    .setPositiveButtonColor(context.getResources().getColor(R.color.nc_darkRed))
+                    .setTitle(R.string.nc_settings_remove_account)
+                    .setMessage(R.string.nc_settings_remove_confirmation)
+                    .setPositiveButton(R.string.nc_settings_remove, new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            removeCurrentAccount();
+                        }
+                    })
+                    .setNegativeButton(R.string.nc_cancel, null)
+                    .setInstanceStateHandler(ID_REMOVE_ACCOUNT_WARNING_DIALOG, saveStateHandler)
+                    .setSavedInstanceState(savedInstanceState)
+                    .show();
+        }
+    }
+
+    private void removeCurrentAccount() {
+        boolean otherUserExists = userUtils.scheduleUserForDeletionWithId(currentUser.getId());
+
+        OneTimeWorkRequest accountRemovalWork = new OneTimeWorkRequest.Builder(AccountRemovalWorker.class).build();
+        WorkManager.getInstance().enqueue(accountRemovalWork);
+
+        if (otherUserExists && getView() != null) {
+            onViewBound(getView());
+            onAttach(getView());
+        } else if (!otherUserExists) {
+            if (getParentController() == null || getParentController().getRouter() == null) {
+                if (getActivity() != null) {
+                    // Something went very wrong, finish the app
+                    getActivity().finish();
+                }
+            } else {
+                getParentController().getRouter().setRoot(RouterTransaction.with(
+                        new ServerSelectionController())
+                        .pushChangeHandler(new VerticalChangeHandler())
+                        .popChangeHandler(new VerticalChangeHandler()));
+            }
+        }
+    }
+
     @Override
     protected void onAttach(@NonNull View view) {
         super.onAttach(view);
@@ -495,28 +577,7 @@ public class SettingsController extends BaseController {
 
 
             removeAccountButton.addPreferenceClickListener(view1 -> {
-                boolean otherUserExists = userUtils.scheduleUserForDeletionWithId(currentUser.getId());
-
-                OneTimeWorkRequest accountRemovalWork = new OneTimeWorkRequest.Builder(AccountRemovalWorker.class).build();
-                WorkManager.getInstance().enqueue(accountRemovalWork);
-
-                if (otherUserExists && getView() != null) {
-                    onViewBound(getView());
-                    onAttach(getView());
-                } else if (!otherUserExists) {
-                    if (getParentController() == null || getParentController().getRouter() == null) {
-                        if (getActivity() != null) {
-                            // Something went very wrong, finish the app
-                            getActivity().finish();
-                        }
-                    } else {
-                        getParentController().getRouter().setRoot(RouterTransaction.with(
-                                new ServerSelectionController())
-                                .pushChangeHandler(new VerticalChangeHandler())
-                                .popChangeHandler(new VerticalChangeHandler()));
-                    }
-                }
-
+                showLovelyDialog(ID_REMOVE_ACCOUNT_WARNING_DIALOG, null);
             });
         }
 

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -69,6 +69,8 @@
     <string name="nc_settings_reauthorize">Reauthorize</string>
     <string name="nc_client_cert_setup">Set up client certificate</string>
     <string name="nc_client_cert_change">Change client certificate</string>
+    <string name="nc_settings_remove">Remove</string>
+    <string name="nc_settings_remove_confirmation">Please confirm your intent to remove the current account.</string>
     <string name="nc_settings_remove_account">Remove account</string>
     <string name="nc_settings_add_account">Add a new account</string>
     <string name="nc_settings_wrong_account">Only current account can be reauthorized</string>