From e5359b283e50ea8f0a3f7d72fa247015d60b36a9 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 14 Jan 2025 11:17:14 -0500 Subject: [PATCH] Align history styling with Settings Fixes: 335717550 Bug: 349652992 Test: manual- view history in all states with new styling enabled and disabled Flag: EXEMPT bug fix Change-Id: I8ccf5d848691f954cb1b0a79c773ad76ab6c371a --- res/layout/notification_history.xml | 12 +- .../notification_history_app_layout.xml | 11 +- res/layout/notification_history_log_row.xml | 21 ++- res/layout/notification_sbn_log_row.xml | 10 +- .../history/NotificationHistoryActivity.java | 127 ++++++++++-------- .../NotificationHistoryRecyclerView.java | 2 - .../history/NotificationSbnAdapter.java | 15 ++- .../history/NotificationSbnViewHolder.java | 6 - 8 files changed, 112 insertions(+), 92 deletions(-) diff --git a/res/layout/notification_history.xml b/res/layout/notification_history.xml index 29744cc7846..798ba4c3ac1 100644 --- a/res/layout/notification_history.xml +++ b/res/layout/notification_history.xml @@ -17,7 +17,6 @@ @@ -132,7 +131,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="16dp"> + android:paddingTop="16dp" + android:paddingBottom="16dp"> + android:orientation="vertical"> diff --git a/res/layout/notification_history_app_layout.xml b/res/layout/notification_history_app_layout.xml index 143fff8f7e5..c3cece75fd1 100644 --- a/res/layout/notification_history_app_layout.xml +++ b/res/layout/notification_history_app_layout.xml @@ -25,6 +25,8 @@ android:id="@+id/app_header" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" + android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingTop="20dp" android:paddingBottom="18dp" android:paddingStart="16dp" @@ -84,15 +86,12 @@ - - + android:layout_height="wrap_content" + android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" + android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"> + + + android:textAlignment="viewStart" + android:paddingBottom="16dp" /> + diff --git a/res/layout/notification_sbn_log_row.xml b/res/layout/notification_sbn_log_row.xml index 23bc110da8b..cfd74d37c44 100644 --- a/res/layout/notification_sbn_log_row.xml +++ b/res/layout/notification_sbn_log_row.xml @@ -22,8 +22,10 @@ @@ -128,11 +130,5 @@ /> - - \ No newline at end of file diff --git a/src/com/android/settings/notification/history/NotificationHistoryActivity.java b/src/com/android/settings/notification/history/NotificationHistoryActivity.java index 156df96e04e..709eb7fc9e0 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryActivity.java +++ b/src/com/android/settings/notification/history/NotificationHistoryActivity.java @@ -17,11 +17,14 @@ package com.android.settings.notification.history; import static android.provider.Settings.Secure.NOTIFICATION_HISTORY_ENABLED; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; import static androidx.core.view.accessibility.AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED; import android.annotation.AttrRes; import android.annotation.ColorInt; +import android.annotation.DrawableRes; import android.app.ActionBar; import android.app.ActivityManager; import android.app.INotificationManager; @@ -30,7 +33,6 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.Outline; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; @@ -41,12 +43,10 @@ import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.util.Log; import android.util.Slog; -import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.ViewOutlineProvider; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageView; import android.widget.TextView; @@ -95,22 +95,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { private PackageManager mPm; private CountDownLatch mCountdownLatch; private Future mCountdownFuture; - private final ViewOutlineProvider mOutlineProvider = new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - final TypedArray ta = NotificationHistoryActivity.this.obtainStyledAttributes( - new int[]{android.R.attr.dialogCornerRadius}); - final float dialogCornerRadius = ta.getDimension(0, 0); - ta.recycle(); - TypedValue v = new TypedValue(); - NotificationHistoryActivity.this.getTheme().resolveAttribute( - com.android.internal.R.attr.listDivider, v, true); - int bottomPadding = NotificationHistoryActivity.this.getDrawable(v.resourceId) - .getIntrinsicHeight(); - outline.setRoundRect(0, 0, view.getWidth(), (view.getHeight() - bottomPadding), - dialogCornerRadius); - } - }; + private UiEventLogger mUiEventLogger = new UiEventLoggerImpl(); enum NotificationHistoryEvent implements UiEventLogger.UiEventEnum { @@ -158,20 +143,28 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { private HistoryLoader.OnHistoryLoaderListener mOnHistoryLoaderListener = notifications -> { findViewById(R.id.today_list).setVisibility( - notifications.isEmpty() ? View.GONE : View.VISIBLE); + notifications.isEmpty() ? GONE : VISIBLE); mCountdownLatch.countDown(); View recyclerView = mTodayView.findViewById(R.id.apps); recyclerView.setClipToOutline(true); - mTodayView.setOutlineProvider(mOutlineProvider); - mSnoozeView.setOutlineProvider(mOutlineProvider); // for each package, new header and recycler view for (int i = 0, notificationsSize = notifications.size(); i < notificationsSize; i++) { NotificationHistoryPackage nhp = notifications.get(i); View viewForPackage = LayoutInflater.from(this) .inflate(R.layout.notification_history_app_layout, null); + int cornerType = ROUND_CORNER_CENTER; + if (i == (notificationsSize - 1)) { + cornerType |= ROUND_CORNER_BOTTOM; + } + if (i == 0) { + cornerType |= ROUND_CORNER_TOP; + } + int backgroundRes = NotificationHistoryActivity.getRoundCornerDrawableRes(cornerType); + viewForPackage.setBackgroundResource(backgroundRes); + final View container = viewForPackage.findViewById(R.id.notification_list_wrapper); - container.setVisibility(View.GONE); + container.setVisibility(GONE); View header = viewForPackage.findViewById(R.id.app_header); NotificationExpandButton expand = viewForPackage.findViewById( com.android.internal.R.id.expand_button); @@ -181,19 +174,19 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { expand.setDefaultPillColor(pillColor); expand.setDefaultTextColor(textColor); expand.setExpanded(false); - header.setStateDescription(container.getVisibility() == View.VISIBLE + header.setStateDescription(container.getVisibility() == VISIBLE ? getString(R.string.condition_expand_hide) : getString(R.string.condition_expand_show)); int finalI = i; header.setOnClickListener(v -> { - container.setVisibility(container.getVisibility() == View.VISIBLE - ? View.GONE : View.VISIBLE); - expand.setExpanded(container.getVisibility() == View.VISIBLE); - header.setStateDescription(container.getVisibility() == View.VISIBLE + container.setVisibility(container.getVisibility() == VISIBLE + ? GONE : VISIBLE); + expand.setExpanded(container.getVisibility() == VISIBLE); + header.setStateDescription(container.getVisibility() == VISIBLE ? getString(R.string.condition_expand_hide) : getString(R.string.condition_expand_show)); header.sendAccessibilityEvent(TYPE_VIEW_ACCESSIBILITY_FOCUSED); - mUiEventLogger.logWithPosition((container.getVisibility() == View.VISIBLE) + mUiEventLogger.logWithPosition((container.getVisibility() == VISIBLE) ? NotificationHistoryEvent.NOTIFICATION_HISTORY_PACKAGE_HISTORY_OPEN : NotificationHistoryEvent.NOTIFICATION_HISTORY_PACKAGE_HISTORY_CLOSE, nhp.uid, nhp.pkgName, finalI); @@ -217,7 +210,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { count.setText(StringUtil.getIcuPluralsString(this, newCount, R.string.notification_history_count)); if (newCount == 0) { - viewForPackage.setVisibility(View.GONE); + viewForPackage.setVisibility(GONE); } }, mUiEventLogger)); ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete( @@ -227,11 +220,6 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { } }; - private void configureNotificationList(View recyclerView) { - recyclerView.setClipToOutline(true); - recyclerView.setOutlineProvider(mOutlineProvider); - } - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -240,8 +228,6 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { mTodayView = findViewById(R.id.apps); mSnoozeView = findViewById(R.id.snoozed_list); mDismissView = findViewById(R.id.recently_dismissed_list); - configureNotificationList(mDismissView.findViewById(R.id.notification_list)); - configureNotificationList(mSnoozeView.findViewById(R.id.notification_list)); mHistoryOff = findViewById(R.id.history_off); mHistoryOn = findViewById(R.id.history_on); mHistoryEmpty = findViewById(R.id.history_on_empty); @@ -289,11 +275,11 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { } ThreadUtils.postOnMainThread(() -> { if (mSwitchBar.isChecked() - && findViewById(R.id.today_list).getVisibility() == View.GONE - && mSnoozeView.getVisibility() == View.GONE - && mDismissView.getVisibility() == View.GONE) { - mHistoryOn.setVisibility(View.GONE); - mHistoryEmpty.setVisibility(View.VISIBLE); + && findViewById(R.id.today_list).getVisibility() == GONE + && mSnoozeView.getVisibility() == GONE + && mDismissView.getVisibility() == GONE) { + mHistoryOn.setVisibility(GONE); + mHistoryEmpty.setVisibility(VISIBLE); } }); }); @@ -320,6 +306,33 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { super.onDestroy(); } + public static final int ROUND_CORNER_CENTER = 1; + public static final int ROUND_CORNER_TOP = 1 << 1; + public static final int ROUND_CORNER_BOTTOM = 1 << 2; + + public static @DrawableRes int getRoundCornerDrawableRes(int cornerType) { + + if ((cornerType & ROUND_CORNER_CENTER) == 0) { + return 0; + } + + if (((cornerType & ROUND_CORNER_TOP) != 0) && ((cornerType & ROUND_CORNER_BOTTOM) == 0)) { + // the first + return com.android.settingslib.widget.theme.R.drawable.settingslib_round_background_top; + } else if (((cornerType & ROUND_CORNER_BOTTOM) != 0) + && ((cornerType & ROUND_CORNER_TOP) == 0)) { + // the last + return com.android.settingslib.widget.theme.R.drawable.settingslib_round_background_bottom; + } else if (((cornerType & ROUND_CORNER_TOP) != 0) + && ((cornerType & ROUND_CORNER_BOTTOM) != 0)) { + // the only one preference + return com.android.settingslib.widget.theme.R.drawable.settingslib_round_background; + } else { + // in the center + return com.android.settingslib.widget.theme.R.drawable.settingslib_round_background_center; + } + } + private @ColorInt int obtainThemeColor(@AttrRes int attrRes) { Resources.Theme theme = new ContextThemeWrapper(this, android.R.style.Theme_DeviceDefault_DayNight).getTheme(); @@ -345,14 +358,14 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { private void toggleViews(boolean isChecked) { if (isChecked) { - mHistoryOff.setVisibility(View.GONE); - mHistoryOn.setVisibility(View.VISIBLE); + mHistoryOff.setVisibility(GONE); + mHistoryOn.setVisibility(VISIBLE); } else { - mHistoryOn.setVisibility(View.GONE); - mHistoryOff.setVisibility(View.VISIBLE); + mHistoryOn.setVisibility(GONE); + mHistoryOff.setVisibility(VISIBLE); mTodayView.removeAllViews(); } - mHistoryEmpty.setVisibility(View.GONE); + mHistoryEmpty.setVisibility(GONE); } private final OnCheckedChangeListener mOnSwitchClickListener = @@ -372,13 +385,13 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { Log.d(TAG, "onSwitchChange history to " + isChecked); } // Reset UI visibility to ensure it matches real state. - mHistoryOn.setVisibility(View.GONE); + mHistoryOn.setVisibility(GONE); if (isChecked) { - mHistoryEmpty.setVisibility(View.VISIBLE); - mHistoryOff.setVisibility(View.GONE); + mHistoryEmpty.setVisibility(VISIBLE); + mHistoryOff.setVisibility(GONE); } else { - mHistoryOff.setVisibility(View.VISIBLE); - mHistoryEmpty.setVisibility(View.GONE); + mHistoryOff.setVisibility(VISIBLE); + mHistoryEmpty.setVisibility(GONE); } mTodayView.removeAllViews(); }; @@ -410,7 +423,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { mSnoozedRv.setNestedScrollingEnabled(false); if (snoozed == null || snoozed.length == 0) { - mSnoozeView.setVisibility(View.GONE); + mSnoozeView.setVisibility(GONE); } else { ((NotificationSbnAdapter) mSnoozedRv.getAdapter()).onRebuildComplete( new ArrayList<>(Arrays.asList(snoozed))); @@ -426,9 +439,9 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { mDismissedRv.setNestedScrollingEnabled(false); if (dismissed == null || dismissed.length == 0) { - mDismissView.setVisibility(View.GONE); + mDismissView.setVisibility(GONE); } else { - mDismissView.setVisibility(View.VISIBLE); + mDismissView.setVisibility(VISIBLE); ((NotificationSbnAdapter) mDismissedRv.getAdapter()).onRebuildComplete( new ArrayList<>(Arrays.asList(dismissed))); } @@ -446,10 +459,10 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { int reason) { if (reason == REASON_SNOOZED) { ((NotificationSbnAdapter) mSnoozedRv.getAdapter()).addSbn(sbn); - mSnoozeView.setVisibility(View.VISIBLE); + mSnoozeView.setVisibility(VISIBLE); } else { ((NotificationSbnAdapter) mDismissedRv.getAdapter()).addSbn(sbn); - mDismissView.setVisibility(View.VISIBLE); + mDismissView.setVisibility(VISIBLE); } } }; diff --git a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java index 5923a4e8dbf..ae7590c9d01 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java +++ b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java @@ -9,7 +9,6 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -36,7 +35,6 @@ public class NotificationHistoryRecyclerView extends RecyclerView { super(context, attrs, defStyle); setLayoutManager(new LinearLayoutManager(getContext())); - addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); ItemTouchHelper touchHelper = new ItemTouchHelper( new DismissTouchHelper(0, ItemTouchHelper.START | ItemTouchHelper.END)); touchHelper.attachToRecyclerView(this); diff --git a/src/com/android/settings/notification/history/NotificationSbnAdapter.java b/src/com/android/settings/notification/history/NotificationSbnAdapter.java index 0301d7b7fd5..3262ec4aea9 100644 --- a/src/com/android/settings/notification/history/NotificationSbnAdapter.java +++ b/src/com/android/settings/notification/history/NotificationSbnAdapter.java @@ -24,6 +24,10 @@ import static android.provider.Settings.EXTRA_APP_PACKAGE; import static android.provider.Settings.EXTRA_CHANNEL_ID; import static android.provider.Settings.EXTRA_CONVERSATION_ID; +import static com.android.settings.notification.history.NotificationHistoryActivity.ROUND_CORNER_BOTTOM; +import static com.android.settings.notification.history.NotificationHistoryActivity.ROUND_CORNER_CENTER; +import static com.android.settings.notification.history.NotificationHistoryActivity.ROUND_CORNER_TOP; + import android.annotation.ColorInt; import android.annotation.UserIdInt; import android.app.ActivityManager; @@ -111,13 +115,22 @@ public class NotificationSbnAdapter extends int position) { final StatusBarNotification sbn = mValues.get(position); if (sbn != null) { + int cornerType = ROUND_CORNER_CENTER; + if (position == (getItemCount() - 1)) { + cornerType |= ROUND_CORNER_BOTTOM; + } + if (position == 0) { + cornerType |= ROUND_CORNER_TOP; + } + int backgroundRes = NotificationHistoryActivity.getRoundCornerDrawableRes(cornerType); + holder.itemView.setBackgroundResource(backgroundRes); + holder.setIconBackground(loadBackground(sbn)); holder.setIcon(loadIcon(sbn)); holder.setPackageLabel(loadPackageLabel(sbn.getPackageName()).toString()); holder.setTitle(getTitleString(sbn.getNotification())); holder.setSummary(getTextString(mContext, sbn.getNotification())); holder.setPostedTime(sbn.getPostTime()); - holder.setDividerVisible(position < (mValues.size() -1)); int userId = normalizeUserId(sbn); if (!mUserBadgeCache.containsKey(userId)) { Drawable profile = mContext.getPackageManager().getUserBadgeForDensityNoBackground( diff --git a/src/com/android/settings/notification/history/NotificationSbnViewHolder.java b/src/com/android/settings/notification/history/NotificationSbnViewHolder.java index df8aec44c0d..36a8720a859 100644 --- a/src/com/android/settings/notification/history/NotificationSbnViewHolder.java +++ b/src/com/android/settings/notification/history/NotificationSbnViewHolder.java @@ -49,7 +49,6 @@ public class NotificationSbnViewHolder extends RecyclerView.ViewHolder { private final TextView mTitle; private final TextView mSummary; private final ImageView mProfileBadge; - private final View mDivider; NotificationSbnViewHolder(View itemView) { super(itemView); @@ -59,7 +58,6 @@ public class NotificationSbnViewHolder extends RecyclerView.ViewHolder { mTitle = itemView.findViewById(R.id.title); mSummary = itemView.findViewById(R.id.text); mProfileBadge = itemView.findViewById(R.id.profile_badge); - mDivider = itemView.findViewById(R.id.divider); } void setSummary(CharSequence summary) { @@ -92,10 +90,6 @@ public class NotificationSbnViewHolder extends RecyclerView.ViewHolder { mProfileBadge.setVisibility(badge != null ? View.VISIBLE : View.GONE); } - void setDividerVisible(boolean visible) { - mDivider.setVisibility(visible ? View.VISIBLE : View.GONE); - } - void addOnClick(int position, String pkg, int uid, int userId, PendingIntent pi, InstanceId instanceId, boolean isSnoozed, UiEventLogger uiEventLogger) {