Merge "[Passpointv2] Implement DataUsage header for Wi-Fi detail fragment"

This commit is contained in:
Cosmo Hsieh
2019-03-14 10:10:54 +00:00
committed by Android (Google) Code Review
14 changed files with 176 additions and 34 deletions

View File

@@ -10759,7 +10759,7 @@
<string name="media_output_panel_summary_of_playing_device">Currently playing on <xliff:g id="device_name" example="Bose headphone">%1$s</xliff:g></string>
<!-- Message for forget passpoint dialog [CHAR LIMIT=none] -->
<string name="forget_passpoint_dialog_message">Your subscription with this provider may be cancelled. Recurring subscriptions will not be cancelled. For more information, check with your provider.</string>
<string name="forget_passpoint_dialog_message">You may lose access to any remaining time or data. Check with your provider before removing.</string>
<!-- Keywords for Content Capture feature [CHAR_LIMIT=32] -->
<string name="keywords_content_capture">content capture</string>
@@ -10767,5 +10767,4 @@
<string name="content_capture">Content Capture</string>
<!-- Description of the 'Content Capture' feature toggle in the Settings -> Privacy screen [CHAR LIMIT=NONE]-->
<string name="content_capture_summary">Allow Android to save information seen on your screen or heard in video or audio content. Android makes helpful suggestions based on your device activity.</string>
</resources>

View File

@@ -26,6 +26,11 @@
android:order="-10000"
settings:allowDividerBelow="true"/>
<com.android.settings.datausage.DataUsageSummaryPreference
android:key="status_header"
android:selectable="false"
settings:isPreferenceVisible="false"/>
<!-- Buttons -->
<com.android.settingslib.widget.ActionButtonsPreference
android:key="buttons"

View File

@@ -26,4 +26,7 @@ public class FeatureFlags {
public static final String NETWORK_INTERNET_V2 = "settings_network_and_internet_v2";
public static final String SLICE_INJECTION = "settings_slice_injection";
public static final String MAINLINE_MODULE = "settings_mainline_module";
public static final String WIFI_DETAILS_SAVED_SCREEN = "settings_wifi_details_saved_screen";
public static final String WIFI_DETAILS_DATAUSAGE_HEADER =
"settings_wifi_details_datausage_header";
}

View File

