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:
@@ -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/>
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user