Allow OEM customizing max screen timeout value.

Side fix - update string for select timezone.

Change-Id: Id61128b7dfcc27da8ed07225af3b6bec4e93b512
Fixes: 113346164
Fixes: 121986474
Test: robotest
diff --git a/res/values/config.xml b/res/values/config.xml
index 82e185c..8efa6b2 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -171,4 +171,7 @@
 
     <!-- ComponentName to launch a vendor-specific enrollment activity if available -->
     <string name="config_face_enroll" translatable="false"></string>
+
+    <!-- Max allowed value for screen timeout, in milliseconds -->
+    <integer name="max_lock_after_timeout_ms">1800000</integer>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c80ba95..ad94614 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5828,9 +5828,6 @@
          Used in SetupWizard for XLarge screen [CHAR LIMIT=20] -->
     <string name="wifi_setup_detail">Network details</string>
 
-    <!-- Do not translate. This is a stub which will be removed soon. -->
-    <string name="time_zone_auto_stub" translatable="false">Select Time Zone</string>
-
     <!-- Content description of the enabled sync icon for accessibility. [CHAR LIMIT=NONE] -->
     <string name="accessibility_sync_enabled">Sync enabled</string>
     <!-- Content description of the disabled sync icon for accessibility. [CHAR LIMIT=NONE] -->
diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml
index edda1ba..e8af64c 100644
--- a/res/xml/date_time_prefs.xml
+++ b/res/xml/date_time_prefs.xml
@@ -58,7 +58,7 @@
         <com.android.settingslib.RestrictedPreference
             android:fragment="com.android.settings.datetime.timezone.TimeZoneSettings"
             android:key="timezone"
-            android:title="@string/date_time_set_timezone"
+            android:title="@string/date_time_set_timezone_title"
             android:summary="@string/summary_placeholder"
             settings:userRestriction="no_config_date_time" />
     </PreferenceCategory>
diff --git a/src/com/android/settings/display/TimeoutListPreference.java b/src/com/android/settings/display/TimeoutListPreference.java
index f9a731d..5ed427f 100644
--- a/src/com/android/settings/display/TimeoutListPreference.java
+++ b/src/com/android/settings/display/TimeoutListPreference.java
@@ -26,6 +26,7 @@
 import android.util.Log;
 import android.view.View;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog.Builder;
 
 import com.android.settings.R;
@@ -33,18 +34,18 @@
 import com.android.settingslib.RestrictedLockUtils;
 
 import java.util.ArrayList;
+import java.util.List;
 
 
 public class TimeoutListPreference extends RestrictedListPreference {
     private static final String TAG = "TimeoutListPreference";
     private EnforcedAdmin mAdmin;
-    private final CharSequence[] mInitialEntries;
-    private final CharSequence[] mInitialValues;
+    private CharSequence[] mInitialEntries;
+    private CharSequence[] mInitialValues;
 
     public TimeoutListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-        mInitialEntries = getEntries();
-        mInitialValues = getEntryValues();
+        updateInitialValues();
     }
 
     @Override
@@ -65,13 +66,8 @@
         if (mAdmin != null) {
             View footerView = dialog.findViewById(R.id.admin_disabled_other_options);
             footerView.findViewById(R.id.admin_more_details_link).setOnClickListener(
-                    new View.OnClickListener() {
-                        @Override
-                        public void onClick(View view) {
-                            RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
-                                    getContext(), mAdmin);
-                        }
-                    });
+                    view -> RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
+                            getContext(), mAdmin));
         }
     }
 
@@ -89,8 +85,8 @@
             maxTimeout = Long.MAX_VALUE;
         }
 
