Merge "Update flows for notification history" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-04-15 17:32:47 +00:00
committed by Android (Google) Code Review
2 changed files with 72 additions and 74 deletions

View File

@@ -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>

View File

@@ -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);
if (isChecked) {
mHistoryEmpty.setVisibility(View.VISIBLE);
mHistoryOff.setVisibility(View.GONE);
} else {
mHistoryOff.setVisibility(View.VISIBLE);
mHistoryEmpty.setVisibility(View.GONE);
}
mTodayView.removeAllViews();
mHistoryOff.setVisibility(View.VISIBLE);
};
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