1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.settings.network; 17 18 import static com.android.settings.network.MobilePlanPreferenceController 19 .MANAGE_MOBILE_PLAN_DIALOG_ID; 20 21 import android.app.Activity; 22 import android.app.AlertDialog; 23 import android.app.Dialog; 24 import android.app.Fragment; 25 import android.content.Context; 26 import android.provider.SearchIndexableResource; 27 import android.support.annotation.VisibleForTesting; 28 import android.util.Log; 29 import android.view.Menu; 30 import android.view.MenuInflater; 31 32 import com.android.internal.logging.nano.MetricsProto; 33 import com.android.settings.R; 34 import com.android.settings.core.instrumentation.MetricsFeatureProvider; 35 import com.android.settings.dashboard.DashboardFragment; 36 import com.android.settings.dashboard.SummaryLoader; 37 import com.android.settings.network.MobilePlanPreferenceController.MobilePlanPreferenceHost; 38 import com.android.settings.search.BaseSearchIndexProvider; 39 import com.android.settings.wifi.WifiMasterSwitchPreferenceController; 40 import com.android.settingslib.core.AbstractPreferenceController; 41 import com.android.settingslib.core.lifecycle.Lifecycle; 42 43 import java.util.ArrayList; 44 import java.util.Arrays; 45 import java.util.List; 46 47 public class NetworkDashboardFragment extends DashboardFragment implements 48 MobilePlanPreferenceHost { 49 50 private static final String TAG = "NetworkDashboardFrag"; 51 52 private NetworkResetActionMenuController mNetworkResetController; 53 54 @Override getMetricsCategory()55 public int getMetricsCategory() { 56 return MetricsProto.MetricsEvent.SETTINGS_NETWORK_CATEGORY; 57 } 58 59 @Override getLogTag()60 protected String getLogTag() { 61 return TAG; 62 } 63 64 @Override getPreferenceScreenResId()65 protected int getPreferenceScreenResId() { 66 return R.xml.network_and_internet; 67 } 68 69 @Override onAttach(Context context)70 public void onAttach(Context context) { 71 super.onAttach(context); 72 mNetworkResetController = new NetworkResetActionMenuController(context); 73 } 74 75 @Override getHelpResource()76 protected int getHelpResource() { 77 return R.string.help_url_network_dashboard; 78 } 79 80 @Override onCreateOptionsMenu(Menu menu, MenuInflater inflater)81 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 82 super.onCreateOptionsMenu(menu, inflater); 83 mNetworkResetController.buildMenuItem(menu); 84 } 85 86 @Override getPreferenceControllers(Context context)87 protected List<AbstractPreferenceController> getPreferenceControllers(Context context) { 88 return buildPreferenceControllers(context, getLifecycle(), mMetricsFeatureProvider, this 89 /* fragment */, 90 this /* mobilePlanHost */); 91 } 92 buildPreferenceControllers(Context context, Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, MobilePlanPreferenceHost mobilePlanHost)93 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, 94 Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, 95 MobilePlanPreferenceHost mobilePlanHost) { 96 final AirplaneModePreferenceController airplaneModePreferenceController = 97 new AirplaneModePreferenceController(context, fragment); 98 final MobilePlanPreferenceController mobilePlanPreferenceController = 99 new MobilePlanPreferenceController(context, mobilePlanHost); 100 final WifiMasterSwitchPreferenceController wifiPreferenceController = 101 new WifiMasterSwitchPreferenceController(context, metricsFeatureProvider); 102 final MobileNetworkPreferenceController mobileNetworkPreferenceController = 103 new MobileNetworkPreferenceController(context); 104 final VpnPreferenceController vpnPreferenceController = 105 new VpnPreferenceController(context); 106 107 if (lifecycle != null) { 108 lifecycle.addObserver(airplaneModePreferenceController); 109 lifecycle.addObserver(mobilePlanPreferenceController); 110 lifecycle.addObserver(wifiPreferenceController); 111 lifecycle.addObserver(mobileNetworkPreferenceController); 112 lifecycle.addObserver(vpnPreferenceController); 113 } 114 115 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 116 controllers.add(airplaneModePreferenceController); 117 controllers.add(mobileNetworkPreferenceController); 118 controllers.add(new TetherPreferenceController(context, lifecycle)); 119 controllers.add(vpnPreferenceController); 120 controllers.add(new ProxyPreferenceController(context)); 121 controllers.add(mobilePlanPreferenceController); 122 controllers.add(wifiPreferenceController); 123 return controllers; 124 } 125 126 @Override showMobilePlanMessageDialog()127 public void showMobilePlanMessageDialog() { 128 showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID); 129 } 130 131 @Override onCreateDialog(int dialogId)132 public Dialog onCreateDialog(int dialogId) { 133 Log.d(TAG, "onCreateDialog: dialogId=" + dialogId); 134 switch (dialogId) { 135 case MANAGE_MOBILE_PLAN_DIALOG_ID: 136 final MobilePlanPreferenceController controller = 137 getPreferenceController(MobilePlanPreferenceController.class); 138 return new AlertDialog.Builder(getActivity()) 139 .setMessage(controller.getMobilePlanDialogMessage()) 140 .setCancelable(false) 141 .setPositiveButton(com.android.internal.R.string.ok, 142 (dialog, id) -> controller.setMobilePlanDialogMessage(null)) 143 .create(); 144 } 145 return super.onCreateDialog(dialogId); 146 } 147 148 @Override getDialogMetricsCategory(int dialogId)149 public int getDialogMetricsCategory(int dialogId) { 150 if (MANAGE_MOBILE_PLAN_DIALOG_ID == dialogId) { 151 return MetricsProto.MetricsEvent.DIALOG_MANAGE_MOBILE_PLAN; 152 } 153 return 0; 154 } 155 156 @VisibleForTesting 157 static class SummaryProvider implements SummaryLoader.SummaryProvider { 158 159 private final Context mContext; 160 private final SummaryLoader mSummaryLoader; 161 private final MobileNetworkPreferenceController mMobileNetworkPreferenceController; 162 private final TetherPreferenceController mTetherPreferenceController; 163 SummaryProvider(Context context, SummaryLoader summaryLoader)164 public SummaryProvider(Context context, SummaryLoader summaryLoader) { 165 this(context, summaryLoader, 166 new MobileNetworkPreferenceController(context), 167 new TetherPreferenceController(context, null /* lifecycle */)); 168 } 169 170 @VisibleForTesting(otherwise = VisibleForTesting.NONE) SummaryProvider(Context context, SummaryLoader summaryLoader, MobileNetworkPreferenceController mobileNetworkPreferenceController, TetherPreferenceController tetherPreferenceController)171 SummaryProvider(Context context, SummaryLoader summaryLoader, 172 MobileNetworkPreferenceController mobileNetworkPreferenceController, 173 TetherPreferenceController tetherPreferenceController) { 174 mContext = context; 175 mSummaryLoader = summaryLoader; 176 mMobileNetworkPreferenceController = mobileNetworkPreferenceController; 177 mTetherPreferenceController = tetherPreferenceController; 178 } 179 180 181 @Override setListening(boolean listening)182 public void setListening(boolean listening) { 183 if (listening) { 184 String summary = mContext.getString(R.string.wifi_settings_title); 185 if (mMobileNetworkPreferenceController.isAvailable()) { 186 final String mobileSettingSummary = mContext.getString( 187 R.string.network_dashboard_summary_mobile); 188 summary = mContext.getString(R.string.join_many_items_middle, summary, 189 mobileSettingSummary); 190 } 191 final String dataUsageSettingSummary = mContext.getString( 192 R.string.network_dashboard_summary_data_usage); 193 summary = mContext.getString(R.string.join_many_items_middle, summary, 194 dataUsageSettingSummary); 195 if (mTetherPreferenceController.isAvailable()) { 196 final String hotspotSettingSummary = mContext.getString( 197 R.string.network_dashboard_summary_hotspot); 198 summary = mContext.getString(R.string.join_many_items_middle, summary, 199 hotspotSettingSummary); 200 } 201 mSummaryLoader.setSummary(this, summary); 202 } 203 } 204 } 205 206 public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY 207 = new SummaryLoader.SummaryProviderFactory() { 208 @Override 209 public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity, 210 SummaryLoader summaryLoader) { 211 return new SummaryProvider(activity, summaryLoader); 212 } 213 }; 214 215 216 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 217 new BaseSearchIndexProvider() { 218 @Override 219 public List<SearchIndexableResource> getXmlResourcesToIndex( 220 Context context, boolean enabled) { 221 final SearchIndexableResource sir = new SearchIndexableResource(context); 222 sir.xmlResId = R.xml.network_and_internet; 223 return Arrays.asList(sir); 224 } 225 226 @Override 227 public List<AbstractPreferenceController> getPreferenceControllers(Context 228 context) { 229 return buildPreferenceControllers(context, null /* lifecycle */, 230 null /* metricsFeatureProvider */, null /* fragment */, 231 null /* mobilePlanHost */); 232 } 233 234 @Override 235 public List<String> getNonIndexableKeys(Context context) { 236 List<String> keys = super.getNonIndexableKeys(context); 237 // Remove master switch as a result 238 keys.add(WifiMasterSwitchPreferenceController.KEY_TOGGLE_WIFI); 239 return keys; 240 } 241 }; 242 } 243