-        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
-        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
+        final ArrayList<CharSequence> revisedEntries = new ArrayList<>();
+        final ArrayList<CharSequence> revisedValues = new ArrayList<>();
         for (int i = 0; i < mInitialValues.length; ++i) {
             long timeout = Long.parseLong(mInitialValues[i].toString());
             if (timeout <= maxTimeout) {
@@ -101,7 +97,7 @@
 
         // If there are no possible options for the user, then set this preference as disabled
         // by admin, otherwise remove the padlock in case it was set earlier.
-        if (revisedValues.size() == 0) {
+        if (revisedValues.isEmpty()) {
             setDisabledByAdmin(admin);
             return;
         } else {
@@ -117,7 +113,7 @@
                 setValue(String.valueOf(userPreference));
             } else if (revisedValues.size() > 0
                     && Long.parseLong(revisedValues.get(revisedValues.size() - 1).toString())
-                            == maxTimeout) {
+                    == maxTimeout) {
                 // If the last one happens to be the same as the max timeout, select that
                 setValue(String.valueOf(maxTimeout));
             } else {
@@ -128,4 +124,36 @@
             }
         }
     }
+
+    @VisibleForTesting
+    void updateInitialValues() {
+        // Read default list of candidate values.
+        final CharSequence[] entries = getEntries();
+        final CharSequence[] values = getEntryValues();
+        // Filter out values based on config
+        final List<CharSequence> revisedEntries = new ArrayList<>();
+        final List<CharSequence> revisedValues = new ArrayList<>();
+        final long maxTimeout = getContext().getResources().getInteger(
+                R.integer.max_lock_after_timeout_ms);
+        if (entries == null || values == null) {
+            return;
+        }
+        Log.d(TAG, "max timeout: " + maxTimeout);
+        for (int i = 0; i < values.length; ++i) {
+            long timeout = Long.parseLong(values[i].toString());
+            if (timeout <= maxTimeout) {
+                Log.d(TAG, "keeping timeout: " + values[i]);
+                revisedEntries.add(entries[i]);
+                revisedValues.add(values[i]);
+            } else {
+                Log.d(TAG, "Dropping timeout: " + values[i]);
+            }
+        }
+
+        // Store final candidates in initial value lists.
+        mInitialEntries = revisedEntries.toArray(new CharSequence[0]);
+        setEntries(mInitialEntries);
+        mInitialValues = revisedValues.toArray(new CharSequence[0]);
+        setEntryValues(mInitialValues);
+    }
 }
diff --git a/src/com/android/settings/display/TimeoutPreferenceController.java b/src/com/android/settings/display/TimeoutPreferenceController.java
index 60b7e24..c1c5069 100644
--- a/src/com/android/settings/display/TimeoutPreferenceController.java
+++ b/src/com/android/settings/display/TimeoutPreferenceController.java
@@ -13,8 +13,6 @@
  */
 package com.android.settings.display;
 
-import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.os.UserHandle;
@@ -60,7 +58,7 @@
     public void updateState(Preference preference) {
         final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) preference;
         final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
-                SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
+                Settings.System.SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
         timeoutListPreference.setValue(String.valueOf(currentTimeout));
         final DevicePolicyManager dpm =
                 (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
@@ -86,7 +84,8 @@
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         try {
             int value = Integer.parseInt((String) newValue);
-            Settings.System.putInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT, value);
+            Settings.System.putInt(mContext.getContentResolver(),
+                    Settings.System.SCREEN_OFF_TIMEOUT, value);
             updateTimeoutPreferenceDescription((TimeoutListPreference) preference, value);
         } catch (NumberFormatException e) {
             Log.e(TAG, "could not persist screen timeout setting", e);
@@ -94,7 +93,7 @@
         return true;
     }
 
-    public static CharSequence getTimeoutDescription(
+    private static CharSequence getTimeoutDescription(
             long currentTimeout, CharSequence[] entries, CharSequence[] values) {
         if (currentTimeout < 0 || entries == null || values == null
                 || values.length != entries.length) {
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index 101a6b8..59028d3 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -88,4 +88,7 @@
 
     <!-- Email address for the homepage contextual cards feedback -->
     <string name="config_contextual_card_feedback_email" translatable="false">test@test.test</string>
+
+    <!-- Max allowed value for screen timeout, in milliseconds -->
+    <integer name="max_lock_after_timeout_ms">1700000</integer>
 </resources>
diff --git a/tests/robotests/src/com/android/settings/display/TimeoutListPreferenceTest.java b/tests/robotests/src/com/android/settings/display/TimeoutListPreferenceTest.java
index 55fcdac..7b67f0f 100644
--- a/tests/robotests/src/com/android/settings/display/TimeoutListPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/display/TimeoutListPreferenceTest.java
@@ -17,11 +17,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
 import static org.robolectric.RuntimeEnvironment.application;
 
 import android.util.AttributeSet;
 
+import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settingslib.RestrictedLockUtils;
 
@@ -69,4 +69,23 @@
         // should set to largest allowed value, which is 5 minute
         assertThat(mPreference.getValue()).isEqualTo("300000");
     }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void newInstance_hasLowTimeoutConfig_shouldRemoveLongTimeouts() {
+        final AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
+        final TimeoutListPreference pref = new TimeoutListPreference(application, attributeSet);
+        final long maxTimeout = application.getResources().getInteger(
+                R.integer.max_lock_after_timeout_ms);
+        pref.setEntries(R.array.screen_timeout_entries);
+        pref.setEntryValues(R.array.screen_timeout_values);
+
+        pref.updateInitialValues();
+
+        final CharSequence[] values = pref.getEntryValues();
+        for (CharSequence value : values) {
+            long timeout = Long.parseLong(value.toString());
+            assertThat(timeout).isAtMost(maxTimeout);
+        }
+    }
 }