Bladeren bron

Implement basics of screen timeout

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 6 jaren geleden
bovenliggende
commit
7f0912299f

+ 5 - 9
app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java

@@ -29,8 +29,10 @@ import android.os.Bundle;
 import android.util.Log;
 import android.view.WindowManager;
 import android.webkit.SslErrorHandler;
-
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AppCompatActivity;
+import autodagger.AutoInjector;
 import com.nextcloud.talk.R;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.events.CertificateEvent;
@@ -38,22 +40,16 @@ import com.nextcloud.talk.utils.SecurityUtils;
 import com.nextcloud.talk.utils.preferences.AppPreferences;
 import com.nextcloud.talk.utils.ssl.MagicTrustManager;
 import com.yarolegovich.lovelydialog.LovelyStandardDialog;
-
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
+import javax.inject.Inject;
 import java.security.cert.CertificateParsingException;
 import java.security.cert.X509Certificate;
 import java.text.DateFormat;
 import java.util.List;
 
-import javax.inject.Inject;
-
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
-import autodagger.AutoInjector;
-
 @AutoInjector(NextcloudTalkApplication.class)
 public class BaseActivity extends AppCompatActivity {
     private static final String TAG = "BaseActivity";
@@ -73,7 +69,7 @@ public class BaseActivity extends AppCompatActivity {
         super.onCreate(savedInstanceState);
         if (appPreferences.getIsScreenLocked()) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                SecurityUtils.createKey();
+                SecurityUtils.createKey(appPreferences.getScreenLockTimeout());
             }
         }
     }

+ 51 - 2
app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java

@@ -63,6 +63,7 @@ import com.nextcloud.talk.models.RingtoneSettings;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.utils.ApiUtils;
 import com.nextcloud.talk.utils.DoNotDisturbUtils;
+import com.nextcloud.talk.utils.SecurityUtils;
 import com.nextcloud.talk.utils.bundle.BundleKeys;
 import com.nextcloud.talk.utils.database.user.UserUtils;
 import com.nextcloud.talk.utils.glide.GlideApp;
