Disable lockscreen notifications for secure users on upgrade.
Add a notification for those users that teaches them how to re-enable the notifications. Bug: 15934899 Depends-On: Ie0bcc207c4f331def207e588bbad36b8986fe114 Change-Id: I4a169e268042cfcaa4ad80cdf205904f9c90e76d
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -3706,6 +3715,14 @@ public final class Settings {
|
||||
public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS =
|
||||
"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.
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
24
packages/SystemUI/res/drawable/ic_android.xml
Normal file
24
packages/SystemUI/res/drawable/ic_android.xml
Normal file
@@ -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>
|
||||
24
packages/SystemUI/res/drawable/ic_close.xml
Normal file
24
packages/SystemUI/res/drawable/ic_close.xml
Normal file
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -582,6 +582,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
putComponent(PhoneStatusBar.class, this);
|
||||
|
||||
setControllerUsers();
|
||||
|
||||
notifyUserAboutHiddenNotifications();
|
||||
}
|
||||
|
||||
// ================================================================================
|
||||
|
||||
Reference in New Issue
Block a user