Add FutureTask approach in DashboardFragment
- Use the multiple tasks to enhance the controllers loading. Bug: 137558156 Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.dashboard Change-Id: I629ff5dc81347cddf9762a87015b9b86b6a46e50
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.settings.dashboard;
|
||||
|
||||
import static com.android.settingslib.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class ControllerFutureTaskTest {
|
||||
private static final String KEY = "my_key";
|
||||
|
||||
private Context mContext;
|
||||
private TestPreferenceController mTestController;
|
||||
private PreferenceScreen mScreen;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mTestController = new TestPreferenceController(mContext, KEY);
|
||||
final PreferenceManager preferenceManager = new PreferenceManager(mContext);
|
||||
mScreen = preferenceManager.createPreferenceScreen(mContext);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getController_addTask_checkControllerKey() {
|
||||
final ControllerFutureTask futureTask = new ControllerFutureTask(
|
||||
new ControllerTask(mTestController, mScreen, null /* metricsFeature */,
|
||||
METRICS_CATEGORY_UNKNOWN), null /* result */);
|
||||
|
||||
assertThat(futureTask.getController().getPreferenceKey()).isEqualTo(KEY);
|
||||
}
|
||||
|
||||
|
||||
static class TestPreferenceController extends BasePreferenceController {
|
||||
TestPreferenceController(Context context, String preferenceKey) {
|
||||
super(context, preferenceKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return AVAILABLE;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.settings.dashboard;
|
||||
|
||||
import static com.android.settingslib.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class ControllerTaskTest {
|
||||
private static final String KEY = "my_key";
|
||||
|
||||
private Context mContext;
|
||||
private PreferenceScreen mScreen;
|
||||
private TestPreferenceController mTestController;
|
||||
private ControllerTask mControllerTask;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
final PreferenceManager preferenceManager = new PreferenceManager(mContext);
|
||||
mScreen = preferenceManager.createPreferenceScreen(mContext);
|
||||
mTestController = spy(new TestPreferenceController(mContext));
|
||||
mControllerTask = new ControllerTask(mTestController, mScreen, null /* metricsFeature */,
|
||||
METRICS_CATEGORY_UNKNOWN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doRun_controlNotAvailable_noRunUpdateState() {
|
||||
mTestController.setAvailable(false);
|
||||
|
||||
mControllerTask.run();
|
||||
|
||||
verify(mTestController, never()).updateState(any(Preference.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doRun_emptyKey_noRunUpdateState() {
|
||||
mTestController.setKey("");
|
||||
|
||||
mControllerTask.run();
|
||||
|
||||
verify(mTestController, never()).updateState(any(Preference.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doRun_preferenceNotExist_noRunUpdateState() {
|
||||
mTestController.setKey(KEY);
|
||||
|
||||
mControllerTask.run();
|
||||
|
||||
verify(mTestController, never()).updateState(any(Preference.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doRun_executeUpdateState() {
|
||||
mTestController.setKey(KEY);
|
||||
final Preference preference = new Preference(mContext);
|
||||
preference.setKey(KEY);
|
||||
mScreen.addPreference(preference);
|
||||
|
||||
mControllerTask.run();
|
||||
|
||||
verify(mTestController).updateState(any(Preference.class));
|
||||
}
|
||||
|
||||
static class TestPreferenceController extends AbstractPreferenceController {
|
||||
private boolean mAvailable;
|
||||
private String mKey;
|
||||
|
||||
TestPreferenceController(Context context) {
|
||||
super(context);
|
||||
mAvailable = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return mAvailable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return mKey;
|
||||
}
|
||||
|
||||
void setAvailable(boolean available) {
|
||||
mAvailable = available;
|
||||
}
|
||||
|
||||
void setKey(String key) {
|
||||
mKey = key;
|
||||
}
|
||||
}
|
||||
}
|
@@ -37,6 +37,7 @@ import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ProviderInfo;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.FeatureFlagUtils;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
@@ -45,6 +46,7 @@ import androidx.preference.PreferenceScreen;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.core.FeatureFlags;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.slices.BlockingSlicePrefController;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
@@ -333,7 +335,38 @@ public class DashboardFragmentTest {
|
||||
assertThat(pref).isInstanceOf(MasterSwitchPreference.class);
|
||||
}
|
||||
|
||||
private static class TestPreferenceController extends AbstractPreferenceController
|
||||
@Test
|
||||
public void isFeatureFlagAndIsParalleled_runParalleledUpdatePreferenceStates() {
|
||||
FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTROLLER_ENHANCEMENT, true);
|
||||
final TestFragment testFragment = spy(new TestFragment(RuntimeEnvironment.application));
|
||||
|
||||
testFragment.updatePreferenceStates();
|
||||
|
||||
verify(testFragment).updatePreferenceStatesInParallel();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void notFeatureFlagAndIsParalleled_notRunParalleledUpdatePreferenceStates() {
|
||||
FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTROLLER_ENHANCEMENT, false);
|
||||
final TestFragment testFragment = spy(new TestFragment(RuntimeEnvironment.application));
|
||||
|
||||
testFragment.updatePreferenceStates();
|
||||
|
||||
verify(testFragment, never()).updatePreferenceStatesInParallel();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isFeatureFlagAndNotParalleled_notRunParalleledUpdatePreferenceStates() {
|
||||
FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTROLLER_ENHANCEMENT, true);
|
||||
final TestFragment testFragment = spy(new TestFragment(RuntimeEnvironment.application));
|
||||
testFragment.setUsingControllerEnhancement(false);
|
||||
|
||||
testFragment.updatePreferenceStates();
|
||||
|
||||
verify(testFragment, never()).updatePreferenceStatesInParallel();
|
||||
}
|
||||
|
||||
public static class TestPreferenceController extends AbstractPreferenceController
|
||||
implements PreferenceControllerMixin {
|
||||
|
||||
private TestPreferenceController(Context context) {
|
||||
@@ -362,19 +395,21 @@ public class DashboardFragmentTest {
|
||||
|
||||
private static class TestFragment extends DashboardFragment {
|
||||
|
||||
public final PreferenceScreen mScreen;
|
||||
|
||||
private final PreferenceManager mPreferenceManager;
|
||||
private final Context mContext;
|
||||
private final List<AbstractPreferenceController> mControllers;
|
||||
private final ContentResolver mContentResolver;
|
||||
|
||||
public final PreferenceScreen mScreen;
|
||||
private boolean mIsParalleled;
|
||||
|
||||
public TestFragment(Context context) {
|
||||
mContext = context;
|
||||
mPreferenceManager = mock(PreferenceManager.class);
|
||||
mScreen = mock(PreferenceScreen.class);
|
||||
mContentResolver = mock(ContentResolver.class);
|
||||
mControllers = new ArrayList<>();
|
||||
mIsParalleled = true;
|
||||
|
||||
when(mPreferenceManager.getContext()).thenReturn(mContext);
|
||||
ReflectionHelpers.setField(
|
||||
@@ -420,6 +455,14 @@ public class DashboardFragmentTest {
|
||||
protected ContentResolver getContentResolver() {
|
||||
return mContentResolver;
|
||||
}
|
||||
|
||||
protected boolean isParalleledControllers() {
|
||||
return mIsParalleled;
|
||||
}
|
||||
|
||||
public void setUsingControllerEnhancement(boolean isParalleled) {
|
||||
mIsParalleled = isParalleled;
|
||||
}
|
||||
}
|
||||
|
||||
private static class TestDynamicDataObserver extends DynamicDataObserver {
|
||||
|
Reference in New Issue
Block a user