Merge "AOD: Implement redacted notificatinos" into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
89e8b7b58e
@@ -4202,9 +4202,22 @@ public class Notification implements Parcelable
|
||||
* @hide
|
||||
*/
|
||||
public RemoteViews makePublicContentView() {
|
||||
return makePublicView(false /* ambient */);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a RemoteViews for the display in public contexts like on the lockscreen.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public RemoteViews makePublicAmbientNotification() {
|
||||
return makePublicView(true /* ambient */);
|
||||
}
|
||||
|
||||
private RemoteViews makePublicView(boolean ambient) {
|
||||
if (mN.publicVersion != null) {
|
||||
final Builder builder = recoverBuilder(mContext, mN.publicVersion);
|
||||
return builder.createContentView();
|
||||
return ambient ? builder.makeAmbientNotification() : builder.createContentView();
|
||||
}
|
||||
Bundle savedBundle = mN.extras;
|
||||
Style style = mStyle;
|
||||
@@ -4221,14 +4234,15 @@ public class Notification implements Parcelable
|
||||
publicExtras.putBoolean(EXTRA_CHRONOMETER_COUNT_DOWN,
|
||||
savedBundle.getBoolean(EXTRA_CHRONOMETER_COUNT_DOWN));
|
||||
publicExtras.putCharSequence(EXTRA_TITLE,
|
||||
mContext.getString(R.string.notification_hidden_text));
|
||||
mContext.getString(com.android.internal.R.string.notification_hidden_text));
|
||||
mN.extras = publicExtras;
|
||||
final RemoteViews publicView = applyStandardTemplate(getBaseLayoutResource());
|
||||
final RemoteViews view = ambient ? makeAmbientNotification()
|
||||
: applyStandardTemplate(getBaseLayoutResource());
|
||||
mN.extras = savedBundle;
|
||||
mN.mLargeIcon = largeIcon;
|
||||
mN.largeIcon = largeIconLegacy;
|
||||
mStyle = style;
|
||||
return publicView;
|
||||
return view;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1115,6 +1115,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
|
||||
mNotificationInflater.setInflateExceptionHandler(inflateExceptionHandler);
|
||||
}
|
||||
|
||||
public void setNeedsRedaction(boolean needsRedaction) {
|
||||
mNotificationInflater.setRedactAmbient(needsRedaction);
|
||||
}
|
||||
|
||||
public interface ExpansionLogger {
|
||||
public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
|
||||
}
|
||||
|
||||
@@ -428,6 +428,9 @@ public class NotificationContentView extends FrameLayout {
|
||||
mAmbientChild.animate().cancel();
|
||||
removeView(mAmbientChild);
|
||||
}
|
||||
if (child == null) {
|
||||
return;
|
||||
}
|
||||
addView(child);
|
||||
mAmbientChild = child;
|
||||
mAmbientWrapper = NotificationViewWrapper.wrap(getContext(), child,
|
||||
|
||||
@@ -21,6 +21,8 @@ import android.content.Context;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.widget.RemoteViews;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
@@ -49,6 +51,7 @@ public class NotificationInflater {
|
||||
private RemoteViews.OnClickHandler mRemoteViewClickHandler;
|
||||
private boolean mIsChildInGroup;
|
||||
private InflationExceptionHandler mInflateExceptionHandler;
|
||||
private boolean mRedactAmbient;
|
||||
|
||||
public NotificationInflater(ExpandableNotificationRow row) {
|
||||
mRow = row;
|
||||
@@ -92,6 +95,21 @@ public class NotificationInflater {
|
||||
mRemoteViewClickHandler = remoteViewClickHandler;
|
||||
}
|
||||
|
||||
public void setRedactAmbient(boolean redactAmbient) {
|
||||
if (mRedactAmbient != redactAmbient) {
|
||||
mRedactAmbient = redactAmbient;
|
||||
if (mRow.getEntry() == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
inflateNotificationViews(FLAG_REINFLATE_AMBIENT_VIEW);
|
||||
} catch (InflationException e) {
|
||||
mInflateExceptionHandler.handleInflationException(
|
||||
mRow.getStatusBarNotification(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void inflateNotificationViews() throws InflationException {
|
||||
inflateNotificationViews(FLAG_REINFLATE_ALL);
|
||||
}
|
||||
@@ -123,6 +141,8 @@ public class NotificationInflater {
|
||||
Notification.Builder builder, Context packageContext) {
|
||||
NotificationData.Entry entry = mRow.getEntry();
|
||||
NotificationContentView privateLayout = mRow.getPrivateLayout();
|
||||
NotificationContentView publicLayout = mRow.getPublicLayout();
|
||||
|
||||
boolean isLowPriority = mIsLowPriority && !mIsChildInGroup;
|
||||
if ((reInflateFlags & FLAG_REINFLATE_CONTENT_VIEW) != 0) {
|
||||
final RemoteViews newContentView = createContentView(builder,
|
||||
@@ -190,7 +210,6 @@ public class NotificationInflater {
|
||||
}
|
||||
|
||||
if ((reInflateFlags & FLAG_REINFLATE_PUBLIC_VIEW) != 0) {
|
||||
NotificationContentView publicLayout = mRow.getPublicLayout();
|
||||
final RemoteViews newPublicNotification
|
||||
= builder.makePublicContentView();
|
||||
if (!compareRemoteViews(newPublicNotification, entry.cachedPublicContentView)) {
|
||||
@@ -209,18 +228,24 @@ public class NotificationInflater {
|
||||
}
|
||||
|
||||
if ((reInflateFlags & FLAG_REINFLATE_AMBIENT_VIEW) != 0) {
|
||||
final RemoteViews newAmbientNotification
|
||||
= builder.makeAmbientNotification();
|
||||
if (!compareRemoteViews(newAmbientNotification, entry.cachedAmbientContentView)) {
|
||||
final RemoteViews newAmbientNotification = mRedactAmbient
|
||||
? builder.makePublicAmbientNotification()
|
||||
: builder.makeAmbientNotification();
|
||||
NotificationContentView newParent = mRedactAmbient ? publicLayout : privateLayout;
|
||||
NotificationContentView otherParent = !mRedactAmbient ? publicLayout : privateLayout;
|
||||
|
||||
if (newParent.getAmbientChild() == null ||
|
||||
!compareRemoteViews(newAmbientNotification, entry.cachedAmbientContentView)) {
|
||||
View ambientContentView = newAmbientNotification.apply(
|
||||
packageContext,
|
||||
privateLayout,
|
||||
newParent,
|
||||
mRemoteViewClickHandler);
|
||||
ambientContentView.setIsRootNamespace(true);
|
||||
privateLayout.setAmbientChild(ambientContentView);
|
||||
newParent.setAmbientChild(ambientContentView);
|
||||
otherParent.setAmbientChild(null);
|
||||
} else {
|
||||
newAmbientNotification.reapply(packageContext,
|
||||
privateLayout.getAmbientChild(),
|
||||
newParent.getAmbientChild(),
|
||||
mRemoteViewClickHandler);
|
||||
}
|
||||
entry.cachedAmbientContentView = newAmbientNotification;
|
||||
|
||||
@@ -49,10 +49,8 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.IntentSender;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.IPackageManager;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.database.ContentObserver;
|
||||
@@ -141,7 +139,6 @@ import com.android.systemui.doze.DozeLog;
|
||||
import com.android.systemui.fragments.FragmentHostManager;
|
||||
import com.android.systemui.fragments.PluginFragmentListener;
|
||||
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||
import com.android.systemui.pip.phone.PipManager;
|
||||
import com.android.systemui.plugins.qs.QS;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
|
||||
@@ -1814,6 +1811,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
updatePublicContentView(ent, ent.notification);
|
||||
}
|
||||
ent.row.setSensitive(sensitive, deviceSensitive);
|
||||
ent.row.setNeedsRedaction(needsRedaction(ent));
|
||||
if (mGroupManager.isChildInGroupWithSummary(ent.row.getStatusBarNotification())) {
|
||||
ExpandableNotificationRow summary = mGroupManager.getGroupSummary(
|
||||
ent.row.getStatusBarNotification());
|
||||
@@ -1902,6 +1900,21 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
mNotificationIconAreaController.updateNotificationIcons(mNotificationData);
|
||||
}
|
||||
|
||||
/** @return true if the entry needs redaction when on the lockscreen. */
|
||||
private boolean needsRedaction(Entry ent) {
|
||||
int userId = ent.notification.getUserId();
|
||||
|
||||
boolean currentUserWantsRedaction = !userAllowsPrivateNotificationsInPublic(mCurrentUserId);
|
||||
boolean notiUserWantsRedaction = !userAllowsPrivateNotificationsInPublic(userId);
|
||||
boolean redactedLockscreen = currentUserWantsRedaction || notiUserWantsRedaction;
|
||||
|
||||
boolean notificationRequestsRedaction =
|
||||
ent.notification.getNotification().visibility == Notification.VISIBILITY_PRIVATE;
|
||||
boolean userForcesRedaction = packageHasVisibilityOverride(ent.notification.getKey());
|
||||
|
||||
return userForcesRedaction || notificationRequestsRedaction && redactedLockscreen;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable QS if device not provisioned.
|
||||
* If the user switcher is simple then disable QS during setup because
|
||||
@@ -6166,6 +6179,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
}
|
||||
}
|
||||
|
||||
row.setNeedsRedaction(needsRedaction(entry));
|
||||
boolean isLowPriority = mNotificationData.isAmbient(sbn.getKey());
|
||||
row.setIsLowPriority(isLowPriority);
|
||||
// bind the click event to the content area
|
||||
@@ -6530,7 +6544,6 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
NotificationData.Entry entry = new NotificationData.Entry(sbn);
|
||||
Dependency.get(LeakDetector.class).trackInstance(entry);
|
||||
entry.createIcons(mContext, sbn);
|
||||
|
||||
// Construct the expanded view.
|
||||
inflateViews(entry, mStackScroller);
|
||||
return entry;
|
||||
|
||||
Reference in New Issue
Block a user