Browse Source

Make lock options mutually exclusive

Hari 7 years ago
parent
commit
a98905a9a3

+ 6 - 3
src/main/java/com/owncloud/android/authentication/PassCodeManager.java

@@ -114,8 +114,10 @@ public class PassCodeManager {
     }
 
     private boolean passCodeIsEnabled() {
-        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
-        return (appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false));
+        SharedPreferences appPrefs = PreferenceManager
+                .getDefaultSharedPreferences(MainApp.getAppContext());
+        return (appPrefs.getString(Preferences.PREFERENCE_LOCK, "")
+                .equals(Preferences.LOCK_PASSCODE));
     }
 
     private boolean deviceCredentialsShouldBeRequested() {
@@ -138,6 +140,7 @@ public class PassCodeManager {
     private boolean deviceCredentialsAreEnabled() {
         SharedPreferences appPrefs = PreferenceManager
                 .getDefaultSharedPreferences(MainApp.getAppContext());
-        return appPrefs.getBoolean(Preferences.PREFERENCE_USE_DEVICE_CREDENTIALS, false);
+        return (appPrefs.getString(Preferences.PREFERENCE_LOCK, "")
+                .equals(Preferences.LOCK_DEVICE_CREDENTIALS));
     }
 }

+ 4 - 2
src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java

@@ -94,7 +94,9 @@ public class ManageSpaceActivity extends AppCompatActivity {
             SharedPreferences appPrefs = PreferenceManager
                     .getDefaultSharedPreferences(getApplicationContext());
 
-            boolean passCodeEnable = appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
+            String lockPref = appPrefs.getString(Preferences.PREFERENCE_LOCK, Preferences.LOCK_NONE);
+            boolean passCodeEnable = appPrefs.getString(Preferences.PREFERENCE_LOCK, "")
+                    .equals(Preferences.LOCK_PASSCODE);
 
             String passCodeDigits[] = new String[4];
             if (passCodeEnable) {
@@ -122,7 +124,7 @@ public class ManageSpaceActivity extends AppCompatActivity {
                 appPrefsEditor.putString(PassCodeActivity.PREFERENCE_PASSCODE_D4, passCodeDigits[3]);
             }
 
-            appPrefsEditor.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, passCodeEnable);
+            appPrefsEditor.putString(Preferences.PREFERENCE_LOCK, lockPref);
             result = result && appPrefsEditor.commit();
 
             return result;

+ 0 - 3
src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java

@@ -56,9 +56,6 @@ public class PassCodeActivity extends AppCompatActivity {
     public final static String KEY_PASSCODE  = "KEY_PASSCODE";
     public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT";
 
-    // NOTE: PREFERENCE_SET_PASSCODE must have the same value as preferences.xml-->android:key for passcode preference
-    public final static String PREFERENCE_SET_PASSCODE = "set_pincode";
-
     public final static String PREFERENCE_PASSCODE_D = "PrefPinCode";
     public final static String PREFERENCE_PASSCODE_D1 = "PrefPinCode1";
     public final static String PREFERENCE_PASSCODE_D2 = "PrefPinCode2";

+ 93 - 75
src/main/java/com/owncloud/android/ui/activity/Preferences.java

@@ -76,6 +76,7 @@ import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.ThemeUtils;
 
 import java.io.IOException;
+import java.util.ArrayList;
 
 /**
  * An Activity that allows the user to change the application's settings.
@@ -87,7 +88,11 @@ public class Preferences extends PreferenceActivity
 
     private static final String TAG = Preferences.class.getSimpleName();
 
-    public final static String PREFERENCE_USE_DEVICE_CREDENTIALS= "use_device_credentials";
+    public static final String PREFERENCE_LOCK= "lock";
+
+    public static final String LOCK_NONE = "none";
+    public static final String LOCK_PASSCODE = "passcode";
+    public static final String LOCK_DEVICE_CREDENTIALS = "device_credentials";
 
     public static final String PREFERENCE_EXPERT_MODE = "expert_mode";
 
@@ -106,13 +111,14 @@ public class Preferences extends PreferenceActivity
      */
     private Uri mUri;
 
-    private SwitchPreference pCode;
+    private ListPreference mLock;
     private SwitchPreference mShowHiddenFiles;
     private SwitchPreference mExpertMode;
     private AppCompatDelegate mDelegate;
 
     private ListPreference mPrefStoragePath;
     private String mStoragePath;
+    private String pendingLock;
 
     public static class PreferenceKeys {
         public static final String STORAGE_PATH = "storage_path";
@@ -509,9 +515,7 @@ public class Preferences extends PreferenceActivity
         boolean fShowHiddenFilesEnabled = getResources().getBoolean(R.bool.show_hidden_files_enabled);
         boolean fSyncedFolderLightEnabled = getResources().getBoolean(R.bool.syncedFolder_light);
 
-        setupPasscodePreference(preferenceCategoryDetails, fPassCodeEnabled);
-
-        setupDeviceCredentialsPreference(preferenceCategoryDetails, fDeviceCredentialsEnabled);
+        setupLockPreference(preferenceCategoryDetails, fPassCodeEnabled, fDeviceCredentialsEnabled);
 
         setupHiddenFilesPreference(preferenceCategoryDetails, fShowHiddenFilesEnabled);
 
@@ -574,64 +578,56 @@ public class Preferences extends PreferenceActivity
         }
     }
 
-    private void setupDeviceCredentialsPreference(PreferenceCategory preferenceCategoryDetails,
-                                                  boolean deviceCredentialsEnabled) {
-        SwitchPreference useDeviceCredentials = (SwitchPreference) findPreference(PREFERENCE_USE_DEVICE_CREDENTIALS);
-
-        final Activity activity = this;
-
-        if (useDeviceCredentials != null && deviceCredentialsEnabled && Build.VERSION.SDK_INT >=
-                Build.VERSION_CODES.M) {
-            useDeviceCredentials.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+    private void setupLockPreference(PreferenceCategory preferenceCategoryDetails,
+                                     boolean passCodeEnabled,
+                                     boolean deviceCredentialsEnabled) {
+        mLock = (ListPreference) findPreference(PREFERENCE_LOCK);
+        if (mLock != null && (passCodeEnabled || deviceCredentialsEnabled)) {
+            ArrayList<String> lockEntries = new ArrayList<>(3);
+            lockEntries.add(getString(R.string.prefs_lock_none));
+            lockEntries.add(getString(R.string.prefs_lock_using_passcode));
+            lockEntries.add(getString(R.string.prefs_lock_using_device_credentials));
+
+            ArrayList<String> lockValues = new ArrayList<>(3);
+            lockValues.add(LOCK_NONE);
+            lockValues.add(LOCK_PASSCODE);
+            lockValues.add(LOCK_DEVICE_CREDENTIALS);
+
+            if (!passCodeEnabled) {
+                lockEntries.remove(1);
+                lockValues.remove(1);
+            } else if (!deviceCredentialsEnabled || Build.VERSION.SDK_INT <
+                    Build.VERSION_CODES.M) {
+                lockEntries.remove(2);
+                lockValues.remove(2);
+            }
+            String[] lockEntriesArr = new String[lockEntries.size()];
+            lockEntriesArr = lockEntries.toArray(lockEntriesArr);
+            String[] lockValuesArr = new String[lockValues.size()];
+            lockValuesArr = lockValues.toArray(lockValuesArr);
+
+            mLock.setEntries(lockEntriesArr);
+            mLock.setEntryValues(lockValuesArr);
+            mLock.setSummary(mLock.getEntry());
+            mLock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                 @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    Boolean incoming = (Boolean) newValue;
-                    if (incoming) {
-                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
-                                !DeviceCredentialUtils.areCredentialsAvailable(getApplicationContext())) {
-                            DisplayUtils
-                                    .showSnackMessage(activity, R.string.prefs_device_credentials_not_setup);
-                            return false;
+                public boolean onPreferenceChange(Preference preference, Object o) {
+                    pendingLock = LOCK_NONE;
+                    String oldValue = ((ListPreference) preference).getValue();
+                    String newValue = (String) o;
+                    if (!oldValue.equals(newValue)) {
+                        if (oldValue.equals(LOCK_NONE)) {
+                            enableLock(newValue);
+                        } else {
+                            pendingLock = newValue;
+                            disableLock(oldValue);
                         }
-                        SharedPreferences appPrefs = PreferenceManager
-                                .getDefaultSharedPreferences(getApplicationContext());
-                        appPrefs.edit().putBoolean(PREFERENCE_USE_DEVICE_CREDENTIALS, true).apply();
-                        return true;
-                    } else {
-                        Intent i = new Intent(getApplicationContext(), RequestCredentialsActivity.class);
-                        startActivityForResult(i, ACTION_CONFIRM_DEVICE_CREDENTIALS);
-                        return false;
                     }
-                }
-            });
-        } else {
-            preferenceCategoryDetails.removePreference(useDeviceCredentials);
-        }
-    }
-
-    private void setupPasscodePreference(PreferenceCategory preferenceCategoryDetails, boolean fPassCodeEnabled) {
-        pCode = (SwitchPreference) findPreference(PassCodeActivity.PREFERENCE_SET_PASSCODE);
-        if (pCode != null && fPassCodeEnabled) {
-            pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
-                    Boolean incoming = (Boolean) newValue;
-
-                    i.setAction(
-                            incoming ? PassCodeActivity.ACTION_REQUEST_WITH_RESULT :
-                                    PassCodeActivity.ACTION_CHECK_WITH_RESULT
-                    );
-
-                    startActivityForResult(i, incoming ? ACTION_REQUEST_PASSCODE :
-                            ACTION_CONFIRM_PASSCODE);
-
-                    // Don't update just yet, we will decide on it in onActivityResult
                     return false;
                 }
             });
         } else {
-            preferenceCategoryDetails.removePreference(pCode);
+            preferenceCategoryDetails.removePreference(mLock);
         }
     }
 
