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