Loading res/layout/notification_history.xml +18 −6 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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" Loading @@ -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" Loading @@ -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" /> Loading @@ -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> Loading src/com/android/settings/notification/history/NotificationHistoryActivity.java +54 −68 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading @@ -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) Loading Loading @@ -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 Loading @@ -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); Loading @@ -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 Loading @@ -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()); } } Loading @@ -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 = Loading @@ -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() { Loading Loading @@ -303,6 +287,8 @@ public class NotificationHistoryActivity extends Activity { ((NotificationSbnAdapter) mDismissedRv.getAdapter()).onRebuildComplete( new ArrayList<>(Arrays.asList(dismissed))); } mCountdownLatch.countDown(); } @Override Loading Loading
res/layout/notification_history.xml +18 −6 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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" Loading @@ -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" Loading @@ -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" /> Loading @@ -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> Loading
src/com/android/settings/notification/history/NotificationHistoryActivity.java +54 −68 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading @@ -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) Loading Loading @@ -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 Loading @@ -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); Loading @@ -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 Loading @@ -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()); } } Loading @@ -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 = Loading @@ -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() { Loading Loading @@ -303,6 +287,8 @@ public class NotificationHistoryActivity extends Activity { ((NotificationSbnAdapter) mDismissedRv.getAdapter()).onRebuildComplete( new ArrayList<>(Arrays.asList(dismissed))); } mCountdownLatch.countDown(); } @Override Loading