1 /* 2 * Copyright (C) 2015 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.fuelgauge; 18 19 import android.Manifest; 20 import android.content.DialogInterface; 21 import android.content.pm.ApplicationInfo; 22 import android.content.pm.PackageManager; 23 import android.net.Uri; 24 import android.os.Bundle; 25 import android.os.IDeviceIdleController; 26 import android.os.PowerManager; 27 import android.os.RemoteException; 28 import android.os.ServiceManager; 29 import android.util.Log; 30 31 import com.android.internal.app.AlertActivity; 32 import com.android.internal.app.AlertController; 33 import com.android.settings.R; 34 35 public class RequestIgnoreBatteryOptimizations extends AlertActivity implements 36 DialogInterface.OnClickListener { 37 static final String TAG = "RequestIgnoreBatteryOptimizations"; 38 39 private static final String DEVICE_IDLE_SERVICE = "deviceidle"; 40 41 IDeviceIdleController mDeviceIdleService; 42 String mPackageName; 43 44 @Override onCreate(Bundle savedInstanceState)45 public void onCreate(Bundle savedInstanceState) { 46 super.onCreate(savedInstanceState); 47 48 mDeviceIdleService = IDeviceIdleController.Stub.asInterface( 49 ServiceManager.getService(DEVICE_IDLE_SERVICE)); 50 51 Uri data = getIntent().getData(); 52 if (data == null) { 53 Log.w(TAG, "No data supplied for IGNORE_BATTERY_OPTIMIZATION_SETTINGS in: " 54 + getIntent()); 55 finish(); 56 return; 57 } 58 mPackageName = data.getSchemeSpecificPart(); 59 if (mPackageName == null) { 60 Log.w(TAG, "No data supplied for IGNORE_BATTERY_OPTIMIZATION_SETTINGS in: " 61 + getIntent()); 62 finish(); 63 return; 64 } 65 66 PowerManager power = getSystemService(PowerManager.class); 67 if (power.isIgnoringBatteryOptimizations(mPackageName)) { 68 Log.i(TAG, "Not should prompt, already ignoring optimizations: " + mPackageName); 69 finish(); 70 return; 71 } 72 73 ApplicationInfo ai; 74 try { 75 ai = getPackageManager().getApplicationInfo(mPackageName, 0); 76 } catch (PackageManager.NameNotFoundException e) { 77 Log.w(TAG, "Requested package doesn't exist: " + mPackageName); 78 finish(); 79 return; 80 } 81 82 if (getPackageManager().checkPermission( 83 Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, mPackageName) 84 != PackageManager.PERMISSION_GRANTED) { 85 Log.w(TAG, "Requested package " + mPackageName + " does not hold permission " 86 + Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 87 finish(); 88 return; 89 } 90 91 final AlertController.AlertParams p = mAlertParams; 92 p.mTitle = getText(R.string.high_power_prompt_title); 93 p.mMessage = getString(R.string.high_power_prompt_body, ai.loadLabel(getPackageManager())); 94 p.mPositiveButtonText = getText(R.string.allow); 95 p.mNegativeButtonText = getText(R.string.deny); 96 p.mPositiveButtonListener = this; 97 p.mNegativeButtonListener = this; 98 setupAlert(); 99 } 100 101 @Override onClick(DialogInterface dialog, int which)102 public void onClick(DialogInterface dialog, int which) { 103 switch (which) { 104 case BUTTON_POSITIVE: 105 try { 106 mDeviceIdleService.addPowerSaveWhitelistApp(mPackageName); 107 } catch (RemoteException e) { 108 Log.w(TAG, "Unable to reach IDeviceIdleController", e); 109 } 110 setResult(RESULT_OK); 111 break; 112 case BUTTON_NEGATIVE: 113 break; 114 } 115 } 116 } 117