blob: 446891a3c1537e03722b760d0274089183e3d328 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.wifi;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.UserManager;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;
import android.view.WindowManager;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.wifi.WifiPermissionChecker;
/** This activity requests users permission to allow scanning even when Wi-Fi is turned off */
public class WifiScanModeActivity extends FragmentActivity {
private static final String TAG = "WifiScanModeActivity";
private DialogFragment mDialog;
@VisibleForTesting String mApp;
@VisibleForTesting WifiPermissionChecker mWifiPermissionChecker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow()
.addSystemFlags(
WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
Intent intent = getIntent();
if (savedInstanceState == null) {
if (intent != null
&& WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE.equals(
intent.getAction())) {
refreshAppLabel();
} else {
finish();
return;
}
} else {
mApp = savedInstanceState.getString("app");
}
createDialog();
}
@VisibleForTesting
void refreshAppLabel() {
if (mWifiPermissionChecker == null) {
mWifiPermissionChecker = new WifiPermissionChecker(this);
}
String packageName = mWifiPermissionChecker.getLaunchedPackage();
if (TextUtils.isEmpty(packageName)) {
mApp = null;
return;
}
mApp = Utils.getApplicationLabel(getApplicationContext(), packageName).toString();
}
@VisibleForTesting
void createDialog() {
if (isGuestUser(getApplicationContext())) {
Log.e(TAG, "Guest user is not allowed to configure Wi-Fi Scan Mode!");
EventLog.writeEvent(0x534e4554, "235601169", -1 /* UID */, "User is a guest");
finish();
return;
}
if (!isWifiScanModeConfigAllowed(getApplicationContext())) {
Log.e(TAG, "This user is not allowed to configure Wi-Fi Scan Mode!");
finish();
return;
}
if (mDialog == null) {
mDialog = AlertDialogFragment.newInstance(mApp);
mDialog.show(getSupportFragmentManager(), "dialog");
}
}
private void dismissDialog() {
if (mDialog != null) {
mDialog.dismiss();
mDialog = null;
}
}
private void doPositiveClick() {
getApplicationContext().getSystemService(WifiManager.class).setScanAlwaysAvailable(true);
setResult(RESULT_OK);
finish();
}
private void doNegativeClick() {
setResult(RESULT_CANCELED);
finish();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("app", mApp);
}
@Override
public void onPause() {
super.onPause();
dismissDialog();
}
public void onResume() {
super.onResume();
createDialog();
}
public static class AlertDialogFragment extends InstrumentedDialogFragment {
static AlertDialogFragment newInstance(String app) {
AlertDialogFragment frag = new AlertDialogFragment(app);
return frag;
}
private final String mApp;
public AlertDialogFragment(String app) {
super();
mApp = app;
}
public AlertDialogFragment() {
super();
mApp = null;
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DIALOG_WIFI_SCAN_MODE;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage(
TextUtils.isEmpty(mApp)
? getString(R.string.wifi_scan_always_turn_on_message_unknown)
: getString(R.string.wifi_scan_always_turnon_message, mApp))
.setPositiveButton(
R.string.wifi_scan_always_confirm_allow,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((WifiScanModeActivity) getActivity()).doPositiveClick();
}
})
.setNegativeButton(
R.string.wifi_scan_always_confirm_deny,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((WifiScanModeActivity) getActivity()).doNegativeClick();
}
})
.create();
}
@Override
public void onCancel(DialogInterface dialog) {
((WifiScanModeActivity) getActivity()).doNegativeClick();
}
}
private static boolean isGuestUser(Context context) {
final UserManager userManager = context.getSystemService(UserManager.class);
if (userManager == null) return false;
return userManager.isGuestUser();
}
private static boolean isWifiScanModeConfigAllowed(Context context) {
final UserManager userManager = context.getSystemService(UserManager.class);
if (userManager == null) return true;
return !userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_LOCATION);
}
}