diff options
8 files changed, 188 insertions, 3 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 95d1351..53f1d19 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -904,6 +904,15 @@ public final class Settings { public static final String ACTION_APP_NOTIFICATION_SETTINGS = "android.settings.APP_NOTIFICATION_SETTINGS"; + /** + * Activity Action: Show notification redaction settings. + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_APP_NOTIFICATION_REDACTION + = "android.settings.ACTION_APP_NOTIFICATION_REDACTION"; + /** @hide */ public static final String EXTRA_APP_UID = "app_uid"; /** @hide */ public static final String EXTRA_APP_PACKAGE = "app_package"; @@ -3707,6 +3716,14 @@ public final class Settings { "lock_screen_allow_private_notifications"; /** + * Set by the system to track if the user needs to see the call to action for + * the lockscreen notification policy. + * @hide + */ + public static final String SHOW_NOTE_ABOUT_NOTIFICATION_HIDING = + "show_note_about_notification_hiding"; + + /** * The Logging ID (a unique 64-bit value) as a hex string. * Used as a pseudonymous identifier for logging. * @deprecated This identifier is poorly initialized and has diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 299e50c..a3bed4f 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -187,6 +187,9 @@ <!-- Default for Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1==on --> <integer name="def_lock_screen_show_notifications">1</integer> + <!-- Default for Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS --> + <bool name="def_lock_screen_allow_private_notifications">true</bool> + <!-- Default for Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED, 1==on --> <integer name="def_heads_up_enabled">1</integer> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index edefb13..fd5e6fe 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -70,7 +70,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion' // is properly propagated through your change. Not doing so will result in a loss of user // settings. - private static final int DATABASE_VERSION = 108; + private static final int DATABASE_VERSION = 109; private Context mContext; private int mUserHandle; @@ -1673,8 +1673,8 @@ public class DatabaseHelper extends SQLiteOpenHelper { try { stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)" + " VALUES(?,?);"); - loadBooleanSetting(stmt, Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, - R.bool.def_guest_user_enabled); + loadIntegerSetting(stmt, Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, + R.integer.def_lock_screen_show_notifications); if (mUserHandle == UserHandle.USER_OWNER) { final int oldShow = getIntValueFromTable(db, TABLE_GLOBAL, Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, -1); @@ -1733,6 +1733,22 @@ public class DatabaseHelper extends SQLiteOpenHelper { upgradeVersion = 108; } + if (upgradeVersion < 109) { + db.beginTransaction(); + SQLiteStatement stmt = null; + try { + stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)" + + " VALUES(?,?);"); + loadBooleanSetting(stmt, Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, + R.bool.def_lock_screen_allow_private_notifications); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + if (stmt != null) stmt.close(); + } + upgradeVersion = 109; + } + // *** Remember to update DATABASE_VERSION above! if (upgradeVersion != currentVersion) { @@ -2301,6 +2317,9 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadIntegerSetting(stmt, Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, R.integer.def_lock_screen_show_notifications); + loadBooleanSetting(stmt, Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, + R.bool.def_lock_screen_allow_private_notifications); + } finally { if (stmt != null) stmt.close(); } diff --git a/packages/SystemUI/res/drawable/ic_android.xml b/packages/SystemUI/res/drawable/ic_android.xml new file mode 100644 index 0000000..19ee9a7 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_android.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24.0dp" + android:height="24.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:pathData="M6.000000,18.000000c0.000000,0.600000 0.400000,1.000000 1.000000,1.000000l1.000000,0.000000l0.000000,3.500000C8.000000,23.299999 8.700000,24.000000 9.500000,24.000000c0.800000,0.000000 1.500000,-0.700000 1.500000,-1.500000L11.000000,19.000000l2.000000,0.000000l0.000000,3.500000c0.000000,0.800000 0.700000,1.500000 1.500000,1.500000c0.800000,0.000000 1.500000,-0.700000 1.500000,-1.500000L16.000000,19.000000l1.000000,0.000000c0.600000,0.000000 1.000000,-0.400000 1.000000,-1.000000L18.000000,8.000000L6.000000,8.000000L6.000000,18.000000zM3.500000,8.000000C2.700000,8.000000 2.000000,8.700000 2.000000,9.500000l0.000000,7.000000C2.000000,17.299999 2.700000,18.000000 3.500000,18.000000C4.300000,18.000000 5.000000,17.299999 5.000000,16.500000l0.000000,-7.000000C5.000000,8.700000 4.300000,8.000000 3.500000,8.000000zM20.500000,8.000000C19.700001,8.000000 19.000000,8.700000 19.000000,9.500000l0.000000,7.000000c0.000000,0.800000 0.700000,1.500000 1.500000,1.500000c0.800000,0.000000 1.500000,-0.700000 1.500000,-1.500000l0.000000,-7.000000C22.000000,8.700000 21.299999,8.000000 20.500000,8.000000zM15.500000,2.200000l1.300000,-1.300000c0.200000,-0.200000 0.200000,-0.500000 0.000000,-0.700000c-0.200000,-0.200000 -0.500000,-0.200000 -0.700000,0.000000l-1.500000,1.500000C13.900000,1.200000 13.000000,1.000000 12.000000,1.000000c-1.000000,0.000000 -1.900000,0.200000 -2.700000,0.600000L7.900000,0.100000C7.700000,0.000000 7.300000,0.000000 7.100000,0.100000C7.000000,0.300000 7.000000,0.700000 7.100000,0.900000l1.300000,1.300000C7.000000,3.300000 6.000000,5.000000 6.000000,7.000000l12.000000,0.000000C18.000000,5.000000 17.000000,3.200000 15.500000,2.200000zM10.000000,5.000000L9.000000,5.000000L9.000000,4.000000l1.000000,0.000000L10.000000,5.000000zM15.000000,5.000000l-1.000000,0.000000L14.000000,4.000000l1.000000,0.000000L15.000000,5.000000z" + android:fillColor="#ffffffff"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_close.xml b/packages/SystemUI/res/drawable/ic_close.xml new file mode 100644 index 0000000..7d93d45 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_close.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24.0dp" + android:height="24.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:pathData="M19.000000,6.400000l-1.400000,-1.400000 -5.600000,5.600000 -5.600000,-5.600000 -1.400000,1.400000 5.600000,5.600000 -5.600000,5.600000 1.400000,1.400000 5.600000,-5.600000 5.600000,5.600000 1.400000,-1.400000 -5.600000,-5.600000z" + android:fillColor="#FF000000"/> +</vector> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 0fe389a..3e9a25a 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -323,6 +323,15 @@ <!-- Content description of an item with full signal for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_signal_full">Signal full.</string> + <!-- Content description of an item that is turned on for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_desc_on">On.</string> + <!-- Content description of an item that is turned off for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_desc_off">Off.</string> + <!-- Content description of an item that is connected for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_desc_connected">Connected.</string> + <!-- Content description of an item that is connecting for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_desc_connecting">Connecting.</string> + <!-- Content description of the data connection type GPRS for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_data_connection_gprs">GPRS</string> @@ -870,6 +879,18 @@ <!-- Indication on the keyguard that appears when the user disables trust agents until the next time they unlock manually. [CHAR LIMIT=NONE] --> <string name="keyguard_indication_trust_disabled">Device will stay locked until you manually unlock</string> + <!-- Title of notification educating the user about enabling notifications on the lockscreen. [CHAR LIMIT=40] --> + <string name="hidden_notifications_title">Get notifications faster</string> + + <!-- Body of notification educating the user about enabling notifications on the lockscreen. [CHAR LIMIT=60] --> + <string name="hidden_notifications_text">See them before you unlock</string> + + <!-- Cancel action for notification educating the user about enabling notifications on the lockscreen. [CHAR LIMIT=10] --> + <string name="hidden_notifications_cancel">No thanks</string> + + <!-- continue action for notification educating the user about enabling notifications on the lockscreen. [CHAR LIMIT=10] --> + <string name="hidden_notifications_setup">Set up</string> + <!-- Indication that the current volume and other effects (vibration) are being suppressed by a third party, such as a notification listener. [CHAR LIMIT=30] --> <string name="muted_by">Muted by <xliff:g id="third_party">%1$s</xliff:g></string> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 35ed3e5..7889244 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -22,6 +22,7 @@ import android.animation.TimeInterpolator; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.Notification; +import android.app.NotificationManager; import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.app.admin.DevicePolicyManager; @@ -35,7 +36,11 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.content.res.Configuration; +import android.content.res.Resources; import android.database.ContentObserver; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; @@ -78,6 +83,7 @@ import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.statusbar.StatusBarIconList; import com.android.internal.util.NotificationColorUtil; +import com.android.internal.widget.LockPatternUtils; import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SearchPanelView; @@ -126,6 +132,12 @@ public abstract class BaseStatusBar extends SystemUI implements public static final int EXPANDED_LEAVE_ALONE = -10000; public static final int EXPANDED_FULL_OPEN = -10001; + private static final int HIDDEN_NOTIFICATION_ID = 10000; + private static final String BANNER_ACTION_CANCEL = + "com.android.systemui.statusbar.banner_action_cancel"; + private static final String BANNER_ACTION_SETUP = + "com.android.systemui.statusbar.banner_action_setup"; + protected CommandQueue mCommandQueue; protected IStatusBarService mBarService; protected H mHandler = createHandler(); @@ -308,6 +320,20 @@ public abstract class BaseStatusBar extends SystemUI implements mUsersAllowingPrivateNotifications.clear(); updateLockscreenNotificationSetting(); updateNotifications(); + } else if (BANNER_ACTION_CANCEL.equals(action) || BANNER_ACTION_SETUP.equals(action)) { + NotificationManager noMan = (NotificationManager) + mContext.getSystemService(Context.NOTIFICATION_SERVICE); + noMan.cancel(HIDDEN_NOTIFICATION_ID); + + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, 0); + if (BANNER_ACTION_SETUP.equals(action)) { + animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */); + mContext.startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_REDACTION) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + + ); + } } } }; @@ -490,12 +516,61 @@ public abstract class BaseStatusBar extends SystemUI implements IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_ADDED); + filter.addAction(BANNER_ACTION_CANCEL); + filter.addAction(BANNER_ACTION_SETUP); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); mContext.registerReceiver(mBroadcastReceiver, filter); updateCurrentProfilesCache(); } + protected void notifyUserAboutHiddenNotifications() { + if (0 != Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, 1)) { + Log.d(TAG, "user hasn't seen notification about hidden notifications"); + final LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext); + if (!lockPatternUtils.isSecure()) { + Log.d(TAG, "insecure lockscreen, skipping notification"); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, 0); + return; + } + Log.d(TAG, "disabling lockecreen notifications and alerting the user"); + // disable lockscreen notifications until user acts on the banner. + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0); + + final String packageName = mContext.getPackageName(); + PendingIntent cancelIntent = PendingIntent.getBroadcast(mContext, 0, + new Intent(BANNER_ACTION_CANCEL).setPackage(packageName), + PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent setupIntent = PendingIntent.getBroadcast(mContext, 0, + new Intent(BANNER_ACTION_SETUP).setPackage(packageName), + PendingIntent.FLAG_CANCEL_CURRENT); + + final Resources res = mContext.getResources(); + final int colorRes = com.android.internal.R.color.system_notification_accent_color; + Notification.Builder note = new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_android) + .setContentTitle(mContext.getString(R.string.hidden_notifications_title)) + .setContentText(mContext.getString(R.string.hidden_notifications_text)) + .setPriority(Notification.PRIORITY_HIGH) + .setOngoing(true) + .setColor(res.getColor(colorRes)) + .setContentIntent(setupIntent) + .addAction(R.drawable.ic_close, + mContext.getString(R.string.hidden_notifications_cancel), + cancelIntent) + .addAction(R.drawable.ic_settings, + mContext.getString(R.string.hidden_notifications_setup), + setupIntent); + + NotificationManager noMan = + (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + noMan.notify(HIDDEN_NOTIFICATION_ID, note.build()); + } + } + public void userSwitched(int newUserId) { // should be overridden } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 9fd3d9c..d5a8df9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -582,6 +582,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, putComponent(PhoneStatusBar.class, this); setControllerUsers(); + + notifyUserAboutHiddenNotifications(); } // ================================================================================ |