165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze/*
265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * Copyright (C) 2016 The Android Open Source Project
365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze *
465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * Licensed under the Apache License, Version 2.0 (the "License");
565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * you may not use this file except in compliance with the License.
665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * You may obtain a copy of the License at
765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze *
865fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze *      http://www.apache.org/licenses/LICENSE-2.0
965fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze *
1065fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * Unless required by applicable law or agreed to in writing, software
1165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * distributed under the License is distributed on an "AS IS" BASIS,
1265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * See the License for the specific language governing permissions and
1465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * limitations under the License.
1565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze *
1665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze */
1765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
1865fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzepackage com.android.settings.search;
1965fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
202b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport android.content.ContentResolver;
213746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritzeimport android.content.Intent;
2265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzeimport android.os.Parcel;
232b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport android.provider.Settings;
2465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzeimport android.content.Context;
2565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
269f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner;
2765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzeimport com.android.settings.TestConfig;
282b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport com.android.settings.search.ResultPayload.Availability;
292b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport com.android.settings.search.ResultPayload.SettingsSource;
302b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport org.junit.Before;
3165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzeimport org.junit.Test;
3265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzeimport org.junit.runner.RunWith;
332b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport org.robolectric.RuntimeEnvironment;
3465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzeimport org.robolectric.annotation.Config;
3565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
362b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE;
3765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzeimport static com.google.common.truth.Truth.assertThat;
3865fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
3965fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze@RunWith(SettingsRobolectricTestRunner.class)
4065fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
4165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzepublic class InlineSwitchPayloadTest {
4265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
432b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    private static final String DUMMY_SETTING = "inline_test";
442b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    private static final int STANDARD_ON = 1;
452b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    private static final int FLIPPED_ON = 0;
4665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
472b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    private Context mContext;
482b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
492b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    @Before
502b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    public void setUp() {
512b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        mContext = RuntimeEnvironment.application;
5265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze    }
5365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
5465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze    @Test
5565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze    public void testConstructor_DataRetained() {
5665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        final String uri = "test.com";
5765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        final int type = ResultPayload.PayloadType.INLINE_SWITCH;
582b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        final int source = SettingsSource.SECURE;
593746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final String intentKey = "key";
603746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final String intentVal = "value";
613746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final Intent intent = new Intent();
623746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        intent.putExtra(intentKey, intentVal);
6365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
64458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze        InlineSwitchPayload payload = new InlineSwitchPayload(uri, source, 1, intent, true,
65458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze                1 /* default */);
663746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final Intent retainedIntent = payload.getIntent();
672b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.mSettingKey).isEqualTo(uri);
68694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze        assertThat(payload.getType()).isEqualTo(type);
692b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.mSettingSource).isEqualTo(source);
702b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.isStandard()).isTrue();
712b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.getAvailability()).isEqualTo(ResultPayload.Availability.AVAILABLE);
723746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(retainedIntent.getStringExtra(intentKey)).isEqualTo(intentVal);
7365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze    }
7465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
7565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze    @Test
7665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze    public void testParcelConstructor_DataRetained() {
7765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        String uri = "test.com";
7865fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        int type = ResultPayload.PayloadType.INLINE_SWITCH;
792b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        int source = SettingsSource.SECURE;
803746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final String intentKey = "key";
813746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final String intentVal = "value";
823746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final Intent intent = new Intent();
833746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        intent.putExtra(intentKey, intentVal);
8465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        Parcel parcel = Parcel.obtain();
852b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        parcel.writeParcelable(intent, 0);
8665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        parcel.writeString(uri);
8765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        parcel.writeInt(source);
882b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        parcel.writeInt(InlineSwitchPayload.TRUE);
892b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        parcel.writeInt(InlineSwitchPayload.TRUE);
90458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze        parcel.writeInt(InlineSwitchPayload.TRUE);
9165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        parcel.setDataPosition(0);
9265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
9365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze        InlineSwitchPayload payload = InlineSwitchPayload.CREATOR.createFromParcel(parcel);
94694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze
953746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        final Intent builtIntent = payload.getIntent();
962b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.mSettingKey).isEqualTo(uri);
97694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze        assertThat(payload.getType()).isEqualTo(type);
982b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.mSettingSource).isEqualTo(source);
992b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.isStandard()).isTrue();
1002b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(payload.getAvailability()).isEqualTo(Availability.AVAILABLE);
1013746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(builtIntent.getStringExtra(intentKey)).isEqualTo(intentVal);
10265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze    }
10365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze
1042b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    @Test
1052b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    public void testGetSystem_flippedSetting_returnsFlippedValue() {
1062b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        // Stores 1s as 0s, and vis versa
1072b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        InlineSwitchPayload payload = new InlineSwitchPayload(DUMMY_SETTING, SettingsSource.SYSTEM,
108458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze                FLIPPED_ON, null /* intent */, true, 1 /* default */);
1092b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        int currentValue = 1;
1102b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        Settings.System.putInt(mContext.getContentResolver(), DUMMY_SETTING, currentValue);
1112b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1122b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        int newValue = payload.getValue(mContext);
1132b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1142b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(newValue).isEqualTo(1 - currentValue);
1152b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    }
1162b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1172b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    @Test
1182b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    public void testSetSystem_flippedSetting_updatesToFlippedValue() {
1192b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        // Stores 1s as 0s, and vis versa
1202b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        InlineSwitchPayload payload = new InlineSwitchPayload(DUMMY_SETTING, SettingsSource.SYSTEM,
121458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze                FLIPPED_ON, null /* intent */, true, 1 /* default */);
1222b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        int newValue = 1;
1232b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        ContentResolver resolver = mContext.getContentResolver();
1242b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        Settings.System.putInt(resolver, SCREEN_BRIGHTNESS_MODE, newValue);
1252b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1262b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        payload.setValue(mContext, newValue);
1272b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        int updatedValue = Settings.System.getInt(resolver, DUMMY_SETTING, -1);
1282b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1292b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        assertThat(updatedValue).isEqualTo(1 - newValue);
1302b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    }
1312b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1322b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    @Test(expected = IllegalArgumentException.class)
1332b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    public void testSetSystem_negativeValue_ThrowsError() {
1342b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        InlineSwitchPayload payload = new InlineSwitchPayload(DUMMY_SETTING, SettingsSource.SYSTEM,
135458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze                STANDARD_ON, null /* intent */, true, 1 /* default */);
1362b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1372b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        payload.setValue(mContext, -1);
1382b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    }
1392b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1402b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    @Test(expected = IllegalArgumentException.class)
1412b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    public void testSetSystem_highValue_ThrowsError() {
1422b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        InlineSwitchPayload payload = new InlineSwitchPayload(DUMMY_SETTING, SettingsSource.SYSTEM,
143458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze                STANDARD_ON, null /* intent */, true, 1 /* default */);
1442b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze
1452b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze        payload.setValue(mContext, 2);
1462b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze    }
14765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze}
148