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.text.BidiFormatter; 29 import android.util.Log; 30 31 import com.android.internal.logging.nano.MetricsProto; 32 import com.android.settings.R; 33 import com.android.settings.dashboard.DashboardFragment; 34 import com.android.settings.dashboard.SummaryLoader; 35 import com.android.settings.network.MobilePlanPreferenceController.MobilePlanPreferenceHost; 36 import com.android.settings.search.BaseSearchIndexProvider; 37 import com.android.settings.wifi.WifiMasterSwitchPreferenceController; 38 import com.android.settingslib.core.AbstractPreferenceController; 39 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 40 import com.android.settingslib.core.lifecycle.Lifecycle; 41 42 import java.util.ArrayList; 43 import java.util.Arrays; 44 import java.util.List; 45 46 public class NetworkDashboardFragment extends DashboardFragment implements 47 MobilePlanPreferenceHost { 48 49 private static final String TAG = "NetworkDashboardFrag"; 50 51 @Override getMetricsCategory()52 public int getMetricsCategory() { 53 return MetricsProto.MetricsEvent.SETTINGS_NETWORK_CATEGORY; 54 } 55 56 @Override getLogTag()57 protected String getLogTag() { 58 return TAG; 59 } 60 61 @Override getPreferenceScreenResId()62 protected int getPreferenceScreenResId() { 63 return R.xml.network_and_internet; 64 } 65 66 @Override onAttach(Context context)67 public void onAttach(Context context) { 68 super.onAttach(context); 69 70 use(AirplaneModePreferenceController.class).setFragment(this); 71 } 72 73 @Override getHelpResource()74 public int getHelpResource() { 75 return R.string.help_url_network_dashboard; 76 } 77 78 @Override createPreferenceControllers(Context context)79 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 80 return buildPreferenceControllers(context, getLifecycle(), mMetricsFeatureProvider, this 81 /* fragment */, 82 this /* mobilePlanHost */); 83 } 84 buildPreferenceControllers(Context context, Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, MobilePlanPreferenceHost mobilePlanHost)85 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, 86 Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, 87 MobilePlanPreferenceHost mobilePlanHost) { 88 final MobilePlanPreferenceController mobilePlanPreferenceController = 89 new MobilePlanPreferenceController(context, mobilePlanHost); 90 final WifiMasterSwitchPreferenceController wifiPreferenceController = 91 new WifiMasterSwitchPreferenceController(context, metricsFeatureProvider); 92 final MobileNetworkPreferenceController mobileNetworkPreferenceController = 93 new MobileNetworkPreferenceController(context); 94 final VpnPreferenceController vpnPreferenceController = 95 new VpnPreferenceController(context); 96 final PrivateDnsPreferenceController privateDnsPreferenceController = 97 new PrivateDnsPreferenceController(context); 98 99 if (lifecycle != null) { 100 lifecycle.addObserver(mobilePlanPreferenceController); 101 lifecycle.addObserver(wifiPreferenceController); 102 lifecycle.addObserver(mobileNetworkPreferenceController); 103 lifecycle.addObserver(vpnPreferenceController); 104 lifecycle.addObserver(privateDnsPreferenceController); 105 } 106 107 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 108 controllers.add(mobileNetworkPreferenceController); 109 controllers.add(new TetherPreferenceController(context, lifecycle)); 110 controllers.add(vpnPreferenceController); 111 controllers.add(new ProxyPreferenceController(context)); 112 controllers.add(mobilePlanPreferenceController); 113 controllers.add(wifiPreferenceController); 114 controllers.add(privateDnsPreferenceController); 115 return controllers; 116 } 117 118 @Override showMobilePlanMessageDialog()119 public void showMobilePlanMessageDialog() { 120 showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID); 121 } 122 123 @Override onCreateDialog(int dialogId)124 public Dialog onCreateDialog(int dialogId) { 125 Log.d(TAG, "onCreateDialog: dialogId=" + dialogId); 126 switch (dialogId) { 127 case MANAGE_MOBILE_PLAN_DIALOG_ID: 128 final MobilePlanPreferenceController controller = 129 use(MobilePlanPreferenceController.class); 130 return new AlertDialog.Builder(getActivity()) 131 .setMessage(controller.getMobilePlanDialogMessage()) 132 .setCancelable(false) 133 .setPositiveButton(com.android.internal.R.string.ok, 134 (dialog, id) -> controller.setMobilePlanDialogMessage(null)) 135 .create(); 136 } 137 return super.onCreateDialog(dialogId); 138 } 139 140 @Override getDialogMetricsCategory(int dialogId)141 public int getDialogMetricsCategory(int dialogId) { 142 if (MANAGE_MOBILE_PLAN_DIALOG_ID == dialogId) { 143 return MetricsProto.MetricsEvent.DIALOG_MANAGE_MOBILE_PLAN; 144 } 145 return 0; 146 } 147 148 @VisibleForTesting 149 static class SummaryProvider implements SummaryLoader.SummaryProvider { 150 151 private final Context mContext; 152 private final SummaryLoader mSummaryLoader; 153 private final MobileNetworkPreferenceController mMobileNetworkPreferenceController; 154 private final TetherPreferenceController mTetherPreferenceController; 155 SummaryProvider(Context context, SummaryLoader summaryLoader)156 public SummaryProvider(Context context, SummaryLoader summaryLoader) { 157 this(context, summaryLoader, 158 new MobileNetworkPreferenceController(context), 159 new TetherPreferenceController(context, null /* lifecycle */)); 160 } 161 162 @VisibleForTesting(otherwise = VisibleForTesting.NONE) SummaryProvider(Context context, SummaryLoader summaryLoader, MobileNetworkPreferenceController mobileNetworkPreferenceController, TetherPreferenceController tetherPreferenceController)163 SummaryProvider(Context context, SummaryLoader summaryLoader, 164 MobileNetworkPreferenceController mobileNetworkPreferenceController, 165 TetherPreferenceController tetherPreferenceController) { 166 mContext = context; 167 mSummaryLoader = summaryLoader; 168 mMobileNetworkPreferenceController = mobileNetworkPreferenceController; 169 mTetherPreferenceController = tetherPreferenceController; 170 } 171 172 173 @Override setListening(boolean listening)174 public void setListening(boolean listening) { 175 if (listening) { 176 String summary = BidiFormatter.getInstance() 177 .unicodeWrap(mContext.getString(R.string.wifi_settings_title)); 178 if (mMobileNetworkPreferenceController.isAvailable()) { 179 final String mobileSettingSummary = mContext.getString( 180 R.string.network_dashboard_summary_mobile); 181 summary = mContext.getString(R.string.join_many_items_middle, summary, 182 mobileSettingSummary); 183 } 184 final String dataUsageSettingSummary = mContext.getString( 185 R.string.network_dashboard_summary_data_usage); 186 summary = mContext.getString(R.string.join_many_items_middle, summary, 187 dataUsageSettingSummary); 188 if (mTetherPreferenceController.isAvailable()) { 189 final String hotspotSettingSummary = mContext.getString( 190 R.string.network_dashboard_summary_hotspot); 191 summary = mContext.getString(R.string.join_many_items_middle, summary, 192 hotspotSettingSummary); 193 } 194 mSummaryLoader.setSummary(this, summary); 195 } 196 } 197 } 198 199 public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY 200 = new SummaryLoader.SummaryProviderFactory() { 201 @Override 202 public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity, 203 SummaryLoader summaryLoader) { 204 return new SummaryProvider(activity, summaryLoader); 205 } 206 }; 207 208 209 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 210 new BaseSearchIndexProvider() { 211 @Override 212 public List<SearchIndexableResource> getXmlResourcesToIndex( 213 Context context, boolean enabled) { 214 final SearchIndexableResource sir = new SearchIndexableResource(context); 215 sir.xmlResId = R.xml.network_and_internet; 216 return Arrays.asList(sir); 217 } 218 219 @Override 220 public List<AbstractPreferenceController> createPreferenceControllers(Context 221 context) { 222 return buildPreferenceControllers(context, null /* lifecycle */, 223 null /* metricsFeatureProvider */, null /* fragment */, 224 null /* mobilePlanHost */); 225 } 226 227 @Override 228 public List<String> getNonIndexableKeys(Context context) { 229 List<String> keys = super.getNonIndexableKeys(context); 230 // Remove master switch as a result 231 keys.add(WifiMasterSwitchPreferenceController.KEY_TOGGLE_WIFI); 232 return keys; 233 } 234 }; 235 } 236