150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff/* 250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * Copyright (C) 2013 The Android Open Source Project 350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * 450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * you may not use this file except in compliance with the License. 650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * You may obtain a copy of the License at 750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * 850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * 1050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * Unless required by applicable law or agreed to in writing, software 1150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 1250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * See the License for the specific language governing permissions and 1450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * limitations under the License. 1550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff */ 1650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 1750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffpackage com.android.settings.wifi; 1850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 1950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport com.android.settings.R; 2050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 2150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.app.Activity; 2250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.app.AlertDialog; 2350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.app.Dialog; 2450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.app.DialogFragment; 2550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.content.DialogInterface; 2650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.content.Intent; 27994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwaltimport android.content.pm.ApplicationInfo; 28994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwaltimport android.content.pm.PackageManager; 2950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.net.wifi.WifiManager; 3050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.os.Bundle; 3150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.provider.Settings; 3250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffimport android.util.Log; 3350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 3450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff/** 3550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff * This activity requests users permission to allow scanning even when Wi-Fi is turned off 3650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff */ 3750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriffpublic class WifiScanModeActivity extends Activity { 3850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff private DialogFragment mDialog; 3950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff private String mApp; 4050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 4150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff @Override 4250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff protected void onCreate(Bundle savedInstanceState) { 4350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff super.onCreate(savedInstanceState); 4450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff Intent intent = getIntent(); 4550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff if (savedInstanceState == null) { 4650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff if (intent != null && intent.getAction() 4750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff .equals(WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE)) { 48994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwalt ApplicationInfo ai; 4950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mApp = getCallingPackage(); 50994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwalt try { 51994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwalt PackageManager pm = getPackageManager(); 52994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwalt ai = pm.getApplicationInfo(mApp, 0); 53994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwalt mApp = (String)pm.getApplicationLabel(ai); 54994807b1d2f33698a3e309b956a2fb467444e4d2Robert Greenwalt } catch (PackageManager.NameNotFoundException e) { } 5550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } else { 5650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff finish(); 5750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff return; 5850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 5950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } else { 6050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mApp = savedInstanceState.getString("app"); 6150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 6250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff createDialog(); 6350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 6450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 6550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff private void createDialog() { 6650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff if (mDialog == null) { 6750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mDialog = AlertDialogFragment.newInstance(mApp); 6850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mDialog.show(getFragmentManager(), "dialog"); 6950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 7050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 7150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 7250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff private void dismissDialog() { 7350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff if (mDialog != null) { 7450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mDialog.dismiss(); 7550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mDialog = null; 7650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 7750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 7850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 7950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff private void doPositiveClick() { 8050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff Settings.Global.putInt(getContentResolver(), 8150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1); 8250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff setResult(RESULT_OK); 8350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff finish(); 8450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 8550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 8650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff private void doNegativeClick() { 8750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff setResult(RESULT_CANCELED); 8850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff finish(); 8950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 9050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 9150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff @Override 9250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public void onSaveInstanceState(Bundle outState) { 9350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff super.onSaveInstanceState(outState); 9450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff outState.putString("app", mApp); 9550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 9650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 9750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff @Override 9850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public void onPause() { 9950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff super.onPause(); 10050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff dismissDialog(); 10150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 10250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 10350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public void onResume() { 10450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff super.onResume(); 10550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff createDialog(); 10650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 10750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 10850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public static class AlertDialogFragment extends DialogFragment { 10950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff static AlertDialogFragment newInstance(String app) { 11050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff AlertDialogFragment frag = new AlertDialogFragment(app); 11150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff return frag; 11250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 11350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 11450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff private final String mApp; 11550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public AlertDialogFragment(String app) { 11650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff super(); 11750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mApp = app; 11850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 11950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 12050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public AlertDialogFragment() { 12150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff super(); 12250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff mApp = null; 12350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 12450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff 12550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff @Override 12650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public Dialog onCreateDialog(Bundle savedInstanceState) { 12750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff return new AlertDialog.Builder(getActivity()) 12850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff .setMessage(getString(R.string.wifi_scan_always_turnon_message, mApp)) 12950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff .setPositiveButton(R.string.wifi_scan_always_confirm_allow, 13050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff new DialogInterface.OnClickListener() { 13150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public void onClick(DialogInterface dialog, int whichButton) { 13250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff ((WifiScanModeActivity) getActivity()).doPositiveClick(); 13350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 13450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 13550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff ) 13650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff .setNegativeButton(R.string.wifi_scan_always_confirm_deny, 13750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff new DialogInterface.OnClickListener() { 13850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public void onClick(DialogInterface dialog, int whichButton) { 13950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff ((WifiScanModeActivity) getActivity()).doNegativeClick(); 14050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 14150f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 14250f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff ) 14350f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff .create(); 14450f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 14550f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff @Override 14650f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff public void onCancel(DialogInterface dialog) { 14750f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff ((WifiScanModeActivity) getActivity()).doNegativeClick(); 14850f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 14950f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff } 15050f341dcd95620ebb067acd16c34c1cb48a6f718Irfan Sheriff} 151