Merge "Import translations for cherry-picked Bluetooth changes." into gingerbread
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 560e6e3..1b3abbf 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -255,6 +255,24 @@
         <item>TTLS</item>
     </string-array>
 
+    <!-- Bluetooth Settings -->
+
+    <!-- Discoverable mode timeout options -->
+    <string-array name="bluetooth_visibility_timeout_entries">
+        <item>2 Minutes</item>
+        <item>5 Minutes</item>
+        <item>1 Hour</item>
+        <item>Never</item>
+    </string-array>
+
+    <!-- Values for visibility_duration_entries matching constants in BluetoothSettings. Do not translate. -->
+    <string-array name="bluetooth_visibility_timeout_values" translatable="false">
+        <item>twomin</item>
+        <item>fivemin</item>
+        <item>onehour</item>
+        <item>never</item>
+    </string-array>
+
     <!-- Match this with drawable.wifi_signal. --> <skip />
     <!-- Wi-Fi settings. The signal strength a Wi-Fi network has. -->
     <string-array name="wifi_signal">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 571e02a..6d58827 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -184,9 +184,14 @@
     <string name="bluetooth_visibility">Discoverable</string>
     <!-- Bluetooth settings screen, summary after selecting Discoverable check box -->
     <string name="bluetooth_is_discoverable">Discoverable for <xliff:g id="discoverable_time_period">%1$s</xliff:g> seconds\u2026</string>
+    <!-- Bluetooth settings screen, Discoverable checkbox summary text when Discoverable duration is set to "forever" -->
+    <string name="bluetooth_is_discoverable_always">Discoverable</string>
     <!-- Bluetooth settings screen, Discoverable checkbox summary text -->
     <string name="bluetooth_not_discoverable">Make device discoverable</string>
-    <!-- Bluetooth settings screen, heading above the list of nearby bluetooth devices -->
+    <!-- Bluetooth settings screen, option name to pick discoverability timeout duration (a list dialog comes up) -->
+    <string name="bluetooth_visibility_timeout">Discoverable timeout</string>
+    <!-- Bluetooth settings screen, Discoverable timout list dialog summary text -->
+    <string name="bluetooth_visibility_timeout_summary">Set how long device will be discoverable</string>
     <!-- Bluetooth settings screen, check box label whether or not to allow
         bluetooth voice dialing when lock screen is up-->
     <string name="bluetooth_lock_voice_dialing">Lock voice dialing</string>
@@ -194,7 +199,7 @@
     <string name="bluetooth_lock_voice_dialing_summary">
       Prevent use of the bluetooth dialer when the screen is locked
     </string>
-
+    <!-- Bluetooth settings screen, heading above the list of nearby bluetooth devices -->
     <string name="bluetooth_devices">Bluetooth devices</string>
     <!-- Bluetooth settings screen, title for the current bluetooth name setting -->
     <string name="bluetooth_device_name">Device name</string>
@@ -243,9 +248,15 @@
     <!-- Strings for asking to the user whether to allow an app to enable discovery mode -->
     <string name="bluetooth_ask_discovery">"An application on your phone is requesting permission to make your phone discoverable by other Bluetooth devices for <xliff:g id="timeout">%1$d</xliff:g> seconds. Do you want to do this?"</string>
 
+    <!-- Strings for asking to the user whether to allow an app to enable lasting discovery mode  -->
+    <string name="bluetooth_ask_lasting_discovery">"An application on your phone is requesting permission to make your phone \u201calways discoverable\u201d by other Bluetooth devices. Do you want to do this?"</string>
+
     <!-- Strings for asking to the user whether to allow an app to enable bluetooth and discovery mode -->
     <string name="bluetooth_ask_enablement_and_discovery">"An application on your phone is requesting permission to turn on Bluetooth and to make your phone discoverable by other devices for <xliff:g id="timeout">%1$d</xliff:g> seconds. Do you want to do this?"</string>
 