@@ -156,6 +157,9 @@ public class SettingsController extends BaseController {
     @BindView(R.id.settings_screen_lock)
     MaterialSwitchPreference screenLockSwitchPreference;
 
+    @BindView(R.id.settings_screen_lock_timeout)
+    MaterialChoicePreference screenLockTimeoutChoicePreference;
+
     @BindView(R.id.message_text)
     TextView messageText;
 
@@ -180,6 +184,8 @@ public class SettingsController extends BaseController {
     private OnPreferenceValueChangedListener<String> proxyTypeChangeListener;
     private OnPreferenceValueChangedListener<Boolean> proxyCredentialsChangeListener;
     private OnPreferenceValueChangedListener<Boolean> screenSecurityChangeListener;
+    private OnPreferenceValueChangedListener<Boolean> screenLockChangeListener;
+    private OnPreferenceValueChangedListener<String> screenLockTimeoutChangeListener;
 
     private Disposable profileQueryDisposable;
     private Disposable dbQueryDisposable;
@@ -207,6 +213,8 @@ public class SettingsController extends BaseController {
         appPreferences.registerProxyTypeListener(proxyTypeChangeListener = new ProxyTypeChangeListener());
         appPreferences.registerProxyCredentialsListener(proxyCredentialsChangeListener = new ProxyCredentialsChangeListener());
         appPreferences.registerScreenSecurityListener(screenSecurityChangeListener = new ScreenSecurityChangeListener());
+        appPreferences.registerScreenLockListener(screenLockChangeListener = new ScreenLockListener());
+        appPreferences.registerScreenLockTimeoutListener(screenLockTimeoutChangeListener = new ScreenLockTimeoutListener());
 
         List<String> listWithIntFields = new ArrayList<>();
         listWithIntFields.add("proxy_port");
@@ -236,6 +244,7 @@ public class SettingsController extends BaseController {
 
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
             screenLockSwitchPreference.setVisibility(View.GONE);
+            screenLockTimeoutChoicePreference.setVisibility(View.GONE);
         } else {
             screenLockSwitchPreference.setSummary(String.format(Locale.getDefault(),
                     getResources().getString(R.string.nc_settings_screen_lock_desc),
@@ -366,13 +375,27 @@ public class SettingsController extends BaseController {
 
             if (keyguardManager.isDeviceSecure()) {
                 screenLockSwitchPreference.setEnabled(true);
+                screenLockTimeoutChoicePreference.setEnabled(true);
                 ((Checkable) screenLockSwitchPreference.findViewById(R.id.mp_checkable)).setChecked(appPreferences.getIsScreenLocked());
+
+                screenLockTimeoutChoicePreference.setEnabled(appPreferences.getIsScreenLocked());
+
+                if (appPreferences.getIsScreenLocked()) {
+                    screenLockTimeoutChoicePreference.setAlpha(1.0f);
+                } else {
+                    screenLockTimeoutChoicePreference.setAlpha(0.38f);
+                }
+
                 screenLockSwitchPreference.setAlpha(1.0f);
             } else {
                 screenLockSwitchPreference.setEnabled(false);
-                appPreferences.setScreenLock(false);
+                screenLockTimeoutChoicePreference.setEnabled(false);
+                appPreferences.removeScreenLock();
+                appPreferences.removeScreenLockTimeout();
+                screenLockTimeoutChoicePreference.setValue("0");
                 ((Checkable) screenLockSwitchPreference.findViewById(R.id.mp_checkable)).setChecked(false);
                 screenLockSwitchPreference.setAlpha(0.38f);
+                screenLockTimeoutChoicePreference.setAlpha(0.38f);
             }
         }
 
@@ -579,6 +602,8 @@ public class SettingsController extends BaseController {
             appPreferences.unregisterProxyTypeListener(proxyTypeChangeListener);
             appPreferences.unregisterProxyCredentialsListener(proxyCredentialsChangeListener);
             appPreferences.unregisterScreenSecurityListener(screenSecurityChangeListener);
+            appPreferences.unregisterScreenLockListener(screenLockChangeListener);
+            appPreferences.unregisterScreenLockTimeoutListener(screenLockTimeoutChangeListener);
         }
         super.onDestroy();
     }
@@ -641,13 +666,37 @@ public class SettingsController extends BaseController {
         return getResources().getString(R.string.nc_app_name);
     }
 
+    private class ScreenLockTimeoutListener implements OnPreferenceValueChangedListener<String> {
+
+        @Override
+        public void onChanged(String newValue) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+                SecurityUtils.createKey(newValue);
+            }
+        }
+    }
+
+    private class ScreenLockListener implements OnPreferenceValueChangedListener<Boolean> {
+
+        @Override
+        public void onChanged(Boolean newValue) {
+            screenLockTimeoutChoicePreference.setEnabled(newValue);
+
+            if (newValue) {
+                screenLockTimeoutChoicePreference.setAlpha(1.0f);
+            } else {
+                screenLockTimeoutChoicePreference.setAlpha(0.38f);
+            }
+        }
+    }
+
     private class ScreenSecurityChangeListener implements OnPreferenceValueChangedListener<Boolean> {
 
         @Override
         public void onChanged(Boolean newValue) {
             if (newValue) {
                 if (getActivity() != null) {
-                    getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
+                    getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
                 }
             } else {
                 if (getActivity() != null) {

+ 11 - 0
app/src/main/res/layout/controller_settings.xml

@@ -157,6 +157,17 @@
             apc:mp_key="@string/nc_settings_screen_lock_key"
             apc:mp_title="@string/nc_settings_screen_lock_title" />
 
+        <com.yarolegovich.mp.MaterialChoicePreference
+            android:id="@+id/settings_screen_lock_timeout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            apc:mp_default_value="@string/nc_screen_lock_timeout_thirty"
+            apc:mp_entry_values="@array/screen_lock_timeout_entry_values"
+            apc:mp_entry_descriptions="@array/screen_lock_timeout_descriptions"
+            apc:mp_key="@string/nc_settings_screen_lock_timeout_key"
+            apc:mp_show_value="onRight"
+            apc:mp_title="@string/nc_settings_screen_lock_timeout_title" />
+
         <com.yarolegovich.mp.MaterialSwitchPreference
             android:id="@+id/settings_screen_security"
             android:layout_width="match_parent"

+ 22 - 1
app/src/main/res/values/arrays.xml

@@ -39,4 +39,25 @@
         <item>always</item>
     </array>
 
-</resources>
+    <array name="screen_lock_timeout_descriptions">
+        <item>@string/nc_screen_lock_timeout_30</item>
+        <item>@string/nc_screen_lock_timeout_60</item>
+        <item>@string/nc_screen_lock_timeout_300</item>
+        <item>@string/nc_screen_lock_timeout_600</item>
+    </array>
+
+    <array name="screen_lock_timeout_entry_values">
+        <item>@string/nc_screen_lock_timeout_thirty</item>
+        <item>@string/nc_screen_lock_timeout_sixty</item>
+        <item>@string/nc_screen_lock_timeout_three_hundred</item>
+        <item>@string/nc_screen_lock_timeout_six_hundred</item>
+    </array>
+
+    <array name="screen_lock_timeout_entry_int_values">
+        <item>30</item>
+        <item>60</item>
+        <item>300</item>
+        <item>600</item>
+    </array>
+
+</resources>

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

@@ -103,6 +103,15 @@
     <string name="nc_settings_link_previews_desc">Allows previews of content from received links for supported services</string>
     <string name="nc_settings_link_previews_key" translatable="false">link_previews</string>
 
+    <string name="nc_screen_lock_timeout_30">30 seconds</string>
+    <string name="nc_screen_lock_timeout_60">1 minute</string>
+    <string name="nc_screen_lock_timeout_300">5 minutes</string>
+    <string name="nc_screen_lock_timeout_600">10 minutes</string>
+    <string name="nc_screen_lock_timeout_thirty">30</string>
+    <string name="nc_screen_lock_timeout_sixty">60</string>
+    <string name="nc_screen_lock_timeout_three_hundred">300</string>
+    <string name="nc_screen_lock_timeout_six_hundred">600</string>
+
 
     <string name="nc_no_proxy">No proxy</string>
     <string name="nc_username">Username</string>