Merge "Fix opening secured networks from QS" into mnc-dev
diff --git a/res/layout/redaction_interstitial.xml b/res/layout/redaction_interstitial.xml
index 6f0ba2e..14e57f8 100644
--- a/res/layout/redaction_interstitial.xml
+++ b/res/layout/redaction_interstitial.xml
@@ -33,6 +33,7 @@
             android:textAppearance="?android:attr/textAppearanceMedium" />
 
     <RadioGroup
+            android:id="@+id/radio_group"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/redaction_vertical_margins"
diff --git a/res/layout/setup_redaction_interstitial.xml b/res/layout/setup_redaction_interstitial.xml
index 2844828..826e633 100644
--- a/res/layout/setup_redaction_interstitial.xml
+++ b/res/layout/setup_redaction_interstitial.xml
@@ -43,6 +43,7 @@
             android:text="@string/lock_screen_notifications_interstitial_message" />
 
         <RadioGroup
+            android:id="@+id/radio_group"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/redaction_vertical_margins"
diff --git a/res/layout/widget_text_views.xml b/res/layout/widget_text_views.xml
index 2e029e8..ea49fa5 100644
--- a/res/layout/widget_text_views.xml
+++ b/res/layout/widget_text_views.xml
@@ -21,7 +21,7 @@
 
     <TextView
         android:id="@+id/widget_text1"
-        android:layout_width="0dp"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:layout_gravity="fill_horizontal|top"
@@ -34,7 +34,7 @@
 
     <TextView
         android:id="@+id/widget_text2"
-        android:layout_width="0dp"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:layout_marginStart="8dip"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6169fc9..292698f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -677,11 +677,11 @@
     <!-- Text shown for title of profile info setting [CHAR LIMIT=20]-->
     <string name="profile_info_settings_title">Profile info</string>
     <!-- Main Settings screen setting option title for the item to take you to the Accounts screen [CHAR LIMIT=22] -->
-    <string name="Accounts_settings_title">Account sync</string>
+    <string name="Accounts_settings_title">Accounts</string>
     <!-- Main Settings screen setting option title for the item to take you to the location screen -->
     <string name="location_settings_title">Location</string>
     <!-- Main Settings screen setting option title for the item to take you to the accounts screen [CHAR LIMIT=22] -->
-    <string name="account_settings_title">Account sync</string>
+    <string name="account_settings_title">Accounts</string>
     <!-- Main Settings screen setting option title for the item to take you to the security screen -->
     <string name="security_settings_title">Security</string>
     <!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
diff --git a/res/xml/power_usage_details.xml b/res/xml/power_usage_details.xml
index ad28650..724aae8 100644
--- a/res/xml/power_usage_details.xml
+++ b/res/xml/power_usage_details.xml
@@ -17,9 +17,6 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
 
-        <com.android.settings.fuelgauge.BatteryHistoryPreference
-            android:key="battery_history" />
-
         <com.android.settings.applications.LayoutPreference
             android:key="two_buttons"
             android:layout="@layout/two_buttons_panel"
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 576cee5..64aaaca 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -559,7 +559,10 @@
             getActivity().finish();
             mDone = true;
             if (!wasSecureBefore) {
-                startActivity(getRedactionInterstitialIntent(getActivity()));
+                Intent intent = getRedactionInterstitialIntent(getActivity());
+                if (intent != null) {
+                    startActivity(intent);
+                }
             }
         }
 
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index baee599..481cf0f 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -641,7 +641,10 @@
                 startVerifyPattern(utils, wasSecureBefore);
             } else {
                 if (!wasSecureBefore) {
-                    startActivity(getRedactionInterstitialIntent(getActivity()));
+                    Intent intent = getRedactionInterstitialIntent(getActivity());
+                    if (intent != null) {
+                        startActivity(intent);
+                    }
                 }
                 getActivity().setResult(RESULT_FINISHED);
                 doFinish();
@@ -670,7 +673,10 @@
                             mPendingLockCheck = null;
 
                             if (!wasSecureBefore) {
-                                startActivity(getRedactionInterstitialIntent(getActivity()));
+                                Intent intent = getRedactionInterstitialIntent(getActivity());
+                                if (intent != null) {
+                                    startActivity(intent);
+                                }
                             }
 
                             Intent intent = new Intent();
diff --git a/src/com/android/settings/DropDownPreference.java b/src/com/android/settings/DropDownPreference.java
index ce4bb2f..0f5b06a 100644
--- a/src/com/android/settings/DropDownPreference.java
+++ b/src/com/android/settings/DropDownPreference.java
@@ -126,6 +126,10 @@
         mValues.add(value);
     }
 
