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