Entity header: When screen scrolls, there should be shadow under the header.

Bug: 70950124

Test: manual
Test: make RunSettingsRoboTests

Change-Id: I5c1d9f463a57d48e258d67602fc4d1fbbdfaad60
This commit is contained in:
Jan Nordqvist
2018-03-23 15:45:17 -07:00
parent f88dcfadbb
commit 4092b2193c
4 changed files with 94 additions and 26 deletions

View File

@@ -72,8 +72,6 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl
protected final String mPreferenceKey; protected final String mPreferenceKey;
protected Lifecycle mLifecycle;
/** /**
* Instantiate a controller as specified controller type and user-defined key. * Instantiate a controller as specified controller type and user-defined key.
* <p/> * <p/>

View File

@@ -161,7 +161,7 @@ public class DataUsageSummary extends DataUsageBaseFragment implements Indexable
final Activity activity = getActivity(); final Activity activity = getActivity();
final ArrayList<AbstractPreferenceController> controllers = new ArrayList<>(); final ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
mSummaryController = mSummaryController =
new DataUsageSummaryPreferenceController(context, this, activity); new DataUsageSummaryPreferenceController(activity, getLifecycle(), this);
controllers.add(mSummaryController); controllers.add(mSummaryController);
getLifecycle().addObserver(mSummaryController); getLifecycle().addObserver(mSummaryController);
return controllers; return controllers;

View File

@@ -37,6 +37,7 @@ import android.util.Log;
import android.util.RecurrenceRule; import android.util.RecurrenceRule;
import com.android.internal.util.CollectionUtils; import com.android.internal.util.CollectionUtils;
import android.support.v7.widget.RecyclerView;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
@@ -63,8 +64,10 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll
private static final float RELATIVE_SIZE_LARGE = 1.25f * 1.25f; // (1/0.8)^2 private static final float RELATIVE_SIZE_LARGE = 1.25f * 1.25f; // (1/0.8)^2
private static final float RELATIVE_SIZE_SMALL = 1.0f / RELATIVE_SIZE_LARGE; // 0.8^2 private static final float RELATIVE_SIZE_SMALL = 1.0f / RELATIVE_SIZE_LARGE; // 0.8^2
private final Fragment mFragment;
private final Activity mActivity; private final Activity mActivity;
private final EntityHeaderController mEntityHeaderController;
private final Lifecycle mLifecycle;
private final DataUsageSummary mDataUsageSummary;
private final DataUsageController mDataUsageController; private final DataUsageController mDataUsageController;
private final DataUsageInfoController mDataInfoController; private final DataUsageInfoController mDataInfoController;
private final NetworkTemplate mDefaultTemplate; private final NetworkTemplate mDefaultTemplate;
@@ -96,27 +99,30 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll
private Intent mManageSubscriptionIntent; private Intent mManageSubscriptionIntent;
public DataUsageSummaryPreferenceController(Context context, Fragment fragment, public DataUsageSummaryPreferenceController(Activity activity,
Activity activity) { Lifecycle lifecycle, DataUsageSummary dataUsageSummary) {
super(context, KEY); super(activity, KEY);
mFragment = fragment;
mActivity = activity; mActivity = activity;
mEntityHeaderController = EntityHeaderController.newInstance(activity,
dataUsageSummary, null);
mLifecycle = lifecycle;
mDataUsageSummary = dataUsageSummary;
final int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context); final int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(activity);
mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, defaultSubId); mDefaultTemplate = DataUsageUtils.getDefaultTemplate(activity, defaultSubId);
NetworkPolicyManager policyManager = NetworkPolicyManager.from(context); NetworkPolicyManager policyManager = NetworkPolicyManager.from(activity);
mPolicyEditor = new NetworkPolicyEditor(policyManager); mPolicyEditor = new NetworkPolicyEditor(policyManager);
mHasMobileData = DataUsageUtils.hasMobileData(context) mHasMobileData = DataUsageUtils.hasMobileData(activity)
&& defaultSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID; && defaultSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mDataUsageController = new DataUsageController(context); mDataUsageController = new DataUsageController(activity);
mDataInfoController = new DataUsageInfoController(); mDataInfoController = new DataUsageInfoController();
if (mHasMobileData) { if (mHasMobileData) {
mDataUsageTemplate = R.string.cell_data_template; mDataUsageTemplate = R.string.cell_data_template;
} else if (DataUsageUtils.hasWifiRadio(context)) { } else if (DataUsageUtils.hasWifiRadio(activity)) {
mDataUsageTemplate = R.string.wifi_data_template; mDataUsageTemplate = R.string.wifi_data_template;
} else { } else {
mDataUsageTemplate = R.string.ethernet_data_template; mDataUsageTemplate = R.string.ethernet_data_template;
@@ -128,15 +134,18 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll
@VisibleForTesting @VisibleForTesting
DataUsageSummaryPreferenceController( DataUsageSummaryPreferenceController(
Context context,
DataUsageController dataUsageController, DataUsageController dataUsageController,
DataUsageInfoController dataInfoController, DataUsageInfoController dataInfoController,
NetworkTemplate defaultTemplate, NetworkTemplate defaultTemplate,
NetworkPolicyEditor policyEditor, NetworkPolicyEditor policyEditor,
int dataUsageTemplate, int dataUsageTemplate,
boolean hasMobileData, boolean hasMobileData,
SubscriptionManager subscriptionManager) { SubscriptionManager subscriptionManager,
super(context, KEY); Activity activity,
Lifecycle lifecycle,
EntityHeaderController entityHeaderController,
DataUsageSummary dataUsageSummary) {
super(activity, KEY);
mDataUsageController = dataUsageController; mDataUsageController = dataUsageController;
mDataInfoController = dataInfoController; mDataInfoController = dataInfoController;
mDefaultTemplate = defaultTemplate; mDefaultTemplate = defaultTemplate;
@@ -144,13 +153,17 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll
mDataUsageTemplate = dataUsageTemplate; mDataUsageTemplate = dataUsageTemplate;
mHasMobileData = hasMobileData; mHasMobileData = hasMobileData;
mSubscriptionManager = subscriptionManager; mSubscriptionManager = subscriptionManager;
mFragment = null; mActivity = activity;
mActivity = null; mLifecycle = lifecycle;
mEntityHeaderController = entityHeaderController;
mDataUsageSummary = dataUsageSummary;
} }
@Override @Override
public void onStart() { public void onStart() {
EntityHeaderController.newInstance(mActivity, mFragment, null).styleActionBar(mActivity); RecyclerView view = mDataUsageSummary.getListView();
mEntityHeaderController.setRecyclerView(view, mLifecycle);
mEntityHeaderController.styleActionBar(mActivity);
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -25,27 +25,41 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.NetworkTemplate; import android.net.NetworkTemplate;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.applications.AppInfoWithHeaderTest;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.NetworkPolicyEditor;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.net.DataUsageController; import com.android.settingslib.net.DataUsageController;
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.mockito.Answers;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import android.support.v7.widget.RecyclerView;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = ShadowEntityHeaderController.class)
public class DataUsageSummaryPreferenceControllerTest { public class DataUsageSummaryPreferenceControllerTest {
private static final long UPDATE_BACKOFF_MS = TimeUnit.MINUTES.toMillis(13); private static final long UPDATE_BACKOFF_MS = TimeUnit.MINUTES.toMillis(13);
@@ -68,7 +82,15 @@ public class DataUsageSummaryPreferenceControllerTest {
private NetworkTemplate mNetworkTemplate; private NetworkTemplate mNetworkTemplate;
@Mock @Mock
private SubscriptionManager mSubscriptionManager; private SubscriptionManager mSubscriptionManager;
@Mock
private Lifecycle mLifecycle;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private EntityHeaderController mHeaderController;
@Mock
private DataUsageSummary mDataUsageSummary;
private FakeFeatureFactory mFactory;
private Activity mActivity;
private Context mContext; private Context mContext;
private DataUsageSummaryPreferenceController mController; private DataUsageSummaryPreferenceController mController;
@@ -79,15 +101,27 @@ public class DataUsageSummaryPreferenceControllerTest {
doReturn("%1$s %2%s").when(mContext) doReturn("%1$s %2%s").when(mContext)
.getString(com.android.internal.R.string.fileSizeSuffix); .getString(com.android.internal.R.string.fileSizeSuffix);
mActivity = Robolectric.setupActivity(Activity.class);
mFactory = FakeFeatureFactory.setupForTest();
when(mFactory.metricsFeatureProvider.getMetricsCategory(any(Object.class)))
.thenReturn(MetricsProto.MetricsEvent.SETTINGS_APP_NOTIF_CATEGORY);
ShadowEntityHeaderController.setUseMock(mHeaderController);
mController = new DataUsageSummaryPreferenceController( mController = new DataUsageSummaryPreferenceController(
mContext,
mDataUsageController, mDataUsageController,
mDataInfoController, mDataInfoController,
mNetworkTemplate, mNetworkTemplate,
mPolicyEditor, mPolicyEditor,
R.string.cell_data_template, R.string.cell_data_template,
true, true,
null); null,
mActivity, null, null, null);
}
@After
public void tearDown() {
ShadowEntityHeaderController.reset();
} }
@Test @Test
@@ -240,14 +274,14 @@ public class DataUsageSummaryPreferenceControllerTest {
@Test @Test
public void testMobileData_preferenceAvailable() { public void testMobileData_preferenceAvailable() {
mController = new DataUsageSummaryPreferenceController( mController = new DataUsageSummaryPreferenceController(
mContext,
mDataUsageController, mDataUsageController,
mDataInfoController, mDataInfoController,
mNetworkTemplate, mNetworkTemplate,
mPolicyEditor, mPolicyEditor,
R.string.cell_data_template, R.string.cell_data_template,
true, true,
mSubscriptionManager); mSubscriptionManager,
mActivity, null, null, null);
final SubscriptionInfo subInfo = new SubscriptionInfo(0, "123456", 0, "name", "carrier", final SubscriptionInfo subInfo = new SubscriptionInfo(0, "123456", 0, "name", "carrier",
0, 0, "number", 0, null, 123, 456, "ZX"); 0, 0, "number", 0, null, 123, 456, "ZX");
@@ -258,19 +292,42 @@ public class DataUsageSummaryPreferenceControllerTest {
@Test @Test
public void testMobileData_preferenceDisabled() { public void testMobileData_preferenceDisabled() {
mController = new DataUsageSummaryPreferenceController( mController = new DataUsageSummaryPreferenceController(
mContext,
mDataUsageController, mDataUsageController,
mDataInfoController, mDataInfoController,
mNetworkTemplate, mNetworkTemplate,
mPolicyEditor, mPolicyEditor,
R.string.cell_data_template, R.string.cell_data_template,
true, true,
mSubscriptionManager); mSubscriptionManager,
mActivity, null, null, null);
when(mSubscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(null); when(mSubscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(null);
assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_UNSUPPORTED); assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_UNSUPPORTED);
} }
@Test
public void testMobileData_entityHeaderSet() {
final RecyclerView recyclerView = new RecyclerView(mActivity);
mController = new DataUsageSummaryPreferenceController(
mDataUsageController,
mDataInfoController,
mNetworkTemplate,
mPolicyEditor,
R.string.cell_data_template,
true,
mSubscriptionManager,
mActivity, mLifecycle, mHeaderController, mDataUsageSummary);
when(mDataUsageSummary.getListView()).thenReturn(recyclerView);
mController.onStart();
verify(mHeaderController)
.setRecyclerView(any(RecyclerView.class), any(Lifecycle.class));
verify(mHeaderController).styleActionBar(any(Activity.class));
}
private DataUsageController.DataUsageInfo createTestDataUsageInfo(long now) { private DataUsageController.DataUsageInfo createTestDataUsageInfo(long now) {
DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo(); DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
info.carrier = CARRIER_NAME; info.carrier = CARRIER_NAME;