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.MANAGE_MOBILE_PLAN_DIALOG_ID; 19 20 import android.app.Dialog; 21 import android.app.settings.SettingsEnums; 22 import android.content.Context; 23 import android.content.Intent; 24 import android.os.Bundle; 25 import android.provider.SearchIndexableResource; 26 import android.util.Log; 27 28 import androidx.appcompat.app.AlertDialog; 29 import androidx.fragment.app.Fragment; 30 import androidx.lifecycle.LifecycleOwner; 31 32 import com.android.settings.R; 33 import com.android.settings.SettingsDumpService; 34 import com.android.settings.Utils; 35 import com.android.settings.core.OnActivityResultListener; 36 import com.android.settings.dashboard.DashboardFragment; 37 import com.android.settings.network.MobilePlanPreferenceController.MobilePlanPreferenceHost; 38 import com.android.settings.search.BaseSearchIndexProvider; 39 import com.android.settings.wifi.WifiPrimarySwitchPreferenceController; 40 import com.android.settingslib.core.AbstractPreferenceController; 41 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 42 import com.android.settingslib.core.lifecycle.Lifecycle; 43 import com.android.settingslib.search.SearchIndexable; 44 45 import java.util.ArrayList; 46 import java.util.Arrays; 47 import java.util.List; 48 49 @SearchIndexable 50 public class NetworkDashboardFragment extends DashboardFragment implements 51 MobilePlanPreferenceHost, OnActivityResultListener { 52 53 private static final String TAG = "NetworkDashboardFrag"; 54 55 @Override getMetricsCategory()56 public int getMetricsCategory() { 57 return SettingsEnums.SETTINGS_NETWORK_CATEGORY; 58 } 59 60 @Override getLogTag()61 protected String getLogTag() { 62 return TAG; 63 } 64 65 @Override getPreferenceScreenResId()66 protected int getPreferenceScreenResId() { 67 return R.xml.network_provider_internet; 68 } 69 70 @Override onAttach(Context context)71 public void onAttach(Context context) { 72 super.onAttach(context); 73 74 use(AirplaneModePreferenceController.class).setFragment(this); 75 getSettingsLifecycle().addObserver(use(AllInOneTetherPreferenceController.class)); 76 } 77 78 @Override onCreatePreferences(Bundle savedInstanceState, String rootKey)79 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 80 super.onCreatePreferences(savedInstanceState, rootKey); 81 use(AllInOneTetherPreferenceController.class).initEnabler(getSettingsLifecycle()); 82 } 83 84 @Override getHelpResource()85 public int getHelpResource() { 86 return R.string.help_url_network_dashboard; 87 } 88 89 @Override createPreferenceControllers(Context context)90 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 91 return buildPreferenceControllers(context, getSettingsLifecycle(), mMetricsFeatureProvider, 92 this /* fragment */, this /* mobilePlanHost */, this /* LifecycleOwner */); 93 } 94 buildPreferenceControllers(Context context, Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, MobilePlanPreferenceHost mobilePlanHost, LifecycleOwner lifecycleOwner)95 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, 96 Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, 97 MobilePlanPreferenceHost mobilePlanHost, LifecycleOwner lifecycleOwner) { 98 final MobilePlanPreferenceController mobilePlanPreferenceController = 99 new MobilePlanPreferenceController(context, mobilePlanHost); 100 final InternetPreferenceController internetPreferenceController = 101 new InternetPreferenceController(context, lifecycle, lifecycleOwner); 102 103 final VpnPreferenceController vpnPreferenceController = 104 new VpnPreferenceController(context); 105 final PrivateDnsPreferenceController privateDnsPreferenceController = 106 new PrivateDnsPreferenceController(context); 107 108 if (lifecycle != null) { 109 lifecycle.addObserver(mobilePlanPreferenceController); 110 lifecycle.addObserver(vpnPreferenceController); 111 lifecycle.addObserver(privateDnsPreferenceController); 112 } 113 114 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 115 116 controllers.add(new MobileNetworkSummaryController(context, lifecycle, lifecycleOwner)); 117 controllers.add(new TetherPreferenceController(context, lifecycle)); 118 controllers.add(vpnPreferenceController); 119 controllers.add(new ProxyPreferenceController(context)); 120 controllers.add(mobilePlanPreferenceController); 121 if (internetPreferenceController != null) { 122 controllers.add(internetPreferenceController); 123 } 124 controllers.add(privateDnsPreferenceController); 125 controllers.add(new NetworkProviderCallsSmsController(context, lifecycle, lifecycleOwner)); 126 127 // Start SettingsDumpService after the MobileNetworkRepository is created. 128 Intent intent = new Intent(context, SettingsDumpService.class); 129 intent.putExtra(SettingsDumpService.EXTRA_KEY_SHOW_NETWORK_DUMP, true); 130 context.startService(intent); 131 return controllers; 132 } 133 134 @Override showMobilePlanMessageDialog()135 public void showMobilePlanMessageDialog() { 136 showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID); 137 } 138 139 @Override onCreateDialog(int dialogId)140 public Dialog onCreateDialog(int dialogId) { 141 Log.d(TAG, "onCreateDialog: dialogId=" + dialogId); 142 switch (dialogId) { 143 case MANAGE_MOBILE_PLAN_DIALOG_ID: 144 final MobilePlanPreferenceController controller = 145 use(MobilePlanPreferenceController.class); 146 return new AlertDialog.Builder(getActivity()) 147 .setMessage(controller.getMobilePlanDialogMessage()) 148 .setCancelable(false) 149 .setPositiveButton(com.android.internal.R.string.ok, 150 (dialog, id) -> controller.setMobilePlanDialogMessage(null)) 151 .create(); 152 } 153 return super.onCreateDialog(dialogId); 154 } 155 156 @Override getDialogMetricsCategory(int dialogId)157 public int getDialogMetricsCategory(int dialogId) { 158 if (MANAGE_MOBILE_PLAN_DIALOG_ID == dialogId) { 159 return SettingsEnums.DIALOG_MANAGE_MOBILE_PLAN; 160 } 161 return 0; 162 } 163 onActivityResult(int requestCode, int resultCode, Intent data)164 public void onActivityResult(int requestCode, int resultCode, Intent data) { 165 super.onActivityResult(requestCode, resultCode, data); 166 167 switch (requestCode) { 168 case AirplaneModePreferenceController.REQUEST_CODE_EXIT_ECM: 169 use(AirplaneModePreferenceController.class) 170 .onActivityResult(requestCode, resultCode, data); 171 break; 172 } 173 } 174 175 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 176 new BaseSearchIndexProvider(R.xml.network_provider_internet) { 177 @Override 178 public List<AbstractPreferenceController> createPreferenceControllers(Context 179 context) { 180 return buildPreferenceControllers(context, null /* lifecycle */, 181 null /* metricsFeatureProvider */, null /* fragment */, 182 null /* mobilePlanHost */, null /* LifecycleOwner */); 183 } 184 }; 185 } 186