+    public int getItemCount() {
+        return mAdapter.getCount();
+    }
+
     public void clearItems(){
         mAdapter.clear();
         mValues.clear();
diff --git a/src/com/android/settings/SetupChooseLockPassword.java b/src/com/android/settings/SetupChooseLockPassword.java
index 080e470..9837562 100644
--- a/src/com/android/settings/SetupChooseLockPassword.java
+++ b/src/com/android/settings/SetupChooseLockPassword.java
@@ -110,7 +110,9 @@
         @Override
         protected Intent getRedactionInterstitialIntent(Context context) {
             Intent intent = SetupRedactionInterstitial.createStartIntent(context);
-            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            if (intent != null) {
+                SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            }
             return intent;
         }
 
diff --git a/src/com/android/settings/SetupChooseLockPattern.java b/src/com/android/settings/SetupChooseLockPattern.java
index 2ea8d4a..bdf7af8 100644
--- a/src/com/android/settings/SetupChooseLockPattern.java
+++ b/src/com/android/settings/SetupChooseLockPattern.java
@@ -103,7 +103,9 @@
         @Override
         protected Intent getRedactionInterstitialIntent(Context context) {
             Intent intent = SetupRedactionInterstitial.createStartIntent(context);
-            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            if (intent != null) {
+                SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            }
             return intent;
         }
 
diff --git a/src/com/android/settings/SetupRedactionInterstitial.java b/src/com/android/settings/SetupRedactionInterstitial.java
index 590788b..4939aea 100644
--- a/src/com/android/settings/SetupRedactionInterstitial.java
+++ b/src/com/android/settings/SetupRedactionInterstitial.java
@@ -40,9 +40,11 @@
 
     public static Intent createStartIntent(Context ctx) {
         Intent startIntent = RedactionInterstitial.createStartIntent(ctx);
-        startIntent.setClass(ctx, SetupRedactionInterstitial.class);
-        startIntent.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)
-                .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, -1);
+        if (startIntent != null) {
+            startIntent.setClass(ctx, SetupRedactionInterstitial.class);
+            startIntent.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)
+                    .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, -1);
+        }
         return startIntent;
     }
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index 5cb6c24..4bc5982 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -303,7 +303,6 @@
     private static final String KEY_CONTROLS_PARENT = "controls_parent";
     private static final String KEY_MESSAGES_PARENT = "messages_parent";
     private static final String KEY_PACKAGES_PARENT = "packages_parent";
-    private static final String KEY_BATTERY_HISTORY = "battery_history";
     private static final String KEY_TWO_BUTTONS = "two_buttons";
     private static final String KEY_HIGH_POWER = "high_power";
 
@@ -319,7 +318,6 @@
     private BatterySipper.DrainType mDrainType;
     private double mNoCoverage; // Percentage of time that there was no coverage
 
-    private BatteryHistoryPreference mHistPref;
     private PreferenceCategory mDetailsParent;
     private PreferenceCategory mControlsParent;
     private PreferenceCategory mMessagesParent;
@@ -341,7 +339,6 @@
         mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
 
         addPreferencesFromResource(R.xml.power_usage_details);
-        mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_HISTORY);
         mDetailsParent = (PreferenceCategory) findPreference(KEY_DETAILS_PARENT);
         mControlsParent = (PreferenceCategory) findPreference(KEY_CONTROLS_PARENT);
         mMessagesParent = (PreferenceCategory) findPreference(KEY_MESSAGES_PARENT);
@@ -440,12 +437,6 @@
         fillControlsSection(mUid);
         fillMessagesSection(mUid);
     }
