Merge "Fixing notification dots settings not updated properly" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-04-01 20:14:34 +00:00
committed by Android (Google) Code Review
7 changed files with 51 additions and 53 deletions
@@ -187,7 +187,7 @@ public class RecentsAnimationDeviceState implements
SettingsCache.OnChangeListener onChangeListener =
enabled -> mIsOneHandedModeEnabled = enabled;
settingsCache.register(oneHandedUri, onChangeListener);
settingsCache.dispatchOnChange(oneHandedUri);
mIsOneHandedModeEnabled = settingsCache.getValue(oneHandedUri);
runOnDestroy(() -> settingsCache.unregister(oneHandedUri, onChangeListener));
} else {
mIsOneHandedModeEnabled = false;
@@ -199,7 +199,7 @@ public class RecentsAnimationDeviceState implements
SettingsCache.OnChangeListener onChangeListener =
enabled -> mIsSwipeToNotificationEnabled = enabled;
settingsCache.register(swipeBottomNotificationUri, onChangeListener);
settingsCache.dispatchOnChange(swipeBottomNotificationUri);
mIsSwipeToNotificationEnabled = settingsCache.getValue(swipeBottomNotificationUri);
runOnDestroy(() -> settingsCache.unregister(swipeBottomNotificationUri, onChangeListener));
Uri setupCompleteUri = Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE);
@@ -80,7 +80,7 @@ public class SettingsChangeLogger implements
SettingsCache mSettingsCache = SettingsCache.INSTANCE.get(context);
mSettingsCache.register(NOTIFICATION_BADGING_URI,
this::onNotificationDotsChanged);
mSettingsCache.dispatchOnChange(NOTIFICATION_BADGING_URI);
onNotificationDotsChanged(mSettingsCache.getValue(NOTIFICATION_BADGING_URI));
}
private static ArrayMap<String, LoggablePref> loadPrefKeys(Context context) {
@@ -116,7 +116,7 @@ public class LauncherAppState {
mNotificationSettingsChangedListener = this::onNotificationSettingsChanged;
mSettingsCache.register(NOTIFICATION_BADGING_URI,
mNotificationSettingsChangedListener);
mSettingsCache.dispatchOnChange(NOTIFICATION_BADGING_URI);
onNotificationSettingsChanged(mSettingsCache.getValue(NOTIFICATION_BADGING_URI));
}
public LauncherAppState(Context context, @Nullable String iconCacheFileName) {
@@ -16,9 +16,9 @@
package com.android.launcher3.notification;
import static com.android.launcher3.util.SettingsCache.NOTIFICATION_BADGING_URI;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import static com.android.launcher3.util.SettingsCache.NOTIFICATION_BADGING_URI;
import android.annotation.TargetApi;
import android.app.Notification;
@@ -37,8 +37,8 @@ import androidx.annotation.AnyThread;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.android.launcher3.util.SettingsCache;
import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.SettingsCache;
import java.util.ArrayList;
import java.util.Arrays;
@@ -213,7 +213,7 @@ public class NotificationListener extends NotificationListenerService {
mNotificationSettingsChangedListener = this::onNotificationSettingsChanged;
mSettingsCache.register(NOTIFICATION_BADGING_URI,
mNotificationSettingsChangedListener);
mSettingsCache.dispatchOnChange(NOTIFICATION_BADGING_URI);
onNotificationSettingsChanged(mSettingsCache.getValue(NOTIFICATION_BADGING_URI));
onNotificationFullRefresh();
}
@@ -17,6 +17,8 @@ package com.android.launcher3.settings;
import static com.android.launcher3.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
import static com.android.launcher3.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGS;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.SettingsCache.NOTIFICATION_BADGING_URI;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -24,6 +26,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.ContentObserver;
import android.os.Bundle;
import android.provider.Settings;
import android.util.AttributeSet;
@@ -49,6 +52,14 @@ public class NotificationDotsPreference extends Preference
/** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */
private static final String NOTIFICATION_ENABLED_LISTENERS = "enabled_notification_listeners";
private final ContentObserver mListenerListObserver =
new ContentObserver(MAIN_EXECUTOR.getHandler()) {
@Override
public void onChange(boolean selfChange) {
updateUI();
}
};
public NotificationDotsPreference(
Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -66,6 +77,29 @@ public class NotificationDotsPreference extends Preference
super(context);
}
@Override
public void onAttached() {
super.onAttached();
SettingsCache.INSTANCE.get(getContext()).register(NOTIFICATION_BADGING_URI, this);
getContext().getContentResolver().registerContentObserver(
Settings.Secure.getUriFor(NOTIFICATION_ENABLED_LISTENERS),
false, mListenerListObserver);
updateUI();
}
private void updateUI() {
onSettingsChanged(SettingsCache.INSTANCE.get(getContext())
.getValue(NOTIFICATION_BADGING_URI));
}
@Override
public void onDetached() {
super.onDetached();
SettingsCache.INSTANCE.get(getContext()).unregister(NOTIFICATION_BADGING_URI, this);
getContext().getContentResolver().unregisterContentObserver(mListenerListObserver);
}
private void setWidgetFrameVisible(boolean isVisible) {
if (mWidgetFrameVisible != isVisible) {
mWidgetFrameVisible = isVisible;
@@ -18,8 +18,6 @@ package com.android.launcher3.settings;
import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS;
import static com.android.launcher3.util.SettingsCache.NOTIFICATION_BADGING_URI;
import static com.android.launcher3.util.SettingsCache.NOTIFICATION_ENABLED_LISTENERS;
import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY;
import static com.android.launcher3.states.RotationHelper.getAllowRotationDefaultValue;
@@ -45,7 +43,6 @@ import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.util.SettingsCache;
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
/**
@@ -124,11 +121,8 @@ public class SettingsActivity extends FragmentActivity
*/
public static class LauncherSettingsFragment extends PreferenceFragmentCompat {
private SettingsCache mSettingsCache;
private String mHighLightKey;
private boolean mPreferenceHighlighted = false;
private NotificationDotsPreference mNotificationSettingsChangedListener;
private Preference mDeveloperOptionPref;
@Override
@@ -172,22 +166,7 @@ public class SettingsActivity extends FragmentActivity
protected boolean initPreference(Preference preference) {
switch (preference.getKey()) {
case NOTIFICATION_DOTS_PREFERENCE_KEY:
if (WidgetsModel.GO_DISABLE_NOTIFICATION_DOTS) {
return false;
}
// Listen to system notification dot settings while this UI is active.
mSettingsCache = SettingsCache.INSTANCE.get(getActivity());
mNotificationSettingsChangedListener =
((NotificationDotsPreference) preference);
mSettingsCache.register(NOTIFICATION_BADGING_URI,
(NotificationDotsPreference) mNotificationSettingsChangedListener);
// Also listen if notification permission changes
mSettingsCache.register(NOTIFICATION_ENABLED_LISTENERS,
mNotificationSettingsChangedListener);
mSettingsCache.dispatchOnChange(NOTIFICATION_BADGING_URI);
mSettingsCache.dispatchOnChange(NOTIFICATION_ENABLED_LISTENERS);
return true;
return !WidgetsModel.GO_DISABLE_NOTIFICATION_DOTS;
case ALLOW_ROTATION_PREFERENCE_KEY:
if (getResources().getBoolean(R.bool.allow_rotation)) {
@@ -269,16 +248,5 @@ public class SettingsActivity extends FragmentActivity
}
});
}
@Override
public void onDestroy() {
if (mSettingsCache != null) {
mSettingsCache.unregister(NOTIFICATION_BADGING_URI,
mNotificationSettingsChangedListener);
mSettingsCache.unregister(NOTIFICATION_ENABLED_LISTENERS,
mNotificationSettingsChangedListener);
}
super.onDestroy();
}
}
}
@@ -39,12 +39,11 @@ import java.util.concurrent.CopyOnWriteArrayList;
* {@link #unregister(Uri, OnChangeListener)} methods.
*
* This can be used as a normal cache without any listeners as well via the
* {@link #getValue(Uri, int)} and {@link #dispatchOnChange(Uri)} to update (and subsequently call
* {@link #getValue(Uri, int)} and {@link #onChange)} to update (and subsequently call
* get)
*
* The cache will be invalidated/updated through the normal
* {@link ContentObserver#onChange(boolean)} calls
* or can be force updated by calling {@link #dispatchOnChange(Uri)}.
*
* Cache will also be updated if a key queried is missing (even if it has no listeners registered).
*/
@@ -58,9 +57,6 @@ public class SettingsCache extends ContentObserver {
/** Hidden field Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED */
public static final String ONE_HANDED_SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED =
"swipe_bottom_to_notification_enabled";
/** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */
public static final Uri NOTIFICATION_ENABLED_LISTENERS =
Settings.Secure.getUriFor("enabled_notification_listeners");
public static final Uri ROTATION_SETTING_URI =
Settings.System.getUriFor(ACCELEROMETER_ROTATION);
@@ -99,6 +95,14 @@ public class SettingsCache extends ContentObserver {
}
}
/**
* Returns the value for this classes key from the cache. If not in cache, will call
* {@link #updateValue(Uri, int)} to fetch.
*/
public boolean getValue(Uri keySetting) {
return getValue(keySetting, 1);
}
/**
* Returns the value for this classes key from the cache. If not in cache, will call
* {@link #updateValue(Uri, int)} to fetch.
@@ -139,14 +143,6 @@ public class SettingsCache extends ContentObserver {
return newVal;
}
/**
* Force update a change for a given URI and have all listeners for that URI receive callbacks
* even if the value is unchanged.
*/
public void dispatchOnChange(Uri uri) {
onChange(true, uri);
}
/**
* Call to stop receiving updates on the given {@param listener}.
* This Uri/Listener pair must correspond to the same pair called with for