@@ -683,6 +679,35 @@ public class Preferences extends PreferenceActivity
         }
     }
 
+    private void enableLock(String lock) {
+        pendingLock = LOCK_NONE;
+        if (lock.equals(LOCK_PASSCODE)) {
+            Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
+            i.setAction(PassCodeActivity.ACTION_REQUEST_WITH_RESULT);
+            startActivityForResult(i, ACTION_REQUEST_PASSCODE);
+        } else if (lock.equals(LOCK_DEVICE_CREDENTIALS)){
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
+                    !DeviceCredentialUtils.areCredentialsAvailable(getApplicationContext())) {
+                DisplayUtils.showSnackMessage(this, R.string.prefs_lock_device_credentials_not_setup);
+            } else {
+                DisplayUtils.showSnackMessage(this, R.string.prefs_lock_device_credentials_enabled);
+                mLock.setValue(LOCK_DEVICE_CREDENTIALS);
+                mLock.setSummary(mLock.getEntry());
+            }
+        }
+    }
+
+    private void disableLock(String lock) {
+        if (lock.equals(LOCK_PASSCODE)) {
+            Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
+            i.setAction(PassCodeActivity.ACTION_CHECK_WITH_RESULT);
+            startActivityForResult(i, ACTION_CONFIRM_PASSCODE);
+        } else if (lock.equals(LOCK_DEVICE_CREDENTIALS)) {
+            Intent i = new Intent(getApplicationContext(), RequestCredentialsActivity.class);
+            startActivityForResult(i, ACTION_CONFIRM_DEVICE_CREDENTIALS);
+        }
+    }
+
     private void setupGeneralCategory(int accentColor) {
         PreferenceCategory preferenceCategoryGeneral = (PreferenceCategory) findPreference("general");
         preferenceCategoryGeneral.setTitle(ThemeUtils.getColoredTitle(getString(R.string.prefs_category_general),
@@ -816,14 +841,7 @@ public class Preferences extends PreferenceActivity
         t.start();
     }
 
-    @Override
-    protected void onResume() {
-        super.onResume();
 
-        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
-        boolean state = appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
-        pCode.setChecked(state);
-    }
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
@@ -844,32 +862,32 @@ public class Preferences extends PreferenceActivity
                 for (int i = 1; i <= 4; ++i) {
                     appPrefs.putString(PassCodeActivity.PREFERENCE_PASSCODE_D + i, passcode.substring(i - 1, i));
                 }
-                appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, true);
                 appPrefs.apply();
+                mLock.setValue(LOCK_PASSCODE);
+                mLock.setSummary(mLock.getEntry());
                 DisplayUtils.showSnackMessage(this, R.string.pass_code_stored);
             }
         } else if (requestCode == ACTION_CONFIRM_PASSCODE && resultCode == RESULT_OK) {
             if (data.getBooleanExtra(PassCodeActivity.KEY_CHECK_RESULT, false)) {
-
-                SharedPreferences.Editor appPrefs = PreferenceManager
-                        .getDefaultSharedPreferences(getApplicationContext()).edit();
-                appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
-                appPrefs.apply();
+                mLock.setValue(LOCK_NONE);
+                mLock.setSummary(mLock.getEntry());
 
                 DisplayUtils.showSnackMessage(this, R.string.pass_code_removed);
+                if (!pendingLock.equals(LOCK_NONE)) {
+                    enableLock(pendingLock);
+                }
             }
         } else if (requestCode == ACTION_REQUEST_CODE_DAVDROID_SETUP && resultCode == RESULT_OK) {
             DisplayUtils.showSnackMessage(this, R.string.prefs_calendar_contacts_sync_setup_successful);
         } else if (requestCode == ACTION_CONFIRM_DEVICE_CREDENTIALS && resultCode == RESULT_OK &&
             Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
             data.getBooleanExtra(RequestCredentialsActivity.KEY_CHECK_RESULT, false)) {
-            SharedPreferences.Editor appPrefs = PreferenceManager
-                    .getDefaultSharedPreferences(getApplicationContext()).edit();
-            appPrefs.putBoolean(PREFERENCE_USE_DEVICE_CREDENTIALS, false).apply();
-            SwitchPreference useDeviceCredentials = (SwitchPreference)
-                    findPreference(PREFERENCE_USE_DEVICE_CREDENTIALS);
-            useDeviceCredentials.setChecked(false);
+            mLock.setValue(LOCK_NONE);
+            mLock.setSummary(mLock.getEntry());
             DisplayUtils.showSnackMessage(this, R.string.credentials_disabled);
+            if (!pendingLock.equals(LOCK_NONE)) {
+                enableLock(pendingLock);
+            }
         }
     }
 

