Merge "Update flows for notification history" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
79a38a733f
@@ -40,7 +40,6 @@
|
||||
android:layout_width="67dp"
|
||||
android:layout_height="67dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:contentDescription="@string/notification_history"
|
||||
android:scaleType="fitCenter"
|
||||
android:focusable="false"
|
||||
android:tint="?android:attr/colorControlNormal"
|
||||
@@ -50,7 +49,6 @@
|
||||
android:id="@+id/history_off_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/history_image"
|
||||
android:layout_marginTop="48dp"
|
||||
android:layout_marginStart="48dp"
|
||||
android:layout_marginEnd="48dp"
|
||||
@@ -63,7 +61,6 @@
|
||||
android:id="@+id/history_off_summary"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/history_off_title"
|
||||
android:layout_marginStart="48dp"
|
||||
android:layout_marginEnd="48dp"
|
||||
android:layout_marginTop="16dp"
|
||||
@@ -73,17 +70,33 @@
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/notification_history_off_summary" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/history_on_empty"
|
||||
android:visibility="gone"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="164dp"
|
||||
android:orientation="vertical">
|
||||
<ImageView
|
||||
android:id="@+id/history_image_on"
|
||||
android:layout_width="67dp"
|
||||
android:layout_height="67dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:scaleType="fitCenter"
|
||||
android:focusable="false"
|
||||
android:tint="?android:attr/colorControlNormal"
|
||||
android:src="@drawable/ic_history" />
|
||||
<TextView
|
||||
android:id="@+id/history_toggled_on_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/history_image"
|
||||
android:layout_marginTop="48dp"
|
||||
android:layout_marginStart="48dp"
|
||||
android:layout_marginEnd="48dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:focusable="true"
|
||||
android:visibility="gone"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:text="@string/history_toggled_on_title" />
|
||||
|
||||
@@ -98,7 +111,6 @@
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textAlignment="center"
|
||||
android:focusable="true"
|
||||
android:visibility="gone"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/history_toggled_on_summary" />
|
||||
</LinearLayout>
|
||||
|
@@ -22,15 +22,11 @@ import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.INotificationManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
import android.service.notification.NotificationListenerService;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
@@ -50,9 +46,13 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.notification.NotificationBackend;
|
||||
import com.android.settings.widget.SwitchBar;
|
||||
import com.android.settingslib.utils.ThreadUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class NotificationHistoryActivity extends Activity {
|
||||
|
||||
@@ -60,18 +60,22 @@ public class NotificationHistoryActivity extends Activity {
|
||||
|
||||
private ViewGroup mHistoryOn;
|
||||
private ViewGroup mHistoryOff;
|
||||
private ViewGroup mHistoryEmpty;
|
||||
private ViewGroup mTodayView;
|
||||
private ViewGroup mSnoozeView;
|
||||
private ViewGroup mDismissView;
|
||||
private SwitchBar mSwitchBar;
|
||||
|
||||
private SettingsObserver mSettingsObserver = new SettingsObserver();
|
||||
private HistoryLoader mHistoryLoader;
|
||||
private INotificationManager mNm;
|
||||
private PackageManager mPm;
|
||||
private CountDownLatch mCountdownLatch;
|
||||
private Future mCountdownFuture;
|
||||
|
||||
private HistoryLoader.OnHistoryLoaderListener mOnHistoryLoaderListener = notifications -> {
|
||||
findViewById(R.id.today_list).setVisibility(
|
||||
notifications.isEmpty() ? View.GONE : View.VISIBLE);
|
||||
mCountdownLatch.countDown();
|
||||
// for each package, new header and recycler view
|
||||
for (NotificationHistoryPackage nhp : notifications) {
|
||||
View viewForPackage = LayoutInflater.from(this)
|
||||
@@ -124,6 +128,8 @@ public class NotificationHistoryActivity extends Activity {
|
||||
mDismissView = findViewById(R.id.recently_dismissed_list);
|
||||
mHistoryOff = findViewById(R.id.history_off);
|
||||
mHistoryOn = findViewById(R.id.history_on);
|
||||
mHistoryEmpty = findViewById(R.id.history_on_empty);
|
||||
mSwitchBar = findViewById(R.id.switch_bar);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -131,6 +137,8 @@ public class NotificationHistoryActivity extends Activity {
|
||||
super.onResume();
|
||||
|
||||
mPm = getPackageManager();
|
||||
// wait for history loading and recent/snooze loading
|
||||
mCountdownLatch = new CountDownLatch(2);
|
||||
|
||||
mTodayView.removeAllViews();
|
||||
mHistoryLoader = new HistoryLoader(this, new NotificationBackend(), mPm);
|
||||
@@ -144,9 +152,25 @@ public class NotificationHistoryActivity extends Activity {
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Cannot register listener", e);
|
||||
}
|
||||
mSettingsObserver.observe();
|
||||
|
||||
bindSwitch();
|
||||
|
||||
mCountdownFuture = ThreadUtils.postOnBackgroundThread(() -> {
|
||||
try {
|
||||
mCountdownLatch.await(2, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
Slog.e(TAG, "timed out waiting for loading", e);
|
||||
}
|
||||
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);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,24 +180,30 @@ public class NotificationHistoryActivity extends Activity {
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Cannot unregister listener", e);
|
||||
}
|
||||
mSettingsObserver.stopObserving();
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
if (mCountdownFuture != null) {
|
||||
mCountdownFuture.cancel(true);
|
||||
}
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
private void bindSwitch() {
|
||||
SwitchBar bar = findViewById(R.id.switch_bar);
|
||||
if (bar != null) {
|
||||
bar.setSwitchBarText(R.string.notification_history_toggle,
|
||||
if (mSwitchBar != null) {
|
||||
mSwitchBar.setSwitchBarText(R.string.notification_history_toggle,
|
||||
R.string.notification_history_toggle);
|
||||
bar.show();
|
||||
mSwitchBar.show();
|
||||
try {
|
||||
bar.addOnSwitchChangeListener(mOnSwitchClickListener);
|
||||
mSwitchBar.addOnSwitchChangeListener(mOnSwitchClickListener);
|
||||
} catch (IllegalStateException e) {
|
||||
// an exception is thrown if you try to add the listener twice
|
||||
}
|
||||
bar.setChecked(Settings.Secure.getInt(getContentResolver(),
|
||||
mSwitchBar.setChecked(Settings.Secure.getInt(getContentResolver(),
|
||||
NOTIFICATION_HISTORY_ENABLED, 0) == 1);
|
||||
toggleViews(bar.isChecked());
|
||||
toggleViews(mSwitchBar.isChecked());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,53 +214,9 @@ public class NotificationHistoryActivity extends Activity {
|
||||
} else {
|
||||
mHistoryOn.setVisibility(View.GONE);
|
||||
mHistoryOff.setVisibility(View.VISIBLE);
|
||||
mHistoryOff.findViewById(R.id.history_off_title).setVisibility(View.VISIBLE);
|
||||
mHistoryOff.findViewById(R.id.history_off_summary).setVisibility(View.VISIBLE);
|
||||
mHistoryOff.findViewById(R.id.history_toggled_on_title).setVisibility(View.GONE);
|
||||
mHistoryOff.findViewById(R.id.history_toggled_on_summary).setVisibility(View.GONE);
|
||||
mTodayView.removeAllViews();
|
||||
}
|
||||
}
|
||||
|
||||
private void onHistoryEnabledChanged(boolean enabled) {
|
||||
if (enabled) {
|
||||
mHistoryLoader.load(mOnHistoryLoaderListener);
|
||||
}
|
||||
}
|
||||
|
||||
final class SettingsObserver extends ContentObserver {
|
||||
private final Uri NOTIFICATION_HISTORY_URI
|
||||
= Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_HISTORY_ENABLED);
|
||||
|
||||
SettingsObserver() {
|
||||
super(null);
|
||||
}
|
||||
|
||||
void observe() {
|
||||
ContentResolver resolver = getContentResolver();
|
||||
resolver.registerContentObserver(NOTIFICATION_HISTORY_URI,
|
||||
false, this, UserHandle.USER_ALL);
|
||||
}
|
||||
|
||||
void stopObserving() {
|
||||
ContentResolver resolver = getContentResolver();
|
||||
resolver.unregisterContentObserver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
update(uri);
|
||||
}
|
||||
|
||||
public void update(Uri uri) {
|
||||
ContentResolver resolver = getContentResolver();
|
||||
if (uri == null || NOTIFICATION_HISTORY_URI.equals(uri)) {
|
||||
boolean historyEnabled = Settings.Secure.getInt(resolver,
|
||||
Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 0)
|
||||
!= 0;
|
||||
onHistoryEnabledChanged(historyEnabled);
|
||||
}
|
||||
}
|
||||
mHistoryEmpty.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
private final SwitchBar.OnSwitchChangeListener mOnSwitchClickListener =
|
||||
@@ -239,16 +225,14 @@ public class NotificationHistoryActivity extends Activity {
|
||||
NOTIFICATION_HISTORY_ENABLED,
|
||||
isChecked ? 1 : 0);
|
||||
mHistoryOn.setVisibility(View.GONE);
|
||||
mHistoryOff.findViewById(R.id.history_off_title).setVisibility(
|
||||
isChecked ? View.GONE : View.VISIBLE);
|
||||
mHistoryOff.findViewById(R.id.history_off_summary).setVisibility(
|
||||
isChecked ? View.GONE : View.VISIBLE);
|
||||
mHistoryOff.findViewById(R.id.history_toggled_on_title).setVisibility(
|
||||
isChecked ? View.VISIBLE : View.GONE);
|
||||
mHistoryOff.findViewById(R.id.history_toggled_on_summary).setVisibility(
|
||||
isChecked ? View.VISIBLE : View.GONE);
|
||||
mTodayView.removeAllViews();
|
||||
if (isChecked) {
|
||||
mHistoryEmpty.setVisibility(View.VISIBLE);
|
||||
mHistoryOff.setVisibility(View.GONE);
|
||||
} else {
|
||||
mHistoryOff.setVisibility(View.VISIBLE);
|
||||
mHistoryEmpty.setVisibility(View.GONE);
|
||||
}
|
||||
mTodayView.removeAllViews();
|
||||
};
|
||||
|
||||
private final NotificationListenerService mListener = new NotificationListenerService() {
|
||||
@@ -303,6 +287,8 @@ public class NotificationHistoryActivity extends Activity {
|
||||
((NotificationSbnAdapter) mDismissedRv.getAdapter()).onRebuildComplete(
|
||||
new ArrayList<>(Arrays.asList(dismissed)));
|
||||
}
|
||||
|
||||
mCountdownLatch.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user