Merge "Allow notifications be to hidden from the lockscreen by app." into nyc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e900832..91099ac 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6037,11 +6037,8 @@
     <!-- [CHAR LIMIT=NONE] App notification settings: Override DND option description-->
     <string name="app_notification_override_dnd_summary">Let these notifications continue to interrupt when Do Not Disturb is set to Priority Only</string>
 
-    <!-- [CHAR LIMIT=NONE] App notification settings: Sensitive option title -->
-    <string name="app_notification_sensitive_title">Hide sensitive content</string>
-
-    <!-- [CHAR LIMIT=NONE] App notification settings: Sensitive option description-->
-    <string name="app_notification_sensitive_summary">When the device is locked, hide content in these notifications that might reveal private information</string>
+    <!-- [CHAR LIMIT=NONE] App notification settings: Visibility override option title -->
+    <string name="app_notification_visibility_override_title">On the lock screen</string>
 
     <!-- [CHAR LIMIT=20] Notification settings: App notifications row summary when banned -->
     <string name="app_notification_row_banned">Blocked</string>
diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml
index 37c4426..8bd0c88 100644
--- a/res/xml/app_notification_settings.xml
+++ b/res/xml/app_notification_settings.xml
@@ -45,11 +45,10 @@
             android:layout="@layout/two_buttons_panel"
             android:order="6" />
 
-    <!-- Sensitive -->
-    <com.android.settingslib.RestrictedSwitchPreference
-            android:key="sensitive"
-            android:title="@string/app_notification_sensitive_title"
-            android:summary="@string/app_notification_sensitive_summary"
+    <!-- Visibility Override -->
+    <DropDownPreference
+            android:key="visibility_override"
+            android:title="@string/app_notification_visibility_override_title"
             android:order="7" />
 
     <!-- Bypass DND -->
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index c82ad19..f393300 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -24,8 +24,8 @@
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 import android.os.UserHandle;
-import android.provider.Settings;
 import android.service.notification.NotificationListenerService.Ranking;
+import android.support.v7.preference.DropDownPreference;
 import android.util.ArrayMap;
 import android.util.Log;
 
@@ -76,8 +76,9 @@
         mImportanceTitle = (RestrictedPreference) findPreference(KEY_IMPORTANCE_TITLE);
         mPriority =
                 (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BYPASS_DND);
-        mSensitive =
-                (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SENSITIVE);
+        mVisibilityOverride =
+                (DropDownPreference) getPreferenceScreen().findPreference(
+                        KEY_VISIBILITY_OVERRIDE);
         mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK);
         mSilent = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SILENT);
 
@@ -94,7 +95,7 @@
 
         setupImportancePrefs(mAppRow.systemApp, mAppRow.appImportance, mAppRow.banned);
         setupPriorityPref(mAppRow.appBypassDnd);
-        setupSensitivePref(mAppRow.appSensitive);
+        setupVisOverridePref(mAppRow.appVisOverride);
         updateDependents(mAppRow.appImportance);
     }
 
@@ -102,8 +103,6 @@
     protected void updateDependents(int importance) {
         final boolean lockscreenSecure = new LockPatternUtils(getActivity()).isSecure(
                 UserHandle.myUserId());
-        final boolean lockscreenNotificationsEnabled = getLockscreenNotificationsEnabled();
-        final boolean allowPrivate = getLockscreenAllowPrivateNotifications();
 
         if (getPreferenceScreen().findPreference(mBlock.getKey()) != null) {
             setVisible(mSilent, checkCanBeVisible(Ranking.IMPORTANCE_MIN, importance));
@@ -111,8 +110,8 @@
         }
         setVisible(mPriority, checkCanBeVisible(Ranking.IMPORTANCE_DEFAULT, importance)
                 && !mDndVisualEffectsSuppressed);
-        setVisible(mSensitive, checkCanBeVisible(Ranking.IMPORTANCE_MIN, importance)
-                && lockscreenSecure && lockscreenNotificationsEnabled && allowPrivate);
+        setVisible(mVisibilityOverride,
+                checkCanBeVisible(Ranking.IMPORTANCE_MIN, importance) && lockscreenSecure);
     }
 
     protected boolean checkCanBeVisible(int minImportanceVisible, int importance) {
@@ -122,16 +121,6 @@
         return importance >= minImportanceVisible;
     }
 
-    private boolean getLockscreenNotificationsEnabled() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
-    }
-
-    private boolean getLockscreenAllowPrivateNotifications() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0;
-    }
-
     private List<ResolveInfo> queryNotificationConfigActivities() {
         if (DEBUG) Log.d(TAG, "APP_NOTIFICATION_PREFS_CATEGORY_INTENT is "
                 + APP_NOTIFICATION_PREFS_CATEGORY_INTENT);
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index 772fa19..c418769 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -48,7 +48,7 @@
         row.banned = getNotificationsBanned(row.pkg, row.uid);
         row.appImportance = getImportance(row.pkg, row.uid);
         row.appBypassDnd = getBypassZenMode(row.pkg, row.uid);
-        row.appSensitive = getSensitive(row.pkg, row.uid);
+        row.appVisOverride = getVisibilityOverride(row.pkg, row.uid);
         return row;
     }
 
@@ -88,20 +88,18 @@
         }
     }
 
