/* * Copyright (C) 2019 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.settingslib.drawer; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_ORDER; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; import static com.android.settingslib.drawer.TileUtils.PROFILE_ALL; import static com.android.settingslib.drawer.TileUtils.PROFILE_PRIMARY; import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.os.Bundle; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; 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.ShadowPackageManager; @RunWith(RobolectricTestRunner.class) public class ProviderTileTest { @Rule public final ExpectedException thrown = ExpectedException.none(); private Context mContext; private ProviderInfo mProviderInfo; private Bundle mMetaData; private Tile mTile; @Before public void setUp() { mContext = RuntimeEnvironment.application; mProviderInfo = new ProviderInfo(); mProviderInfo.applicationInfo = new ApplicationInfo(); mProviderInfo.packageName = mContext.getPackageName(); mProviderInfo.name = "abc"; mProviderInfo.authority = "authority"; mMetaData = new Bundle(); mMetaData.putString(META_DATA_PREFERENCE_KEYHINT, "key"); mMetaData.putString(META_DATA_PREFERENCE_TITLE, "title"); mMetaData.putInt(META_DATA_PREFERENCE_ICON, com.android.internal.R.drawable.ic_plus); mTile = new ProviderTile(mProviderInfo, "category", mMetaData); } @Test public void isPrimaryProfileOnly_profilePrimary_shouldReturnTrue() { mMetaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY); assertThat(mTile.isPrimaryProfileOnly()).isTrue(); } @Test public void isPrimaryProfileOnly_profileAll_shouldReturnFalse() { mMetaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL); assertThat(mTile.isPrimaryProfileOnly()).isFalse(); } @Test public void isPrimaryProfileOnly_noExplicitValue_shouldReturnFalse() { assertThat(mTile.isPrimaryProfileOnly()).isFalse(); } @Test public void getIcon_noContextOrMetadata_shouldThrowNullPointerException() { thrown.expect(NullPointerException.class); final Tile tile = new ProviderTile(mProviderInfo, "category", null); } @Test public void getIcon_hasIconMetadata_returnIcon() { mMetaData.putInt(META_DATA_PREFERENCE_ICON, android.R.drawable.ic_info); assertThat(mTile.getIcon(RuntimeEnvironment.application).getResId()) .isEqualTo(android.R.drawable.ic_info); } @Test public void isIconTintable_hasMetadata_shouldReturnIconTintableMetadata() { final Tile tile = new ProviderTile(mProviderInfo, "category", mMetaData); mMetaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, false); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isFalse(); mMetaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, true); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isTrue(); } @Test public void isIconTintable_noIcon_shouldReturnFalse() { final Tile tile = new ProviderTile(mProviderInfo, "category", mMetaData); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isFalse(); } @Test public void isIconTintable_noTintableMetadata_shouldReturnFalse() { final Tile tile = new ProviderTile(mProviderInfo, "category", mMetaData); mMetaData.putInt(META_DATA_PREFERENCE_ICON, android.R.drawable.ic_info); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isFalse(); } @Test public void getPriority_noMetadata_return0() { final Tile tile = new ProviderTile(mProviderInfo, "category", mMetaData); assertThat(tile.getOrder()).isEqualTo(0); } @Test public void getPriority_badMetadata_return0() { mMetaData.putString(META_DATA_KEY_ORDER, "1"); final Tile tile = new ProviderTile(mProviderInfo, "category", mMetaData); assertThat(tile.getOrder()).isEqualTo(0); } @Test public void getPriority_validMetadata_returnMetadataValue() { mMetaData.putInt(META_DATA_KEY_ORDER, 1); final Tile tile = new ProviderTile(mProviderInfo, "category", mMetaData); assertThat(tile.getOrder()).isEqualTo(1); } @Test @Config(shadows = ShadowTileUtils.class) public void getTitle_shouldEnsureMetadataNotStale() { final ResolveInfo info = new ResolveInfo(); info.providerInfo = mProviderInfo; final ShadowPackageManager spm = Shadow.extract(mContext.getPackageManager()); spm.addResolveInfoForIntent( new Intent().setClassName(mProviderInfo.packageName, mProviderInfo.name), info); ShadowTileUtils.setMetaData(mMetaData); final Tile tile = new ProviderTile(mProviderInfo, "category", mMetaData); final long staleTimeStamp = -10000; tile.mLastUpdateTime = staleTimeStamp; tile.getTitle(RuntimeEnvironment.application); assertThat(tile.mLastUpdateTime).isNotEqualTo(staleTimeStamp); } @Implements(TileUtils.class) private static class ShadowTileUtils { private static Bundle sMetaData; @Implementation protected static Bundle getSwitchDataFromProvider(Context context, String authority, String key) { return sMetaData; } private static void setMetaData(Bundle metaData) { sMetaData = metaData; } } }