• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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 
17 package com.android.settings.wifi;
18 
19 import android.app.Dialog;
20 import android.app.settings.SettingsEnums;
21 import android.content.Context;
22 import android.content.DialogInterface;
23 import android.content.Intent;
24 import android.net.wifi.WifiManager;
25 import android.os.Bundle;
26 import android.os.UserManager;
27 import android.text.TextUtils;
28 import android.util.EventLog;
29 import android.util.Log;
30 import android.view.WindowManager;
31 
32 import androidx.annotation.VisibleForTesting;
33 import androidx.appcompat.app.AlertDialog;
34 import androidx.fragment.app.DialogFragment;
35 import androidx.fragment.app.FragmentActivity;
36 
37 import com.android.settings.R;
38 import com.android.settings.Utils;
39 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
40 import com.android.settingslib.wifi.WifiPermissionChecker;
41 
42 /**
43  * This activity requests users permission to allow scanning even when Wi-Fi is turned off
44  */
45 public class WifiScanModeActivity extends FragmentActivity {
46     private static final String TAG = "WifiScanModeActivity";
47     private DialogFragment mDialog;
48     @VisibleForTesting
49     String mApp;
50     @VisibleForTesting
51     WifiPermissionChecker mWifiPermissionChecker;
52 
53     @Override
onCreate(Bundle savedInstanceState)54     protected void onCreate(Bundle savedInstanceState) {
55         super.onCreate(savedInstanceState);
56         getWindow().addSystemFlags(
57                 WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
58         Intent intent = getIntent();
59         if (savedInstanceState == null) {
60             if (intent != null && WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
61                     .equals(intent.getAction())) {
62                 refreshAppLabel();
63             } else {
64                 finish();
65                 return;
66             }
67         } else {
68             mApp = savedInstanceState.getString("app");
69         }
70         createDialog();
71     }
72 
73     @VisibleForTesting
refreshAppLabel()74     void refreshAppLabel() {
75         if (mWifiPermissionChecker == null) {
76             mWifiPermissionChecker = new WifiPermissionChecker(this);
77         }
78         String packageName = mWifiPermissionChecker.getLaunchedPackage();
79         if (TextUtils.isEmpty(packageName)) {
80             mApp = null;
81             return;
82         }
83         mApp = Utils.getApplicationLabel(getApplicationContext(), packageName).toString();
84     }
85 
86     @VisibleForTesting
createDialog()87     void createDialog() {
88         if (isGuestUser(getApplicationContext())) {
89             Log.e(TAG, "Guest user is not allowed to configure Wi-Fi Scan Mode!");
90             EventLog.writeEvent(0x534e4554, "235601169", -1 /* UID */, "User is a guest");
91             finish();
92             return;
93         }
94 
95         if (mDialog == null) {
96             mDialog = AlertDialogFragment.newInstance(mApp);
97             mDialog.show(getSupportFragmentManager(), "dialog");
98         }
99     }
100 
dismissDialog()101     private void dismissDialog() {
102         if (mDialog != null) {
103             mDialog.dismiss();
104             mDialog = null;
105         }
106     }
107 
doPositiveClick()108     private void doPositiveClick() {
109         getApplicationContext().getSystemService(WifiManager.class).setScanAlwaysAvailable(true);
110         setResult(RESULT_OK);
111         finish();
112     }
113 
doNegativeClick()114     private void doNegativeClick() {
115         setResult(RESULT_CANCELED);
116         finish();
117     }
118 
119     @Override
onSaveInstanceState(Bundle outState)120     public void onSaveInstanceState(Bundle outState) {
121         super.onSaveInstanceState(outState);
122         outState.putString("app", mApp);
123     }
124 
125     @Override
onPause()126     public void onPause() {
127         super.onPause();
128         dismissDialog();
129     }
130 
onResume()131     public void onResume() {
132         super.onResume();
133         createDialog();
134     }
135 
136     public static class AlertDialogFragment extends InstrumentedDialogFragment {
newInstance(String app)137         static AlertDialogFragment newInstance(String app) {
138             AlertDialogFragment frag = new AlertDialogFragment(app);
139             return frag;
140         }
141 
142         private final String mApp;
AlertDialogFragment(String app)143         public AlertDialogFragment(String app) {
144             super();
145             mApp = app;
146         }
147 
AlertDialogFragment()148         public AlertDialogFragment() {
149             super();
150             mApp = null;
151         }
152 
153         @Override
getMetricsCategory()154         public int getMetricsCategory() {
155             return SettingsEnums.DIALOG_WIFI_SCAN_MODE;
156         }
157 
158         @Override
onCreateDialog(Bundle savedInstanceState)159         public Dialog onCreateDialog(Bundle savedInstanceState) {
160             return new AlertDialog.Builder(getActivity())
161                     .setMessage(TextUtils.isEmpty(mApp) ?
162                         getString(R.string.wifi_scan_always_turn_on_message_unknown) :
163                         getString(R.string.wifi_scan_always_turnon_message, mApp))
164                     .setPositiveButton(R.string.wifi_scan_always_confirm_allow,
165                             new DialogInterface.OnClickListener() {
166                                 public void onClick(DialogInterface dialog, int whichButton) {
167                                     ((WifiScanModeActivity) getActivity()).doPositiveClick();
168                                 }
169                             }
170                     )
171                     .setNegativeButton(R.string.wifi_scan_always_confirm_deny,
172                             new DialogInterface.OnClickListener() {
173                                 public void onClick(DialogInterface dialog, int whichButton) {
174                                     ((WifiScanModeActivity) getActivity()).doNegativeClick();
175                                 }
176                             }
177                     )
178                     .create();
179         }
180         @Override
onCancel(DialogInterface dialog)181         public void onCancel(DialogInterface dialog) {
182             ((WifiScanModeActivity) getActivity()).doNegativeClick();
183         }
184     }
185 
186     private static boolean isGuestUser(Context context) {
187         if (context == null) return false;
188         final UserManager userManager = context.getSystemService(UserManager.class);
189         if (userManager == null) return false;
190         return userManager.isGuestUser();
191     }
192 }
193