-    public boolean getSensitive(String pkg, int uid) {
+    public int getVisibilityOverride(String pkg, int uid) {
         try {
-            return sINM.getVisibilityOverride(pkg, uid) == Notification.VISIBILITY_PRIVATE;
+            return sINM.getVisibilityOverride(pkg, uid);
         } catch (Exception e) {
             Log.w(TAG, "Error calling NoMan", e);
-            return false;
+            return NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE;
         }
     }
 
-    public boolean setSensitive(String pkg, int uid, boolean sensitive) {
+    public boolean setVisibilityOverride(String pkg, int uid, int override) {
         try {
-            sINM.setVisibilityOverride(pkg, uid,
-                    sensitive ? Notification.VISIBILITY_PRIVATE
-                            : NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE);
+            sINM.setVisibilityOverride(pkg, uid, override);
             return true;
         } catch (Exception e) {
             Log.w(TAG, "Error calling NoMan", e);
@@ -143,6 +141,6 @@
         public boolean systemApp;
         public int appImportance;
         public boolean appBypassDnd;
-        public boolean appSensitive;
+        public int appVisOverride;
     }
 }
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index ee0cac0..314c2f8 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -34,6 +34,7 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService.Ranking;
+import android.support.v7.preference.DropDownPreference;
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
 import android.util.Log;
@@ -41,6 +42,8 @@
 import android.widget.Button;
 import android.widget.Toast;
 
+import java.util.ArrayList;
+
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 abstract public class NotificationSettingsBase extends SettingsPreferenceFragment {
@@ -49,7 +52,7 @@
     private static final String TUNER_SETTING = "show_importance_slider";
 
     protected static final String KEY_BYPASS_DND = "bypass_dnd";
-    protected static final String KEY_SENSITIVE = "sensitive";
+    protected static final String KEY_VISIBILITY_OVERRIDE = "visibility_override";
     protected static final String KEY_IMPORTANCE = "importance";
     protected static final String KEY_IMPORTANCE_TITLE = "importance_title";
     protected static final String KEY_IMPORTANCE_RESET = "importance_reset_button";
@@ -68,7 +71,7 @@
     protected RestrictedPreference mImportanceTitle;
     protected LayoutPreference mImportanceReset;
     protected RestrictedSwitchPreference mPriority;
-    protected RestrictedSwitchPreference mSensitive;
+    protected DropDownPreference mVisibilityOverride;
     protected RestrictedSwitchPreference mBlock;
     protected RestrictedSwitchPreference mSilent;
     protected EnforcedAdmin mSuspendedAppsAdmin;
@@ -144,9 +147,6 @@
         if (mPriority != null) {
             mPriority.setDisabledByAdmin(mSuspendedAppsAdmin);
         }
-        if (mSensitive != null) {
-            mSensitive.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
         if (mImportanceTitle != null) {
             mImportanceTitle.setDisabledByAdmin(mSuspendedAppsAdmin);
         }
@@ -273,18 +273,62 @@
         });
     }
 
-    protected void setupSensitivePref(boolean sensitive) {
-        mSensitive.setDisabledByAdmin(mSuspendedAppsAdmin);
-        mSensitive.setChecked(sensitive);
-        mSensitive.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+    protected void setupVisOverridePref(int sensitive) {
+        ArrayList<CharSequence> entries = new ArrayList<>();
+        ArrayList<CharSequence> values = new ArrayList<>();
+
+        if (getLockscreenNotificationsEnabled() && getLockscreenAllowPrivateNotifications()) {
+            entries.add(getString(R.string.lock_screen_notifications_summary_show));
+            values.add(Integer.toString(Ranking.VISIBILITY_NO_OVERRIDE));
+        }
+
+        entries.add(getString(R.string.lock_screen_notifications_summary_hide));
+        values.add(Integer.toString(Notification.VISIBILITY_PRIVATE));
+        entries.add(getString(R.string.lock_screen_notifications_summary_disable));
+        values.add(Integer.toString(Notification.VISIBILITY_SECRET));
+        mVisibilityOverride.setEntries(entries.toArray(new CharSequence[entries.size()]));
+        mVisibilityOverride.setEntryValues(values.toArray(new CharSequence[values.size()]));
+
+        if (sensitive == Ranking.VISIBILITY_NO_OVERRIDE) {
+            mVisibilityOverride.setValue(Integer.toString(getGlobalVisibility()));
+        } else {
+            mVisibilityOverride.setValue(Integer.toString(sensitive));
+        }
+        mVisibilityOverride.setSummary("%s");
+
+        mVisibilityOverride.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
             @Override
             public boolean onPreferenceChange(Preference preference, Object newValue) {
-                final boolean sensitive = (Boolean) newValue;
-                return mBackend.setSensitive(mPkgInfo.packageName, mUid, sensitive);
+                int sensitive = Integer.parseInt((String) newValue);
+                if (sensitive == getGlobalVisibility()) {
+                    sensitive = Ranking.VISIBILITY_NO_OVERRIDE;
+                }
+                mBackend.setVisibilityOverride(mPkgInfo.packageName, mUid, sensitive);
+                return true;
             }
         });
     }
 
+    private int getGlobalVisibility() {
+        int globalVis = Ranking.VISIBILITY_NO_OVERRIDE;
+        if (!getLockscreenNotificationsEnabled()) {
+            globalVis = Notification.VISIBILITY_SECRET;
+        } else if (!getLockscreenAllowPrivateNotifications()) {
+            globalVis = Notification.VISIBILITY_PRIVATE;
+        }
+        return globalVis;
+    }
+
+    protected boolean getLockscreenNotificationsEnabled() {
+        return Settings.Secure.getInt(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
+    }
+
+    protected boolean getLockscreenAllowPrivateNotifications() {
+        return Settings.Secure.getInt(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0;
+    }
+
     abstract void updateDependents(int progress);
 
     protected void setVisible(Preference p, boolean visible) {