|
|
|
|
@@ -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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|