+    <!-- Strings for asking to the user whether to allow an app to enable bluetooth and discovery mode -->
+    <string name="bluetooth_ask_enablement_and_lasting_discovery">"An application on your phone is requesting permission to turn on Bluetooth and to make your phone discoverable by other devices. Do you want to do this?"</string>
+
     <!-- Strings for msg to display to user while bluetooth is turning on -->
     <string name="bluetooth_turning_on">"Turning on Bluetooth\u2026"</string>
 
diff --git a/res/xml/bluetooth_settings.xml b/res/xml/bluetooth_settings.xml
index 131f7a0..0c16880 100644
--- a/res/xml/bluetooth_settings.xml
+++ b/res/xml/bluetooth_settings.xml
@@ -40,6 +40,14 @@
         android:summaryOff="@string/bluetooth_not_discoverable"
         android:persistent="false" />
 
+    <ListPreference
+        android:key="bt_discoverable_timeout"
+        android:title="@string/bluetooth_visibility_timeout"
+        android:dependency="bt_discoverable"
+        android:summary="@string/bluetooth_visibility_timeout_summary"
+        android:entries="@array/bluetooth_visibility_timeout_entries"
+        android:entryValues="@array/bluetooth_visibility_timeout_values" />
+
     <Preference
         android:key="bt_scan"
         android:dependency="bt_checkbox"
diff --git a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
index 37e48ff..166e4ae 100644
--- a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
@@ -26,8 +26,11 @@
 import android.content.SharedPreferences;
 import android.os.Handler;
 import android.os.SystemProperties;
+import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.CheckBoxPreference;
+import android.provider.Settings;
+import android.util.Log;
 
 /**
  * BluetoothDiscoverableEnabler is a helper to manage the "Discoverable"
@@ -39,14 +42,26 @@
 
     private static final String SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT =
             "debug.bt.discoverable_time";
-    /* package */  static final int DEFAULT_DISCOVERABLE_TIMEOUT = 120;
 
-    /* package */ static final String SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP =
-            "discoverable_end_timestamp";
+    static final int DISCOVERABLE_TIMEOUT_TWO_MINUTES = 120;
+    static final int DISCOVERABLE_TIMEOUT_FIVE_MINUTES = 300;
+    static final int DISCOVERABLE_TIMEOUT_ONE_HOUR = 3600;
+    static final int DISCOVERABLE_TIMEOUT_NEVER = 0;
+
+    static final String SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP =
+        "discoverable_end_timestamp";
+
+    private static final String VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES = "twomin";
+    private static final String VALUE_DISCOVERABLE_TIMEOUT_FIVE_MINUTES = "fivemin";
+    private static final String VALUE_DISCOVERABLE_TIMEOUT_ONE_HOUR = "onehour";
+    private static final String VALUE_DISCOVERABLE_TIMEOUT_NEVER = "never";
+
+    static final int DEFAULT_DISCOVERABLE_TIMEOUT = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
 
     private final Context mContext;
     private final Handler mUiHandler;
     private final CheckBoxPreference mCheckBoxPreference;
+    private final ListPreference mTimeoutListPreference;
 
     private final LocalBluetoothManager mLocalManager;
 
@@ -69,12 +84,16 @@
         }
     };
 
