Merge "Add Intentfilter BasePreferenceController" into pi-dev
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index c3eb672..816141e 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -15,6 +15,7 @@
 
 import android.annotation.IntDef;
 import android.content.Context;
+import android.content.IntentFilter;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -221,6 +222,14 @@
     }
 
     /**
+     * @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.
      *
      * Called by SearchIndexProvider#getNonIndexableKeys
diff --git a/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java b/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java
index 03032c5..cc0de80 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 @@
                 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 44f57f8..b5bb28a 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -22,7 +22,6 @@
 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.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 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 @@
     @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 @@
         long startBuildTime = System.currentTimeMillis();
 
         final SliceData sliceData = mSlicesDatabaseAccessor.getSliceDataFromUri(uri);
-        List<Uri> pinnedSlices = getContext().getSystemService(
+
+        final BasePreferenceController controller = SliceBuilderUtils.getPreferenceController(
+                getContext(), sliceData);
+        final IntentFilter filter = controller.getIntentFilter();
+        if (filter != null) {
+            registerIntentToUri(filter, uri);
+        }
+
+        final List<Uri> pinnedSlices = getContext().getSystemService(
                 SliceManager.class).getPinnedSlices();
         if (pinnedSlices.contains(uri)) {
             mSliceDataCache.put(uri, sliceData);
@@ -333,6 +340,8 @@
      * {@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 9d8e6b4..fe6d512 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 @@
     @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 @@
     @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);
@@ -127,9 +130,19 @@
     }
 
     @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 @@
     @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 @@
         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 d0ce76f..bae267a 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 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 @@
         return Settings.Global.getInt(mContext.getContentResolver(),
                 AVAILABILITY_KEY, AVAILABLE);
     }
+
+    @Override
+    public IntentFilter getIntentFilter() {
+        return INTENT_FILTER;
+    }
 }