-    
-    @Override
-    protected void refreshStats() {
-        super.refreshStats();
-        updatePreference(mHistPref);
-    }
 
     private void setupHeader() {
         final Bundle args = getArguments();
diff --git a/src/com/android/settings/notification/NotificationSettings.java b/src/com/android/settings/notification/NotificationSettings.java
index 98f2517..2a56c90 100644
--- a/src/com/android/settings/notification/NotificationSettings.java
+++ b/src/com/android/settings/notification/NotificationSettings.java
@@ -17,6 +17,7 @@
 package com.android.settings.notification;
 
 import android.app.NotificationManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -427,32 +428,56 @@
             return;
         }
 
-        mLockscreen.addItem(R.string.lock_screen_notifications_summary_show,
-                R.string.lock_screen_notifications_summary_show);
-        if (mSecure) {
+        boolean isSecureNotificationsDisabled = isSecureNotificationsDisabled();
+        boolean isUnredactedNotificationsDisabled = isUnredactedNotificationsDisabled();
+        if (!isSecureNotificationsDisabled && !isUnredactedNotificationsDisabled) {
+            mLockscreen.addItem(R.string.lock_screen_notifications_summary_show,
+                    R.string.lock_screen_notifications_summary_show);
+        }
+        if (mSecure && !isSecureNotificationsDisabled) {
             mLockscreen.addItem(R.string.lock_screen_notifications_summary_hide,
                     R.string.lock_screen_notifications_summary_hide);
         }
         mLockscreen.addItem(R.string.lock_screen_notifications_summary_disable,
                 R.string.lock_screen_notifications_summary_disable);
         updateLockscreenNotifications();
-        mLockscreen.setCallback(new DropDownPreference.Callback() {
-            @Override
-            public boolean onItemSelected(int pos, Object value) {
-                final int val = (Integer) value;
-                if (val == mLockscreenSelectedValue) {
+        if (mLockscreen.getItemCount() > 1) {
+            mLockscreen.setCallback(new DropDownPreference.Callback() {
+                @Override
+                public boolean onItemSelected(int pos, Object value) {
+                    final int val = (Integer) value;
+                    if (val == mLockscreenSelectedValue) {
+                        return true;
+                    }
+                    final boolean enabled =
+                            val != R.string.lock_screen_notifications_summary_disable;
+                    final boolean show = val == R.string.lock_screen_notifications_summary_show;
+                    Settings.Secure.putInt(getContentResolver(),
+                            Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, show ? 1 : 0);
+                    Settings.Secure.putInt(getContentResolver(),
+                            Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, enabled ? 1 : 0);
+                    mLockscreenSelectedValue = val;
                     return true;
                 }
-                final boolean enabled = val != R.string.lock_screen_notifications_summary_disable;
-                final boolean show = val == R.string.lock_screen_notifications_summary_show;
-                Settings.Secure.putInt(getContentResolver(),
-                        Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, show ? 1 : 0);
-                Settings.Secure.putInt(getContentResolver(),
-                        Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, enabled ? 1 : 0);
-                mLockscreenSelectedValue = val;
-                return true;
-            }
-        });
+            });
+        } else {
+            // There is one or less option for the user, disable the drop down.
+            mLockscreen.setEnabled(false);
+        }
+    }
+
+    private boolean isSecureNotificationsDisabled() {
+        final DevicePolicyManager dpm =
+                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+        return dpm != null && (dpm.getKeyguardDisabledFeatures(null)
+                & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS) != 0;
+    }
+
+    private boolean isUnredactedNotificationsDisabled() {
+        final DevicePolicyManager dpm =
+                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+        return dpm != null && (dpm.getKeyguardDisabledFeatures(null)
+                & DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS) != 0;
     }
 
     private void updateLockscreenNotifications() {
diff --git a/src/com/android/settings/notification/RedactionInterstitial.java b/src/com/android/settings/notification/RedactionInterstitial.java
index 16ee3b5..a0d1219 100644
--- a/src/com/android/settings/notification/RedactionInterstitial.java
+++ b/src/com/android/settings/notification/RedactionInterstitial.java
@@ -21,6 +21,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
@@ -29,6 +30,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.RadioButton;
+import android.widget.RadioGroup;
 
 public class RedactionInterstitial extends SettingsActivity {
 
@@ -44,20 +46,44 @@
         return RedactionInterstitialFragment.class.getName().equals(fragmentName);
     }
 
+    /**
+     * Create an intent for launching RedactionInterstitial.
+     * @return An intent to launch the activity is if is available, @null if the activity is not
+     * available to be launched.
+     */
     public static Intent createStartIntent(Context ctx) {
-        return new Intent(ctx, RedactionInterstitial.class)
-                .putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true)
-                .putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null)
-                .putExtra(EXTRA_PREFS_SET_NEXT_TEXT, ctx.getString(
-                        R.string.app_notifications_dialog_done));
+        if (isSecureNotificationsDisabled(ctx)) {
+            // If there is no choices for the user, we should not start the activity.
+            return null;
+        } else {
+            return new Intent(ctx, RedactionInterstitial.class)
+                    .putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true)
+                    .putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null)
+                    .putExtra(EXTRA_PREFS_SET_NEXT_TEXT, ctx.getString(
+                            R.string.app_notifications_dialog_done));
+        }
+    }
+
+    private static boolean isSecureNotificationsDisabled(Context context) {
+        final DevicePolicyManager dpm =
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        return dpm != null && (dpm.getKeyguardDisabledFeatures(null)
+                & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS) != 0;
+    }
+
+    private static boolean isUnredactedNotificationsDisabled(Context context) {
+        final DevicePolicyManager dpm =
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        return dpm != null && (dpm.getKeyguardDisabledFeatures(null)
+                & DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS) != 0;
     }
 
     public static class RedactionInterstitialFragment extends SettingsPreferenceFragment
