Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d8b1de7a authored by Julia Reynolds's avatar Julia Reynolds Committed by Android Build Coastguard Worker
Browse files

Hide notification content in history

- if the user is locked
- and the user has chosen to hide sensistive content when locked

Test: manual with a work profile with a different pin
Bug: 378088320
Flag: EXEMPT bug fix
(cherry picked from commit 9df37c3f)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:069aca2a8c4687626ed1356dd057d0284618a513)
Merged-In: Ia70454d9859fb788ffa1f48f88760f88c354cdff
Change-Id: Ia70454d9859fb788ffa1f48f88760f88c354cdff
parent cc1b1b5e
Loading
Loading
Loading
Loading
+28 −4
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.settings.notification.history;
package com.android.settings.notification.history;


import static android.provider.Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS;
import static android.provider.Settings.Secure.NOTIFICATION_HISTORY_ENABLED;
import static android.provider.Settings.Secure.NOTIFICATION_HISTORY_ENABLED;


import static androidx.core.view.accessibility.AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED;
import static androidx.core.view.accessibility.AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED;
@@ -25,9 +26,11 @@ import android.annotation.ColorInt;
import android.app.ActionBar;
import android.app.ActionBar;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.INotificationManager;
import android.app.INotificationManager;
import android.app.KeyguardManager;
import android.content.ComponentName;
import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.TypedArray;
import android.graphics.Outline;
import android.graphics.Outline;
@@ -58,6 +61,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.NotificationExpandButton;
import com.android.internal.widget.NotificationExpandButton;
import com.android.settings.R;
import com.android.settings.R;
import com.android.settings.notification.NotificationBackend;
import com.android.settings.notification.NotificationBackend;
@@ -68,6 +72,7 @@ import com.android.settingslib.widget.MainSwitchBar;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
@@ -113,6 +118,9 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
    };
    };
    private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
    private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();


    // List of users that have the setting "hide sensitive content" enabled on the lockscreen
    private ArrayList<Integer> mContentRestrictedUsers = new ArrayList<>();

    enum NotificationHistoryEvent implements UiEventLogger.UiEventEnum {
    enum NotificationHistoryEvent implements UiEventLogger.UiEventEnum {
        @UiEvent(doc = "User turned on notification history")
        @UiEvent(doc = "User turned on notification history")
        NOTIFICATION_HISTORY_ON(504),
        NOTIFICATION_HISTORY_ON(504),
@@ -212,14 +220,14 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {


            final NotificationHistoryRecyclerView rv =
            final NotificationHistoryRecyclerView rv =
                    viewForPackage.findViewById(R.id.notification_list);
                    viewForPackage.findViewById(R.id.notification_list);
            rv.setAdapter(new NotificationHistoryAdapter(mNm, rv,
            rv.setAdapter(new NotificationHistoryAdapter(NotificationHistoryActivity.this, mNm, rv,
                    newCount -> {
                    newCount -> {
                        count.setText(StringUtil.getIcuPluralsString(this, newCount,
                        count.setText(StringUtil.getIcuPluralsString(this, newCount,
                                R.string.notification_history_count));
                                R.string.notification_history_count));
                        if (newCount == 0) {
                        if (newCount == 0) {
                            viewForPackage.setVisibility(View.GONE);
                            viewForPackage.setVisibility(View.GONE);
                        }
                        }
                    }, mUiEventLogger));
                    }, mUiEventLogger, mContentRestrictedUsers));
            ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete(
            ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete(
                    new ArrayList<>(nhp.notifications));
                    new ArrayList<>(nhp.notifications));


@@ -263,6 +271,21 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {


        mPm = getPackageManager();
        mPm = getPackageManager();
        mUm = getSystemService(UserManager.class);
        mUm = getSystemService(UserManager.class);

        mContentRestrictedUsers.clear();
        List<UserInfo> users = mUm.getProfiles(getUserId());
        mContentRestrictedUsers.clear();
        for (UserInfo user : users) {
            if (Settings.Secure.getIntForUser(getContentResolver(),
                    LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, user.id) == 0) {
                LockPatternUtils lpu = new LockPatternUtils(this);
                KeyguardManager km = getSystemService(KeyguardManager.class);
                if (lpu.isSecure(user.id) && km.isDeviceLocked(user.id)) {
                    mContentRestrictedUsers.add(user.id);
                }
            }
        }

        // wait for history loading and recent/snooze loading
        // wait for history loading and recent/snooze loading
        mCountdownLatch = new CountDownLatch(2);
        mCountdownLatch = new CountDownLatch(2);


@@ -317,6 +340,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
        if (mCountdownFuture != null) {
        if (mCountdownFuture != null) {
            mCountdownFuture.cancel(true);
            mCountdownFuture.cancel(true);
        }
        }
        mContentRestrictedUsers.clear();
        super.onDestroy();
        super.onDestroy();
    }
    }


@@ -406,7 +430,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
            mSnoozedRv.setLayoutManager(lm);
            mSnoozedRv.setLayoutManager(lm);
            mSnoozedRv.setAdapter(
            mSnoozedRv.setAdapter(
                    new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm, mUm,
                    new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm, mUm,
                            true, mUiEventLogger));
                            true, mUiEventLogger, mContentRestrictedUsers));
            mSnoozedRv.setNestedScrollingEnabled(false);
            mSnoozedRv.setNestedScrollingEnabled(false);


            if (snoozed == null || snoozed.length == 0) {
            if (snoozed == null || snoozed.length == 0) {
@@ -422,7 +446,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
            mDismissedRv.setLayoutManager(dismissLm);
            mDismissedRv.setLayoutManager(dismissLm);
            mDismissedRv.setAdapter(
            mDismissedRv.setAdapter(
                    new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm, mUm,
                    new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm, mUm,
                            false, mUiEventLogger));
                            false, mUiEventLogger, mContentRestrictedUsers));
            mDismissedRv.setNestedScrollingEnabled(false);
            mDismissedRv.setNestedScrollingEnabled(false);


            if (dismissed == null || dismissed.length == 0) {
            if (dismissed == null || dismissed.length == 0) {
+18 −4
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.provider.Settings.EXTRA_CONVERSATION_ID;


import android.app.INotificationManager;
import android.app.INotificationManager;
import android.app.NotificationHistory.HistoricalNotification;
import android.app.NotificationHistory.HistoricalNotification;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.os.Bundle;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.RemoteException;
@@ -53,16 +54,23 @@ public class NotificationHistoryAdapter extends
    private List<HistoricalNotification> mValues;
    private List<HistoricalNotification> mValues;
    private OnItemDeletedListener mListener;
    private OnItemDeletedListener mListener;
    private UiEventLogger mUiEventLogger;
    private UiEventLogger mUiEventLogger;
    public NotificationHistoryAdapter(INotificationManager nm,
    private ArrayList<Integer> mContentRestrictedUsers = new ArrayList<>();
    Context mContext;

    public NotificationHistoryAdapter(Context context,
            INotificationManager nm,
            NotificationHistoryRecyclerView listView,
            NotificationHistoryRecyclerView listView,
            OnItemDeletedListener listener,
            OnItemDeletedListener listener,
            UiEventLogger uiEventLogger) {
            UiEventLogger uiEventLogger,
            ArrayList<Integer> contentRestrictedUsers) {
        mContext = context;
        mValues = new ArrayList<>();
        mValues = new ArrayList<>();
        setHasStableIds(true);
        setHasStableIds(true);
        listView.setOnItemSwipeDeleteListener(this);
        listView.setOnItemSwipeDeleteListener(this);
        mNm = nm;
        mNm = nm;
        mListener = listener;
        mListener = listener;
        mUiEventLogger = uiEventLogger;
        mUiEventLogger = uiEventLogger;
        mContentRestrictedUsers = contentRestrictedUsers;
    }
    }


    @Override
    @Override
@@ -81,8 +89,14 @@ public class NotificationHistoryAdapter extends
    public void onBindViewHolder(final @NonNull NotificationHistoryViewHolder holder,
    public void onBindViewHolder(final @NonNull NotificationHistoryViewHolder holder,
            int position) {
            int position) {
        final HistoricalNotification hn = mValues.get(position);
        final HistoricalNotification hn = mValues.get(position);
        // Redact sensitive notification content if needed
        if (mContentRestrictedUsers.contains(hn.getUserId())) {
            holder.setSummary(mContext.getString(
                    com.android.internal.R.string.notification_hidden_text));
        } else {
            holder.setTitle(hn.getTitle());
            holder.setTitle(hn.getTitle());
            holder.setSummary(hn.getText());
            holder.setSummary(hn.getText());
        }
        holder.setPostedTime(hn.getPostedTimeMs());
        holder.setPostedTime(hn.getPostedTimeMs());
        final View.OnClickListener onClick = v -> {
        final View.OnClickListener onClick = v -> {
            mUiEventLogger.logWithPosition(NotificationHistoryActivity.NotificationHistoryEvent
            mUiEventLogger.logWithPosition(NotificationHistoryActivity.NotificationHistoryEvent
+12 −3
Original line number Original line Diff line number Diff line
@@ -74,9 +74,11 @@ public class NotificationSbnAdapter extends
    private List<Integer> mEnabledProfiles = new ArrayList<>();
    private List<Integer> mEnabledProfiles = new ArrayList<>();
    private boolean mIsSnoozed;
    private boolean mIsSnoozed;
    private UiEventLogger mUiEventLogger;
    private UiEventLogger mUiEventLogger;
    private ArrayList<Integer> mContentRestrictedUsers = new ArrayList<>();


    public NotificationSbnAdapter(Context context, PackageManager pm, UserManager um,
    public NotificationSbnAdapter(Context context, PackageManager pm, UserManager um,
            boolean isSnoozed, UiEventLogger uiEventLogger) {
            boolean isSnoozed, UiEventLogger uiEventLogger,
            ArrayList<Integer> contentRestrictedUsers) {
        mContext = context;
        mContext = context;
        mPm = pm;
        mPm = pm;
        mUserBadgeCache = new HashMap<>();
        mUserBadgeCache = new HashMap<>();
@@ -97,6 +99,7 @@ public class NotificationSbnAdapter extends
        // If true, this is the panel for snoozed notifs, otherwise the one for dismissed notifs.
        // If true, this is the panel for snoozed notifs, otherwise the one for dismissed notifs.
        mIsSnoozed = isSnoozed;
        mIsSnoozed = isSnoozed;
        mUiEventLogger = uiEventLogger;
        mUiEventLogger = uiEventLogger;
        mContentRestrictedUsers = contentRestrictedUsers;
    }
    }


    @Override
    @Override
@@ -114,8 +117,14 @@ public class NotificationSbnAdapter extends
            holder.setIconBackground(loadBackground(sbn));
            holder.setIconBackground(loadBackground(sbn));
            holder.setIcon(loadIcon(sbn));
            holder.setIcon(loadIcon(sbn));
            holder.setPackageLabel(loadPackageLabel(sbn.getPackageName()).toString());
            holder.setPackageLabel(loadPackageLabel(sbn.getPackageName()).toString());
            // If the notification is from a content restricted user, show generic text.
            if (mContentRestrictedUsers.contains(sbn.getNormalizedUserId())) {
                holder.setSummary(mContext.getString(
                        com.android.internal.R.string.notification_hidden_text));
            } else {
                holder.setTitle(getTitleString(sbn.getNotification()));
                holder.setTitle(getTitleString(sbn.getNotification()));
                holder.setSummary(getTextString(mContext, sbn.getNotification()));
                holder.setSummary(getTextString(mContext, sbn.getNotification()));
            }
            holder.setPostedTime(sbn.getPostTime());
            holder.setPostedTime(sbn.getPostTime());
            holder.setDividerVisible(position < (mValues.size() -1));
            holder.setDividerVisible(position < (mValues.size() -1));
            int userId = normalizeUserId(sbn);
            int userId = normalizeUserId(sbn);