+ 1 - 1
src/main/java/com/owncloud/android/ui/activity/RequestCredentialsActivity.java

@@ -68,7 +68,7 @@ public class RequestCredentialsActivity extends Activity {
             DeviceCredentialUtils.createKey(getApplicationContext());
             requestCredentials();
         } else {
-            DisplayUtils.showSnackMessage(this, R.string.prefs_device_credentials_not_setup);
+            DisplayUtils.showSnackMessage(this, R.string.prefs_lock_device_credentials_not_setup);
             finishWithResult(true);
         }
     }

+ 7 - 3
src/main/res/values/strings.xml

@@ -39,9 +39,13 @@
     <string name="prefs_category_general">General</string>
     <string name="prefs_category_more">More</string>
     <string name="prefs_manage_accounts">Manage accounts</string>
-    <string name="prefs_passcode">Passcode lock</string>
-    <string name="prefs_use_device_credentials">Lock using device credentials</string>
-    <string name="prefs_device_credentials_not_setup">No device credentials have been set up.</string>
+    <string name="prefs_lock">Lock</string>
+    <string name="prefs_lock_title">Lock using</string>
+    <string name="prefs_lock_none">None</string>
+    <string name="prefs_lock_using_passcode">Passcode</string>
+    <string name="prefs_lock_using_device_credentials">Device credentials</string>
+    <string name="prefs_lock_device_credentials_enabled">Device credentials enabled</string>
+    <string name="prefs_lock_device_credentials_not_setup">No device credentials have been set up.</string>
     <string name="prefs_expert_mode">Expert mode</string>
     <string name="prefs_show_hidden_files">Show hidden files</string>
     <string name="prefs_log_delete_history_button">Delete history</string>

+ 5 - 6
src/main/res/xml/preferences.xml

@@ -39,12 +39,11 @@
 	</PreferenceCategory>
 
 	<PreferenceCategory android:title="@string/prefs_category_details" android:key="details">
-		<com.owncloud.android.ui.ThemeableSwitchPreference
-			android:title="@string/prefs_passcode"
-			android:key="set_pincode"/>
-		<com.owncloud.android.ui.ThemeableSwitchPreference
-			android:title="@string/prefs_use_device_credentials"
-			android:key="use_device_credentials"/>
+		<ListPreference
+			android:title="@string/prefs_lock"
+			android:key="lock"
+			android:dialogTitle="@string/prefs_lock_title"
+			android:defaultValue="none"/>
 		<com.owncloud.android.ui.ThemeableSwitchPreference
 			android:title="@string/prefs_show_hidden_files"
 			android:key="show_hidden_files"/>