-            implements View.OnClickListener {
+            implements RadioGroup.OnCheckedChangeListener {
 
+        private RadioGroup mRadioGroup;
         private RadioButton mShowAllButton;
         private RadioButton mRedactSensitiveButton;
-        private RadioButton mHideAllButton;
 
         @Override
         protected int getMetricsCategory() {
@@ -73,13 +99,19 @@
         @Override
         public void onViewCreated(View view, Bundle savedInstanceState) {
             super.onViewCreated(view, savedInstanceState);
+            mRadioGroup = (RadioGroup) view.findViewById(R.id.radio_group);
             mShowAllButton = (RadioButton) view.findViewById(R.id.show_all);
             mRedactSensitiveButton = (RadioButton) view.findViewById(R.id.redact_sensitive);
-            mHideAllButton = (RadioButton) view.findViewById(R.id.hide_all);
 
-            mShowAllButton.setOnClickListener(this);
-            mRedactSensitiveButton.setOnClickListener(this);
-            mHideAllButton.setOnClickListener(this);
+            mRadioGroup.setOnCheckedChangeListener(this);
+
+            // Disable buttons according to policy.
+            if (isSecureNotificationsDisabled(getActivity())) {
+                mShowAllButton.setEnabled(false);
+                mRedactSensitiveButton.setEnabled(false);
+            } else if (isUnredactedNotificationsDisabled(getActivity())) {
+                mShowAllButton.setEnabled(false);
+            }
         }
 
         @Override
@@ -93,15 +125,23 @@
                         Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
             final boolean show = Settings.Secure.getInt(getContentResolver(),
                         Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1) != 0;
-            mShowAllButton.setChecked(enabled && show);
-            mRedactSensitiveButton.setChecked(enabled && !show);
-            mHideAllButton.setChecked(!enabled);
+
+            int checkedButtonId = R.id.hide_all;
+            if (enabled) {
+                if (show && mShowAllButton.isEnabled()) {
+                    checkedButtonId = R.id.show_all;
+                } else if (mRedactSensitiveButton.isEnabled()) {
+                    checkedButtonId = R.id.redact_sensitive;
+                }
+            }
+
+            mRadioGroup.check(checkedButtonId);
         }
 
         @Override
-        public void onClick(View v) {
-            final boolean show = (v == mShowAllButton);
-            final boolean enabled = (v != mHideAllButton);
+        public void onCheckedChanged(RadioGroup group, int checkedId) {
+            final boolean show = (checkedId == R.id.show_all);
+            final boolean enabled = (checkedId != R.id.hide_all);
 
             Settings.Secure.putInt(getContentResolver(),
                     Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, show ? 1 : 0);