Loading res/layout/notification_history.xml +6 −6 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll" android:background="?android:attr/colorBackgroundFloating" android:layout_width="match_parent" android:layout_height="match_parent"> Loading Loading @@ -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"> <LinearLayout android:id="@+id/snoozed_list" Loading @@ -145,12 +145,12 @@ android:layout_width="wrap_content" android:text="@string/notification_history_snooze" android:textColor="?android:attr/textColorPrimary" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:textAppearance="@style/TextAppearance.HomepageCardTitle" android:paddingBottom="16dp" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/notification_list" android:background="@drawable/rounded_bg" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="true" Loading @@ -170,10 +170,10 @@ android:text="@string/notification_history_dismiss" android:textColor="?android:attr/textColorPrimary" android:textAppearance="@style/TextAppearance.HomepageCardTitle" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:paddingBottom="16dp" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/notification_list" android:background="@drawable/rounded_bg" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="true" Loading @@ -191,13 +191,13 @@ android:layout_width="wrap_content" android:textColor="?android:attr/textColorPrimary" android:textAppearance="@style/TextAppearance.HomepageCardTitle" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:paddingBottom="16dp" /> <LinearLayout android:id="@+id/apps" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/rounded_bg"> android:orientation="vertical"> <!-- app based recycler views added here --> </LinearLayout> </LinearLayout> Loading res/layout/notification_history_app_layout.xml +5 −6 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -84,15 +86,12 @@ </androidx.constraintlayout.widget.ConstraintLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="?android:attr/listDivider" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/notification_list_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content"> android:layout_height="wrap_content" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"> <com.android.settings.notification.history.NotificationHistoryRecyclerView android:id="@+id/notification_list" Loading res/layout/notification_history_log_row.xml +14 −7 Original line number Diff line number Diff line Loading @@ -17,17 +17,22 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="48dp" android:paddingTop="16dp" android:paddingBottom="16dp" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="16dp" android:orientation="vertical" android:foreground="?android:attr/selectableItemBackground"> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/listDivider" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="@*android:dimen/status_bar_icon_size" android:layout_marginStart="54dp" android:paddingTop="16dp" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:gravity="center_vertical"> <TextView Loading @@ -36,7 +41,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="32dp" android:ellipsize="end" android:singleLine="true" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Title" Loading Loading @@ -77,11 +81,14 @@ android:layout_height="wrap_content" android:layout_gravity="left|center_vertical" android:ellipsize="end" android:layout_marginStart="32dp" android:layout_marginStart="54dp" android:maxLines="7" android:paddingTop="4dp" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:textColor="?android:attr/textColorSecondary" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification" android:textAlignment="viewStart" /> android:textAlignment="viewStart" android:paddingBottom="16dp" /> </LinearLayout> res/layout/notification_sbn_log_row.xml +3 −7 Original line number Diff line number Diff line Loading @@ -22,8 +22,10 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingStart="16dp" android:layout_marginEnd="16dp" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingTop="16dp" android:paddingBottom="16dp" android:orientation="vertical"> Loading Loading @@ -128,11 +130,5 @@ /> </LinearLayout> </LinearLayout> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/listDivider" /> </LinearLayout> No newline at end of file src/com/android/settings/notification/history/NotificationHistoryActivity.java +70 −57 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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); Loading @@ -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); Loading @@ -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( Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); } }); }); Loading @@ -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(); Loading @@ -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 = Loading @@ -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(); }; Loading Loading @@ -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))); Loading @@ -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))); } Loading @@ -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); } } }; Loading Loading
res/layout/notification_history.xml +6 −6 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll" android:background="?android:attr/colorBackgroundFloating" android:layout_width="match_parent" android:layout_height="match_parent"> Loading Loading @@ -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"> <LinearLayout android:id="@+id/snoozed_list" Loading @@ -145,12 +145,12 @@ android:layout_width="wrap_content" android:text="@string/notification_history_snooze" android:textColor="?android:attr/textColorPrimary" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:textAppearance="@style/TextAppearance.HomepageCardTitle" android:paddingBottom="16dp" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/notification_list" android:background="@drawable/rounded_bg" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="true" Loading @@ -170,10 +170,10 @@ android:text="@string/notification_history_dismiss" android:textColor="?android:attr/textColorPrimary" android:textAppearance="@style/TextAppearance.HomepageCardTitle" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:paddingBottom="16dp" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/notification_list" android:background="@drawable/rounded_bg" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="true" Loading @@ -191,13 +191,13 @@ android:layout_width="wrap_content" android:textColor="?android:attr/textColorPrimary" android:textAppearance="@style/TextAppearance.HomepageCardTitle" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:paddingBottom="16dp" /> <LinearLayout android:id="@+id/apps" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/rounded_bg"> android:orientation="vertical"> <!-- app based recycler views added here --> </LinearLayout> </LinearLayout> Loading
res/layout/notification_history_app_layout.xml +5 −6 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -84,15 +86,12 @@ </androidx.constraintlayout.widget.ConstraintLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="?android:attr/listDivider" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/notification_list_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content"> android:layout_height="wrap_content" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"> <com.android.settings.notification.history.NotificationHistoryRecyclerView android:id="@+id/notification_list" Loading
res/layout/notification_history_log_row.xml +14 −7 Original line number Diff line number Diff line Loading @@ -17,17 +17,22 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="48dp" android:paddingTop="16dp" android:paddingBottom="16dp" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="16dp" android:orientation="vertical" android:foreground="?android:attr/selectableItemBackground"> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/listDivider" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="@*android:dimen/status_bar_icon_size" android:layout_marginStart="54dp" android:paddingTop="16dp" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:gravity="center_vertical"> <TextView Loading @@ -36,7 +41,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="32dp" android:ellipsize="end" android:singleLine="true" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Title" Loading Loading @@ -77,11 +81,14 @@ android:layout_height="wrap_content" android:layout_gravity="left|center_vertical" android:ellipsize="end" android:layout_marginStart="32dp" android:layout_marginStart="54dp" android:maxLines="7" android:paddingTop="4dp" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:textColor="?android:attr/textColorSecondary" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification" android:textAlignment="viewStart" /> android:textAlignment="viewStart" android:paddingBottom="16dp" /> </LinearLayout>
res/layout/notification_sbn_log_row.xml +3 −7 Original line number Diff line number Diff line Loading @@ -22,8 +22,10 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="?android:attr/listPreferredItemPaddingStart" android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingStart="16dp" android:layout_marginEnd="16dp" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingTop="16dp" android:paddingBottom="16dp" android:orientation="vertical"> Loading Loading @@ -128,11 +130,5 @@ /> </LinearLayout> </LinearLayout> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/listDivider" /> </LinearLayout> No newline at end of file
src/com/android/settings/notification/history/NotificationHistoryActivity.java +70 −57 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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); Loading @@ -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); Loading @@ -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( Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); } }); }); Loading @@ -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(); Loading @@ -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 = Loading @@ -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(); }; Loading Loading @@ -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))); Loading @@ -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))); } Loading @@ -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); } } }; Loading