Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79a38a73 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents 0758056d 1845421e
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -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>
+54 −68
Original line number Diff line number Diff line
@@ -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