Merge "Migrate robolectric tests to junit tests"
This commit is contained in:
@@ -24,7 +24,6 @@ import com.android.settings.core.BasePreferenceController;
|
|||||||
import com.android.settings.core.PreferenceControllerListHelper;
|
import com.android.settings.core.PreferenceControllerListHelper;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settings.search.DatabaseIndexingUtils;
|
import com.android.settings.search.DatabaseIndexingUtils;
|
||||||
import com.android.settingslib.search.Indexable;
|
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
@@ -30,4 +30,4 @@ public class FakeSettingsPanelActivity extends SettingsPanelActivity {
|
|||||||
final Intent intent = new Intent(FakePanelContent.FAKE_ACTION);
|
final Intent intent = new Intent(FakePanelContent.FAKE_ACTION);
|
||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -115,4 +115,4 @@ public class FakeSettingsFragment extends DashboardFragment {
|
|||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -12,9 +12,7 @@
|
|||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.testutils;
|
package com.android.settings.testutils;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -26,8 +24,6 @@ import android.provider.Settings;
|
|||||||
import com.android.settings.core.TogglePreferenceController;
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
import com.android.settings.slices.SliceBackgroundWorker;
|
import com.android.settings.slices.SliceBackgroundWorker;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
public class FakeToggleController extends TogglePreferenceController {
|
public class FakeToggleController extends TogglePreferenceController {
|
||||||
|
|
||||||
public static final String AVAILABILITY_KEY = "fake_toggle_availability_key";
|
public static final String AVAILABILITY_KEY = "fake_toggle_availability_key";
|
||||||
|
@@ -322,4 +322,4 @@ public class SliceTester {
|
|||||||
expectedKeywords.add(data.getScreenTitle().toString());
|
expectedKeywords.add(data.getScreenTitle().toString());
|
||||||
assertThat(keywords).containsExactlyElementsIn(expectedKeywords);
|
assertThat(keywords).containsExactlyElementsIn(expectedKeywords);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,18 +0,0 @@
|
|||||||
package com.android.settings.widget;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
|
||||||
public class DonutViewTest {
|
|
||||||
@Test
|
|
||||||
public void getPercentageStringSpannable_doesntCrashForMissingPercentage() {
|
|
||||||
Context context = RuntimeEnvironment.application;
|
|
||||||
|
|
||||||
DonutView.getPercentageStringSpannable(context.getResources(), "50%", "h");
|
|
||||||
}
|
|
||||||
}
|
|
@@ -21,13 +21,14 @@ import android.text.Spannable;
|
|||||||
import android.text.style.ClickableSpan;
|
import android.text.style.ClickableSpan;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class LinkifyUtilsTest {
|
public class LinkifyUtilsTest {
|
||||||
private static final String TEST_STRING = "to LINK_BEGINscanning settingsLINK_END.";
|
private static final String TEST_STRING = "to LINK_BEGINscanning settingsLINK_END.";
|
||||||
private static final String WRONG_STRING = "to scanning settingsLINK_END.";
|
private static final String WRONG_STRING = "to scanning settingsLINK_END.";
|
||||||
@@ -41,7 +42,7 @@ public class LinkifyUtilsTest {
|
|||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
mSpanStringBuilder = new StringBuilder(TEST_STRING);
|
mSpanStringBuilder = new StringBuilder(TEST_STRING);
|
||||||
mWrongSpanStringBuilder = new StringBuilder(WRONG_STRING);
|
mWrongSpanStringBuilder = new StringBuilder(WRONG_STRING);
|
||||||
mTextView = new TextView(RuntimeEnvironment.application);
|
mTextView = new TextView(ApplicationProvider.getApplicationContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
25
tests/unit/src/com/android/settings/TestUtils.java
Normal file
25
tests/unit/src/com/android/settings/TestUtils.java
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience methods and constants for testing.
|
||||||
|
*/
|
||||||
|
public class TestUtils {
|
||||||
|
public static final long KILOBYTE = 1024L; // TODO: Change to 1000 in O Robolectric.
|
||||||
|
public static final long MEGABYTE = KILOBYTE * KILOBYTE;
|
||||||
|
public static final long GIGABYTE = KILOBYTE * MEGABYTE;
|
||||||
|
}
|
@@ -19,6 +19,9 @@ package com.android.settings.accessibility;
|
|||||||
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
|
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
|
||||||
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
|
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -30,10 +33,8 @@ import androidx.preference.SwitchPreference;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class AccessibilityShortcutPreferenceControllerTest {
|
public class AccessibilityShortcutPreferenceControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -42,7 +43,7 @@ public class AccessibilityShortcutPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mController = new AccessibilityShortcutPreferenceController(mContext,
|
mController = new AccessibilityShortcutPreferenceController(mContext,
|
||||||
"accessibility_shortcut_preference");
|
"accessibility_shortcut_preference");
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -26,16 +26,16 @@ import android.content.Context;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class DisableAnimationsPreferenceControllerTest {
|
public class DisableAnimationsPreferenceControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -44,7 +44,7 @@ public class DisableAnimationsPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mController = new DisableAnimationsPreferenceController(mContext, "disable_animation");
|
mController = new DisableAnimationsPreferenceController(mContext, "disable_animation");
|
||||||
}
|
}
|
@@ -22,16 +22,16 @@ import android.content.Context;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class FontWeightAdjustmentPreferenceControllerTest {
|
public class FontWeightAdjustmentPreferenceControllerTest {
|
||||||
private static final int ON = FontWeightAdjustmentPreferenceController.BOLD_TEXT_ADJUSTMENT;
|
private static final int ON = FontWeightAdjustmentPreferenceController.BOLD_TEXT_ADJUSTMENT;
|
||||||
private static final int OFF = 0;
|
private static final int OFF = 0;
|
||||||
@@ -42,7 +42,7 @@ public class FontWeightAdjustmentPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mController = new FontWeightAdjustmentPreferenceController(
|
mController = new FontWeightAdjustmentPreferenceController(
|
||||||
mContext, "font_weight_adjustment");
|
mContext, "font_weight_adjustment");
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -22,16 +22,16 @@ import android.content.Context;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class HighTextContrastPreferenceControllerTest {
|
public class HighTextContrastPreferenceControllerTest {
|
||||||
|
|
||||||
private static final int ON = 1;
|
private static final int ON = 1;
|
||||||
@@ -44,7 +44,7 @@ public class HighTextContrastPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mController = new HighTextContrastPreferenceController(mContext, "text_contrast");
|
mController = new HighTextContrastPreferenceController(mContext, "text_contrast");
|
||||||
}
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -25,16 +25,16 @@ import android.content.Context;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class LargePointerIconPreferenceControllerTest {
|
public class LargePointerIconPreferenceControllerTest {
|
||||||
|
|
||||||
private static final int UNKNOWN = -1;
|
private static final int UNKNOWN = -1;
|
||||||
@@ -45,7 +45,7 @@ public class LargePointerIconPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mController = new LargePointerIconPreferenceController(mContext, "large_pointer");
|
mController = new LargePointerIconPreferenceController(mContext, "large_pointer");
|
||||||
}
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,15 +20,16 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class MagnificationPreferenceControllerTest {
|
public class MagnificationPreferenceControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -36,7 +37,7 @@ public class MagnificationPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new MagnificationPreferenceController(mContext, "magnification");
|
mController = new MagnificationPreferenceController(mContext, "magnification");
|
||||||
}
|
}
|
||||||
|
|
@@ -22,13 +22,13 @@ import android.content.ComponentName;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
/** Tests for {@link PreferredShortcuts} */
|
/** Tests for {@link PreferredShortcuts} */
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class PreferredShortcutsTest {
|
public class PreferredShortcutsTest {
|
||||||
|
|
||||||
private static final String PACKAGE_NAME_1 = "com.test1.example";
|
private static final String PACKAGE_NAME_1 = "com.test1.example";
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -23,16 +23,16 @@ import android.os.UserHandle;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class PrimaryMonoPreferenceControllerTest {
|
public class PrimaryMonoPreferenceControllerTest {
|
||||||
|
|
||||||
private static final int ON = 1;
|
private static final int ON = 1;
|
||||||
@@ -45,7 +45,7 @@ public class PrimaryMonoPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mController = new PrimaryMonoPreferenceController(mContext, "test_key");
|
mController = new PrimaryMonoPreferenceController(mContext, "test_key");
|
||||||
}
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -21,15 +21,16 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SelectLongPressTimeoutPreferenceControllerTest {
|
public class SelectLongPressTimeoutPreferenceControllerTest {
|
||||||
private static final int VALID_VALUE = 1500;
|
private static final int VALID_VALUE = 1500;
|
||||||
private static final int INVALID_VALUE = 0;
|
private static final int INVALID_VALUE = 0;
|
||||||
@@ -40,7 +41,7 @@ public class SelectLongPressTimeoutPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new SelectLongPressTimeoutPreferenceController(mContext, "press_timeout");
|
mController = new SelectLongPressTimeoutPreferenceController(mContext, "press_timeout");
|
||||||
}
|
}
|
||||||
|
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2016 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,13 +18,14 @@ package com.android.settings.accounts;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class RemoveUserFragmentTest {
|
public class RemoveUserFragmentTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -22,13 +22,14 @@ import android.accounts.Account;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SyncStateSwitchPreferenceTest {
|
public class SyncStateSwitchPreferenceTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -36,7 +37,7 @@ public class SyncStateSwitchPreferenceTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -11,26 +11,26 @@
|
|||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.app.AppOpsManager;
|
import android.app.AppOpsManager;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class AppStateInstallAppsBridgeTest {
|
public class AppStateInstallAppsBridgeTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testInstallAppsStateCanInstallApps() {
|
public void testInstallAppsStateCanInstallApps() {
|
||||||
AppStateInstallAppsBridge.InstallAppsState appState =
|
AppStateInstallAppsBridge.InstallAppsState appState =
|
||||||
new AppStateInstallAppsBridge.InstallAppsState();
|
new AppStateInstallAppsBridge.InstallAppsState();
|
||||||
assertThat(appState.canInstallApps()).isFalse();
|
assertThat(appState.canInstallApps()).isFalse();
|
||||||
|
|
||||||
appState.permissionRequested = true;
|
appState.permissionRequested = true;
|
||||||
@@ -46,7 +46,7 @@ public class AppStateInstallAppsBridgeTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testInstallAppsStateIsPotentialAppSource() {
|
public void testInstallAppsStateIsPotentialAppSource() {
|
||||||
AppStateInstallAppsBridge.InstallAppsState appState =
|
AppStateInstallAppsBridge.InstallAppsState appState =
|
||||||
new AppStateInstallAppsBridge.InstallAppsState();
|
new AppStateInstallAppsBridge.InstallAppsState();
|
||||||
assertThat(appState.isPotentialAppSource()).isFalse();
|
assertThat(appState.isPotentialAppSource()).isFalse();
|
||||||
|
|
||||||
appState.appOpMode = AppOpsManager.MODE_ERRORED;
|
appState.appOpMode = AppOpsManager.MODE_ERRORED;
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -11,24 +11,24 @@
|
|||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class EnterpriseDefaultAppsTest {
|
public class EnterpriseDefaultAppsTest {
|
||||||
@Test
|
@Test
|
||||||
public void testNumberOfIntentsCorrelateWithUI() {
|
public void testNumberOfIntentsCorrelateWithUI() {
|
||||||
final int concatenation_templates[] =
|
final int[] concatenation_templates =
|
||||||
new int[]{0 /* no need for single app name */,
|
new int[]{0 /* no need for single app name */,
|
||||||
R.string.app_names_concatenation_template_2,
|
R.string.app_names_concatenation_template_2,
|
||||||
R.string.app_names_concatenation_template_3};
|
R.string.app_names_concatenation_template_3};
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,13 +18,14 @@ package com.android.settings.applications.assist;
|
|||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class AssistSettingObserverTest {
|
public class AssistSettingObserverTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -37,11 +37,12 @@ import static com.android.settings.applications.manageapplications.ManageApplica
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class AppFilterRegistryTest {
|
public class AppFilterRegistryTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,13 +20,14 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class FaceSettingsAttentionPreferenceControllerTest {
|
public class FaceSettingsAttentionPreferenceControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -34,7 +35,7 @@ public class FaceSettingsAttentionPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new FaceSettingsAttentionPreferenceController(mContext);
|
mController = new FaceSettingsAttentionPreferenceController(mContext);
|
||||||
}
|
}
|
||||||
|
|
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.core;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
public class BadPreferenceController extends BasePreferenceController {
|
||||||
|
|
||||||
|
public BadPreferenceController(Context context, String preferenceKey) {
|
||||||
|
super(context, preferenceKey);
|
||||||
|
throw new IllegalArgumentException("error");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
return AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useDynamicSliceSummary() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.core;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.android.settings.core.codeinspection.CodeInspector;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BasePreferenceControllerSignatureInspector extends CodeInspector {
|
||||||
|
|
||||||
|
private final List<String> mExemptList;
|
||||||
|
|
||||||
|
public BasePreferenceControllerSignatureInspector(List<Class<?>> classes) {
|
||||||
|
super(classes);
|
||||||
|
mExemptList = new ArrayList<>();
|
||||||
|
initializeExemptList(mExemptList,
|
||||||
|
"exempt_invalid_base_preference_controller_constructor");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
StringBuilder badClasses = new StringBuilder();
|
||||||
|
|
||||||
|
for (Class c : mClasses) {
|
||||||
|
if (!isConcreteSettingsClass(c)) {
|
||||||
|
// Not a Settings class, or is abstract, don't care.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!BasePreferenceController.class.isAssignableFrom(c)) {
|
||||||
|
// Not a BasePreferenceController, don't care.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final String className = c.getName();
|
||||||
|
if (mExemptList.remove(className)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final Constructor[] constructors = c.getDeclaredConstructors();
|
||||||
|
if (constructors == null || constructors.length == 0) {
|
||||||
|
badClasses.append(c.getName()).append(",");
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean hasValidConstructor = false;
|
||||||
|
for (Constructor constructor : constructors) {
|
||||||
|
if (hasValidConstructorSignature(constructor)) {
|
||||||
|
hasValidConstructor = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!hasValidConstructor) {
|
||||||
|
badClasses.append(className).append(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertWithMessage("All BasePreferenceController (and subclasses) constructor must either"
|
||||||
|
+ " only take Context, or (Context, String). No other types are allowed")
|
||||||
|
.that(badClasses.toString())
|
||||||
|
.isEmpty();
|
||||||
|
|
||||||
|
assertWithMessage("Something in the exempt list is no longer relevant. Please remove"
|
||||||
|
+ "it from packages/apps/Settings/tests/robotests/assets/"
|
||||||
|
+ "exempt_invalid_base_preference_controller_constructor")
|
||||||
|
.that(mExemptList)
|
||||||
|
.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean hasValidConstructorSignature(Constructor constructor) {
|
||||||
|
final Class[] parameterTypes = constructor.getParameterTypes();
|
||||||
|
if (parameterTypes.length == 1) {
|
||||||
|
return Context.class.isAssignableFrom(parameterTypes[0]);
|
||||||
|
} else if (parameterTypes.length == 2) {
|
||||||
|
return Context.class.isAssignableFrom(parameterTypes[0])
|
||||||
|
&& String.class.isAssignableFrom(parameterTypes[1]);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,33 +1,35 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* except in compliance with the License. You may obtain a copy of the License at
|
* 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
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* KIND, either express or implied. See the License for the specific language governing
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* permissions and limitations under the License.
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.core;
|
package com.android.settings.core;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.slices.SliceData;
|
import com.android.settings.slices.SliceData;
|
||||||
import com.android.settings.widget.SeekBarPreference;
|
import com.android.settings.widget.SeekBarPreference;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SettingsSliderPreferenceControllerTest {
|
public class SettingsSliderPreferenceControllerTest {
|
||||||
|
|
||||||
private FakeSliderPreferenceController mSliderController;
|
private FakeSliderPreferenceController mSliderController;
|
||||||
@@ -36,9 +38,9 @@ public class SettingsSliderPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mPreference = new SeekBarPreference(RuntimeEnvironment.application);
|
mPreference = new SeekBarPreference(ApplicationProvider.getApplicationContext());
|
||||||
mSliderController = new FakeSliderPreferenceController(RuntimeEnvironment.application,
|
mSliderController = new FakeSliderPreferenceController(
|
||||||
"key");
|
ApplicationProvider.getApplicationContext(), "key");
|
||||||
|
|
||||||
mPreference.setContinuousUpdates(true);
|
mPreference.setContinuousUpdates(true);
|
||||||
mPreference.setMin(mSliderController.getMin());
|
mPreference.setMin(mSliderController.getMin());
|
||||||
@@ -71,7 +73,7 @@ public class SettingsSliderPreferenceControllerTest {
|
|||||||
|
|
||||||
private class FakeSliderPreferenceController extends SliderPreferenceController {
|
private class FakeSliderPreferenceController extends SliderPreferenceController {
|
||||||
|
|
||||||
private final int MAX_STEPS = 2112;
|
private static final int MAX_STEPS = 2112;
|
||||||
private int mPosition;
|
private int mPosition;
|
||||||
|
|
||||||
private FakeSliderPreferenceController(Context context, String key) {
|
private FakeSliderPreferenceController(Context context, String key) {
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,16 +20,16 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.slices.SliceData;
|
import com.android.settings.slices.SliceData;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class TogglePreferenceControllerTest {
|
public class TogglePreferenceControllerTest {
|
||||||
|
|
||||||
private FakeToggle mToggleController;
|
private FakeToggle mToggleController;
|
||||||
@@ -39,7 +39,7 @@ public class TogglePreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mToggleController = new FakeToggle(mContext, "key");
|
mToggleController = new FakeToggle(mContext, "key");
|
||||||
}
|
}
|
||||||
@@ -102,7 +102,7 @@ public class TogglePreferenceControllerTest {
|
|||||||
|
|
||||||
private static class FakeToggle extends TogglePreferenceController {
|
private static class FakeToggle extends TogglePreferenceController {
|
||||||
|
|
||||||
private boolean checkedFlag;
|
private boolean mCheckedFlag;
|
||||||
|
|
||||||
private FakeToggle(Context context, String preferenceKey) {
|
private FakeToggle(Context context, String preferenceKey) {
|
||||||
super(context, preferenceKey);
|
super(context, preferenceKey);
|
||||||
@@ -110,12 +110,12 @@ public class TogglePreferenceControllerTest {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isChecked() {
|
public boolean isChecked() {
|
||||||
return checkedFlag;
|
return mCheckedFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean setChecked(boolean isChecked) {
|
public boolean setChecked(boolean isChecked) {
|
||||||
checkedFlag = isChecked;
|
mCheckedFlag = isChecked;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.core.codeinspection;
|
||||||
|
|
||||||
|
import com.google.common.reflect.ClassPath;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans and builds all classes in current classloader.
|
||||||
|
*/
|
||||||
|
public class ClassScanner {
|
||||||
|
|
||||||
|
public List<Class<?>> getClassesForPackage(String packageName) throws ClassNotFoundException {
|
||||||
|
final List<Class<?>> classes = new ArrayList<>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||||
|
ClassPath classPath = ClassPath.from(classLoader);
|
||||||
|
|
||||||
|
// Some anonymous classes don't return true when calling isAnonymousClass(), but they
|
||||||
|
// always seem to be nested anonymous classes like com.android.settings.Foo$1$2. In
|
||||||
|
// general we don't want any anonymous classes so we just filter these out by searching
|
||||||
|
// for $[0-9] in the name.
|
||||||
|
Pattern anonymousClassPattern = Pattern.compile(".*\\$\\d+.*");
|
||||||
|
Matcher anonymousClassMatcher = anonymousClassPattern.matcher("");
|
||||||
|
|
||||||
|
for (ClassPath.ClassInfo info : classPath.getAllClasses()) {
|
||||||
|
if (info.getPackageName().startsWith(packageName)) {
|
||||||
|
try {
|
||||||
|
Class clazz = classLoader.loadClass(info.getName());
|
||||||
|
if (clazz.isAnonymousClass() || anonymousClassMatcher.reset(
|
||||||
|
clazz.getName()).matches()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
classes.add(clazz);
|
||||||
|
} catch (NoClassDefFoundError e) {
|
||||||
|
// do nothing. this class hasn't been found by the
|
||||||
|
// loader, and we don't care.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (final IOException e) {
|
||||||
|
throw new ClassNotFoundException("Error when parsing " + packageName, e);
|
||||||
|
}
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.core.codeinspection;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inspector takes a list of class objects and perform static code analysis in its {@link #run()}
|
||||||
|
* method.
|
||||||
|
*/
|
||||||
|
public abstract class CodeInspector {
|
||||||
|
|
||||||
|
protected static final String PACKAGE_NAME = "com.android.settings";
|
||||||
|
|
||||||
|
private static final String TEST_CLASS_SUFFIX = "Test";
|
||||||
|
private static final String TEST_INNER_CLASS_SIGNATURE = "Test$";
|
||||||
|
|
||||||
|
protected final List<Class<?>> mClasses;
|
||||||
|
|
||||||
|
public CodeInspector(List<Class<?>> classes) {
|
||||||
|
mClasses = classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Code inspection runner method.
|
||||||
|
*/
|
||||||
|
public abstract void run();
|
||||||
|
|
||||||
|
protected void assertNoObsoleteInExemptList(String listName, List<String> list) {
|
||||||
|
final StringBuilder obsoleteExemptItems = new StringBuilder(listName).append(
|
||||||
|
" contains item that should not be exempted.\n");
|
||||||
|
for (String c : list) {
|
||||||
|
obsoleteExemptItems.append(c).append("\n");
|
||||||
|
}
|
||||||
|
assertWithMessage(obsoleteExemptItems.toString()).that(list).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isConcreteSettingsClass(Class clazz) {
|
||||||
|
// Abstract classes
|
||||||
|
if (Modifier.isAbstract(clazz.getModifiers())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final String packageName = clazz.getPackage().getName();
|
||||||
|
// Classes that are not in Settings
|
||||||
|
if (!packageName.contains(PACKAGE_NAME + ".") && !packageName.endsWith(PACKAGE_NAME)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final String className = clazz.getName();
|
||||||
|
// Classes from tests
|
||||||
|
if (className.endsWith(TEST_CLASS_SUFFIX)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (className.contains(TEST_INNER_CLASS_SIGNATURE)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void initializeExemptList(List<String> exemptList, String filename) {
|
||||||
|
try {
|
||||||
|
final InputStream in = ApplicationProvider.getApplicationContext()
|
||||||
|
.getAssets().open(filename);
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
exemptList.add(line);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalArgumentException("Error initializing exempt list " + filename, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.core.codeinspection;
|
||||||
|
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
import android.util.ArraySet;
|
||||||
|
|
||||||
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnAttach;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnCreate;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnDestroy;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnPause;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnResume;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.SetPreferenceScreen;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class LifecycleObserverCodeInspector extends CodeInspector {
|
||||||
|
|
||||||
|
private static final List<Class> LIFECYCLE_EVENTS = Arrays.asList(
|
||||||
|
OnAttach.class,
|
||||||
|
OnCreate.class,
|
||||||
|
OnCreateOptionsMenu.class,
|
||||||
|
OnDestroy.class,
|
||||||
|
OnOptionsItemSelected.class,
|
||||||
|
OnPause.class,
|
||||||
|
OnPrepareOptionsMenu.class,
|
||||||
|
OnResume.class,
|
||||||
|
OnSaveInstanceState.class,
|
||||||
|
OnStart.class,
|
||||||
|
OnStop.class,
|
||||||
|
SetPreferenceScreen.class
|
||||||
|
);
|
||||||
|
|
||||||
|
public LifecycleObserverCodeInspector(List<Class<?>> classes) {
|
||||||
|
super(classes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final Set<String> notImplementingLifecycleObserver = new ArraySet<>();
|
||||||
|
for (Class clazz : mClasses) {
|
||||||
|
if (!isConcreteSettingsClass(clazz)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
boolean classObservesLifecycleEvent = false;
|
||||||
|
for (Class event : LIFECYCLE_EVENTS) {
|
||||||
|
if (event.isAssignableFrom(clazz)) {
|
||||||
|
classObservesLifecycleEvent = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (classObservesLifecycleEvent && !LifecycleObserver.class.isAssignableFrom(clazz)) {
|
||||||
|
// Observes LifecycleEvent but not implementing LifecycleObserver. Something is
|
||||||
|
// wrong.
|
||||||
|
notImplementingLifecycleObserver.add(clazz.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!notImplementingLifecycleObserver.isEmpty()) {
|
||||||
|
final String errorTemplate =
|
||||||
|
"The following class(es) implements lifecycle.events.*, but don't "
|
||||||
|
+ "implement LifecycleObserver. Something is wrong:\n";
|
||||||
|
final StringBuilder error = new StringBuilder(errorTemplate);
|
||||||
|
for (String name : notImplementingLifecycleObserver) {
|
||||||
|
error.append(name).append('\n');
|
||||||
|
}
|
||||||
|
fail(error.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.core.instrumentation;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
|
|
||||||
|
import android.util.ArraySet;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import com.android.settings.core.codeinspection.CodeInspector;
|
||||||
|
import com.android.settingslib.core.instrumentation.Instrumentable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link CodeInspector} that verifies all fragments implements Instrumentable.
|
||||||
|
*/
|
||||||
|
public class InstrumentableFragmentCodeInspector extends CodeInspector {
|
||||||
|
|
||||||
|
private final List<String> mNotImplementingInstrumentableExemptList;
|
||||||
|
|
||||||
|
public InstrumentableFragmentCodeInspector(List<Class<?>> classes) {
|
||||||
|
super(classes);
|
||||||
|
mNotImplementingInstrumentableExemptList = new ArrayList<>();
|
||||||
|
initializeExemptList(mNotImplementingInstrumentableExemptList,
|
||||||
|
"exempt_not_implementing_instrumentable");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final Set<String> broken = new ArraySet<>();
|
||||||
|
|
||||||
|
for (Class clazz : mClasses) {
|
||||||
|
if (!isConcreteSettingsClass(clazz)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final String className = clazz.getName();
|
||||||
|
// If it's a fragment, it must also be instrumentable.
|
||||||
|
final boolean allowlisted =
|
||||||
|
mNotImplementingInstrumentableExemptList.remove(className);
|
||||||
|
if (Fragment.class.isAssignableFrom(clazz)
|
||||||
|
&& !Instrumentable.class.isAssignableFrom(clazz)
|
||||||
|
&& !allowlisted) {
|
||||||
|
broken.add(className);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final StringBuilder sb = new StringBuilder(
|
||||||
|
"All fragments should implement Instrumentable, but the following are not:\n");
|
||||||
|
for (String c : broken) {
|
||||||
|
sb.append(c).append("\n");
|
||||||
|
}
|
||||||
|
assertWithMessage(sb.toString()).that(broken.isEmpty()).isTrue();
|
||||||
|
assertNoObsoleteInExemptList("exempt_not_implementing_instrumentable",
|
||||||
|
mNotImplementingInstrumentableExemptList);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2016 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -29,6 +29,9 @@ import android.content.pm.ProviderInfo;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settingslib.drawer.ActivityTile;
|
import com.android.settingslib.drawer.ActivityTile;
|
||||||
import com.android.settingslib.drawer.CategoryKey;
|
import com.android.settingslib.drawer.CategoryKey;
|
||||||
import com.android.settingslib.drawer.DashboardCategory;
|
import com.android.settingslib.drawer.DashboardCategory;
|
||||||
@@ -38,13 +41,11 @@ import com.android.settingslib.drawer.Tile;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class CategoryManagerTest {
|
public class CategoryManagerTest {
|
||||||
|
|
||||||
private ActivityInfo mActivityInfo;
|
private ActivityInfo mActivityInfo;
|
||||||
@@ -55,7 +56,7 @@ public class CategoryManagerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mActivityInfo = new ActivityInfo();
|
mActivityInfo = new ActivityInfo();
|
||||||
mActivityInfo.packageName = "pkg";
|
mActivityInfo.packageName = "pkg";
|
||||||
mActivityInfo.name = "class";
|
mActivityInfo.name = "class";
|
||||||
@@ -144,7 +145,8 @@ public class CategoryManagerTest {
|
|||||||
mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
|
mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
|
||||||
|
|
||||||
// Sort their priorities
|
// Sort their priorities
|
||||||
mCategoryManager.sortCategories(RuntimeEnvironment.application, mCategoryByKeyMap);
|
mCategoryManager.sortCategories(ApplicationProvider.getApplicationContext(),
|
||||||
|
mCategoryByKeyMap);
|
||||||
|
|
||||||
// Verify they are now sorted.
|
// Verify they are now sorted.
|
||||||
assertThat(category.getTile(0)).isSameInstanceAs(tile3);
|
assertThat(category.getTile(0)).isSameInstanceAs(tile3);
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,14 +18,15 @@ package com.android.settings.dashboard;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.accounts.AccountDashboardFragment;
|
import com.android.settings.accounts.AccountDashboardFragment;
|
||||||
import com.android.settingslib.drawer.CategoryKey;
|
import com.android.settingslib.drawer.CategoryKey;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class DashboardFragmentRegistryTest {
|
public class DashboardFragmentRegistryTest {
|
||||||
@Test
|
@Test
|
||||||
public void pageAndKeyShouldHave1to1Mapping() {
|
public void pageAndKeyShouldHave1to1Mapping() {
|
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.dashboard;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
import com.android.settings.core.PreferenceControllerListHelper;
|
||||||
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
|
import com.android.settings.search.DatabaseIndexingUtils;
|
||||||
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DashboardFragmentSearchIndexProviderInspector {
|
||||||
|
|
||||||
|
public static boolean isSharingPreferenceControllers(Class clazz) {
|
||||||
|
final Context context = ApplicationProvider.getApplicationContext();
|
||||||
|
final Fragment fragment;
|
||||||
|
try {
|
||||||
|
fragment = Fragment.instantiate(context, clazz.getName());
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// Can't do much with exception, assume the test passed.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(fragment instanceof DashboardFragment)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
final BaseSearchIndexProvider provider =
|
||||||
|
(BaseSearchIndexProvider) DatabaseIndexingUtils.getSearchIndexProvider(clazz);
|
||||||
|
if (provider == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
final List<AbstractPreferenceController> controllersFromSearchIndexProvider;
|
||||||
|
final List<AbstractPreferenceController> controllersFromFragment;
|
||||||
|
try {
|
||||||
|
controllersFromSearchIndexProvider = provider.getPreferenceControllers(context);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// Can't do much with exception, assume the test passed.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
controllersFromFragment =
|
||||||
|
((DashboardFragment) fragment).createPreferenceControllers(context);
|
||||||
|
List<BasePreferenceController> controllersFromXml = PreferenceControllerListHelper
|
||||||
|
.getPreferenceControllersFromXml(context,
|
||||||
|
((DashboardFragment) fragment).getPreferenceScreenResId());
|
||||||
|
final List<BasePreferenceController> uniqueControllerFromXml =
|
||||||
|
PreferenceControllerListHelper.filterControllers(
|
||||||
|
controllersFromXml, controllersFromFragment);
|
||||||
|
controllersFromFragment.addAll(uniqueControllerFromXml);
|
||||||
|
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// Can't do much with exception, assume the test passed.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (controllersFromFragment == controllersFromSearchIndexProvider) {
|
||||||
|
return true;
|
||||||
|
} else if (controllersFromFragment != null && controllersFromSearchIndexProvider != null) {
|
||||||
|
return controllersFromFragment.size() == controllersFromSearchIndexProvider.size();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,6 +20,8 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.icu.text.Collator;
|
import android.icu.text.Collator;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.datetime.timezone.RegionZonePicker.TimeZoneInfoComparator;
|
import com.android.settings.datetime.timezone.RegionZonePicker.TimeZoneInfoComparator;
|
||||||
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
|
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
|
||||||
|
|
||||||
@@ -31,9 +33,8 @@ import java.util.Collections;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class RegionZonePickerTest {
|
public class RegionZonePickerTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -23,18 +23,19 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
|
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class TimeZoneInfoPreferenceControllerTest {
|
public class TimeZoneInfoPreferenceControllerTest {
|
||||||
|
|
||||||
private TimeZoneInfo mTimeZoneInfo;
|
private TimeZoneInfo mTimeZoneInfo;
|
||||||
@@ -42,7 +43,7 @@ public class TimeZoneInfoPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
final Context context = RuntimeEnvironment.application;
|
final Context context = ApplicationProvider.getApplicationContext();
|
||||||
final Date now = new Date(0L); // 00:00 1/1/1970
|
final Date now = new Date(0L); // 00:00 1/1/1970
|
||||||
final Formatter formatter = new Formatter(Locale.US, now);
|
final Formatter formatter = new Formatter(Locale.US, now);
|
||||||
mTimeZoneInfo = formatter.format("America/Los_Angeles");
|
mTimeZoneInfo = formatter.format("America/Los_Angeles");
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,6 +18,8 @@ package com.android.settings.datetime.timezone;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
|
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -25,9 +27,8 @@ import org.junit.runner.RunWith;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class TimeZoneInfoTest {
|
public class TimeZoneInfoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -22,14 +22,14 @@ import android.content.Context;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class OverlaySettingsPreferenceControllerTest {
|
public class OverlaySettingsPreferenceControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -38,7 +38,7 @@ public class OverlaySettingsPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new OverlaySettingsPreferenceController(mContext);
|
mController = new OverlaySettingsPreferenceController(mContext);
|
||||||
mPreference = new SwitchPreference(mContext);
|
mPreference = new SwitchPreference(mContext);
|
||||||
}
|
}
|
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.development.autofill;
|
||||||
|
|
||||||
|
import android.content.ContentResolver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.provider.Settings.SettingNotFoundException;
|
||||||
|
|
||||||
|
final class AutofillTestingHelper {
|
||||||
|
private final ContentResolver mResolver;
|
||||||
|
|
||||||
|
AutofillTestingHelper(Context context) {
|
||||||
|
mResolver = context.getContentResolver();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoggingLevel(int max) {
|
||||||
|
setGlobal(Settings.Global.AUTOFILL_LOGGING_LEVEL, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxPartitionsSize(int max) {
|
||||||
|
setGlobal(Settings.Global.AUTOFILL_MAX_PARTITIONS_SIZE, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxVisibleDatasets(int level) {
|
||||||
|
setGlobal(Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLoggingLevel() throws SettingNotFoundException {
|
||||||
|
return getGlobal(Settings.Global.AUTOFILL_LOGGING_LEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaxPartitionsSize() throws SettingNotFoundException {
|
||||||
|
return getGlobal(Settings.Global.AUTOFILL_MAX_PARTITIONS_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaxVisibleDatasets() throws SettingNotFoundException {
|
||||||
|
return getGlobal(Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setGlobal(String key, int value) {
|
||||||
|
Settings.Global.putInt(mResolver, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getGlobal(String key) throws SettingNotFoundException {
|
||||||
|
return Settings.Global.getInt(mResolver, key);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -22,14 +22,15 @@ import android.os.SystemProperties;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.util.FeatureFlagUtils;
|
import android.util.FeatureFlagUtils;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class FeatureFlagPersistentTest {
|
public class FeatureFlagPersistentTest {
|
||||||
|
|
||||||
private static final String TEST_FEATURE_NAME = "test_feature";
|
private static final String TEST_FEATURE_NAME = "test_feature";
|
||||||
@@ -43,7 +44,7 @@ public class FeatureFlagPersistentTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
|
|
||||||
FeatureFlagPersistent.getAllPersistentFlags().add(TEST_FEATURE_NAME);
|
FeatureFlagPersistent.getAllPersistentFlags().add(TEST_FEATURE_NAME);
|
||||||
FeatureFlagUtils.getAllFeatureFlags().put(TEST_FEATURE_NAME, "false");
|
FeatureFlagUtils.getAllFeatureFlags().put(TEST_FEATURE_NAME, "false");
|
||||||
@@ -137,7 +138,8 @@ public class FeatureFlagPersistentTest {
|
|||||||
|
|
||||||
FeatureFlagPersistent.setEnabled(mContext, TEST_FEATURE_NAME, true);
|
FeatureFlagPersistent.setEnabled(mContext, TEST_FEATURE_NAME, true);
|
||||||
|
|
||||||
assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME)).isEqualTo("true");
|
assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME))
|
||||||
|
.isEqualTo("true");
|
||||||
assertThat(FeatureFlagUtils.isEnabled(mContext, TEST_FEATURE_NAME)).isTrue();
|
assertThat(FeatureFlagUtils.isEnabled(mContext, TEST_FEATURE_NAME)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,7 +152,8 @@ public class FeatureFlagPersistentTest {
|
|||||||
|
|
||||||
FeatureFlagPersistent.setEnabled(mContext, TEST_FEATURE_NAME, false);
|
FeatureFlagPersistent.setEnabled(mContext, TEST_FEATURE_NAME, false);
|
||||||
|
|
||||||
assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME)).isEqualTo("false");
|
assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME))
|
||||||
|
.isEqualTo("false");
|
||||||
assertThat(FeatureFlagUtils.isEnabled(mContext, TEST_FEATURE_NAME)).isFalse();
|
assertThat(FeatureFlagUtils.isEnabled(mContext, TEST_FEATURE_NAME)).isFalse();
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -22,15 +22,15 @@ import android.content.Context;
|
|||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class TranscodeDefaultOptionPreferenceControllerTest {
|
public class TranscodeDefaultOptionPreferenceControllerTest {
|
||||||
private static final String TRANSCODE_DEFAULT_SYS_PROP_KEY =
|
private static final String TRANSCODE_DEFAULT_SYS_PROP_KEY =
|
||||||
"persist.sys.fuse.transcode_default";
|
"persist.sys.fuse.transcode_default";
|
@@ -22,13 +22,13 @@ import android.content.Context;
|
|||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class TranscodeGlobalTogglePreferenceControllerTest {
|
public class TranscodeGlobalTogglePreferenceControllerTest {
|
||||||
|
|
||||||
private static final String TRANSCODE_ENABLED_PROP_KEY = "persist.sys.fuse.transcode_enabled";
|
private static final String TRANSCODE_ENABLED_PROP_KEY = "persist.sys.fuse.transcode_enabled";
|
@@ -22,15 +22,15 @@ import android.content.Context;
|
|||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class TranscodeUserControlPreferenceControllerTest {
|
public class TranscodeUserControlPreferenceControllerTest {
|
||||||
private static final String TRANSCODE_USER_CONTROL_SYS_PROP_KEY =
|
private static final String TRANSCODE_USER_CONTROL_SYS_PROP_KEY =
|
||||||
"persist.sys.fuse.transcode_user_control";
|
"persist.sys.fuse.transcode_user_control";
|
@@ -1,3 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.deviceinfo.storage;
|
package com.android.settings.deviceinfo.storage;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -8,14 +23,15 @@ import static org.mockito.Mockito.when;
|
|||||||
|
|
||||||
import android.os.storage.VolumeInfo;
|
import android.os.storage.VolumeInfo;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settingslib.deviceinfo.PrivateStorageInfo;
|
import com.android.settingslib.deviceinfo.PrivateStorageInfo;
|
||||||
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
|
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class VolumeSizesLoaderTest {
|
public class VolumeSizesLoaderTest {
|
||||||
@Test
|
@Test
|
||||||
public void getVolumeSize_getsValidSizes() throws Exception {
|
public void getVolumeSize_getsValidSizes() throws Exception {
|
@@ -1,3 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.fuelgauge.batterysaver;
|
package com.android.settings.fuelgauge.batterysaver;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -9,13 +24,14 @@ import android.provider.Settings;
|
|||||||
import android.provider.Settings.Global;
|
import android.provider.Settings.Global;
|
||||||
import android.provider.Settings.Secure;
|
import android.provider.Settings.Secure;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class BatterySaverScheduleRadioButtonsControllerTest {
|
public class BatterySaverScheduleRadioButtonsControllerTest {
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private ContentResolver mResolver;
|
private ContentResolver mResolver;
|
||||||
@@ -24,7 +40,7 @@ public class BatterySaverScheduleRadioButtonsControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mSeekBarController = new BatterySaverScheduleSeekBarController(mContext);
|
mSeekBarController = new BatterySaverScheduleSeekBarController(mContext);
|
||||||
mController = new BatterySaverScheduleRadioButtonsController(
|
mController = new BatterySaverScheduleRadioButtonsController(
|
||||||
mContext, mSeekBarController);
|
mContext, mSeekBarController);
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2016 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -21,13 +21,15 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.provider.Settings.Global;
|
import android.provider.Settings.Global;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class BatterySaverStickyPreferenceControllerTest {
|
public class BatterySaverStickyPreferenceControllerTest {
|
||||||
|
|
||||||
private static final String PREF_KEY = "battery_saver_sticky";
|
private static final String PREF_KEY = "battery_saver_sticky";
|
||||||
@@ -37,7 +39,7 @@ public class BatterySaverStickyPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new BatterySaverStickyPreferenceController(mContext, PREF_KEY);
|
mController = new BatterySaverStickyPreferenceController(mContext, PREF_KEY);
|
||||||
}
|
}
|
||||||
|
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -21,6 +21,8 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -28,9 +30,8 @@ import org.junit.runner.RunWith;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class AppInfoTest {
|
public class AppInfoTest {
|
||||||
|
|
||||||
private static final String PACKAGE_NAME = "com.android.app";
|
private static final String PACKAGE_NAME = "com.android.app";
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -22,13 +22,14 @@ import android.content.Context;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class BatteryTipPolicyTest {
|
public class BatteryTipPolicyTest {
|
||||||
|
|
||||||
private static final String BATTERY_TIP_CONSTANTS_VALUE = "battery_tip_enabled=true"
|
private static final String BATTERY_TIP_CONSTANTS_VALUE = "battery_tip_enabled=true"
|
||||||
@@ -54,7 +55,7 @@ public class BatteryTipPolicyTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -21,16 +21,16 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.TogglePreferenceController;
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class OneHandedAppTapsExitPreferenceControllerTest {
|
public class OneHandedAppTapsExitPreferenceControllerTest {
|
||||||
|
|
||||||
private static final String KEY = "gesture_app_taps_to_exit";
|
private static final String KEY = "gesture_app_taps_to_exit";
|
||||||
@@ -42,7 +42,7 @@ public class OneHandedAppTapsExitPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new OneHandedAppTapsExitPreferenceController(mContext, KEY);
|
mController = new OneHandedAppTapsExitPreferenceController(mContext, KEY);
|
||||||
mSwitchPreference = new SwitchPreference(mContext);
|
mSwitchPreference = new SwitchPreference(mContext);
|
||||||
mSwitchPreference.setKey(KEY);
|
mSwitchPreference.setKey(KEY);
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -22,14 +22,15 @@ import android.content.Context;
|
|||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class CardDatabaseHelperTest {
|
public class CardDatabaseHelperTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -38,7 +39,7 @@ public class CardDatabaseHelperTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mCardDatabaseHelper = CardDatabaseHelper.getInstance(mContext);
|
mCardDatabaseHelper = CardDatabaseHelper.getInstance(mContext);
|
||||||
mDatabase = mCardDatabaseHelper.getReadableDatabase();
|
mDatabase = mCardDatabaseHelper.getReadableDatabase();
|
||||||
}
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,18 +18,19 @@ package com.android.settings.homepage.contextualcards;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.homepage.contextualcards.ContextualCardLookupTable.ControllerRendererMapping;
|
import com.android.settings.homepage.contextualcards.ContextualCardLookupTable.ControllerRendererMapping;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class ContextualCardLookupTableTest {
|
public class ContextualCardLookupTableTest {
|
||||||
|
|
||||||
private static final int UNSUPPORTED_CARD_TYPE = -99999;
|
private static final int UNSUPPORTED_CARD_TYPE = -99999;
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -11,9 +11,8 @@
|
|||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.homepage.contextualcards;
|
package com.android.settings.homepage.contextualcards;
|
||||||
|
|
||||||
import static com.android.settings.intelligence.ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE;
|
import static com.android.settings.intelligence.ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE;
|
||||||
@@ -23,15 +22,16 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class ContextualCardsDiffCallbackTest {
|
public class ContextualCardsDiffCallbackTest {
|
||||||
|
|
||||||
private static final Uri TEST_SLICE_URI = Uri.parse("content://test/test");
|
private static final Uri TEST_SLICE_URI = Uri.parse("content://test/test");
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,13 +18,14 @@ package com.android.settings.homepage.contextualcards.conditional;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.homepage.contextualcards.ContextualCard;
|
import com.android.settings.homepage.contextualcards.ContextualCard;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class ConditionFooterContextualCardTest {
|
public class ConditionFooterContextualCardTest {
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,13 +18,14 @@ package com.android.settings.homepage.contextualcards.conditional;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.homepage.contextualcards.ContextualCard;
|
import com.android.settings.homepage.contextualcards.ContextualCard;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class ConditionHeaderContextualCardTest {
|
public class ConditionHeaderContextualCardTest {
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -21,13 +21,14 @@ import static com.android.settings.homepage.contextualcards.conditional.Conditio
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.homepage.contextualcards.ContextualCard;
|
import com.android.settings.homepage.contextualcards.ContextualCard;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class ConditionalContextualCardTest {
|
public class ConditionalContextualCardTest {
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -11,9 +11,8 @@
|
|||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.homepage.contextualcards.slices;
|
package com.android.settings.homepage.contextualcards.slices;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -31,14 +30,14 @@ import android.provider.Settings;
|
|||||||
import androidx.slice.SliceMetadata;
|
import androidx.slice.SliceMetadata;
|
||||||
import androidx.slice.SliceProvider;
|
import androidx.slice.SliceProvider;
|
||||||
import androidx.slice.widget.SliceLiveData;
|
import androidx.slice.widget.SliceLiveData;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class FaceSetupSliceTest {
|
public class FaceSetupSliceTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -48,7 +47,7 @@ public class FaceSetupSliceTest {
|
|||||||
public void setUp() {
|
public void setUp() {
|
||||||
// Set-up specs for SliceMetadata.
|
// Set-up specs for SliceMetadata.
|
||||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||||
mContext = spy(RuntimeEnvironment.application);
|
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
mPackageManager = mock(PackageManager.class);
|
mPackageManager = mock(PackageManager.class);
|
||||||
when(mContext.getPackageManager()).thenReturn(mPackageManager);
|
when(mContext.getPackageManager()).thenReturn(mPackageManager);
|
||||||
}
|
}
|
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.network.ims;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.telephony.ims.ImsException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller class for mock VT status
|
||||||
|
*/
|
||||||
|
public class MockVtQueryImsState extends VtQueryImsState {
|
||||||
|
|
||||||
|
private Boolean mIsTtyOnVolteEnabled;
|
||||||
|
private Boolean mIsEnabledOnPlatform;
|
||||||
|
private Boolean mIsProvisionedOnDevice;
|
||||||
|
private Boolean mIsEnabledByUser;
|
||||||
|
private Boolean mIsServiceStateReady;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param context {@link Context}
|
||||||
|
* @param subId subscription's id
|
||||||
|
*/
|
||||||
|
public MockVtQueryImsState(Context context, int subId) {
|
||||||
|
super(context, subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsTtyOnVolteEnabled(boolean enabled) {
|
||||||
|
mIsTtyOnVolteEnabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isTtyOnVolteEnabled(int subId) {
|
||||||
|
if (mIsTtyOnVolteEnabled != null) {
|
||||||
|
return mIsTtyOnVolteEnabled;
|
||||||
|
}
|
||||||
|
return super.isTtyOnVolteEnabled(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsEnabledByPlatform(boolean isEnabled) {
|
||||||
|
mIsEnabledOnPlatform = isEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isEnabledByPlatform(int subId) throws InterruptedException, ImsException,
|
||||||
|
IllegalArgumentException {
|
||||||
|
if (mIsEnabledOnPlatform != null) {
|
||||||
|
return mIsEnabledOnPlatform;
|
||||||
|
}
|
||||||
|
return super.isEnabledByPlatform(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsProvisionedOnDevice(boolean isProvisioned) {
|
||||||
|
mIsProvisionedOnDevice = isProvisioned;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isProvisionedOnDevice(int subId) {
|
||||||
|
if (mIsProvisionedOnDevice != null) {
|
||||||
|
return mIsProvisionedOnDevice;
|
||||||
|
}
|
||||||
|
return super.isProvisionedOnDevice(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServiceStateReady(boolean isReady) {
|
||||||
|
mIsServiceStateReady = isReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
|
||||||
|
IllegalArgumentException {
|
||||||
|
if (mIsServiceStateReady != null) {
|
||||||
|
return mIsServiceStateReady;
|
||||||
|
}
|
||||||
|
return super.isServiceStateReady(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsEnabledByUser(boolean enabled) {
|
||||||
|
mIsEnabledByUser = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isEnabledByUser(int subId) {
|
||||||
|
if (mIsEnabledByUser != null) {
|
||||||
|
return mIsEnabledByUser;
|
||||||
|
}
|
||||||
|
return super.isEnabledByUser(subId);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.network.ims;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.telephony.ims.ImsException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller class for mock Wifi calling status
|
||||||
|
*/
|
||||||
|
public class MockWifiCallingQueryImsState extends WifiCallingQueryImsState {
|
||||||
|
|
||||||
|
private Boolean mIsTtyOnVolteEnabled;
|
||||||
|
private Boolean mIsEnabledOnPlatform;
|
||||||
|
private Boolean mIsProvisionedOnDevice;
|
||||||
|
private Boolean mIsServiceStateReady;
|
||||||
|
private Boolean mIsEnabledByUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param context {@code Context}
|
||||||
|
* @param subId subscription's id
|
||||||
|
*/
|
||||||
|
public MockWifiCallingQueryImsState(Context context, int subId) {
|
||||||
|
super(context, subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsTtyOnVolteEnabled(boolean enabled) {
|
||||||
|
mIsTtyOnVolteEnabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isTtyOnVolteEnabled(int subId) {
|
||||||
|
if (mIsTtyOnVolteEnabled != null) {
|
||||||
|
return mIsTtyOnVolteEnabled;
|
||||||
|
}
|
||||||
|
return super.isTtyOnVolteEnabled(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setIsEnabledByPlatform(boolean isEnabled) {
|
||||||
|
mIsEnabledOnPlatform = isEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isEnabledByPlatform(int subId) throws InterruptedException, ImsException,
|
||||||
|
IllegalArgumentException {
|
||||||
|
if (mIsEnabledOnPlatform != null) {
|
||||||
|
return mIsEnabledOnPlatform;
|
||||||
|
}
|
||||||
|
return super.isEnabledByPlatform(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsProvisionedOnDevice(boolean isProvisioned) {
|
||||||
|
mIsProvisionedOnDevice = isProvisioned;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isProvisionedOnDevice(int subId) {
|
||||||
|
if (mIsProvisionedOnDevice != null) {
|
||||||
|
return mIsProvisionedOnDevice;
|
||||||
|
}
|
||||||
|
return super.isProvisionedOnDevice(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServiceStateReady(boolean isReady) {
|
||||||
|
mIsServiceStateReady = isReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
|
||||||
|
IllegalArgumentException {
|
||||||
|
if (mIsServiceStateReady != null) {
|
||||||
|
return mIsServiceStateReady;
|
||||||
|
}
|
||||||
|
return super.isServiceStateReady(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsEnabledByUser(boolean enabled) {
|
||||||
|
mIsEnabledByUser = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isEnabledByUser(int subId) {
|
||||||
|
if (mIsEnabledByUser != null) {
|
||||||
|
return mIsEnabledByUser;
|
||||||
|
}
|
||||||
|
return super.isEnabledByUser(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -18,20 +18,22 @@ package com.android.settings.nfc;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class NfcDetectionPointControllerTest {
|
public class NfcDetectionPointControllerTest {
|
||||||
|
|
||||||
private NfcDetectionPointController mController;
|
private NfcDetectionPointController mController;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mController = new NfcDetectionPointController(RuntimeEnvironment.application, "fakeKey");
|
mController = new NfcDetectionPointController(ApplicationProvider.getApplicationContext(),
|
||||||
|
"fakeKey");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,13 +20,14 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SecureNfcPreferenceControllerTest {
|
public class SecureNfcPreferenceControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -34,7 +35,7 @@ public class SecureNfcPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new SecureNfcPreferenceController(mContext, "nfc_secure_settings");
|
mController = new SecureNfcPreferenceController(mContext, "nfc_secure_settings");
|
||||||
}
|
}
|
||||||
|
|
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.notification.zen;
|
||||||
|
|
||||||
|
import android.app.AutomaticZenRule;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.service.notification.ZenPolicy;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
abstract class ZenRuleCustomPrefContrTestBase {
|
||||||
|
public static final String RULE_ID = "test_rule_id";
|
||||||
|
public static final String PREF_KEY = "main_pref";
|
||||||
|
|
||||||
|
AutomaticZenRule mRule = new AutomaticZenRule("test", null, null, null, null,
|
||||||
|
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
||||||
|
|
||||||
|
abstract AbstractZenCustomRulePreferenceController getController();
|
||||||
|
|
||||||
|
void updateControllerZenPolicy(ZenPolicy policy) {
|
||||||
|
mRule.setZenPolicy(policy);
|
||||||
|
getController().onResume(mRule, RULE_ID);
|
||||||
|
}
|
||||||
|
}
|
119
tests/unit/src/com/android/settings/panel/FakePanelContent.java
Normal file
119
tests/unit/src/com/android/settings/panel/FakePanelContent.java
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.panel;
|
||||||
|
|
||||||
|
import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import androidx.core.graphics.drawable.IconCompat;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fake PanelContent for testing.
|
||||||
|
*/
|
||||||
|
public class FakePanelContent implements PanelContent {
|
||||||
|
|
||||||
|
public static final String FAKE_ACTION = "fake_action";
|
||||||
|
|
||||||
|
public static final CharSequence TITLE = "title";
|
||||||
|
|
||||||
|
public static final List<Uri> SLICE_URIS = Arrays.asList(
|
||||||
|
WIFI_SLICE_URI
|
||||||
|
);
|
||||||
|
|
||||||
|
public static final Intent INTENT = new Intent();
|
||||||
|
|
||||||
|
private CharSequence mTitle = TITLE;
|
||||||
|
private CharSequence mSubTitle;
|
||||||
|
private IconCompat mIcon;
|
||||||
|
private int mViewType;
|
||||||
|
private boolean mIsCustomizedButtonUsed = false;
|
||||||
|
private CharSequence mCustomizedButtonTitle;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IconCompat getIcon() {
|
||||||
|
return mIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIcon(IconCompat icon) {
|
||||||
|
mIcon = icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getSubTitle() {
|
||||||
|
return mSubTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubTitle(CharSequence subTitle) {
|
||||||
|
mSubTitle = subTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getTitle() {
|
||||||
|
return mTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(CharSequence title) {
|
||||||
|
mTitle = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Uri> getSlices() {
|
||||||
|
return SLICE_URIS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Intent getSeeMoreIntent() {
|
||||||
|
return INTENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMetricsCategory() {
|
||||||
|
return SettingsEnums.TESTING;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setViewType(int viewType) {
|
||||||
|
mViewType = viewType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getViewType() {
|
||||||
|
return mViewType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCustomizedButtonUsed() {
|
||||||
|
return mIsCustomizedButtonUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsCustomizedButtonUsed(boolean isUsed) {
|
||||||
|
mIsCustomizedButtonUsed = isUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getCustomizedButtonTitle() {
|
||||||
|
return mCustomizedButtonTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomizedButtonTitle(CharSequence title) {
|
||||||
|
mCustomizedButtonTitle = title;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.panel;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
public class FakeSettingsPanelActivity extends SettingsPanelActivity {
|
||||||
|
@Override
|
||||||
|
public ComponentName getCallingActivity() {
|
||||||
|
return new ComponentName("fake-package", "fake-class");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Intent getIntent() {
|
||||||
|
final Intent intent = new Intent(FakePanelContent.FAKE_ACTION);
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,25 +20,25 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.slices.CustomSliceRegistry;
|
import com.android.settings.slices.CustomSliceRegistry;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class NfcPanelTest {
|
public class NfcPanelTest {
|
||||||
|
|
||||||
private NfcPanel mPanel;
|
private NfcPanel mPanel;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mPanel = NfcPanel.create(RuntimeEnvironment.application);
|
mPanel = NfcPanel.create(ApplicationProvider.getApplicationContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -12,9 +12,7 @@
|
|||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.panel;
|
package com.android.settings.panel;
|
||||||
|
|
||||||
import static com.android.settings.panel.SettingsPanelActivity.KEY_MEDIA_PACKAGE_NAME;
|
import static com.android.settings.panel.SettingsPanelActivity.KEY_MEDIA_PACKAGE_NAME;
|
||||||
@@ -26,13 +24,14 @@ import android.content.Context;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class PanelFeatureProviderImplTest {
|
public class PanelFeatureProviderImplTest {
|
||||||
|
|
||||||
private static final String TEST_PACKAGENAME = "com.test.packagename";
|
private static final String TEST_PACKAGENAME = "com.test.packagename";
|
||||||
@@ -43,7 +42,7 @@ public class PanelFeatureProviderImplTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mProvider = new PanelFeatureProviderImpl();
|
mProvider = new PanelFeatureProviderImpl();
|
||||||
mBundle = new Bundle();
|
mBundle = new Bundle();
|
||||||
mBundle.putString(KEY_MEDIA_PACKAGE_NAME, TEST_PACKAGENAME);
|
mBundle.putString(KEY_MEDIA_PACKAGE_NAME, TEST_PACKAGENAME);
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -22,14 +22,14 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import org.robolectric.RobolectricTestRunner;
|
@RunWith(AndroidJUnit4.class)
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
|
||||||
public class PanelSlicesLoaderCountdownLatchTest {
|
public class PanelSlicesLoaderCountdownLatchTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -43,7 +43,7 @@ public class PanelSlicesLoaderCountdownLatchTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mSliceCountdownLatch = new PanelSlicesLoaderCountdownLatch(URIS.length);
|
mSliceCountdownLatch = new PanelSlicesLoaderCountdownLatch(URIS.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,4 +89,4 @@ public class PanelSlicesLoaderCountdownLatchTest {
|
|||||||
// Verify the second call returns false without external state change
|
// Verify the second call returns false without external state change
|
||||||
assertThat(mSliceCountdownLatch.isPanelReadyToLoad()).isFalse();
|
assertThat(mSliceCountdownLatch.isPanelReadyToLoad()).isFalse();
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,24 +20,25 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.slices.CustomSliceRegistry;
|
import com.android.settings.slices.CustomSliceRegistry;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class WifiPanelTest {
|
public class WifiPanelTest {
|
||||||
|
|
||||||
private WifiPanel mPanel;
|
private WifiPanel mPanel;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mPanel = WifiPanel.create(RuntimeEnvironment.application);
|
mPanel = WifiPanel.create(ApplicationProvider.getApplicationContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -11,20 +11,20 @@
|
|||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.password;
|
package com.android.settings.password;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class ScreenLockTypeTest {
|
public class ScreenLockTypeTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -18,6 +18,8 @@ package com.android.settings.search;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.DisplaySettings;
|
import com.android.settings.DisplaySettings;
|
||||||
import com.android.settings.backup.UserBackupSettingsActivity;
|
import com.android.settings.backup.UserBackupSettingsActivity;
|
||||||
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
|
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
|
||||||
@@ -39,9 +41,8 @@ import com.android.settings.wifi.WifiSettings;
|
|||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class CustomSiteMapRegistryTest {
|
public class CustomSiteMapRegistryTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.search;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.settingslib.search.Indexable;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class for {@like DatabaseIndexingManager} to handle the mapping between Payloads
|
||||||
|
* and Preference controllers, and managing indexable classes.
|
||||||
|
*/
|
||||||
|
public class DatabaseIndexingUtils {
|
||||||
|
|
||||||
|
private static final String TAG = "IndexingUtil";
|
||||||
|
|
||||||
|
public static final String FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER =
|
||||||
|
"SEARCH_INDEX_DATA_PROVIDER";
|
||||||
|
|
||||||
|
public static Indexable.SearchIndexProvider getSearchIndexProvider(final Class<?> clazz) {
|
||||||
|
try {
|
||||||
|
final Field f = clazz.getField(FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER);
|
||||||
|
return (Indexable.SearchIndexProvider) f.get(null);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
Log.d(TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
|
||||||
|
} catch (SecurityException se) {
|
||||||
|
Log.d(TAG,
|
||||||
|
"Security exception for field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
Log.d(TAG, "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Log.d(TAG, "Illegal argument when accessing field '"
|
||||||
|
+ FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.search;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.provider.SearchIndexableResource;
|
||||||
|
|
||||||
|
import com.android.internal.logging.nano.MetricsProto;
|
||||||
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
import com.android.settingslib.search.SearchIndexableRaw;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Settings Search Indexing.
|
||||||
|
* If you change this class, please run robotests to make sure they still pass.
|
||||||
|
*/
|
||||||
|
public class FakeSettingsFragment extends DashboardFragment {
|
||||||
|
|
||||||
|
public static final String TITLE = "raw title";
|
||||||
|
public static final String SUMMARY_ON = "raw summary on";
|
||||||
|
public static final String SUMMARY_OFF = "raw summary off";
|
||||||
|
public static final String ENTRIES = "rawentries";
|
||||||
|
public static final String KEYWORDS = "keywords, keywordss, keywordsss";
|
||||||
|
public static final String SPACE_KEYWORDS = "keywords keywordss keywordsss";
|
||||||
|
public static final String SCREEN_TITLE = "raw screen title";
|
||||||
|
public static final String CLASS_NAME = FakeSettingsFragment.class.getName();
|
||||||
|
public static final int ICON = 0xff;
|
||||||
|
public static final String INTENT_ACTION = "raw action";
|
||||||
|
public static final String PACKAGE_NAME = "raw target package";
|
||||||
|
public static final String TARGET_CLASS = "raw target class";
|
||||||
|
public static final String TARGET_PACKAGE = "raw package name";
|
||||||
|
public static final String KEY = "raw key";
|
||||||
|
public static final boolean ENABLED = true;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMetricsCategory() {
|
||||||
|
return MetricsProto.MetricsEvent.DISPLAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getLogTag() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getPreferenceScreenResId() {
|
||||||
|
return com.android.settings.R.xml.display_settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Index provider used to expose this fragment in search. */
|
||||||
|
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||||
|
new BaseSearchIndexProvider() {
|
||||||
|
@Override
|
||||||
|
public List<SearchIndexableRaw> getRawDataToIndex(Context context,
|
||||||
|
boolean enabled) {
|
||||||
|
final SearchIndexableRaw data = new SearchIndexableRaw(context);
|
||||||
|
data.title = TITLE;
|
||||||
|
data.summaryOn = SUMMARY_ON;
|
||||||
|
data.summaryOff = SUMMARY_OFF;
|
||||||
|
data.entries = ENTRIES;
|
||||||
|
data.keywords = KEYWORDS;
|
||||||
|
data.screenTitle = SCREEN_TITLE;
|
||||||
|
data.packageName = PACKAGE_NAME;
|
||||||
|
data.intentAction = INTENT_ACTION;
|
||||||
|
data.intentTargetClass = TARGET_CLASS;
|
||||||
|
data.intentTargetPackage = TARGET_PACKAGE;
|
||||||
|
data.key = KEY;
|
||||||
|
data.iconResId = ICON;
|
||||||
|
data.enabled = ENABLED;
|
||||||
|
|
||||||
|
final List<SearchIndexableRaw> result = new ArrayList<>(1);
|
||||||
|
result.add(data);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
|
||||||
|
boolean enabled) {
|
||||||
|
final ArrayList<SearchIndexableResource> result = new ArrayList<>();
|
||||||
|
|
||||||
|
final SearchIndexableResource sir = new SearchIndexableResource(context);
|
||||||
|
sir.xmlResId = com.android.settings.R.xml.display_settings;
|
||||||
|
result.add(sir);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getNonIndexableKeys(Context context) {
|
||||||
|
List<String> keys = super.getNonIndexableKeys(context);
|
||||||
|
keys.add("pref_key_1");
|
||||||
|
keys.add("pref_key_3");
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@@ -0,0 +1,204 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.search;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
|
|
||||||
|
import android.provider.SearchIndexableResource;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
|
import com.android.settings.core.codeinspection.CodeInspector;
|
||||||
|
import com.android.settings.dashboard.DashboardFragmentSearchIndexProviderInspector;
|
||||||
|
import com.android.settingslib.search.Indexable;
|
||||||
|
import com.android.settingslib.search.SearchIndexableData;
|
||||||
|
import com.android.settingslib.search.SearchIndexableResources;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link CodeInspector} to ensure fragments implement search components correctly.
|
||||||
|
*/
|
||||||
|
public class SearchIndexProviderCodeInspector extends CodeInspector {
|
||||||
|
private static final String TAG = "SearchCodeInspector";
|
||||||
|
|
||||||
|
private static final String NOT_CONTAINING_PROVIDER_OBJECT_ERROR =
|
||||||
|
"Indexable should have public field "
|
||||||
|
+ DatabaseIndexingUtils.FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER
|
||||||
|
+ " but these are not:\n";
|
||||||
|
private static final String NOT_SHARING_PREF_CONTROLLERS_BETWEEN_FRAG_AND_PROVIDER =
|
||||||
|
"DashboardFragment should share pref controllers with its SearchIndexProvider, but "
|
||||||
|
+ " these are not: \n";
|
||||||
|
private static final String NOT_IN_INDEXABLE_PROVIDER_REGISTRY =
|
||||||
|
"Class containing " + DatabaseIndexingUtils.FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER
|
||||||
|
+ " must be added to " + SearchIndexableResources.class.getName()
|
||||||
|
+ " but these are not: \n";
|
||||||
|
private static final String NOT_PROVIDING_VALID_RESOURCE_ERROR =
|
||||||
|
"SearchIndexableProvider must either provide no resource to index, or valid ones. "
|
||||||
|
+ "But the followings contain resource with xml id = 0\n";
|
||||||
|
|
||||||
|
private final List<String> mNotImplementingIndexProviderExemptList;
|
||||||
|
private final List<String> mNotInSearchIndexableRegistryExemptList;
|
||||||
|
private final List<String> mNotSharingPrefControllersExemptList;
|
||||||
|
|
||||||
|
public SearchIndexProviderCodeInspector(List<Class<?>> classes) {
|
||||||
|
super(classes);
|
||||||
|
mNotImplementingIndexProviderExemptList = new ArrayList<>();
|
||||||
|
mNotInSearchIndexableRegistryExemptList = new ArrayList<>();
|
||||||
|
mNotSharingPrefControllersExemptList = new ArrayList<>();
|
||||||
|
initializeExemptList(mNotImplementingIndexProviderExemptList,
|
||||||
|
"exempt_not_implementing_index_provider");
|
||||||
|
initializeExemptList(mNotInSearchIndexableRegistryExemptList,
|
||||||
|
"exempt_not_in_search_index_provider_registry");
|
||||||
|
initializeExemptList(mNotSharingPrefControllersExemptList,
|
||||||
|
"exempt_not_sharing_pref_controllers_with_search_provider");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final Set<String> notImplementingIndexProvider = new ArraySet<>();
|
||||||
|
final Set<String> notInSearchProviderRegistry = new ArraySet<>();
|
||||||
|
final Set<String> notSharingPreferenceControllers = new ArraySet<>();
|
||||||
|
final Set<String> notProvidingValidResource = new ArraySet<>();
|
||||||
|
final Set<Class> providerClasses = new ArraySet<>();
|
||||||
|
|
||||||
|
final SearchFeatureProvider provider = new SearchFeatureProviderImpl();
|
||||||
|
for (SearchIndexableData bundle :
|
||||||
|
provider.getSearchIndexableResources().getProviderValues()) {
|
||||||
|
providerClasses.add(bundle.getTargetClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Class clazz : mClasses) {
|
||||||
|
if (!isConcreteSettingsClass(clazz)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final String className = clazz.getName();
|
||||||
|
// Skip fragments if it's not SettingsPreferenceFragment.
|
||||||
|
if (!SettingsPreferenceFragment.class.isAssignableFrom(clazz)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final boolean hasSearchIndexProvider = hasSearchIndexProvider(clazz);
|
||||||
|
// If it implements Indexable, it must also implement the index provider field.
|
||||||
|
if (!hasSearchIndexProvider) {
|
||||||
|
if (!mNotImplementingIndexProviderExemptList.remove(className)) {
|
||||||
|
notImplementingIndexProvider.add(className);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// If it implements index provider field AND it's a DashboardFragment, its fragment and
|
||||||
|
// search provider must share the same set of PreferenceControllers.
|
||||||
|
final boolean isSharingPrefControllers = DashboardFragmentSearchIndexProviderInspector
|
||||||
|
.isSharingPreferenceControllers(clazz);
|
||||||
|
if (!isSharingPrefControllers) {
|
||||||
|
if (!mNotSharingPrefControllersExemptList.remove(className)) {
|
||||||
|
notSharingPreferenceControllers.add(className);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Must be in SearchProviderRegistry
|
||||||
|
if (!providerClasses.contains(clazz)) {
|
||||||
|
if (!mNotInSearchIndexableRegistryExemptList.remove(className)) {
|
||||||
|
notInSearchProviderRegistry.add(className);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Search provider must either don't provider resource xml, or provide valid ones.
|
||||||
|
if (!hasValidResourceFromProvider(clazz)) {
|
||||||
|
notProvidingValidResource.add(className);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build error messages
|
||||||
|
final String indexProviderError = buildErrorMessage(NOT_CONTAINING_PROVIDER_OBJECT_ERROR,
|
||||||
|
notImplementingIndexProvider);
|
||||||
|
final String notSharingPrefControllerError = buildErrorMessage(
|
||||||
|
NOT_SHARING_PREF_CONTROLLERS_BETWEEN_FRAG_AND_PROVIDER,
|
||||||
|
notSharingPreferenceControllers);
|
||||||
|
final String notInProviderRegistryError =
|
||||||
|
buildErrorMessage(NOT_IN_INDEXABLE_PROVIDER_REGISTRY, notInSearchProviderRegistry);
|
||||||
|
final String notProvidingValidResourceError = buildErrorMessage(
|
||||||
|
NOT_PROVIDING_VALID_RESOURCE_ERROR, notProvidingValidResource);
|
||||||
|
assertWithMessage(indexProviderError)
|
||||||
|
.that(notImplementingIndexProvider)
|
||||||
|
.isEmpty();
|
||||||
|
assertWithMessage(notSharingPrefControllerError)
|
||||||
|
.that(notSharingPreferenceControllers)
|
||||||
|
.isEmpty();
|
||||||
|
assertWithMessage(notInProviderRegistryError)
|
||||||
|
.that(notInSearchProviderRegistry)
|
||||||
|
.isEmpty();
|
||||||
|
assertWithMessage(notProvidingValidResourceError)
|
||||||
|
.that(notProvidingValidResource)
|
||||||
|
.isEmpty();
|
||||||
|
assertNoObsoleteInExemptList("exempt_not_implementing_index_provider",
|
||||||
|
mNotImplementingIndexProviderExemptList);
|
||||||
|
assertNoObsoleteInExemptList("exempt_not_in_search_index_provider_registry",
|
||||||
|
mNotInSearchIndexableRegistryExemptList);
|
||||||
|
assertNoObsoleteInExemptList(
|
||||||
|
"exempt_not_sharing_pref_controllers_with_search_provider",
|
||||||
|
mNotSharingPrefControllersExemptList);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasSearchIndexProvider(Class clazz) {
|
||||||
|
try {
|
||||||
|
final Field f = clazz.getField(
|
||||||
|
DatabaseIndexingUtils.FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER);
|
||||||
|
return f != null;
|
||||||
|
} catch (NoClassDefFoundError e) {
|
||||||
|
// Cannot find class def, ignore
|
||||||
|
return true;
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
Log.e(TAG, "error fetching search provider from class " + clazz.getName());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasValidResourceFromProvider(Class clazz) {
|
||||||
|
try {
|
||||||
|
final Indexable.SearchIndexProvider provider =
|
||||||
|
DatabaseIndexingUtils.getSearchIndexProvider(clazz);
|
||||||
|
final List<SearchIndexableResource> resources = provider.getXmlResourcesToIndex(
|
||||||
|
ApplicationProvider.getApplicationContext(), true /* enabled */);
|
||||||
|
if (resources == null) {
|
||||||
|
// No resource, that's fine.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (SearchIndexableResource res : resources) {
|
||||||
|
if (res.xmlResId == 0) {
|
||||||
|
// Invalid resource
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Ignore.
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildErrorMessage(String errorSummary, Set<String> errorClasses) {
|
||||||
|
final StringBuilder error = new StringBuilder(errorSummary);
|
||||||
|
for (String c : errorClasses) {
|
||||||
|
error.append(c).append("\n");
|
||||||
|
}
|
||||||
|
return error.toString();
|
||||||
|
}
|
||||||
|
}
|
@@ -20,15 +20,16 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class CredentialManagementAppButtonsControllerTest {
|
public class CredentialManagementAppButtonsControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -38,7 +39,7 @@ public class CredentialManagementAppButtonsControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new CredentialManagementAppButtonsController(
|
mController = new CredentialManagementAppButtonsController(
|
||||||
mContext, PREF_KEY_CREDENTIAL_MANAGEMENT_APP);
|
mContext, PREF_KEY_CREDENTIAL_MANAGEMENT_APP);
|
||||||
}
|
}
|
@@ -20,15 +20,16 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class CredentialManagementAppHeaderControllerTest {
|
public class CredentialManagementAppHeaderControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -38,7 +39,7 @@ public class CredentialManagementAppHeaderControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new CredentialManagementAppHeaderController(
|
mController = new CredentialManagementAppHeaderController(
|
||||||
mContext, PREF_KEY_CREDENTIAL_MANAGEMENT_APP);
|
mContext, PREF_KEY_CREDENTIAL_MANAGEMENT_APP);
|
||||||
}
|
}
|
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 android.content.Context;
|
||||||
|
|
||||||
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
|
public class FakeContextOnlyPreferenceController extends BasePreferenceController {
|
||||||
|
|
||||||
|
public static final String KEY = "fakeController2";
|
||||||
|
|
||||||
|
public FakeContextOnlyPreferenceController(Context context) {
|
||||||
|
super(context, KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
return AVAILABLE;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 android.content.Context;
|
||||||
|
|
||||||
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
|
public class FakePreferenceController extends BasePreferenceController {
|
||||||
|
|
||||||
|
public FakePreferenceController(Context context, String preferenceKey) {
|
||||||
|
super(context, preferenceKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
return AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSliceType() {
|
||||||
|
return SliceData.SliceType.SLIDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSliceable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPublicSlice() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useDynamicSliceSummary() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.provider.SearchIndexableResource;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.core.PreferenceXmlParserUtils;
|
||||||
|
import com.android.settings.core.SliderPreferenceController;
|
||||||
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
|
import com.android.settings.core.codeinspection.CodeInspector;
|
||||||
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
import com.android.settings.search.SearchFeatureProvider;
|
||||||
|
import com.android.settings.search.SearchFeatureProviderImpl;
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
import com.android.settingslib.search.Indexable;
|
||||||
|
import com.android.settingslib.search.SearchIndexableData;
|
||||||
|
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class SliceControllerInXmlCodeInspector extends CodeInspector {
|
||||||
|
|
||||||
|
private static final List<Class> sSliceControllerClasses = Arrays.asList(
|
||||||
|
TogglePreferenceController.class,
|
||||||
|
SliderPreferenceController.class
|
||||||
|
);
|
||||||
|
|
||||||
|
private final List<String> mXmlDeclaredControllers = new ArrayList<>();
|
||||||
|
private final List<String> mExemptedClasses = new ArrayList<>();
|
||||||
|
|
||||||
|
private static final String ERROR_MISSING_CONTROLLER =
|
||||||
|
"The following controllers were expected to be declared by "
|
||||||
|
+ "'settings:controller=Controller_Class_Name' in their corresponding Xml. "
|
||||||
|
+ "If it should not appear in XML, add the controller's classname to "
|
||||||
|
+ "exempt_slice_controller_not_in_xml. Controllers:\n";
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
private final SearchFeatureProvider mSearchProvider;
|
||||||
|
private final FakeFeatureFactory mFakeFeatureFactory;
|
||||||
|
|
||||||
|
public SliceControllerInXmlCodeInspector(List<Class<?>> classes) throws Exception {
|
||||||
|
super(classes);
|
||||||
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
|
mSearchProvider = new SearchFeatureProviderImpl();
|
||||||
|
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mFakeFeatureFactory.searchFeatureProvider = mSearchProvider;
|
||||||
|
|
||||||
|
CodeInspector.initializeExemptList(mExemptedClasses,
|
||||||
|
"exempt_slice_controller_not_in_xml");
|
||||||
|
initDeclaredControllers();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initDeclaredControllers() throws IOException, XmlPullParserException {
|
||||||
|
final List<Integer> xmlResources = getIndexableXml();
|
||||||
|
for (int xmlResId : xmlResources) {
|
||||||
|
final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
|
||||||
|
xmlResId, PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
|
||||||
|
for (Bundle bundle : metadata) {
|
||||||
|
final String controllerClassName = bundle.getString(METADATA_CONTROLLER);
|
||||||
|
if (TextUtils.isEmpty(controllerClassName)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mXmlDeclaredControllers.add(controllerClassName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// We definitely have some controllers in xml, so assert not-empty here as a proxy to
|
||||||
|
// make sure the parser didn't fail
|
||||||
|
assertThat(mXmlDeclaredControllers).isNotEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final List<String> missingControllersInXml = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Class<?> clazz : mClasses) {
|
||||||
|
if (!isConcreteSettingsClass(clazz)) {
|
||||||
|
// Only care about non-abstract classes.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!isInlineSliceClass(clazz)) {
|
||||||
|
// Only care about inline-slice controller classes.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mXmlDeclaredControllers.contains(clazz.getName())) {
|
||||||
|
// Class clazz should have been declared in XML (unless allowlisted).
|
||||||
|
missingControllersInXml.add(clazz.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removed allowlisted classes
|
||||||
|
missingControllersInXml.removeAll(mExemptedClasses);
|
||||||
|
|
||||||
|
final String missingControllerError =
|
||||||
|
buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml);
|
||||||
|
|
||||||
|
assertWithMessage(missingControllerError).that(missingControllersInXml).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isInlineSliceClass(Class clazz) {
|
||||||
|
while (clazz != null) {
|
||||||
|
clazz = clazz.getSuperclass();
|
||||||
|
if (sSliceControllerClasses.contains(clazz)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildErrorMessage(String errorSummary, List<String> errorClasses) {
|
||||||
|
final StringBuilder error = new StringBuilder(errorSummary);
|
||||||
|
for (String c : errorClasses) {
|
||||||
|
error.append(c).append("\n");
|
||||||
|
}
|
||||||
|
return error.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Integer> getIndexableXml() {
|
||||||
|
final List<Integer> xmlResSet = new ArrayList<>();
|
||||||
|
|
||||||
|
final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(
|
||||||
|
mContext).getSearchFeatureProvider().getSearchIndexableResources()
|
||||||
|
.getProviderValues();
|
||||||
|
|
||||||
|
for (SearchIndexableData bundle : bundles) {
|
||||||
|
Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
|
||||||
|
|
||||||
|
if (provider == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<SearchIndexableResource> resources = provider.getXmlResourcesToIndex(mContext,
|
||||||
|
true);
|
||||||
|
|
||||||
|
if (resources == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (SearchIndexableResource resource : resources) {
|
||||||
|
// Add '0's anyway. It won't break the test.
|
||||||
|
xmlResSet.add(resource.xmlResId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return xmlResSet;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,24 +20,25 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SliceDataTest {
|
public class SliceDataTest {
|
||||||
|
|
||||||
private final String KEY = "KEY";
|
private static final String KEY = "KEY";
|
||||||
private final String TITLE = "title";
|
private static final String TITLE = "title";
|
||||||
private final String SUMMARY = "summary";
|
private static final String SUMMARY = "summary";
|
||||||
private final String SCREEN_TITLE = "screen title";
|
private static final String SCREEN_TITLE = "screen title";
|
||||||
private final String KEYWORDS = "a, b, c";
|
private static final String KEYWORDS = "a, b, c";
|
||||||
private final String FRAGMENT_NAME = "fragment name";
|
private static final String FRAGMENT_NAME = "fragment name";
|
||||||
private final int ICON = 1234; // I declare a thumb war
|
private static final int ICON = 1234; // I declare a thumb war
|
||||||
private final Uri URI = Uri.parse("content://com.android.settings.slices/test");
|
private static final Uri URI = Uri.parse("content://com.android.settings.slices/test");
|
||||||
private final String PREF_CONTROLLER = "com.android.settings.slices.tester";
|
private static final String PREF_CONTROLLER = "com.android.settings.slices.tester";
|
||||||
private final int SLICE_TYPE = SliceData.SliceType.SWITCH;
|
private static final int SLICE_TYPE = SliceData.SliceType.SWITCH;
|
||||||
private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice";
|
private static final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBuilder_buildsMatchingObject() {
|
public void testBuilder_buildsMatchingObject() {
|
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 android.content.ContentResolver;
|
||||||
|
import android.content.ContentValues;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.provider.SettingsSlicesContract;
|
||||||
|
|
||||||
|
import com.android.settings.testutils.FakeIndexProvider;
|
||||||
|
import com.android.settings.testutils.FakeToggleController;
|
||||||
|
|
||||||
|
class SliceTestUtils {
|
||||||
|
|
||||||
|
public static final String FAKE_TITLE = "title";
|
||||||
|
public static final String FAKE_SUMMARY = "summary";
|
||||||
|
public static final String FAKE_SCREEN_TITLE = "screen_title";
|
||||||
|
public static final String FAKE_KEYWORDS = "a, b, c";
|
||||||
|
public static final int FAKE_ICON = 1234;
|
||||||
|
public static final String FAKE_FRAGMENT_NAME = FakeIndexProvider.class.getName();
|
||||||
|
public static final String FAKE_CONTROLLER_NAME = FakeToggleController.class.getName();
|
||||||
|
|
||||||
|
|
||||||
|
public static void insertSliceToDb(Context context, String key) {
|
||||||
|
insertSliceToDb(context, key, true /* isPlatformSlice */);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice) {
|
||||||
|
insertSliceToDb(context, key, isPlatformSlice, null /*customizedUnavailableSliceSubtitle*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice,
|
||||||
|
String customizedUnavailableSliceSubtitle) {
|
||||||
|
insertSliceToDb(context, key, isPlatformSlice, customizedUnavailableSliceSubtitle, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice,
|
||||||
|
String customizedUnavailableSliceSubtitle, boolean isPublicSlice) {
|
||||||
|
final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(context).getWritableDatabase();
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.KEY, key);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.SLICE_URI,
|
||||||
|
new Uri.Builder()
|
||||||
|
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||||
|
.authority(isPlatformSlice
|
||||||
|
? SettingsSlicesContract.AUTHORITY
|
||||||
|
: SettingsSliceProvider.SLICE_AUTHORITY)
|
||||||
|
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
|
||||||
|
.appendPath(key)
|
||||||
|
.build().toSafeString());
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.TITLE, FAKE_TITLE);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.SUMMARY, FAKE_SUMMARY);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, FAKE_SCREEN_TITLE);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.KEYWORDS, FAKE_KEYWORDS);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.ICON_RESOURCE, FAKE_ICON);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, FAKE_FRAGMENT_NAME);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, FAKE_CONTROLLER_NAME);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.SLICE_TYPE, SliceData.SliceType.INTENT);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.UNAVAILABLE_SLICE_SUBTITLE,
|
||||||
|
customizedUnavailableSliceSubtitle);
|
||||||
|
values.put(SlicesDatabaseHelper.IndexColumns.PUBLIC_SLICE, isPublicSlice);
|
||||||
|
|
||||||
|
db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -12,9 +12,7 @@
|
|||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings.slices;
|
package com.android.settings.slices;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -27,24 +25,24 @@ import android.net.Uri;
|
|||||||
import android.provider.SettingsSlicesContract;
|
import android.provider.SettingsSlicesContract;
|
||||||
|
|
||||||
import androidx.slice.Slice;
|
import androidx.slice.Slice;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SpecialCaseSliceManagerTest {
|
public class SpecialCaseSliceManagerTest {
|
||||||
|
|
||||||
private final String FAKE_PARAMETER_KEY = "fake_parameter_key";
|
private static final String FAKE_PARAMETER_KEY = "fake_parameter_key";
|
||||||
private final String FAKE_PARAMETER_VALUE = "fake_value";
|
private static final String FAKE_PARAMETER_VALUE = "fake_value";
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
CustomSliceRegistry.sUriToSlice.clear();
|
CustomSliceRegistry.sUriToSlice.clear();
|
||||||
CustomSliceRegistry.sUriToSlice.put(FakeSliceable.URI, FakeSliceable.class);
|
CustomSliceRegistry.sUriToSlice.put(FakeSliceable.URI, FakeSliceable.class);
|
||||||
}
|
}
|
||||||
@@ -113,7 +111,7 @@ public class SpecialCaseSliceManagerTest {
|
|||||||
|
|
||||||
static final Slice SLICE = new Slice.Builder(URI).build();
|
static final Slice SLICE = new Slice.Builder(URI).build();
|
||||||
|
|
||||||
static boolean backingData = false;
|
static boolean sBackingData = false;
|
||||||
|
|
||||||
final Context mContext;
|
final Context mContext;
|
||||||
|
|
||||||
@@ -133,7 +131,7 @@ public class SpecialCaseSliceManagerTest {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNotifyChange(Intent intent) {
|
public void onNotifyChange(Intent intent) {
|
||||||
backingData = !backingData;
|
sBackingData = !sBackingData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@@ -26,14 +26,15 @@ import android.content.ContentResolver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class MediaControlsPreferenceControllerTest {
|
public class MediaControlsPreferenceControllerTest {
|
||||||
|
|
||||||
private static final String KEY = "media_controls_resume_switch";
|
private static final String KEY = "media_controls_resume_switch";
|
||||||
@@ -46,7 +47,7 @@ public class MediaControlsPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = spy(RuntimeEnvironment.application);
|
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
mContentResolver = mContext.getContentResolver();
|
mContentResolver = mContext.getContentResolver();
|
||||||
mOriginalQs = Settings.Global.getInt(mContentResolver,
|
mOriginalQs = Settings.Global.getInt(mContentResolver,
|
||||||
Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1);
|
Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1);
|
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for mocking installed applications.
|
||||||
|
*/
|
||||||
|
public class ApplicationTestUtils {
|
||||||
|
/**
|
||||||
|
* Create and populate an {@link android.content.pm.ApplicationInfo} object that describes an
|
||||||
|
* installed app.
|
||||||
|
*
|
||||||
|
* @param uid The app's uid
|
||||||
|
* @param packageName The app's package name.
|
||||||
|
* @param flags Flags describing the app. See {@link android.content.pm.ApplicationInfo#flags}
|
||||||
|
* for possible values.
|
||||||
|
* @param targetSdkVersion The app's target SDK version
|
||||||
|
*
|
||||||
|
* @see android.content.pm.ApplicationInfo
|
||||||
|
*/
|
||||||
|
public static ApplicationInfo buildInfo(int uid, String packageName, int flags,
|
||||||
|
int targetSdkVersion) {
|
||||||
|
final ApplicationInfo info = new ApplicationInfo();
|
||||||
|
info.uid = uid;
|
||||||
|
info.packageName = packageName;
|
||||||
|
info.flags = flags;
|
||||||
|
info.targetSdkVersion = targetSdkVersion;
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.BatteryManager;
|
||||||
|
|
||||||
|
public class BatteryTestUtils {
|
||||||
|
|
||||||
|
public static Intent getChargingIntent() {
|
||||||
|
return getCustomBatteryIntent(
|
||||||
|
BatteryManager.BATTERY_PLUGGED_AC,
|
||||||
|
50 /* level */,
|
||||||
|
100 /* scale */,
|
||||||
|
BatteryManager.BATTERY_STATUS_CHARGING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Intent getDischargingIntent() {
|
||||||
|
return getCustomBatteryIntent(
|
||||||
|
0 /* plugged */,
|
||||||
|
10 /* level */,
|
||||||
|
100 /* scale */,
|
||||||
|
BatteryManager.BATTERY_STATUS_DISCHARGING);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Intent getCustomBatteryIntent(int plugged, int level, int scale, int status) {
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.putExtra(BatteryManager.EXTRA_PLUGGED, plugged);
|
||||||
|
intent.putExtra(BatteryManager.EXTRA_LEVEL, level);
|
||||||
|
intent.putExtra(BatteryManager.EXTRA_SCALE, scale);
|
||||||
|
intent.putExtra(BatteryManager.EXTRA_STATUS, status);
|
||||||
|
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
|
||||||
|
public class CustomActivity extends Activity {
|
||||||
|
@Override
|
||||||
|
public void startActivityAsUser(Intent intent, UserHandle user) {}
|
||||||
|
}
|
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
|
public class FakeCopyableController extends BasePreferenceController {
|
||||||
|
|
||||||
|
public FakeCopyableController(Context context, String preferenceKey) {
|
||||||
|
super(context, preferenceKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
return AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSliceable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCopyableSlice() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
|
import com.android.settingslib.search.Indexable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class FakeIndexProvider implements Indexable {
|
||||||
|
|
||||||
|
public static final String KEY = "TestKey";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The fake SearchIndexProvider. Note that the use of location_settings below implies that tests
|
||||||
|
* using this should be using the res/xml-mcc999/location_settings.xml or
|
||||||
|
* res/xml-mcc998/location_settings.xml. Annotate tests with
|
||||||
|
* {@code @Config(qualifiers = "mcc999")}.
|
||||||
|
*/
|
||||||
|
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||||
|
new BaseSearchIndexProvider(R.xml.location_settings) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getNonIndexableKeys(Context context) {
|
||||||
|
List<String> result = super.getNonIndexableKeys(context);
|
||||||
|
result.add(KEY);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
public class FakeInvalidSliderController extends FakeSliderController {
|
||||||
|
|
||||||
|
public FakeInvalidSliderController(Context context, String key) {
|
||||||
|
super(context, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMax() {
|
||||||
|
// Return 0 to make it invalid
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import com.android.settings.core.SliderPreferenceController;
|
||||||
|
|
||||||
|
public class FakeSliderController extends SliderPreferenceController {
|
||||||
|
|
||||||
|
public static final String AVAILABILITY_KEY = "fake_slider_availability_key";
|
||||||
|
|
||||||
|
public static final int MAX_VALUE = 9;
|
||||||
|
|
||||||
|
private static final String SETTING_KEY = "fake_slider_key";
|
||||||
|
|
||||||
|
public FakeSliderController(Context context, String key) {
|
||||||
|
super(context, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSliderPosition() {
|
||||||
|
return Settings.System.getInt(mContext.getContentResolver(), SETTING_KEY, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setSliderPosition(int position) {
|
||||||
|
return Settings.System.putInt(mContext.getContentResolver(), SETTING_KEY, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMax() {
|
||||||
|
return MAX_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMin() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
return Settings.Global.getInt(mContext.getContentResolver(), AVAILABILITY_KEY, AVAILABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSliceable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
|
import com.android.settings.slices.SliceBackgroundWorker;
|
||||||
|
|
||||||
|
public class FakeToggleController extends TogglePreferenceController {
|
||||||
|
|
||||||
|
public static final String AVAILABILITY_KEY = "fake_toggle_availability_key";
|
||||||
|
|
||||||
|
public static final IntentFilter INTENT_FILTER = new IntentFilter(
|
||||||
|
WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
|
||||||
|
|
||||||
|
private static final String SETTING_KEY = "toggle_key";
|
||||||
|
|
||||||
|
private static final int ON = 1;
|
||||||
|
private static final int OFF = 0;
|
||||||
|
|
||||||
|
private boolean mIsAsyncUpdate = false;
|
||||||
|
|
||||||
|
public FakeToggleController(Context context, String preferenceKey) {
|
||||||
|
super(context, preferenceKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isChecked() {
|
||||||
|
return Settings.System.getInt(mContext.getContentResolver(),
|
||||||
|
SETTING_KEY, OFF) == ON;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setChecked(boolean isChecked) {
|
||||||
|
return Settings.System.putInt(mContext.getContentResolver(), SETTING_KEY,
|
||||||
|
isChecked ? ON : OFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
return Settings.Global.getInt(mContext.getContentResolver(),
|
||||||
|
AVAILABILITY_KEY, AVAILABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IntentFilter getIntentFilter() {
|
||||||
|
return INTENT_FILTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSliceable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() {
|
||||||
|
return TestWorker.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasAsyncUpdate() {
|
||||||
|
return mIsAsyncUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAsyncUpdate(boolean isAsyncUpdate) {
|
||||||
|
mIsAsyncUpdate = isAsyncUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TestWorker extends SliceBackgroundWorker<Void> {
|
||||||
|
|
||||||
|
public TestWorker(Context context, Uri uri) {
|
||||||
|
super(context, uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onSlicePinned() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onSliceUnpinned() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
|
||||||
|
public class FakeUnavailablePreferenceController extends BasePreferenceController {
|
||||||
|
|
||||||
|
public static final String AVAILABILITY_KEY = "fake_availability_key";
|
||||||
|
|
||||||
|
public FakeUnavailablePreferenceController(Context context) {
|
||||||
|
super(context, "key");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
return Settings.Global.getInt(mContext.getContentResolver(), AVAILABILITY_KEY, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSliceable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.content.pm.ProviderInfo;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for building {@link ResolveInfo}s to be used in Robolectric tests.
|
||||||
|
*
|
||||||
|
* <p>The resulting {@link PackageInfo}s should typically be added to {@link
|
||||||
|
* org.robolectric.shadows.ShadowPackageManager#addResolveInfoForIntent(Intent, ResolveInfo)}.
|
||||||
|
*/
|
||||||
|
public final class ResolveInfoBuilder {
|
||||||
|
|
||||||
|
private final String mPackageName;
|
||||||
|
private ActivityInfo mActivityInfo;
|
||||||
|
private ProviderInfo mProviderInfo;
|
||||||
|
|
||||||
|
public ResolveInfoBuilder(String packageName) {
|
||||||
|
this.mPackageName = Preconditions.checkNotNull(packageName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResolveInfoBuilder setActivity(String packageName, String className) {
|
||||||
|
mActivityInfo = new ActivityInfo();
|
||||||
|
mActivityInfo.packageName = packageName;
|
||||||
|
mActivityInfo.name = className;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResolveInfoBuilder setProvider(
|
||||||
|
String packageName, String className, String authority, boolean isSystemApp) {
|
||||||
|
mProviderInfo = new ProviderInfo();
|
||||||
|
mProviderInfo.authority = authority;
|
||||||
|
mProviderInfo.applicationInfo = new ApplicationInfo();
|
||||||
|
if (isSystemApp) {
|
||||||
|
mProviderInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
|
||||||
|
}
|
||||||
|
mProviderInfo.packageName = mPackageName;
|
||||||
|
mProviderInfo.applicationInfo.packageName = mPackageName;
|
||||||
|
mProviderInfo.name = className;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResolveInfo build() {
|
||||||
|
ResolveInfo info = new ResolveInfo();
|
||||||
|
info.activityInfo = mActivityInfo;
|
||||||
|
info.resolvePackageName = mPackageName;
|
||||||
|
info.providerInfo = mProviderInfo;
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
}
|
324
tests/unit/src/com/android/settings/testutils/SliceTester.java
Normal file
324
tests/unit/src/com/android/settings/testutils/SliceTester.java
Normal file
@@ -0,0 +1,324 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import static android.app.slice.Slice.HINT_TITLE;
|
||||||
|
import static android.app.slice.Slice.SUBTYPE_COLOR;
|
||||||
|
import static android.app.slice.SliceItem.FORMAT_IMAGE;
|
||||||
|
import static android.app.slice.SliceItem.FORMAT_INT;
|
||||||
|
import static android.app.slice.SliceItem.FORMAT_TEXT;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import androidx.core.graphics.drawable.IconCompat;
|
||||||
|
import androidx.slice.Slice;
|
||||||
|
import androidx.slice.SliceItem;
|
||||||
|
import androidx.slice.SliceMetadata;
|
||||||
|
import androidx.slice.builders.ListBuilder;
|
||||||
|
import androidx.slice.core.SliceAction;
|
||||||
|
import androidx.slice.core.SliceQuery;
|
||||||
|
import androidx.slice.widget.EventInfo;
|
||||||
|
|
||||||
|
import com.android.settings.Utils;
|
||||||
|
import com.android.settings.slices.SettingsSliceProvider;
|
||||||
|
import com.android.settings.slices.SliceBuilderUtils;
|
||||||
|
import com.android.settings.slices.SliceData;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testing utility class to verify the contents of the different Settings Slices.
|
||||||
|
*
|
||||||
|
* TODO (77712944) check Summary, range (metadata.getRange()), toggle icons.
|
||||||
|
*/
|
||||||
|
public class SliceTester {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the contents of an intent based slice, including:
|
||||||
|
* - No toggles
|
||||||
|
* - Correct intent
|
||||||
|
* - Correct title
|
||||||
|
* - Correct keywords
|
||||||
|
* - TTL
|
||||||
|
* - Color
|
||||||
|
*/
|
||||||
|
public static void testSettingsIntentSlice(Context context, Slice slice, SliceData sliceData) {
|
||||||
|
final SliceMetadata metadata = SliceMetadata.from(context, slice);
|
||||||
|
|
||||||
|
final long sliceTTL = metadata.getExpiry();
|
||||||
|
assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
|
||||||
|
|
||||||
|
final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
|
||||||
|
final int color = colorItem.getInt();
|
||||||
|
assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
|
||||||
|
|
||||||
|
final List<SliceAction> toggles = metadata.getToggles();
|
||||||
|
assertThat(toggles).isEmpty();
|
||||||
|
|
||||||
|
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
|
||||||
|
assertThat(primaryPendingIntent).isEqualTo(
|
||||||
|
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
|
||||||
|
|
||||||
|
assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
|
||||||
|
|
||||||
|
assertKeywords(metadata, sliceData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the contents of an toggle based slice, including:
|
||||||
|
* - Contains one toggle
|
||||||
|
* - Correct toggle intent
|
||||||
|
* - Correct content intent
|
||||||
|
* - Correct title
|
||||||
|
* - Correct keywords
|
||||||
|
* - TTL
|
||||||
|
* - Color
|
||||||
|
*/
|
||||||
|
public static void testSettingsToggleSlice(Context context, Slice slice, SliceData sliceData) {
|
||||||
|
final SliceMetadata metadata = SliceMetadata.from(context, slice);
|
||||||
|
|
||||||
|
final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
|
||||||
|
final int color = colorItem.getInt();
|
||||||
|
assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
|
||||||
|
|
||||||
|
final List<SliceAction> toggles = metadata.getToggles();
|
||||||
|
assertThat(toggles).hasSize(1);
|
||||||
|
|
||||||
|
final long sliceTTL = metadata.getExpiry();
|
||||||
|
assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
|
||||||
|
|
||||||
|
final SliceAction mainToggleAction = toggles.get(0);
|
||||||
|
|
||||||
|
assertThat(mainToggleAction.getIcon()).isNull();
|
||||||
|
|
||||||
|
// Check intent in Toggle Action
|
||||||
|
final PendingIntent togglePendingIntent = mainToggleAction.getAction();
|
||||||
|
assertThat(togglePendingIntent).isEqualTo(SliceBuilderUtils.getActionIntent(context,
|
||||||
|
SettingsSliceProvider.ACTION_TOGGLE_CHANGED, sliceData));
|
||||||
|
|
||||||
|
// Check primary intent
|
||||||
|
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
|
||||||
|
assertThat(primaryPendingIntent).isEqualTo(
|
||||||
|
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
|
||||||
|
|
||||||
|
assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
|
||||||
|
|
||||||
|
assertKeywords(metadata, sliceData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the contents of an slider based slice, including:
|
||||||
|
* - No intent
|
||||||
|
* - Correct title
|
||||||
|
* - Correct keywords
|
||||||
|
* - TTL
|
||||||
|
* - Color
|
||||||
|
*/
|
||||||
|
public static void testSettingsSliderSlice(Context context, Slice slice, SliceData sliceData) {
|
||||||
|
final SliceMetadata metadata = SliceMetadata.from(context, slice);
|
||||||
|
final SliceAction primaryAction = metadata.getPrimaryAction();
|
||||||
|
|
||||||
|
final IconCompat icon = primaryAction.getIcon();
|
||||||
|
if (icon == null) {
|
||||||
|
final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
|
||||||
|
final int color = colorItem.getInt();
|
||||||
|
assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
final IconCompat expectedIcon = IconCompat.createWithResource(context,
|
||||||
|
sliceData.getIconResource());
|
||||||
|
assertThat(expectedIcon.toString()).isEqualTo(icon.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
final long sliceTTL = metadata.getExpiry();
|
||||||
|
assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
|
||||||
|
|
||||||
|
final int headerType = metadata.getHeaderType();
|
||||||
|
assertThat(headerType).isEqualTo(EventInfo.ROW_TYPE_SLIDER);
|
||||||
|
|
||||||
|
// Check primary intent
|
||||||
|
final PendingIntent primaryPendingIntent = primaryAction.getAction();
|
||||||
|
assertThat(primaryPendingIntent).isEqualTo(
|
||||||
|
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
|
||||||
|
|
||||||
|
assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
|
||||||
|
|
||||||
|
assertKeywords(metadata, sliceData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the copyable slice, including:
|
||||||
|
* - No intent
|
||||||
|
* - Correct title
|
||||||
|
* - Correct intent
|
||||||
|
* - Correct keywords
|
||||||
|
* - TTL
|
||||||
|
* - Color
|
||||||
|
*/
|
||||||
|
public static void testSettingsCopyableSlice(Context context, Slice slice,
|
||||||
|
SliceData sliceData) {
|
||||||
|
final SliceMetadata metadata = SliceMetadata.from(context, slice);
|
||||||
|
|
||||||
|
final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
|
||||||
|
final int color = colorItem.getInt();
|
||||||
|
assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
|
||||||
|
|
||||||
|
final SliceAction primaryAction = metadata.getPrimaryAction();
|
||||||
|
|
||||||
|
final IconCompat expectedIcon = IconCompat.createWithResource(context,
|
||||||
|
sliceData.getIconResource());
|
||||||
|
assertThat(expectedIcon.toString()).isEqualTo(primaryAction.getIcon().toString());
|
||||||
|
|
||||||
|
final long sliceTTL = metadata.getExpiry();
|
||||||
|
assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
|
||||||
|
|
||||||
|
// Check primary intent
|
||||||
|
final PendingIntent primaryPendingIntent = primaryAction.getAction();
|
||||||
|
assertThat(primaryPendingIntent).isEqualTo(
|
||||||
|
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
|
||||||
|
|
||||||
|
assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
|
||||||
|
|
||||||
|
assertKeywords(metadata, sliceData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the contents of an unavailable slice, including:
|
||||||
|
* - No toggles
|
||||||
|
* - Correct title
|
||||||
|
* - Correct intent
|
||||||
|
* - Correct keywords
|
||||||
|
* - Color
|
||||||
|
* - TTL
|
||||||
|
*/
|
||||||
|
public static void testSettingsUnavailableSlice(Context context, Slice slice,
|
||||||
|
SliceData sliceData) {
|
||||||
|
final SliceMetadata metadata = SliceMetadata.from(context, slice);
|
||||||
|
|
||||||
|
final long sliceTTL = metadata.getExpiry();
|
||||||
|
assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
|
||||||
|
|
||||||
|
final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
|
||||||
|
final int color = colorItem.getInt();
|
||||||
|
assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
|
||||||
|
|
||||||
|
final List<SliceAction> toggles = metadata.getToggles();
|
||||||
|
assertThat(toggles).isEmpty();
|
||||||
|
|
||||||
|
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
|
||||||
|
assertThat(primaryPendingIntent).isEqualTo(SliceBuilderUtils.getContentPendingIntent(
|
||||||
|
context, sliceData));
|
||||||
|
|
||||||
|
assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
|
||||||
|
|
||||||
|
assertKeywords(metadata, sliceData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert any slice item contains title.
|
||||||
|
*
|
||||||
|
* @param sliceItems All slice items of a Slice.
|
||||||
|
* @param title Title for asserting.
|
||||||
|
*/
|
||||||
|
public static void assertAnySliceItemContainsTitle(List<SliceItem> sliceItems, String title) {
|
||||||
|
assertThat(hasText(sliceItems, title, HINT_TITLE)).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert any slice item contains subtitle.
|
||||||
|
*
|
||||||
|
* @param sliceItems All slice items of a Slice.
|
||||||
|
* @param subtitle Subtitle for asserting.
|
||||||
|
*/
|
||||||
|
public static void assertAnySliceItemContainsSubtitle(List<SliceItem> sliceItems,
|
||||||
|
String subtitle) {
|
||||||
|
// Subtitle has no hints
|
||||||
|
assertThat(hasText(sliceItems, subtitle, null /* hints */)).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert no slice item contains subtitle.
|
||||||
|
*
|
||||||
|
* @param sliceItems All slice items of a Slice.
|
||||||
|
* @param subtitle Subtitle for asserting.
|
||||||
|
*/
|
||||||
|
public static void assertNoSliceItemContainsSubtitle(List<SliceItem> sliceItems,
|
||||||
|
String subtitle) {
|
||||||
|
// Subtitle has no hints
|
||||||
|
assertThat(hasText(sliceItems, subtitle, null /* hints */)).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean hasText(List<SliceItem> sliceItems, String text, String hints) {
|
||||||
|
boolean hasText = false;
|
||||||
|
for (SliceItem item : sliceItems) {
|
||||||
|
List<SliceItem> textItems = SliceQuery.findAll(item, FORMAT_TEXT, hints,
|
||||||
|
null /* non-hints */);
|
||||||
|
if (textItems == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (SliceItem textItem : textItems) {
|
||||||
|
if (TextUtils.equals(textItem.getText(), text)) {
|
||||||
|
hasText = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hasText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert any slice item contains icon.
|
||||||
|
*
|
||||||
|
* @param sliceItems All slice items of a Slice.
|
||||||
|
* @param icon Icon for asserting.
|
||||||
|
*/
|
||||||
|
public static void assertAnySliceItemContainsIcon(List<SliceItem> sliceItems, IconCompat icon) {
|
||||||
|
boolean hasIcon = false;
|
||||||
|
for (SliceItem item : sliceItems) {
|
||||||
|
List<SliceItem> iconItems = SliceQuery.findAll(item, FORMAT_IMAGE,
|
||||||
|
(String) null /* hints */, null /* non-hints */);
|
||||||
|
if (iconItems == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (SliceItem iconItem : iconItems) {
|
||||||
|
if (icon.toString().equals(iconItem.getIcon().toString())) {
|
||||||
|
hasIcon = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertThat(hasIcon).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertKeywords(SliceMetadata metadata, SliceData data) {
|
||||||
|
final List<String> keywords = metadata.getSliceKeywords();
|
||||||
|
final Set<String> expectedKeywords = Arrays.stream(data.getKeywords().split(","))
|
||||||
|
.map(s -> s = s.trim())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
expectedKeywords.add(data.getTitle());
|
||||||
|
expectedKeywords.add(data.getScreenTitle().toString());
|
||||||
|
assertThat(keywords).containsExactlyElementsIn(expectedKeywords);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.testutils;
|
||||||
|
|
||||||
|
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
|
||||||
|
import static com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag
|
||||||
|
.FLAG_INCLUDE_PREF_SCREEN;
|
||||||
|
import static com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_KEY;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.android.settings.core.PreferenceXmlParserUtils;
|
||||||
|
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Util class for parsing XML
|
||||||
|
*/
|
||||||
|
public class XmlTestUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a preference screen's xml, collects and returns all keys used by preferences
|
||||||
|
* on the screen.
|
||||||
|
*
|
||||||
|
* @param context of the preference screen.
|
||||||
|
* @param xmlId of the Preference Xml to be parsed.
|
||||||
|
* @return List of all keys in the preference Xml
|
||||||
|
*/
|
||||||
|
public static List<String> getKeysFromPreferenceXml(Context context, int xmlId) {
|
||||||
|
final List<String> keys = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(context, xmlId,
|
||||||
|
FLAG_NEED_KEY | FLAG_INCLUDE_PREF_SCREEN);
|
||||||
|
for (Bundle bundle : metadata) {
|
||||||
|
final String key = bundle.getString(METADATA_KEY);
|
||||||
|
if (!TextUtils.isEmpty(key)) {
|
||||||
|
keys.add(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (java.io.IOException | XmlPullParserException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -23,15 +23,15 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@Ignore
|
|
||||||
public class MultiUserTopIntroPreferenceControllerTest {
|
public class MultiUserTopIntroPreferenceControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -39,10 +39,11 @@ public class MultiUserTopIntroPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = ApplicationProvider.getApplicationContext();
|
||||||
mController = new MultiUserTopIntroPreferenceController(mContext, "top_info");
|
mController = new MultiUserTopIntroPreferenceController(mContext, "top_info");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void getAvailabilityStatus_multiUserOff_shouldReturnEnabled() {
|
public void getAvailabilityStatus_multiUserOff_shouldReturnEnabled() {
|
||||||
mController.mUserCaps.mEnabled = true;
|
mController.mUserCaps.mEnabled = true;
|
||||||
@@ -51,6 +52,7 @@ public class MultiUserTopIntroPreferenceControllerTest {
|
|||||||
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE);
|
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void getAvailabilityStatus_multiUserOn_shouldReturnDisabled() {
|
public void getAvailabilityStatus_multiUserOn_shouldReturnDisabled() {
|
||||||
mController.mUserCaps.mEnabled = true;
|
mController.mUserCaps.mEnabled = true;
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2016 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -20,19 +20,20 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class LocalClassLoaderContextThemeWrapperTest {
|
public class LocalClassLoaderContextThemeWrapperTest {
|
||||||
|
|
||||||
private LocalClassLoaderContextThemeWrapper mContextThemeWrapper;
|
private LocalClassLoaderContextThemeWrapper mContextThemeWrapper;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getClassLoader_shouldUseLocalClassLoader() {
|
public void getClassLoader_shouldUseLocalClassLoader() {
|
||||||
final Context context = RuntimeEnvironment.application;
|
final Context context = ApplicationProvider.getApplicationContext();
|
||||||
final Class clazz = LocalClassLoaderContextThemeWrapperTest.class;
|
final Class clazz = LocalClassLoaderContextThemeWrapperTest.class;
|
||||||
mContextThemeWrapper = new LocalClassLoaderContextThemeWrapper(clazz, context, 0);
|
mContextThemeWrapper = new LocalClassLoaderContextThemeWrapper(clazz, context, 0);
|
||||||
|
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -23,11 +23,12 @@ import static org.mockito.Mockito.when;
|
|||||||
|
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class VpnUtilsTest {
|
public final class VpnUtilsTest {
|
||||||
@Test
|
@Test
|
||||||
public void testIsAlwaysOnVpnSet() {
|
public void testIsAlwaysOnVpnSet() {
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user