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.os.Bundle;
24 import android.provider.SearchIndexableResource;
25 import android.util.Log;
26 
27 import androidx.appcompat.app.AlertDialog;
28 import androidx.fragment.app.Fragment;
29 
30 import com.android.settings.R;
31 import com.android.settings.Utils;
32 import com.android.settings.dashboard.DashboardFragment;
33 import com.android.settings.network.MobilePlanPreferenceController.MobilePlanPreferenceHost;
34 import com.android.settings.search.BaseSearchIndexProvider;
35 import com.android.settings.wifi.WifiPrimarySwitchPreferenceController;
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         return R.xml.network_provider_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         getSettingsLifecycle().addObserver(use(AllInOneTetherPreferenceController.class));
72     }
73 
74     @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)75     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
76         super.onCreatePreferences(savedInstanceState, rootKey);
77         use(AllInOneTetherPreferenceController.class).initEnabler(getSettingsLifecycle());
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 InternetPreferenceController internetPreferenceController =
97                 new InternetPreferenceController(context, lifecycle);
98 
99         final VpnPreferenceController vpnPreferenceController =
100                 new VpnPreferenceController(context);
101         final PrivateDnsPreferenceController privateDnsPreferenceController =
102                 new PrivateDnsPreferenceController(context);
103 
104         if (lifecycle != null) {
105             lifecycle.addObserver(mobilePlanPreferenceController);
106             lifecycle.addObserver(vpnPreferenceController);
107             lifecycle.addObserver(privateDnsPreferenceController);
108         }
109 
110         final List<AbstractPreferenceController> controllers = new ArrayList<>();
111 
112         controllers.add(new MobileNetworkSummaryController(context, lifecycle));
113         controllers.add(new TetherPreferenceController(context, lifecycle));
114         controllers.add(vpnPreferenceController);
115         controllers.add(new ProxyPreferenceController(context));
116         controllers.add(mobilePlanPreferenceController);
117         if (internetPreferenceController != null) {
118             controllers.add(internetPreferenceController);
119         }
120         controllers.add(privateDnsPreferenceController);
121         controllers.add(new NetworkProviderCallsSmsController(context, lifecycle));
122         return controllers;
123     }
124 
125     @Override
showMobilePlanMessageDialog()126     public void showMobilePlanMessageDialog() {
127         showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID);
128     }
129 
130     @Override
onCreateDialog(int dialogId)131     public Dialog onCreateDialog(int dialogId) {
132         Log.d(TAG, "onCreateDialog: dialogId=" + dialogId);
133         switch (dialogId) {
134             case MANAGE_MOBILE_PLAN_DIALOG_ID:
135                 final MobilePlanPreferenceController controller =
136                         use(MobilePlanPreferenceController.class);
137                 return new AlertDialog.Builder(getActivity())
138                         .setMessage(controller.getMobilePlanDialogMessage())
139                         .setCancelable(false)
140                         .setPositiveButton(com.android.internal.R.string.ok,
141                                 (dialog, id) -> controller.setMobilePlanDialogMessage(null))
142                         .create();
143         }
144         return super.onCreateDialog(dialogId);
145     }
146 
147     @Override
getDialogMetricsCategory(int dialogId)148     public int getDialogMetricsCategory(int dialogId) {
149         if (MANAGE_MOBILE_PLAN_DIALOG_ID == dialogId) {
150             return SettingsEnums.DIALOG_MANAGE_MOBILE_PLAN;
151         }
152         return 0;
153     }
154 
155     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
156             new BaseSearchIndexProvider(R.xml.network_provider_internet) {
157                 @Override
158                 public List<AbstractPreferenceController> createPreferenceControllers(Context
159                         context) {
160                     return buildPreferenceControllers(context, null /* lifecycle */,
161                             null /* metricsFeatureProvider */, null /* fragment */,
162                             null /* mobilePlanHost */);
163                 }
164             };
165 }
166