From 137ff28d5eeae8e1cc9384f9bca40b3df8c1cf09 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Thu, 25 Jan 2018 10:55:59 -0800 Subject: [PATCH] Refactor the DataUsageBase 1. Create a new DataUsageBaseFragment extending from DashboadFragment 2. Mark DataUsageBase as obsolete 3. Make DataUsageSummary use DataUsageBaseFragment 4. Deprecated DataPlanUsageSummary since it has been used nowhere. Bug: 72497434 Test: robotest still pass Change-Id: Ic67a3c90649ae84086dc60b1457566be8727c54b --- .../datausage/DataPlanUsageSummary.java | 5 + .../settings/datausage/DataUsageBase.java | 4 + .../datausage/DataUsageBaseFragment.java | 130 ++++++++++++++++++ .../settings/datausage/DataUsageSummary.java | 25 +++- 4 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 src/com/android/settings/datausage/DataUsageBaseFragment.java diff --git a/src/com/android/settings/datausage/DataPlanUsageSummary.java b/src/com/android/settings/datausage/DataPlanUsageSummary.java index a56bfa1b9dd..94893229bf9 100644 --- a/src/com/android/settings/datausage/DataPlanUsageSummary.java +++ b/src/com/android/settings/datausage/DataPlanUsageSummary.java @@ -48,6 +48,11 @@ import com.android.settingslib.net.DataUsageController; import java.util.ArrayList; import java.util.List; +/** + * @deprecated This fragment was supposed to be new version of {@link DataUsageSummary} however + * unfinished and used nowhere. Keep it in case we may bring it back someday. + */ +@Deprecated public class DataPlanUsageSummary extends DataUsageBase { public static final String KEY_DATA_PLAN_USAGE = "data_plan_usage"; diff --git a/src/com/android/settings/datausage/DataUsageBase.java b/src/com/android/settings/datausage/DataUsageBase.java index f08d534cf8a..b889a2f5812 100644 --- a/src/com/android/settings/datausage/DataUsageBase.java +++ b/src/com/android/settings/datausage/DataUsageBase.java @@ -36,6 +36,10 @@ import android.util.Log; import com.android.settings.SettingsPreferenceFragment; import com.android.settingslib.NetworkPolicyEditor; +/** + * @deprecated please use {@link DataUsageBaseFragment} instead. + */ +@Deprecated public abstract class DataUsageBase extends SettingsPreferenceFragment { private static final String TAG = "DataUsageBase"; private static final String ETHERNET = "ethernet"; diff --git a/src/com/android/settings/datausage/DataUsageBaseFragment.java b/src/com/android/settings/datausage/DataUsageBaseFragment.java new file mode 100644 index 00000000000..344f2b88d7b --- /dev/null +++ b/src/com/android/settings/datausage/DataUsageBaseFragment.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2018 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 static android.net.ConnectivityManager.TYPE_ETHERNET; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.INetworkStatsService; +import android.net.INetworkStatsSession; +import android.net.NetworkPolicy; +import android.net.NetworkPolicyManager; +import android.net.NetworkTemplate; +import android.net.TrafficStats; +import android.os.Bundle; +import android.os.INetworkManagementService; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemProperties; +import android.os.UserManager; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.util.Log; + +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settingslib.NetworkPolicyEditor; + +public abstract class DataUsageBaseFragment extends DashboardFragment { + private static final String TAG = "DataUsageBase"; + private static final String ETHERNET = "ethernet"; + + protected final TemplatePreference.NetworkServices services = + new TemplatePreference.NetworkServices(); + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + final Context context = getActivity(); + + services.mNetworkService = INetworkManagementService.Stub.asInterface( + ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)); + services.mStatsService = INetworkStatsService.Stub.asInterface( + ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + services.mPolicyManager = NetworkPolicyManager.from(context); + + services.mPolicyEditor = new NetworkPolicyEditor(services.mPolicyManager); + + services.mTelephonyManager = TelephonyManager.from(context); + services.mSubscriptionManager = SubscriptionManager.from(context); + services.mUserManager = UserManager.get(context); + } + + @Override + public void onResume() { + super.onResume(); + services.mPolicyEditor.read(); + } + + protected boolean isAdmin() { + return services.mUserManager.isAdminUser(); + } + + protected boolean isMobileDataAvailable(int subId) { + return services.mSubscriptionManager.getActiveSubscriptionInfo(subId) != null; + } + + protected boolean isNetworkPolicyModifiable(NetworkPolicy policy, int subId) { + return policy != null && isBandwidthControlEnabled() && services.mUserManager.isAdminUser() + && isDataEnabled(subId); + } + + private boolean isDataEnabled(int subId) { + if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + return true; + } + return services.mTelephonyManager.getDataEnabled(subId); + } + + protected boolean isBandwidthControlEnabled() { + try { + return services.mNetworkService.isBandwidthControlEnabled(); + } catch (RemoteException e) { + Log.w(TAG, "problem talking with INetworkManagementService: ", e); + return false; + } + } + + /** + * Test if device has an ethernet network connection. + */ + public boolean hasEthernet(Context context) { + if (DataUsageUtils.TEST_RADIOS) { + return SystemProperties.get(DataUsageUtils.TEST_RADIOS_PROP).contains(ETHERNET); + } + + final ConnectivityManager conn = ConnectivityManager.from(context); + final boolean hasEthernet = conn.isNetworkSupported(TYPE_ETHERNET); + + final long ethernetBytes; + try { + INetworkStatsSession statsSession = services.mStatsService.openSession(); + if (statsSession != null) { + ethernetBytes = statsSession.getSummaryForNetwork( + NetworkTemplate.buildTemplateEthernet(), Long.MIN_VALUE, Long.MAX_VALUE) + .getTotalBytes(); + TrafficStats.closeQuietly(statsSession); + } else { + ethernetBytes = 0; + } + } catch (RemoteException e) { + throw new RuntimeException(e); + } + + // only show ethernet when both hardware present and traffic has occurred + return hasEthernet && ethernetBytes > 0; + } +} diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index e626c3a5594..b63cee3cdad 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -46,6 +46,7 @@ import com.android.settings.dashboard.SummaryLoader; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.NetworkPolicyEditor; +import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.net.DataUsageController; import java.util.ArrayList; @@ -53,11 +54,11 @@ import java.util.List; /** * Settings preference fragment that displays data usage summary. - * - * This class in deprecated use {@link DataPlanUsageSummary}. */ -@Deprecated -public class DataUsageSummary extends DataUsageBase implements Indexable, DataUsageEditController { +public class DataUsageSummary extends DataUsageBaseFragment implements Indexable, + DataUsageEditController { + + private static final String TAG = "DataUsageSummary"; static final boolean LOGD = false; @@ -100,7 +101,6 @@ public class DataUsageSummary extends DataUsageBase implements Indexable, DataUs boolean hasMobileData = DataUsageUtils.hasMobileData(context); mDataUsageController = new DataUsageController(context); mDataInfoController = new DataUsageInfoController(); - addPreferencesFromResource(R.xml.data_usage); int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context); if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { @@ -177,6 +177,21 @@ public class DataUsageSummary extends DataUsageBase implements Indexable, DataUs return super.onPreferenceTreeClick(preference); } + @Override + protected int getPreferenceScreenResId() { + return R.xml.data_usage; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected List getPreferenceControllers(Context context) { + return null; + } + private void addMobileSection(int subId) { addMobileSection(subId, null); }