-    public BluetoothDiscoverableEnabler(Context context, CheckBoxPreference checkBoxPreference) {
+    public BluetoothDiscoverableEnabler(Context context,
+            CheckBoxPreference checkBoxPreference, ListPreference timeoutListPreference) {
         mContext = context;
         mUiHandler = new Handler();
         mCheckBoxPreference = checkBoxPreference;
+        mTimeoutListPreference = timeoutListPreference;
 
         checkBoxPreference.setPersistent(false);
+        // we actually want to persist this since can't infer from BT device state
+        mTimeoutListPreference.setPersistent(true);
 
         mLocalManager = LocalBluetoothManager.getInstance(context);
         if (mLocalManager == null) {
@@ -91,7 +110,7 @@
         IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
         mContext.registerReceiver(mReceiver, filter);
         mCheckBoxPreference.setOnPreferenceChangeListener(this);
-
+        mTimeoutListPreference.setOnPreferenceChangeListener(this);
         handleModeChanged(mLocalManager.getBluetoothAdapter().getScanMode());
     }
 
@@ -102,12 +121,18 @@
 
         mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
         mCheckBoxPreference.setOnPreferenceChangeListener(null);
+        mTimeoutListPreference.setOnPreferenceChangeListener(null);
         mContext.unregisterReceiver(mReceiver);
     }
 
     public boolean onPreferenceChange(Preference preference, Object value) {
-        // Turn on/off BT discoverability
-        setEnabled((Boolean) value);
+        if (preference == mCheckBoxPreference) {
+            // Turn on/off BT discoverability
+            setEnabled((Boolean) value);
+        } else if (preference == mTimeoutListPreference) {
+            mTimeoutListPreference.setValue((String) value);
+            setEnabled(true);
+        }
 
         return true;
     }
@@ -116,26 +141,52 @@
         BluetoothAdapter manager = mLocalManager.getBluetoothAdapter();
 
         if (enable) {
-
             int timeout = getDiscoverableTimeout();
             manager.setDiscoverableTimeout(timeout);
 
-            mCheckBoxPreference.setSummaryOn(
-                    mContext.getResources().getString(R.string.bluetooth_is_discoverable, timeout));
-
-            long endTimestamp = System.currentTimeMillis() + timeout * 1000;
+            long endTimestamp = System.currentTimeMillis() + timeout * 1000L;
             persistDiscoverableEndTimestamp(endTimestamp);
 
-            manager.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+            updateCountdownSummary();
+
+            manager.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeout);
         } else {
             manager.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
         }
     }
 
