diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index 0e510325f8b..06780afae35 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -23,7 +23,6 @@ import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLAT import android.annotation.ColorInt; import android.app.PendingIntent; import android.app.settings.SettingsEnums; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -110,17 +109,6 @@ public class SliceBuilderUtils { } } - /** - * @return the {@link SliceData.SliceType} for the {@param controllerClassName} and key. - */ - @SliceData.SliceType - public static int getSliceType(Context context, String controllerClassName, - String controllerKey) { - BasePreferenceController controller = getPreferenceController(context, controllerClassName, - controllerKey); - return controller.getSliceType(); - } - /** * Splits the Settings Slice Uri path into its two expected components: * - intent/action @@ -214,17 +202,6 @@ public class SliceBuilderUtils { return ""; } - public static Uri getUri(String path, boolean isPlatformSlice) { - final String authority = isPlatformSlice - ? SettingsSlicesContract.AUTHORITY - : SettingsSliceProvider.SLICE_AUTHORITY; - return new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(authority) - .appendPath(path) - .build(); - } - public static Intent buildSearchResultPageIntent(Context context, String className, String key, String screenTitle, int sourceMetricsCategory) { final Bundle args = new Bundle(); @@ -350,7 +327,7 @@ public class SliceBuilderUtils { .build(); } - private static BasePreferenceController getPreferenceController(Context context, + static BasePreferenceController getPreferenceController(Context context, String controllerClassName, String controllerKey) { try { return BasePreferenceController.createInstance(context, controllerClassName); diff --git a/src/com/android/settings/slices/SliceDataConverter.java b/src/com/android/settings/slices/SliceDataConverter.java index 7a8ab838f1d..89c0267e4ac 100644 --- a/src/com/android/settings/slices/SliceDataConverter.java +++ b/src/com/android/settings/slices/SliceDataConverter.java @@ -27,14 +27,17 @@ import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_UNAVAI import android.accessibilityservice.AccessibilityServiceInfo; import android.app.settings.SettingsEnums; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.content.res.XmlResourceParser; +import android.net.Uri; import android.os.Bundle; import android.provider.SearchIndexableResource; +import android.provider.SettingsSlicesContract; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; @@ -199,17 +202,24 @@ class SliceDataConverter { } final String key = bundle.getString(METADATA_KEY); + final BasePreferenceController controller = SliceBuilderUtils + .getPreferenceController(mContext, controllerClassName, key); + // Only add pre-approved Slices available on the device. + if (!controller.isSliceable() || !controller.isAvailable()) { + continue; + } final String title = bundle.getString(METADATA_TITLE); final String summary = bundle.getString(METADATA_SUMMARY); final int iconResId = bundle.getInt(METADATA_ICON); - final int sliceType = SliceBuilderUtils.getSliceType(mContext, controllerClassName, - key); + + final int sliceType = controller.getSliceType(); final boolean isPlatformSlice = bundle.getBoolean(METADATA_PLATFORM_SLICE_FLAG); final String unavailableSliceSubtitle = bundle.getString( METADATA_UNAVAILABLE_SLICE_SUBTITLE); final SliceData xmlSlice = new SliceData.Builder() .setKey(key) + .setUri(controller.getSliceUri()) .setTitle(title) .setSummary(summary) .setIcon(iconResId) @@ -221,13 +231,7 @@ class SliceDataConverter { .setUnavailableSliceSubtitle(unavailableSliceSubtitle) .build(); - final BasePreferenceController controller = - SliceBuilderUtils.getPreferenceController(mContext, xmlSlice); - - // Only add pre-approved Slices available on the device. - if (controller.isSliceable() && controller.isAvailable()) { - xmlSliceData.add(xmlSlice); - } + xmlSliceData.add(xmlSlice); } } catch (SliceData.InvalidSliceDataException e) { Log.w(TAG, "Invalid data when building SliceData for " + fragmentName, e); @@ -294,6 +298,12 @@ class SliceDataConverter { sliceDataBuilder.setKey(flattenedName) .setTitle(title) + .setUri(new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(flattenedName) + .build()) .setIcon(iconResource) .setSliceType(SliceData.SliceType.SWITCH); try { diff --git a/src/com/android/settings/slices/SlicesIndexer.java b/src/com/android/settings/slices/SlicesIndexer.java index 495eb0000b8..bc9ca1a1612 100644 --- a/src/com/android/settings/slices/SlicesIndexer.java +++ b/src/com/android/settings/slices/SlicesIndexer.java @@ -101,6 +101,7 @@ class SlicesIndexer implements Runnable { for (SliceData dataRow : indexData) { values = new ContentValues(); values.put(IndexColumns.KEY, dataRow.getKey()); + values.put(IndexColumns.SLICE_URI, dataRow.getUri().toSafeString()); values.put(IndexColumns.TITLE, dataRow.getTitle()); values.put(IndexColumns.SUMMARY, dataRow.getSummary()); values.put(IndexColumns.SCREENTITLE, dataRow.getScreenTitle().toString()); diff --git a/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java index e3672c92dc9..fbbc5c7f380 100644 --- a/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java @@ -163,6 +163,7 @@ public class NfcPreferenceControllerTest { assertThat(keys).hasSize(1); } + @Test public void setChecked_True_nfcShouldEnable() { mNfcController.setChecked(true); @@ -209,7 +210,7 @@ public class NfcPreferenceControllerTest { @Test public void shouldTurnOffNFCInAirplaneMode_airplaneModeRadiosContainsNfc_shouldReturnTrue() { Settings.Global.putString(mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_RADIOS, Settings.Global.RADIO_NFC); + Settings.Global.AIRPLANE_MODE_RADIOS, Settings.Global.RADIO_NFC); assertThat(NfcPreferenceController.shouldTurnOffNFCInAirplaneMode(mContext)).isTrue(); } @@ -217,7 +218,7 @@ public class NfcPreferenceControllerTest { @Test public void shouldTurnOffNFCInAirplaneMode_airplaneModeRadiosWithoutNfc_shouldReturnFalse() { Settings.Global.putString(mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_RADIOS, ""); + Settings.Global.AIRPLANE_MODE_RADIOS, ""); assertThat(NfcPreferenceController.shouldTurnOffNFCInAirplaneMode(mContext)).isFalse(); } @@ -225,7 +226,7 @@ public class NfcPreferenceControllerTest { @Test public void displayPreference_airplaneModeRadiosContainsNfc_shouldCreateAirplaneModeObserver() { Settings.Global.putString(mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_RADIOS, Settings.Global.RADIO_NFC); + Settings.Global.AIRPLANE_MODE_RADIOS, Settings.Global.RADIO_NFC); mNfcController.displayPreference(mScreen); @@ -235,7 +236,7 @@ public class NfcPreferenceControllerTest { @Test public void displayPreference_nfcToggleableInAirplaneMode_shouldCreateAirplaneModeObserver() { Settings.Global.putString(mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS, Settings.Global.RADIO_NFC); + Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS, Settings.Global.RADIO_NFC); mNfcController.displayPreference(mScreen); @@ -245,9 +246,9 @@ public class NfcPreferenceControllerTest { @Test public void displayPreference_nfcNotAffectByAirplaneMode_shouldNotCreateAirplaneModeObserver() { Settings.Global.putString(mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS, ""); + Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS, ""); Settings.Global.putString(mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_RADIOS, ""); + Settings.Global.AIRPLANE_MODE_RADIOS, ""); mNfcController.displayPreference(mScreen); @@ -256,7 +257,8 @@ public class NfcPreferenceControllerTest { @Test public void ncfSliceWorker_nfcBroadcast_noExtra_sliceDoesntUpdate() { - final NfcSliceWorker worker = spy(new NfcSliceWorker(mContext, getDummyUri())); + final NfcSliceWorker worker = spy( + new NfcSliceWorker(mContext, mNfcController.getSliceUri())); final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker); final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); @@ -267,7 +269,8 @@ public class NfcPreferenceControllerTest { @Test public void ncfSliceWorker_nfcBroadcast_turningOn_sliceDoesntUpdate() { - final NfcSliceWorker worker = spy(new NfcSliceWorker(mContext, getDummyUri())); + final NfcSliceWorker worker = spy( + new NfcSliceWorker(mContext, mNfcController.getSliceUri())); final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker); final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_TURNING_ON); @@ -279,7 +282,8 @@ public class NfcPreferenceControllerTest { @Test public void ncfSliceWorker_nfcBroadcast_turningOff_sliceDoesntUpdate() { - final NfcSliceWorker worker = spy(new NfcSliceWorker(mContext, getDummyUri())); + final NfcSliceWorker worker = spy( + new NfcSliceWorker(mContext, mNfcController.getSliceUri())); final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker); final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_TURNING_OFF); @@ -291,7 +295,8 @@ public class NfcPreferenceControllerTest { @Test public void ncfSliceWorker_nfcBroadcast_nfcOn_sliceUpdates() { - final NfcSliceWorker worker = spy(new NfcSliceWorker(mContext, getDummyUri())); + final NfcSliceWorker worker = spy( + new NfcSliceWorker(mContext, mNfcController.getSliceUri())); final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker); final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_ON); @@ -303,7 +308,8 @@ public class NfcPreferenceControllerTest { @Test public void ncfSliceWorker_nfcBroadcast_nfcOff_sliceUpdates() { - final NfcSliceWorker worker = spy(new NfcSliceWorker(mContext, getDummyUri())); + final NfcSliceWorker worker = spy( + new NfcSliceWorker(mContext, mNfcController.getSliceUri())); final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker); final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF); @@ -312,8 +318,4 @@ public class NfcPreferenceControllerTest { verify(worker).updateSlice(); } - - private Uri getDummyUri() { - return SliceBuilderUtils.getUri("action/nfc", false); - } } diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java index 96aaf46ef35..8431dc3cc5d 100644 --- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java +++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java @@ -96,8 +96,18 @@ import java.util.Set; public class SettingsSliceProviderTest { private static final String KEY = "KEY"; - private static final String INTENT_PATH = - SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY; + private static final Uri INTENT_SLICE_URI = + new Uri.Builder().scheme(SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_INTENT) + .appendPath(KEY) + .build(); + private static final Uri ACTION_SLICE_URI = + new Uri.Builder().scheme(SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(KEY) + .build(); private static final String TITLE = "title"; private static final String SUMMARY = "summary"; private static final String SCREEN_TITLE = "screen title"; @@ -155,20 +165,18 @@ public class SettingsSliceProviderTest { @Test public void testInitialSliceReturned_emptySlice() { insertSpecialCase(KEY); - final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); - Slice slice = mProvider.onBindSlice(uri); + Slice slice = mProvider.onBindSlice(INTENT_SLICE_URI); - assertThat(slice.getUri()).isEqualTo(uri); + assertThat(slice.getUri()).isEqualTo(INTENT_SLICE_URI); assertThat(slice.getItems()).isEmpty(); } @Test public void testLoadSlice_returnsSliceFromAccessor() { insertSpecialCase(KEY); - final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); - mProvider.loadSlice(uri); - SliceData data = mProvider.mSliceWeakDataCache.get(uri); + mProvider.loadSlice(INTENT_SLICE_URI); + SliceData data = mProvider.mSliceWeakDataCache.get(INTENT_SLICE_URI); assertThat(data.getKey()).isEqualTo(KEY); assertThat(data.getTitle()).isEqualTo(TITLE); @@ -177,24 +185,23 @@ public class SettingsSliceProviderTest { @Test public void loadSlice_registersIntentFilter() { insertSpecialCase(KEY); - final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); - mProvider.loadSlice(uri); + mProvider.loadSlice(INTENT_SLICE_URI); - verify(mProvider).registerIntentToUri(eq(FakeToggleController.INTENT_FILTER), eq(uri)); + verify(mProvider) + .registerIntentToUri(eq(FakeToggleController.INTENT_FILTER), eq(INTENT_SLICE_URI)); } @Test public void loadSlice_registersBackgroundListener() { insertSpecialCase(KEY); - final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); - mProvider.loadSlice(uri); + mProvider.loadSlice(INTENT_SLICE_URI); Robolectric.flushForegroundThreadScheduler(); Robolectric.flushBackgroundThreadScheduler(); - assertThat(mProvider.mPinnedWorkers.get(uri).getClass()) + assertThat(mProvider.mPinnedWorkers.get(INTENT_SLICE_URI).getClass()) .isEqualTo(FakeToggleController.TestWorker.class); } @@ -255,27 +262,26 @@ public class SettingsSliceProviderTest { @Test public void getDescendantUris_fullActionUri_returnsSelf() { - final Uri uri = SliceBuilderUtils.getUri( - SettingsSlicesContract.PATH_SETTING_ACTION + "/key", true); + final Collection descendants = mProvider.onGetSliceDescendants(ACTION_SLICE_URI); - final Collection descendants = mProvider.onGetSliceDescendants(uri); - - assertThat(descendants).containsExactly(uri); + assertThat(descendants).containsExactly(ACTION_SLICE_URI); } @Test public void getDescendantUris_fullIntentUri_returnsSelf() { - final Uri uri = SliceBuilderUtils.getUri( - SettingsSlicesContract.PATH_SETTING_ACTION + "/key", true); - final Collection descendants = mProvider.onGetSliceDescendants(uri); + final Collection descendants = mProvider.onGetSliceDescendants(ACTION_SLICE_URI); - assertThat(descendants).containsExactly(uri); + assertThat(descendants).containsExactly(ACTION_SLICE_URI); } @Test public void getDescendantUris_wrongPath_returnsEmpty() { - final Uri uri = SliceBuilderUtils.getUri("invalid_path", true); + final Uri uri = new Uri.Builder() + .scheme(SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath("invalid_path") + .build(); final Collection descendants = mProvider.onGetSliceDescendants(uri); diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java index 1db7c8df729..fc82abb21f2 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java @@ -136,58 +136,6 @@ public class SliceBuilderUtilsTest { SliceTester.testSettingsCopyableSlice(mContext, slice, dummyData); } - @Test - public void testUriBuilder_oemAuthority_intentPath_returnsValidSliceUri() { - final Uri expectedUri = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(INTENT_PATH) - .build(); - - final Uri actualUri = SliceBuilderUtils.getUri(INTENT_PATH, false); - - assertThat(actualUri).isEqualTo(expectedUri); - } - - @Test - public void testUriBuilder_oemAuthority_actionPath_returnsValidSliceUri() { - final Uri expectedUri = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(ACTION_PATH) - .build(); - - final Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, false); - - assertThat(actualUri).isEqualTo(expectedUri); - } - - @Test - public void testUriBuilder_platformAuthority_intentPath_returnsValidSliceUri() { - final Uri expectedUri = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSlicesContract.AUTHORITY) - .appendPath(ACTION_PATH) - .build(); - - final Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); - - assertThat(actualUri).isEqualTo(expectedUri); - } - - @Test - public void testUriBuilder_platformAuthority_actionPath_returnsValidSliceUri() { - final Uri expectedUri = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSlicesContract.AUTHORITY) - .appendPath(ACTION_PATH) - .build(); - - final Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); - - assertThat(actualUri).isEqualTo(expectedUri); - } - @Test public void testGetPreferenceController_buildsMatchingController() { final BasePreferenceController controller = diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java index ea7bac5cd8b..76d8def5e79 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java @@ -119,7 +119,8 @@ public class SliceDataConverterTest { assertThat(fakeSlice.getScreenTitle()).isEqualTo(FAKE_SCREEN_TITLE); assertThat(fakeSlice.getKeywords()).isNull(); assertThat(fakeSlice.getIconResource()).isNotNull(); - assertThat(fakeSlice.getUri()).isNull(); + assertThat(fakeSlice.getUri().toSafeString()) + .isEqualTo("content://com.android.settings.slices/action/key"); assertThat(fakeSlice.getFragmentClassName()).isEqualTo(FAKE_FRAGMENT_CLASSNAME); assertThat(fakeSlice.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME); assertThat(fakeSlice.getSliceType()).isEqualTo(SliceData.SliceType.SLIDER); @@ -135,7 +136,7 @@ public class SliceDataConverterTest { assertThat(fakeSlice.getScreenTitle()).isEqualTo( mContext.getString(R.string.accessibility_settings)); assertThat(fakeSlice.getIconResource()).isEqualTo(FAKE_ICON); - assertThat(fakeSlice.getUri()).isNull(); + assertThat(fakeSlice.getUri()).isNotNull(); assertThat(fakeSlice.getFragmentClassName()).isEqualTo(ACCESSIBILITY_FRAGMENT); assertThat(fakeSlice.getPreferenceController()).isEqualTo(A11Y_CONTROLLER_NAME); } diff --git a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java index de2c51fc4bf..15221bd47c5 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.spy; import android.app.ApplicationPackageManager; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; @@ -139,10 +140,15 @@ public class SlicesDatabaseAccessorTest { @Test public void testGetSliceFromUri_validUri_validSliceReturned() { - String key = "key"; - String path = "intent/" + key; + final String key = "key"; insertSpecialCase(key); - Uri uri = SliceBuilderUtils.getUri(path, false); + + final Uri uri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath("action") + .appendPath(key) + .build(); SliceData data = mAccessor.getSliceDataFromUri(uri); @@ -159,7 +165,12 @@ public class SlicesDatabaseAccessorTest { @Test(expected = IllegalStateException.class) public void testGetSliceFromUri_invalidUri_errorThrown() { - Uri uri = SliceBuilderUtils.getUri("intent/durr", false); + final Uri uri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath("intent") + .appendPath("durr") + .build(); mAccessor.getSliceDataFromUri(uri); }