blob: f7b1f1c99d32782db3c51593a8f40529ccd1e4c9 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.android.settings.slices;
import static android.content.ContentResolver.SCHEME_CONTENT;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.app.ApplicationPackageManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.provider.SettingsSlicesContract;
import android.view.accessibility.AccessibilityManager;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeIndexProvider;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settingslib.search.SearchIndexableData;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowAccessibilityManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowUserManager.class, ShadowUtils.class,
SlicesDatabaseAccessorTest.ShadowApplicationPackageManager.class,
ShadowBluetoothAdapter.class, ShadowLockPatternUtils.class})
public class SlicesDatabaseAccessorTest {
private Context mContext;
private SlicesDatabaseAccessor mAccessor;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
ShadowUserManager.getShadow().setIsAdminUser(true);
mAccessor = spy(new SlicesDatabaseAccessor(mContext));
SlicesDatabaseHelper.getInstance(mContext).setIndexedState();
// Register the fake a11y Service
ShadowAccessibilityManager shadowAccessibilityManager = Shadow.extract(
RuntimeEnvironment.application.getSystemService(AccessibilityManager.class));
shadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>());
}
@After
public void cleanUp() {
DatabaseTestUtils.clearDb(mContext);
}
@Test
@Ignore
public void testGetSliceDataFromKey_validKey_validSliceReturned() {
String key = "key";
SliceTestUtils.insertSliceToDb(mContext, key);
SliceData data = mAccessor.getSliceDataFromKey(key);
assertThat(data.getKey()).isEqualTo(key);
assertThat(data.getTitle()).isEqualTo(SliceTestUtils.FAKE_TITLE);
assertThat(data.getSummary()).isEqualTo(SliceTestUtils.FAKE_SUMMARY);
assertThat(data.getScreenTitle()).isEqualTo(SliceTestUtils.FAKE_SCREEN_TITLE);
assertThat(data.getKeywords()).isEqualTo(SliceTestUtils.FAKE_KEYWORDS);
assertThat(data.getIconResource()).isEqualTo(SliceTestUtils.FAKE_ICON);
assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
assertThat(data.getUri()).isNull();
assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
assertThat(data.getUnavailableSliceSubtitle()).isNull();
}
@Test
@Ignore
public void testGetSliceDataFromKey_allowDynamicSummary_validSliceReturned() {
String key = "key";
SliceTestUtils.insertSliceToDb(mContext, key, true /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */);
SliceData data = mAccessor.getSliceDataFromKey(key);
assertThat(data.getKey()).isEqualTo(key);
assertThat(data.getTitle()).isEqualTo(SliceTestUtils.FAKE_TITLE);
assertThat(data.getSummary()).isEqualTo(SliceTestUtils.FAKE_SUMMARY);
assertThat(data.getScreenTitle()).isEqualTo(SliceTestUtils.FAKE_SCREEN_TITLE);
assertThat(data.getKeywords()).isEqualTo(SliceTestUtils.FAKE_KEYWORDS);
assertThat(data.getIconResource()).isEqualTo(SliceTestUtils.FAKE_ICON);
assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
assertThat(data.getUri()).isNull();
assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
}
@Test(expected = IllegalStateException.class)
@Ignore
public void testGetSliceDataFromKey_invalidKey_errorThrown() {
String key = "key";
mAccessor.getSliceDataFromKey(key);
}
@Test
@Ignore
public void testGetSliceFromUri_validUri_validSliceReturned() {
final String key = "key";
SliceTestUtils.insertSliceToDb(mContext, key);
final Uri uri = new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
.appendPath("action")
.appendPath(key)
.build();
SliceData data = mAccessor.getSliceDataFromUri(uri);
assertThat(data.getKey()).isEqualTo(key);
assertThat(data.getTitle()).isEqualTo(SliceTestUtils.FAKE_TITLE);
assertThat(data.getSummary()).isEqualTo(SliceTestUtils.FAKE_SUMMARY);
assertThat(data.getScreenTitle()).isEqualTo(SliceTestUtils.FAKE_SCREEN_TITLE);
assertThat(data.getKeywords()).isEqualTo(SliceTestUtils.FAKE_KEYWORDS);
assertThat(data.getIconResource()).isEqualTo(SliceTestUtils.FAKE_ICON);
assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
assertThat(data.getUri()).isEqualTo(uri);
assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
}
@Test(expected = IllegalStateException.class)
@Ignore
public void testGetSliceFromUri_invalidUri_errorThrown() {
final Uri uri = new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
.appendPath("intent")
.appendPath("durr")
.build();
mAccessor.getSliceDataFromUri(uri);
}
@Test
@Ignore
public void getDescendantUris_platformSlice_doesNotReturnOEMSlice() {
final String key = "oem_key";
SliceTestUtils.insertSliceToDb(mContext, key, false /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, true /* isPublicSlice */);
final List<Uri> keys = mAccessor.getSliceUris(SettingsSlicesContract.AUTHORITY,
true /* isPublicSlice */);
assertThat(keys).isEmpty();
}
@Test
@Ignore
public void getDescendantUris_oemSlice_doesNotReturnPlatformSlice() {
final String key = "platform_key";
SliceTestUtils.insertSliceToDb(mContext, key, true /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, true /* isPublicSlice */);
final List<Uri> keys = mAccessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY,
true /* isPublicSlice */);
assertThat(keys).isEmpty();
}
@Test
@Ignore
public void getDescendantUris_oemSlice_returnsOEMUriDescendant() {
final String key = "oem_key";
SliceTestUtils.insertSliceToDb(mContext, key, false /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, true /* isPublicSlice */);
final List<Uri> keys = mAccessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY,
true /* isPublicSlice */);
assertThat(keys).containsExactly(
Uri.parse("content://com.android.settings.slices/action/oem_key"));
}
@Test
@Ignore
public void getDescendantUris_platformSlice_returnsPlatformUriDescendant() {
final String key = "platform_key";
SliceTestUtils.insertSliceToDb(mContext, key, true /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, true /* isPublicSlice */);
final List<Uri> keys = mAccessor.getSliceUris(SettingsSlicesContract.AUTHORITY,
true /* isPublicSlice */);
assertThat(keys).containsExactly(
Uri.parse("content://android.settings.slices/action/platform_key"));
}
@Test
@Ignore
public void getSliceUris_publicSlice_returnPublicUri() {
SliceTestUtils.insertSliceToDb(mContext, "test_public", false /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, true /* isPublicSlice */);
SliceTestUtils.insertSliceToDb(mContext, "test_private", false /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, false /* isPublicSlice */);
final Uri expectedUri = new Uri.Builder()
.scheme(SCHEME_CONTENT)
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
.appendPath("test_public")
.build();
final List<Uri> uri = mAccessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY, true);
assertThat(uri).containsExactly(expectedUri);
}
@Test
@Ignore
public void getSliceUris_nonPublicSlice_returnNonPublicUri() {
SliceTestUtils.insertSliceToDb(mContext, "test_public", false /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, true /* isPublicSlice */);
SliceTestUtils.insertSliceToDb(mContext, "test_private", false /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */, false /* isPublicSlice */);
final Uri expectedUri = new Uri.Builder()
.scheme(SCHEME_CONTENT)
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
.appendPath("test_private")
.build();
final List<Uri> uri = mAccessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY, false);
assertThat(uri).containsExactly(expectedUri);
}
@Test
@Config(qualifiers = "mcc999")
@Ignore
public void getSliceKeys_indexesDatabase() {
// Force new indexing
Locale.setDefault(new Locale("ca"));
final SearchFeatureProvider provider = new SearchFeatureProviderImpl();
final SlicesFeatureProvider sliceProvider = new SlicesFeatureProviderImpl();
final FakeFeatureFactory factory = FakeFeatureFactory.setupForTest();
factory.searchFeatureProvider = provider;
factory.slicesFeatureProvider = sliceProvider;
// Fake the indexable list.
provider.getSearchIndexableResources().getProviderValues().clear();
provider.getSearchIndexableResources().getProviderValues().add(
new SearchIndexableData(FakeIndexProvider.class,
FakeIndexProvider.SEARCH_INDEX_DATA_PROVIDER));
final SlicesDatabaseAccessor accessor = new SlicesDatabaseAccessor(mContext);
final List<Uri> keys = accessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY,
true /* isPublicSlice */);
assertThat(keys).isNotEmpty();
}
@Test
@Ignore
public void testGetSliceDataFromKey_defaultUnavailableSlice_validSliceReturned() {
String key = "key";
SliceTestUtils.insertSliceToDb(mContext, key, true /* isPlatformSlice */,
null /* customizedUnavailableSliceSubtitle */);
SliceData data = mAccessor.getSliceDataFromKey(key);
assertThat(data.getKey()).isEqualTo(key);
assertThat(data.getTitle()).isEqualTo(SliceTestUtils.FAKE_TITLE);
assertThat(data.getSummary()).isEqualTo(SliceTestUtils.FAKE_SUMMARY);
assertThat(data.getScreenTitle()).isEqualTo(SliceTestUtils.FAKE_SCREEN_TITLE);
assertThat(data.getKeywords()).isEqualTo(SliceTestUtils.FAKE_KEYWORDS);
assertThat(data.getIconResource()).isEqualTo(SliceTestUtils.FAKE_ICON);
assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
assertThat(data.getUri()).isNull();
assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
assertThat(data.getUnavailableSliceSubtitle()).isNull();
}
@Test
@Ignore
public void testGetSliceDataFromKey_customizeSubtitleOfUnavailableSlice_validSliceReturned() {
String key = "key";
String subtitle = "subtitle";
SliceTestUtils.insertSliceToDb(mContext, key, true /* isPlatformSlice */, subtitle);
SliceData data = mAccessor.getSliceDataFromKey(key);
assertThat(data.getKey()).isEqualTo(key);
assertThat(data.getTitle()).isEqualTo(SliceTestUtils.FAKE_TITLE);
assertThat(data.getSummary()).isEqualTo(SliceTestUtils.FAKE_SUMMARY);
assertThat(data.getScreenTitle()).isEqualTo(SliceTestUtils.FAKE_SCREEN_TITLE);
assertThat(data.getKeywords()).isEqualTo(SliceTestUtils.FAKE_KEYWORDS);
assertThat(data.getIconResource()).isEqualTo(SliceTestUtils.FAKE_ICON);
assertThat(data.getFragmentClassName()).isEqualTo(SliceTestUtils.FAKE_FRAGMENT_NAME);
assertThat(data.getUri()).isNull();
assertThat(data.getPreferenceController()).isEqualTo(SliceTestUtils.FAKE_CONTROLLER_NAME);
assertThat(data.getUnavailableSliceSubtitle()).isEqualTo(subtitle);
}
@Implements(ApplicationPackageManager.class)
public static class ShadowApplicationPackageManager extends
org.robolectric.shadows.ShadowApplicationPackageManager {
@Implementation
protected ComponentName getInstantAppResolverSettingsComponent() {
return null;
}
}
}