From 4a6f058552f85727f0d55d73e76a6031dc62717f Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Fri, 11 May 2018 08:35:42 -0700 Subject: [PATCH] Add Intentfilter BasePreferenceController For settings which can change in the framework, outside of the settings app and a slice, a Slice needs to be able to register a listener for these changes. Adding a getter for an IntentFilter in BasePreferenceControllers allows us to use the SliceBroadcastRelay in SysUi to listen for these changes. Test: robotests Fixes: 78138654 Change-Id: I579375069ca98fd21b60cd3a69c1a122cabf96e2 Merged-In: Ifa05b651aaa3458c54866f71469964b1a070e458 --- .../core/BasePreferenceController.java | 9 ++++++++ ...tVolumeRestrictedPreferenceController.java | 10 ++++++++ .../slices/SettingsSliceProvider.java | 17 ++++++++++---- .../slices/SettingsSliceProviderTest.java | 23 +++++++++++++++---- .../testutils/FakeToggleController.java | 10 ++++++++ 5 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java index c3eb672a63c..816141eab97 100644 --- a/src/com/android/settings/core/BasePreferenceController.java +++ b/src/com/android/settings/core/BasePreferenceController.java @@ -15,6 +15,7 @@ package com.android.settings.core; import android.annotation.IntDef; import android.content.Context; +import android.content.IntentFilter; import android.text.TextUtils; import android.util.Log; @@ -220,6 +221,14 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl return SliceData.SliceType.INTENT; } + /** + * @return an {@link IntentFilter} that includes all broadcasts which can affect the state of + * this Setting. + */ + public IntentFilter getIntentFilter() { + return null; + } + /** * Updates non-indexable keys for search provider. * diff --git a/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java b/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java index 03032c5eeba..cc0de808ffe 100644 --- a/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java +++ b/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java @@ -17,6 +17,8 @@ package com.android.settings.notification; import android.content.Context; +import android.content.IntentFilter; +import android.media.AudioManager; import android.os.UserHandle; import android.os.UserManager; import android.support.v7.preference.Preference; @@ -57,4 +59,12 @@ public abstract class AdjustVolumeRestrictedPreferenceController extends UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId()); } + @Override + public IntentFilter getIntentFilter() { + final IntentFilter filter = new IntentFilter(); + filter.addAction(AudioManager.VOLUME_CHANGED_ACTION); + filter.addAction(AudioManager.STREAM_MUTE_CHANGED_ACTION); + filter.addAction(AudioManager.MASTER_MUTE_CHANGED_ACTION); + return filter; + } } diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index 44f57f8d6f5..b5bb28a3816 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -22,7 +22,6 @@ import android.app.slice.SliceManager; import android.content.ContentResolver; import android.content.Intent; import android.content.IntentFilter; -import android.content.Context; import android.net.Uri; import android.provider.SettingsSlicesContract; import android.support.annotation.VisibleForTesting; @@ -33,6 +32,7 @@ import android.util.Log; import android.util.Pair; import com.android.settings.overlay.FeatureFactory; +import com.android.settings.core.BasePreferenceController; import com.android.settings.wifi.WifiSliceBuilder; import com.android.settings.wifi.calling.WifiCallingSliceHelper; import com.android.settings.notification.ZenModeSliceBuilder; @@ -143,8 +143,6 @@ public class SettingsSliceProvider extends SliceProvider { public void onSlicePinned(Uri sliceUri) { if (WifiSliceBuilder.WIFI_URI.equals(sliceUri)) { registerIntentToUri(WifiSliceBuilder.INTENT_FILTER , sliceUri); - // TODO (b/) Register IntentFilters for database entries. - mRegisteredUris.add(sliceUri); return; } else if (ZenModeSliceBuilder.ZEN_MODE_URI.equals(sliceUri)) { registerIntentToUri(ZenModeSliceBuilder.INTENT_FILTER, sliceUri); @@ -159,6 +157,7 @@ public class SettingsSliceProvider extends SliceProvider { @Override public void onSliceUnpinned(Uri sliceUri) { if (mRegisteredUris.contains(sliceUri)) { + Log.d(TAG, "Unregistering uri broadcast relay: " + sliceUri); SliceBroadcastRelay.unregisterReceivers(getContext(), sliceUri); mRegisteredUris.remove(sliceUri); } @@ -280,7 +279,15 @@ public class SettingsSliceProvider extends SliceProvider { long startBuildTime = System.currentTimeMillis(); final SliceData sliceData = mSlicesDatabaseAccessor.getSliceDataFromUri(uri); - List pinnedSlices = getContext().getSystemService( + + final BasePreferenceController controller = SliceBuilderUtils.getPreferenceController( + getContext(), sliceData); + final IntentFilter filter = controller.getIntentFilter(); + if (filter != null) { + registerIntentToUri(filter, uri); + } + + final List pinnedSlices = getContext().getSystemService( SliceManager.class).getPinnedSlices(); if (pinnedSlices.contains(uri)) { mSliceDataCache.put(uri, sliceData); @@ -333,6 +340,8 @@ public class SettingsSliceProvider extends SliceProvider { * {@param intentFilter} happen. */ void registerIntentToUri(IntentFilter intentFilter, Uri sliceUri) { + Log.d(TAG, "Registering Uri for broadcast relay: " + sliceUri); + mRegisteredUris.add(sliceUri); SliceBroadcastRelay.registerReceiver(getContext(), sliceUri, SliceBroadcastReceiver.class, intentFilter); } diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java index 9d8e6b4b918..fe6d512ea88 100644 --- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java +++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java @@ -18,10 +18,13 @@ package com.android.settings.slices; import static android.content.ContentResolver.SCHEME_CONTENT; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.slice.SliceManager; @@ -107,7 +110,7 @@ public class SettingsSliceProviderTest { @Test public void testInitialSliceReturned_emptySlice() { insertSpecialCase(KEY); - Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); + final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); Slice slice = mProvider.onBindSlice(uri); assertThat(slice.getUri()).isEqualTo(uri); @@ -117,7 +120,7 @@ public class SettingsSliceProviderTest { @Test public void testLoadSlice_returnsSliceFromAccessor() { insertSpecialCase(KEY); - Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); + final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); mProvider.loadSlice(uri); SliceData data = mProvider.mSliceWeakDataCache.get(uri); @@ -126,10 +129,20 @@ public class SettingsSliceProviderTest { assertThat(data.getTitle()).isEqualTo(TITLE); } + @Test + public void loadSlice_registersIntentFilter() { + insertSpecialCase(KEY); + final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); + + mProvider.loadSlice(uri); + + verify(mProvider).registerIntentToUri(eq(FakeToggleController.INTENT_FILTER), eq(uri)); + } + @Test public void testLoadSlice_doesNotCacheWithoutPin() { insertSpecialCase(KEY); - Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); + final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); mProvider.loadSlice(uri); SliceData data = mProvider.mSliceDataCache.get(uri); @@ -140,7 +153,7 @@ public class SettingsSliceProviderTest { @Test public void testLoadSlice_cachesWithPin() { insertSpecialCase(KEY); - Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); + final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); when(mManager.getPinnedSlices()).thenReturn(Arrays.asList(uri)); mProvider.loadSlice(uri); @@ -398,7 +411,7 @@ public class SettingsSliceProviderTest { values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, "s"); values.put(SlicesDatabaseHelper.IndexColumns.ICON_RESOURCE, 1234); values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, "test"); - values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, "test"); + values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, PREF_CONTROLLER); values.put(SlicesDatabaseHelper.IndexColumns.PLATFORM_SLICE, isPlatformSlice); values.put(SlicesDatabaseHelper.IndexColumns.SLICE_TYPE, SliceData.SliceType.INTENT); diff --git a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java index d0ce76fe60a..bae267a6224 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java @@ -18,6 +18,8 @@ package com.android.settings.testutils; import android.content.Context; +import android.content.IntentFilter; +import android.net.wifi.WifiManager; import android.provider.Settings; import com.android.settings.core.TogglePreferenceController; @@ -28,6 +30,9 @@ public class FakeToggleController extends TogglePreferenceController { public static final String AVAILABILITY_KEY = "fake_toggle_availability_key"; + public static final IntentFilter INTENT_FILTER = new IntentFilter( + WifiManager.WIFI_AP_STATE_CHANGED_ACTION); + private final int ON = 1; private final int OFF = 0; @@ -52,4 +57,9 @@ public class FakeToggleController extends TogglePreferenceController { return Settings.Global.getInt(mContext.getContentResolver(), AVAILABILITY_KEY, AVAILABLE); } + + @Override + public IntentFilter getIntentFilter() { + return INTENT_FILTER; + } }