1 /* 2 * Copyright (C) 2019 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.car.developeroptions.network; 17 18 import static com.android.car.developeroptions.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.provider.SearchIndexableResource; 24 import android.util.Log; 25 26 import androidx.appcompat.app.AlertDialog; 27 import androidx.fragment.app.Fragment; 28 29 import com.android.car.developeroptions.R; 30 import com.android.car.developeroptions.core.FeatureFlags; 31 import com.android.car.developeroptions.dashboard.DashboardFragment; 32 import com.android.car.developeroptions.development.featureflags.FeatureFlagPersistent; 33 import com.android.car.developeroptions.network.MobilePlanPreferenceController.MobilePlanPreferenceHost; 34 import com.android.car.developeroptions.search.BaseSearchIndexProvider; 35 import com.android.car.developeroptions.wifi.WifiMasterSwitchPreferenceController; 36 import com.android.settingslib.core.AbstractPreferenceController; 37 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 38 import com.android.settingslib.core.lifecycle.Lifecycle; 39 import com.android.settingslib.search.SearchIndexable; 40 41 import java.util.ArrayList; 42 import java.util.Arrays; 43 import java.util.List; 44 45 @SearchIndexable 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 SettingsEnums.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 if (FeatureFlagPersistent.isEnabled(getContext(), FeatureFlags.NETWORK_INTERNET_V2)) { 64 return R.xml.network_and_internet_v2; 65 } else { 66 return R.xml.network_and_internet; 67 } 68 } 69 70 @Override onAttach(Context context)71 public void onAttach(Context context) { 72 super.onAttach(context); 73 74 if (FeatureFlagPersistent.isEnabled(context, FeatureFlags.NETWORK_INTERNET_V2)) { 75 use(MultiNetworkHeaderController.class).init(getSettingsLifecycle()); 76 } 77 use(AirplaneModePreferenceController.class).setFragment(this); 78 } 79 80 @Override getHelpResource()81 public int getHelpResource() { 82 return R.string.help_url_network_dashboard; 83 } 84 85 @Override createPreferenceControllers(Context context)86 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 87 return buildPreferenceControllers(context, getSettingsLifecycle(), mMetricsFeatureProvider, 88 this /* fragment */, this /* mobilePlanHost */); 89 } 90 buildPreferenceControllers(Context context, Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, MobilePlanPreferenceHost mobilePlanHost)91 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, 92 Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, 93 MobilePlanPreferenceHost mobilePlanHost) { 94 final MobilePlanPreferenceController mobilePlanPreferenceController = 95 new MobilePlanPreferenceController(context, mobilePlanHost); 96 final WifiMasterSwitchPreferenceController wifiPreferenceController = 97 new WifiMasterSwitchPreferenceController(context, metricsFeatureProvider); 98 MobileNetworkPreferenceController mobileNetworkPreferenceController = null; 99 if (!FeatureFlagPersistent.isEnabled(context, FeatureFlags.NETWORK_INTERNET_V2)) { 100 mobileNetworkPreferenceController = new MobileNetworkPreferenceController(context); 101 } 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(wifiPreferenceController); 111 if (mobileNetworkPreferenceController != null) { 112 lifecycle.addObserver(mobileNetworkPreferenceController); 113 } 114 lifecycle.addObserver(vpnPreferenceController); 115 lifecycle.addObserver(privateDnsPreferenceController); 116 } 117 118 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 119 120 if (FeatureFlagPersistent.isEnabled(context, FeatureFlags.NETWORK_INTERNET_V2)) { 121 controllers.add(new MobileNetworkSummaryController(context, lifecycle)); 122 } 123 if (mobileNetworkPreferenceController != null) { 124 controllers.add(mobileNetworkPreferenceController); 125 } 126 controllers.add(new TetherPreferenceController(context, lifecycle)); 127 controllers.add(vpnPreferenceController); 128 controllers.add(new ProxyPreferenceController(context)); 129 controllers.add(mobilePlanPreferenceController); 130 controllers.add(wifiPreferenceController); 131 controllers.add(privateDnsPreferenceController); 132 return controllers; 133 } 134 135 @Override showMobilePlanMessageDialog()136 public void showMobilePlanMessageDialog() { 137 showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID); 138 } 139 140 @Override onCreateDialog(int dialogId)141 public Dialog onCreateDialog(int dialogId) { 142 Log.d(TAG, "onCreateDialog: dialogId=" + dialogId); 143 switch (dialogId) { 144 case MANAGE_MOBILE_PLAN_DIALOG_ID: 145 final MobilePlanPreferenceController controller = 146 use(MobilePlanPreferenceController.class); 147 return new AlertDialog.Builder(getActivity()) 148 .setMessage(controller.getMobilePlanDialogMessage()) 149 .setCancelable(false) 150 .setPositiveButton(com.android.internal.R.string.ok, 151 (dialog, id) -> controller.setMobilePlanDialogMessage(null)) 152 .create(); 153 } 154 return super.onCreateDialog(dialogId); 155 } 156 157 @Override getDialogMetricsCategory(int dialogId)158 public int getDialogMetricsCategory(int dialogId) { 159 if (MANAGE_MOBILE_PLAN_DIALOG_ID == dialogId) { 160 return SettingsEnums.DIALOG_MANAGE_MOBILE_PLAN; 161 } 162 return 0; 163 } 164 165 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 166 new BaseSearchIndexProvider() { 167 @Override 168 public List<SearchIndexableResource> getXmlResourcesToIndex( 169 Context context, boolean enabled) { 170 final SearchIndexableResource sir = new SearchIndexableResource(context); 171 if (FeatureFlagPersistent.isEnabled(context, 172 FeatureFlags.NETWORK_INTERNET_V2)) { 173 sir.xmlResId = R.xml.network_and_internet_v2; 174 } else { 175 sir.xmlResId = R.xml.network_and_internet; 176 } 177 return Arrays.asList(sir); 178 } 179 180 @Override 181 public List<AbstractPreferenceController> createPreferenceControllers(Context 182 context) { 183 return buildPreferenceControllers(context, null /* lifecycle */, 184 null /* metricsFeatureProvider */, null /* fragment */, 185 null /* mobilePlanHost */); 186 } 187 188 @Override 189 public List<String> getNonIndexableKeys(Context context) { 190 List<String> keys = super.getNonIndexableKeys(context); 191 // Remove global switch as a result 192 keys.add(WifiMasterSwitchPreferenceController.KEY_TOGGLE_WIFI); 193 return keys; 194 } 195 }; 196 } 197