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.DialogInterface;
22 import android.content.Intent;
23 import android.content.pm.ApplicationInfo;
24 import android.content.pm.PackageManager;
25 import android.net.wifi.WifiManager;
26 import android.os.Bundle;
27 import android.text.TextUtils;
28 import android.view.WindowManager;
29 
30 import androidx.appcompat.app.AlertDialog;
31 import androidx.fragment.app.DialogFragment;
32 import androidx.fragment.app.FragmentActivity;
33 
34 import com.android.settings.R;
35 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
36 
37 /**
38  * This activity requests users permission to allow scanning even when Wi-Fi is turned off
39  */
40 public class WifiScanModeActivity extends FragmentActivity {
41     private DialogFragment mDialog;
42     private String mApp;
43 
44     @Override
onCreate(Bundle savedInstanceState)45     protected void onCreate(Bundle savedInstanceState) {
46         super.onCreate(savedInstanceState);
47         getWindow().addSystemFlags(
48                 WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
49         Intent intent = getIntent();
50         if (savedInstanceState == null) {
51             if (intent != null && WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
52                     .equals(intent.getAction())) {
53                 ApplicationInfo ai;
54                 mApp = getCallingPackage();
55                 try {
56                     PackageManager pm = getPackageManager();
57                     ai = pm.getApplicationInfo(mApp, 0);
58                     mApp = (String)pm.getApplicationLabel(ai);
59                 } catch (PackageManager.NameNotFoundException e) { }
60             } else {
61                 finish();
62                 return;
63             }
64         } else {
65             mApp = savedInstanceState.getString("app");
66         }
67         createDialog();
68     }
69 
createDialog()70     private void createDialog() {
71         if (mDialog == null) {
72             mDialog = AlertDialogFragment.newInstance(mApp);
73             mDialog.show(getSupportFragmentManager(), "dialog");
74         }
75     }
76 
dismissDialog()77     private void dismissDialog() {
78         if (mDialog != null) {
79             mDialog.dismiss();
80             mDialog = null;
81         }
82     }
83 
doPositiveClick()84     private void doPositiveClick() {
85         getApplicationContext().getSystemService(WifiManager.class).setScanAlwaysAvailable(true);
86         setResult(RESULT_OK);
87         finish();
88     }
89 
doNegativeClick()90     private void doNegativeClick() {
91         setResult(RESULT_CANCELED);
92         finish();
93     }
94 
95     @Override
onSaveInstanceState(Bundle outState)96     public void onSaveInstanceState(Bundle outState) {
97         super.onSaveInstanceState(outState);
98         outState.putString("app", mApp);
99     }
100 
101     @Override
onPause()102     public void onPause() {
103         super.onPause();
104         dismissDialog();
105     }
106 
onResume()107     public void onResume() {
108         super.onResume();
109         createDialog();
110     }
111 
112     public static class AlertDialogFragment extends InstrumentedDialogFragment {
newInstance(String app)113         static AlertDialogFragment newInstance(String app) {
114             AlertDialogFragment frag = new AlertDialogFragment(app);
115             return frag;
116         }
117 
118         private final String mApp;
AlertDialogFragment(String app)119         public AlertDialogFragment(String app) {
120             super();
121             mApp = app;
122         }
123 
AlertDialogFragment()124         public AlertDialogFragment() {
125             super();
126             mApp = null;
127         }
128 
129         @Override
getMetricsCategory()130         public int getMetricsCategory() {
131             return SettingsEnums.DIALOG_WIFI_SCAN_MODE;
132         }
133 
134         @Override
onCreateDialog(Bundle savedInstanceState)135         public Dialog onCreateDialog(Bundle savedInstanceState) {
136             return new AlertDialog.Builder(getActivity())
137                     .setMessage(TextUtils.isEmpty(mApp) ?
138                         getString(R.string.wifi_scan_always_turn_on_message_unknown) :
139                         getString(R.string.wifi_scan_always_turnon_message, mApp))
140                     .setPositiveButton(R.string.wifi_scan_always_confirm_allow,
141                             new DialogInterface.OnClickListener() {
142                                 public void onClick(DialogInterface dialog, int whichButton) {
143                                     ((WifiScanModeActivity) getActivity()).doPositiveClick();
144                                 }
145                             }
146                     )
147                     .setNegativeButton(R.string.wifi_scan_always_confirm_deny,
148                             new DialogInterface.OnClickListener() {
149                                 public void onClick(DialogInterface dialog, int whichButton) {
150                                     ((WifiScanModeActivity) getActivity()).doNegativeClick();
151                                 }
152                             }
153                     )
154                     .create();
155         }
156         @Override
onCancel(DialogInterface dialog)157         public void onCancel(DialogInterface dialog) {
158             ((WifiScanModeActivity) getActivity()).doNegativeClick();
159         }
160     }
161 }
162