+    private void updateTimerDisplay(int timeout) {
+        if (getDiscoverableTimeout() == DISCOVERABLE_TIMEOUT_NEVER) {
+            mCheckBoxPreference.setSummaryOn(
+                mContext.getResources()
+                .getString(R.string.bluetooth_is_discoverable_always));
+        } else {
+            mCheckBoxPreference.setSummaryOn(
+                mContext.getResources()
+                .getString(R.string.bluetooth_is_discoverable, timeout));
+        }
+    }
+
     private int getDiscoverableTimeout() {
         int timeout = SystemProperties.getInt(SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT, -1);
-        if (timeout <= 0) {
-            timeout = DEFAULT_DISCOVERABLE_TIMEOUT;
+        if (timeout < 0) {
+            String timeoutValue = null;
+            if (mTimeoutListPreference != null && mTimeoutListPreference.getValue() != null) {
+                timeoutValue = mTimeoutListPreference.getValue().toString();
+            } else {
+                mTimeoutListPreference.setValue(VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES);
+                return DISCOVERABLE_TIMEOUT_TWO_MINUTES;
+            }
+
+            if (timeoutValue.equals(VALUE_DISCOVERABLE_TIMEOUT_NEVER)) {
+                timeout = DISCOVERABLE_TIMEOUT_NEVER;
+            } else if (timeoutValue.equals(VALUE_DISCOVERABLE_TIMEOUT_ONE_HOUR)) {
+                timeout = DISCOVERABLE_TIMEOUT_ONE_HOUR;
+            } else if (timeoutValue.equals(VALUE_DISCOVERABLE_TIMEOUT_FIVE_MINUTES)) {
+                timeout = DISCOVERABLE_TIMEOUT_FIVE_MINUTES;
+            } else {
+                timeout = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
+            }
         }
 
         return timeout;
@@ -151,7 +202,6 @@
         if (mode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
             mCheckBoxPreference.setChecked(true);
             updateCountdownSummary();
-
         } else {
             mCheckBoxPreference.setChecked(false);
         }
@@ -173,11 +223,8 @@
             return;
         }
 
-        String formattedTimeLeft = String.valueOf((endTimestamp - currentTimestamp) / 1000);
-
-        mCheckBoxPreference.setSummaryOn(
-                mContext.getResources().getString(R.string.bluetooth_is_discoverable,
-                        formattedTimeLeft));
+        int timeLeft = (int) ((endTimestamp - currentTimestamp) / 1000L);
+        updateTimerDisplay(timeLeft);
 
         synchronized (this) {
             mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 1e73b2d..e897673 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -31,9 +31,13 @@
 import android.os.Bundle;
 import android.os.ParcelUuid;
 import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
+import android.text.TextUtils;
 import android.view.ContextMenu;
 import android.view.MenuItem;
 import android.view.View;
@@ -55,6 +59,7 @@
     private static final String KEY_BT_CHECKBOX = "bt_checkbox";
     private static final String KEY_BT_DISCOVERABLE = "bt_discoverable";
     private static final String KEY_BT_DEVICE_LIST = "bt_device_list";
+    private static final String KEY_BT_DISCOVERABLE_TIMEOUT = "bt_discoverable_timeout";
     private static final String KEY_BT_NAME = "bt_name";
     private static final String KEY_BT_SCAN = "bt_scan";
 
@@ -141,9 +146,9 @@
                     this,
                     (CheckBoxPreference) findPreference(KEY_BT_CHECKBOX));
 
-            mDiscoverableEnabler = new BluetoothDiscoverableEnabler(
-                    this,
-                    (CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE));
+            mDiscoverableEnabler = new BluetoothDiscoverableEnabler(this,
+                    (CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE),
+                    (ListPreference) findPreference(KEY_BT_DISCOVERABLE_TIMEOUT));
 
             mNamePreference = (BluetoothNamePreference) findPreference(KEY_BT_NAME);
 
diff --git a/src/com/android/settings/bluetooth/RequestPermissionActivity.java b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
index dd802f3..34ecca0 100644
--- a/src/com/android/settings/bluetooth/RequestPermissionActivity.java
+++ b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
@@ -43,7 +43,7 @@
 
     private static final String TAG = "RequestPermissionActivity";
 
-    private static final int MAX_DISCOVERABLE_TIMEOUT = 300;
+    private static final int MAX_DISCOVERABLE_TIMEOUT = 3600; // 1 hr
 
     // Non-error return code: BT is starting or has started successfully. Used
     // by this Activity and RequestPermissionHelperActivity
@@ -157,7 +157,14 @@
             builder.setCancelable(false);
         } else {
             // Ask the user whether to turn on discovery mode or not
-            builder.setMessage(getString(R.string.bluetooth_ask_enablement_and_discovery, mTimeout));
+            // For lasting discoverable mode there is a different message
+            if (mTimeout == BluetoothDiscoverableEnabler.DISCOVERABLE_TIMEOUT_NEVER) {
+                builder.setMessage(
+                        getString(R.string.bluetooth_ask_lasting_discovery));
+            } else {
+                builder.setMessage(
+                        getString(R.string.bluetooth_ask_discovery, mTimeout));
+            }
             builder.setPositiveButton(getString(R.string.yes), this);
             builder.setNegativeButton(getString(R.string.no), this);
         }
@@ -241,11 +248,9 @@
             mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
                     BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT);
 
-            Log.e(TAG, "Timeout = " + mTimeout);
+            Log.d(TAG, "Setting Bluetooth Discoverable Timeout = " + mTimeout);
 
-            if (mTimeout > MAX_DISCOVERABLE_TIMEOUT) {
-                mTimeout = MAX_DISCOVERABLE_TIMEOUT;
-            } else if (mTimeout <= 0) {
+            if (mTimeout < 0 || mTimeout > MAX_DISCOVERABLE_TIMEOUT) {
                 mTimeout = BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT;
             }
         } else {
diff --git a/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java b/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java
index c869868..2657d91 100644
--- a/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java
+++ b/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java
@@ -75,7 +75,11 @@
         if (mEnableOnly) {
             tv.setText(getString(R.string.bluetooth_ask_enablement));
         } else {
-            tv.setText(getString(R.string.bluetooth_ask_enablement_and_discovery, mTimeout));
+            if (mTimeout == BluetoothDiscoverableEnabler.DISCOVERABLE_TIMEOUT_NEVER) {
+                tv.setText(getString(R.string.bluetooth_ask_enablement_and_lasting_discovery));
+            } else {
+                tv.setText(getString(R.string.bluetooth_ask_enablement_and_discovery, mTimeout));
+            }
         }
 
         p.mPositiveButtonText = getString(R.string.yes);