| /* |
| * 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.SwitchesProvider.EXTRA_SWITCH_CHECKED_STATE; |
| import static com.android.settingslib.drawer.SwitchesProvider.EXTRA_SWITCH_DATA; |
| import static com.android.settingslib.drawer.SwitchesProvider.EXTRA_SWITCH_SET_CHECKED_ERROR; |
| import static com.android.settingslib.drawer.SwitchesProvider.EXTRA_SWITCH_SET_CHECKED_ERROR_MESSAGE; |
| import static com.android.settingslib.drawer.SwitchesProvider.METHOD_GET_DYNAMIC_SUMMARY; |
| import static com.android.settingslib.drawer.SwitchesProvider.METHOD_GET_DYNAMIC_TITLE; |
| import static com.android.settingslib.drawer.SwitchesProvider.METHOD_GET_PROVIDER_ICON; |
| import static com.android.settingslib.drawer.SwitchesProvider.METHOD_GET_SWITCH_DATA; |
| import static com.android.settingslib.drawer.SwitchesProvider.METHOD_IS_CHECKED; |
| import static com.android.settingslib.drawer.SwitchesProvider.METHOD_ON_CHECKED_CHANGED; |
| import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; |
| import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY; |
| import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| |
| import android.content.Context; |
| import android.content.pm.ProviderInfo; |
| import android.os.Bundle; |
| |
| import com.android.settingslib.drawer.SwitchController.MetaData; |
| |
| 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 java.util.ArrayList; |
| import java.util.List; |
| |
| @RunWith(RobolectricTestRunner.class) |
| public class SwitchesProviderTest { |
| |
| @Rule |
| public final ExpectedException thrown = ExpectedException.none(); |
| |
| private Context mContext; |
| private ProviderInfo mProviderInfo; |
| |
| private TestSwitchesProvider mSwitchesProvider; |
| |
| @Before |
| public void setUp() { |
| mContext = RuntimeEnvironment.application; |
| mSwitchesProvider = new TestSwitchesProvider(); |
| mProviderInfo = new ProviderInfo(); |
| mProviderInfo.authority = "auth"; |
| } |
| |
| @Test |
| public void attachInfo_noController_shouldThrowIllegalArgumentException() { |
| thrown.expect(IllegalArgumentException.class); |
| |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| } |
| |
| @Test |
| public void attachInfo_NoSwitchKeyInController_shouldThrowNullPointerException() { |
| thrown.expect(NullPointerException.class); |
| final TestSwitchController controller = new TestSwitchController(); |
| mSwitchesProvider.addSwitchController(controller); |
| |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| } |
| |
| @Test |
| public void attachInfo_NoMetaDataInController_shouldThrowIllegalArgumentException() { |
| thrown.expect(IllegalArgumentException.class); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| mSwitchesProvider.addSwitchController(controller); |
| |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| } |
| |
| @Test |
| public void attachInfo_duplicateSwitchKey_shouldThrowIllegalArgumentException() { |
| thrown.expect(IllegalArgumentException.class); |
| final TestSwitchController controller1 = new TestSwitchController(); |
| final TestSwitchController controller2 = new TestSwitchController(); |
| controller1.setKey("123"); |
| controller2.setKey("123"); |
| controller1.setMetaData(new MetaData("category")); |
| controller2.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller1); |
| mSwitchesProvider.addSwitchController(controller2); |
| |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| } |
| |
| @Test |
| public void attachInfo_hasDifferentControllers_shouldNotThrowException() { |
| final TestSwitchController controller1 = new TestSwitchController(); |
| final TestSwitchController controller2 = new TestSwitchController(); |
| controller1.setKey("123"); |
| controller2.setKey("456"); |
| controller1.setMetaData(new MetaData("category")); |
| controller2.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller1); |
| mSwitchesProvider.addSwitchController(controller2); |
| |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| } |
| |
| @Test |
| public void getSwitchData_shouldReturnDataList() { |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle switchData = mSwitchesProvider.call(METHOD_GET_SWITCH_DATA, "uri" , |
| null /* extras*/); |
| |
| final ArrayList<Bundle> dataList = switchData.getParcelableArrayList(EXTRA_SWITCH_DATA); |
| assertThat(dataList).hasSize(1); |
| assertThat(dataList.get(0).getString(META_DATA_PREFERENCE_KEYHINT)).isEqualTo("123"); |
| } |
| |
| @Test |
| public void getSwitchDataByKey_shouldReturnData() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle switchData = mSwitchesProvider.call(METHOD_GET_SWITCH_DATA, "uri" , extras); |
| |
| assertThat(switchData.getString(META_DATA_PREFERENCE_KEYHINT)).isEqualTo("123"); |
| } |
| |
| @Test |
| public void isChecked_shouldReturnCheckedState() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| controller.setChecked(true); |
| Bundle result = mSwitchesProvider.call(METHOD_IS_CHECKED, "uri" , extras); |
| |
| assertThat(result.getBoolean(EXTRA_SWITCH_CHECKED_STATE)).isTrue(); |
| |
| controller.setChecked(false); |
| result = mSwitchesProvider.call(METHOD_IS_CHECKED, "uri" , extras); |
| |
| assertThat(result.getBoolean(EXTRA_SWITCH_CHECKED_STATE)).isFalse(); |
| } |
| |
| @Test |
| public void getProviderIcon_noImplementInterface_shouldReturnNull() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle iconBundle = mSwitchesProvider.call(METHOD_GET_PROVIDER_ICON, "uri" , extras); |
| |
| assertThat(iconBundle).isNull(); |
| } |
| |
| @Test |
| public void getProviderIcon_implementInterface_shouldReturnIcon() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestDynamicSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle iconBundle = mSwitchesProvider.call(METHOD_GET_PROVIDER_ICON, "uri" , extras); |
| |
| assertThat(iconBundle).isEqualTo(TestDynamicSwitchController.ICON_BUNDLE); |
| } |
| |
| @Test |
| public void getDynamicTitle_noImplementInterface_shouldReturnNull() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle result = mSwitchesProvider.call(METHOD_GET_DYNAMIC_TITLE, "uri" , extras); |
| |
| assertThat(result).isNull(); |
| } |
| |
| @Test |
| public void getDynamicTitle_implementInterface_shouldReturnTitle() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestDynamicSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle result = mSwitchesProvider.call(METHOD_GET_DYNAMIC_TITLE, "uri" , extras); |
| |
| assertThat(result.getString(META_DATA_PREFERENCE_TITLE)) |
| .isEqualTo(TestDynamicSwitchController.TITLE); |
| } |
| |
| @Test |
| public void getDynamicSummary_noImplementInterface_shouldReturnNull() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle result = mSwitchesProvider.call(METHOD_GET_DYNAMIC_SUMMARY, "uri" , extras); |
| |
| assertThat(result).isNull(); |
| } |
| |
| @Test |
| public void getDynamicSummary_implementInterface_shouldReturnSummary() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestDynamicSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle result = mSwitchesProvider.call(METHOD_GET_DYNAMIC_SUMMARY, "uri" , extras); |
| |
| assertThat(result.getString(META_DATA_PREFERENCE_SUMMARY)) |
| .isEqualTo(TestDynamicSwitchController.SUMMARY); |
| } |
| |
| @Test |
| public void onCheckedChangedSuccess_shouldReturnNoError() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle result = mSwitchesProvider.call(METHOD_ON_CHECKED_CHANGED, "uri" , extras); |
| |
| assertThat(result.getBoolean(EXTRA_SWITCH_SET_CHECKED_ERROR)).isFalse(); |
| } |
| |
| @Test |
| public void onCheckedChangedFailed_shouldReturnErrorMessage() { |
| final Bundle extras = new Bundle(); |
| extras.putString(META_DATA_PREFERENCE_KEYHINT, "123"); |
| final TestSwitchController controller = new TestSwitchController(); |
| controller.setKey("123"); |
| controller.setMetaData(new MetaData("category")); |
| controller.setErrorMessage("error"); |
| mSwitchesProvider.addSwitchController(controller); |
| mSwitchesProvider.attachInfo(mContext, mProviderInfo); |
| |
| final Bundle result = mSwitchesProvider.call(METHOD_ON_CHECKED_CHANGED, "uri" , extras); |
| |
| assertThat(result.getBoolean(EXTRA_SWITCH_SET_CHECKED_ERROR)).isTrue(); |
| assertThat(result.getString(EXTRA_SWITCH_SET_CHECKED_ERROR_MESSAGE)).isEqualTo("error"); |
| } |
| |
| private class TestSwitchesProvider extends SwitchesProvider { |
| |
| private List<SwitchController> mControllers; |
| |
| @Override |
| protected List<SwitchController> createSwitchControllers() { |
| return mControllers; |
| } |
| |
| void addSwitchController(SwitchController controller) { |
| if (mControllers == null) { |
| mControllers = new ArrayList<>(); |
| } |
| mControllers.add(controller); |
| } |
| } |
| |
| private static class TestSwitchController extends SwitchController { |
| |
| private String mKey; |
| private MetaData mMetaData; |
| private boolean mChecked; |
| private String mErrorMsg; |
| |
| @Override |
| public String getSwitchKey() { |
| return mKey; |
| } |
| |
| @Override |
| protected MetaData getMetaData() { |
| return mMetaData; |
| } |
| |
| @Override |
| protected boolean isChecked() { |
| return mChecked; |
| } |
| |
| @Override |
| protected boolean onCheckedChanged(boolean checked) { |
| return mErrorMsg == null ? true : false; |
| } |
| |
| @Override |
| protected String getErrorMessage(boolean attemptedChecked) { |
| return mErrorMsg; |
| } |
| |
| void setKey(String key) { |
| mKey = key; |
| } |
| |
| void setMetaData(MetaData metaData) { |
| mMetaData = metaData; |
| } |
| |
| void setChecked(boolean checked) { |
| mChecked = checked; |
| } |
| |
| void setErrorMessage(String errorMsg) { |
| mErrorMsg = errorMsg; |
| } |
| } |
| |
| private static class TestDynamicSwitchController extends TestSwitchController |
| implements ProviderIcon, DynamicTitle, DynamicSummary { |
| |
| static final String TITLE = "title"; |
| static final String SUMMARY = "summary"; |
| static final Bundle ICON_BUNDLE = new Bundle(); |
| |
| @Override |
| public Bundle getProviderIcon() { |
| return ICON_BUNDLE; |
| } |
| |
| @Override |
| public String getDynamicTitle() { |
| return TITLE; |
| } |
| |
| @Override |
| public String getDynamicSummary() { |
| return SUMMARY; |
| } |
| } |
| } |