@@ -69,6 +69,8 @@ public class DataUsageSummaryPreference extends Preference {
private boolean mDefaultTextColorSet;
private int mDefaultTextColor;
private int mNumPlans;
/** The specified un-initialized value for cycle time */
private final long CYCLE_TIME_UNINITIAL_VALUE = 0;
/** The ending time of the billing cycle in milliseconds since epoch. */
private long mCycleEndTimeMs;
/** The time of the last update in standard milliseconds since the epoch */
@@ -94,6 +96,7 @@ public class DataUsageSummaryPreference extends Preference {
/** WiFi only mode */
private boolean mWifiMode;
private String mUsagePeriod;
private boolean mSingleWifi; // Shows only one specified WiFi network usage
public DataUsageSummaryPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -142,9 +145,10 @@ public class DataUsageSummaryPreference extends Preference {
notifyChanged();
}
void setWifiMode(boolean isWifiMode, String usagePeriod) {
void setWifiMode(boolean isWifiMode, String usagePeriod, boolean isSingleWifi) {
mWifiMode = isWifiMode;
mUsagePeriod = usagePeriod;
mSingleWifi = isSingleWifi;
notifyChanged();
}
@@ -171,7 +175,16 @@ public class DataUsageSummaryPreference extends Preference {
Button launchButton = (Button) holder.findViewById(R.id.launch_mdp_app_button);
TextView limitInfo = (TextView) holder.findViewById(R.id.data_limits);
if (mWifiMode) {
if (mWifiMode && mSingleWifi) {
updateCycleTimeText(holder);
usageTitle.setVisibility(View.GONE);
launchButton.setVisibility(View.GONE);
carrierInfo.setVisibility(View.GONE);
limitInfo.setVisibility(TextUtils.isEmpty(mLimitInfoText) ? View.GONE : View.VISIBLE);
limitInfo.setText(mLimitInfoText);
} else if (mWifiMode) {
usageTitle.setText(R.string.data_usage_wifi_title);
usageTitle.setVisibility(View.VISIBLE);
TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
@@ -265,6 +278,13 @@ public class DataUsageSummaryPreference extends Preference {
private void updateCycleTimeText(PreferenceViewHolder holder) {
TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
// Takes zero as a special case which value is never set.
if (mCycleEndTimeMs == CYCLE_TIME_UNINITIAL_VALUE) {
cycleTime.setVisibility(View.GONE);
return;
}
cycleTime.setVisibility(View.VISIBLE);
long millisLeft = mCycleEndTimeMs - System.currentTimeMillis();
if (millisLeft <= 0) {
cycleTime.setText(getContext().getString(R.string.billing_cycle_none_left));

View File

@@ -65,10 +65,10 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll
private final EntityHeaderController mEntityHeaderController;
private final Lifecycle mLifecycle;
private final PreferenceFragmentCompat mFragment;
private final DataUsageController mDataUsageController;
private final DataUsageInfoController mDataInfoController;
protected final DataUsageController mDataUsageController;
protected final DataUsageInfoController mDataInfoController;
private final NetworkTemplate mDefaultTemplate;
private final NetworkPolicyEditor mPolicyEditor;
protected final NetworkPolicyEditor mPolicyEditor;
private final int mDataUsageTemplate;
private final boolean mHasMobileData;
private final SubscriptionManager mSubscriptionManager;
@@ -200,11 +200,13 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll
if (DataUsageUtils.hasSim(mActivity)) {
info = mDataUsageController.getDataUsageInfo(mDefaultTemplate);
mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(mDefaultTemplate));
summaryPreference.setWifiMode(/* isWifiMode */ false, /* usagePeriod */ null);
summaryPreference.setWifiMode(/* isWifiMode */ false,
/* usagePeriod */ null, /* isSingleWifi */ false);
} else {
info = mDataUsageController.getDataUsageInfo(
NetworkTemplate.buildTemplateWifiWildcard());
summaryPreference.setWifiMode(/* isWifiMode */ true, /* usagePeriod */ info.period);
summaryPreference.setWifiMode(/* isWifiMode */ true, /* usagePeriod */
info.period, /* isSingleWifi */ false);
summaryPreference.setLimitInfo(null);
summaryPreference.setUsageNumbers(info.usageLevel,
/* dataPlanSize */ -1L,

View File

@@ -0,0 +1,72 @@
/*
* 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.datausage;
import android.app.Activity;
import android.net.NetworkTemplate;
import android.telephony.SubscriptionManager;
import android.text.format.Formatter;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.net.DataUsageController;
/**
* The controller displays a data usage chart for the specified Wi-Fi network.
*/
public class WifiDataUsageSummaryPreferenceController extends DataUsageSummaryPreferenceController {
final String mNetworkId;
public WifiDataUsageSummaryPreferenceController(Activity activity,
Lifecycle lifecycle, PreferenceFragmentCompat fragment, CharSequence networkId) {
super(activity, lifecycle, fragment, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
if (networkId == null) {
mNetworkId = null;
} else {
mNetworkId = String.valueOf(networkId);
}
}
@Override
public void updateState(Preference preference) {
if (preference == null) {
return;
}
final DataUsageSummaryPreference mPreference = (DataUsageSummaryPreference) preference;
// TODO(b/126299427): Currently gets data usage of whole Wi-Fi networks, but should get
// specified one.
final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(mNetworkId);
final DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
template);
mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(template));
mPreference.setWifiMode(/* isWifiMode */ true, /* usagePeriod */
info.period, /* isSingleWifi */ true);
mPreference.setChartEnabled(true);
// Treats Wi-Fi network as unlimited network, which has same usage level and limited level.
mPreference.setUsageNumbers(info.usageLevel, info.usageLevel, /* hasMobileData */ false);
// TODO(b/126142293): Passpoint Wi-Fi should have limit of data usage and time remaining
mPreference.setProgress(100);
mPreference.setLabels(Formatter.formatFileSize(mContext, /* sizeBytes */ 0),
DataUsageUtils.formatDataUsage(mContext, info.usageLevel));
}
}

View File

@@ -67,6 +67,7 @@ import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
import com.android.settings.widget.SwitchBarController;
import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.search.SearchIndexable;
@@ -968,8 +969,13 @@ public class WifiSettings extends RestrictedSettingsFragment
}
private void launchNetworkDetailsFragment(ConnectedAccessPointPreference pref) {
final AccessPoint accessPoint = pref.getAccessPoint();
final Context context = getContext();
final CharSequence title = SavedAccessPointsWifiSettings.usingDetailsFragment(context) ?
accessPoint.getTitle() : context.getText(R.string.pref_title_network_details);
new SubSettingLauncher(getContext())
.setTitleRes(R.string.pref_title_network_details)
.setTitleText(title)
.setDestination(WifiNetworkDetailsFragment.class.getName())
.setArguments(pref.getExtras())
.setSourceMetricsCategory(getMetricsCategory())

View File

@@ -42,6 +42,7 @@ import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.widget.ImageView;
import android.widget.Toast;
@@ -51,12 +52,14 @@ import androidx.core.text.BidiFormatter;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.FeatureFlags;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.datausage.WifiDataUsageSummaryPreferenceController;
import com.android.settings.development.featureflags.FeatureFlagPersistent;
import com.android.settings.widget.EntityHeaderController;
import com.android.settings.wifi.WifiDialog;
@@ -150,6 +153,9 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
private Preference mDnsPref;
private PreferenceCategory mIpv6Category;
private Preference mIpv6AddressPref;
private Lifecycle mLifecycle;
Preference mDataUsageSummaryPref;
WifiDataUsageSummaryPreferenceController mSummaryHeaderController;
private final IconInjector mIconInjector;
private final IntentFilter mFilter;
@@ -262,6 +268,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
mLifecycle = lifecycle;
lifecycle.addObserver(this);
}
@@ -313,6 +320,17 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
private void setupEntityHeader(PreferenceScreen screen) {
LayoutPreference headerPref = screen.findPreference(KEY_HEADER);
if (usingDataUsageHeader(mContext)) {
headerPref.setVisible(false);
mDataUsageSummaryPref = screen.findPreference("status_header");
mDataUsageSummaryPref.setVisible(true);
mSummaryHeaderController =
new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(),
mLifecycle, (PreferenceFragmentCompat) mFragment, mAccessPoint.getSsid());
return;
}
mEntityHeaderController =
EntityHeaderController.newInstance(
mFragment.getActivity(), mFragment,
@@ -326,6 +344,15 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
mEntityHeaderController.setLabel(mAccessPoint.getTitle());
}
private void refreshEntityHeader() {
if (usingDataUsageHeader(mContext)) {
mSummaryHeaderController.updateState(mDataUsageSummaryPref);
} else {
mEntityHeaderController.setSummary(mAccessPoint.getSettingsSummary())
.done(mFragment.getActivity(), true /* rebind */);
}
}
@Override
public void onResume() {
// Ensure mNetwork is set before any callbacks above are delivered, since our
@@ -360,9 +387,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
// MAC Address Pref
mMacAddressPref.setSummary(mWifiConfig.getRandomizedMacAddress().toString());
// TODO(b/124700353): Change header to data usage chart
mEntityHeaderController.setSummary(mAccessPoint.getSettingsSummary())
.done(mFragment.getActivity(), true /* rebind */);
refreshEntityHeader();
updateIpLayerInfo();
@@ -429,8 +454,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
private void refreshNetworkState() {
mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
mEntityHeaderController.setSummary(mAccessPoint.getSettingsSummary())
.done(mFragment.getActivity(), true /* rebind */);
refreshEntityHeader();
}
private void refreshRssiViews() {
@@ -443,7 +467,10 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
wifiIcon.setTintList(Utils.getColorAccent(mContext));
mEntityHeaderController.setIcon(wifiIcon).done(mFragment.getActivity(), true /* rebind */);
if (mEntityHeaderController != null) {
mEntityHeaderController.setIcon(wifiIcon).done(mFragment.getActivity(),
true /* rebind */);
}
Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate();
wifiIconDark.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorControlNormal));
@@ -670,4 +697,8 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
return mContext.getDrawable(Utils.getWifiIconResource(level)).mutate();
}
}
private boolean usingDataUsageHeader(Context context) {
return FeatureFlagUtils.isEnabled(context, FeatureFlags.WIFI_DETAILS_DATAUSAGE_HEADER);
}
}

View File

@@ -153,11 +153,11 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
controllers.add(mWifiDetailPreferenceController);
controllers.add(new WifiMeteredPreferenceController(context, mAccessPoint.getConfig()));
WifiPrivacyPreferenceController preferenceController = new WifiPrivacyPreferenceController(
WifiPrivacyPreferenceController privacyController = new WifiPrivacyPreferenceController(
context);
preferenceController.setWifiConfiguration(mAccessPoint.getConfig());
preferenceController.setIsEphemeral(mAccessPoint.isEphemeral());
controllers.add(preferenceController);
privacyController.setWifiConfiguration(mAccessPoint.getConfig());
privacyController.setIsEphemeral(mAccessPoint.isEphemeral());
controllers.add(privacyController);
return controllers;
}

View File

@@ -199,11 +199,7 @@ public class SavedAccessPointsWifiSettings extends DashboardFragment
* Checks if showing WifiNetworkDetailsFragment when clicking saved network item.
*/
public static boolean usingDetailsFragment(Context context) {
if (FeatureFlagUtils.isEnabled(context, FeatureFlags.MOBILE_NETWORK_V2)
&& FeatureFlagPersistent.isEnabled(context, FeatureFlags.NETWORK_INTERNET_V2)) {
return false; // TODO(b/124695272): mark true when UI is ready.
}
return false;
return FeatureFlagUtils.isEnabled(context, FeatureFlags.WIFI_DETAILS_SAVED_SCREEN);
}
boolean isSubscriptionsFeatureEnabled() {

View File

@@ -6,6 +6,7 @@ com.android.settings.applications.appinfo.InstantAppButtonsPreferenceController
com.android.settings.bluetooth.BluetoothDeviceNamePreferenceController
com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController
com.android.settings.datausage.DataUsageSummaryPreferenceController
com.android.settings.datausage.WifiDataUsageSummaryPreferenceController
com.android.settings.fuelgauge.RestrictAppPreferenceController
com.android.settings.fuelgauge.batterysaver.BatterySaverButtonPreferenceController
com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController

View File

@@ -164,7 +164,8 @@ public class DataUsageSummaryPreferenceControllerTest {
verify(mSummaryPreference).setUsageInfo(info.cycleEnd, now - UPDATE_BACKOFF_MS,
CARRIER_NAME, 1 /* numPlans */, intent);
verify(mSummaryPreference).setChartEnabled(true);
verify(mSummaryPreference).setWifiMode(false, null);
verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
false /* isSingleWifi */);
}
@Test
@@ -188,7 +189,8 @@ public class DataUsageSummaryPreferenceControllerTest {
verify(mSummaryPreference).setUsageInfo(info.cycleEnd, now - UPDATE_BACKOFF_MS,
CARRIER_NAME, 0 /* numPlans */, intent);
verify(mSummaryPreference).setChartEnabled(true);
verify(mSummaryPreference).setWifiMode(false, null);
verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
false /* isSingleWifi */);
}
@Test
@@ -214,7 +216,8 @@ public class DataUsageSummaryPreferenceControllerTest {
0 /* numPlans */,
null /* launchIntent */);
verify(mSummaryPreference).setChartEnabled(true);
verify(mSummaryPreference).setWifiMode(false, null);
verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
false /* isSingleWifi */);
}
@Test
@@ -240,7 +243,8 @@ public class DataUsageSummaryPreferenceControllerTest {
0 /* numPlans */,
null /* launchIntent */);
verify(mSummaryPreference).setChartEnabled(false);
verify(mSummaryPreference).setWifiMode(false, null);
verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
false /* isSingleWifi */);
}
@Test
@@ -321,7 +325,8 @@ public class DataUsageSummaryPreferenceControllerTest {
verify(mSummaryPreference).setLimitInfo(captor.capture());
CharSequence value = captor.getValue();
assertThat(value.toString()).isEqualTo("1.00 MB data warning / 1.00 MB data limit");
verify(mSummaryPreference).setWifiMode(false, null);
verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
false /* isSingleWifi */);
}
@Test
@@ -340,7 +345,8 @@ public class DataUsageSummaryPreferenceControllerTest {
when(mTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_ABSENT);
mController.updateState(mSummaryPreference);
verify(mSummaryPreference).setWifiMode(true, info.period);
verify(mSummaryPreference).setWifiMode(true /* isWifiMode */, info.period /* usagePeriod */,
false /* isSingleWifi */);
verify(mSummaryPreference).setLimitInfo(null);
verify(mSummaryPreference).setUsageNumbers(info.usageLevel, -1L, true);
verify(mSummaryPreference).setChartEnabled(false);

View File

@@ -488,7 +488,7 @@ public class DataUsageSummaryPreferenceTest {
new Intent());
mSummaryPreference.setUsageNumbers(1000000L, -1L, true);
final String cycleText = "The quick fox";
mSummaryPreference.setWifiMode(true, cycleText);
mSummaryPreference.setWifiMode(true /* isWifiMode */, cycleText, false /* isSingleWifi */);
doReturn(200L).when(mSummaryPreference).getHistoricalUsageLevel();
bindViewHolder();
@@ -524,7 +524,8 @@ public class DataUsageSummaryPreferenceTest {
@Test
public void testSetWifiMode_noUsageInfo_shouldDisableLaunchButton() {
mSummaryPreference = spy(mSummaryPreference);
mSummaryPreference.setWifiMode(true, "Test cycle text");
mSummaryPreference.setWifiMode(true /* isWifiMode */, "Test cycle text",
false /* isSingleWifi */);
doReturn(0L).when(mSummaryPreference).getHistoricalUsageLevel();
bindViewHolder();

View File

@@ -778,9 +778,9 @@ public class WifiDetailPreferenceControllerTest {
mockWifiConfig.networkId = 5;
when(mockWifiConfig.isPasspoint()).thenReturn(true);
spyController.displayPreference(mockScreen);
FeatureFlagPersistent.setEnabled(mContext, FeatureFlags.NETWORK_INTERNET_V2, true);
spyController.displayPreference(mockScreen);
mForgetClickListener.getValue().onClick(null);
verify(mockWifiManager, times(0)).removePasspointConfiguration(mockWifiConfig.FQDN);