182 lines
4.8 KiB
Java
182 lines
4.8 KiB
Java
|
/*
|
||
|
* Copyright (C) 2015 The CyanogenMod 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 cyanogenmod.power;
|
||
|
|
||
|
import android.content.Context;
|
||
|
import android.os.IBinder;
|
||
|
import android.os.RemoteException;
|
||
|
import android.os.ServiceManager;
|
||
|
import android.util.Log;
|
||
|
|
||
|
import cyanogenmod.app.CMContextConstants;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public class PerformanceManager {
|
||
|
|
||
|
public static final String TAG = "PerformanceManager";
|
||
|
|
||
|
/**
|
||
|
* Power save profile
|
||
|
*
|
||
|
* This mode sacrifices performance for maximum power saving.
|
||
|
*/
|
||
|
public static final int PROFILE_POWER_SAVE = 0;
|
||
|
|
||
|
/**
|
||
|
* Balanced power profile
|
||
|
*
|
||
|
* The default mode for balanced power savings and performance
|
||
|
*/
|
||
|
public static final int PROFILE_BALANCED = 1;
|
||
|
|
||
|
/**
|
||
|
* High-performance profile
|
||
|
*
|
||
|
* This mode sacrifices power for maximum performance
|
||
|
*/
|
||
|
public static final int PROFILE_HIGH_PERFORMANCE = 2;
|
||
|
|
||
|
/**
|
||
|
* Power save bias profile
|
||
|
*
|
||
|
* This mode decreases performance slightly to improve
|
||
|
* power savings.
|
||
|
*/
|
||
|
public static final int PROFILE_BIAS_POWER_SAVE = 3;
|
||
|
|
||
|
/**
|
||
|
* Performance bias profile
|
||
|
*
|
||
|
* This mode improves performance at the cost of some power.
|
||
|
*/
|
||
|
public static final int PROFILE_BIAS_PERFORMANCE = 4;
|
||
|
|
||
|
private int mNumberOfProfiles = 0;
|
||
|
|
||
|
/**
|
||
|
* Broadcast sent when profile is changed
|
||
|
*/
|
||
|
public static final String POWER_PROFILE_CHANGED = "cyanogenmod.power.PROFILE_CHANGED";
|
||
|
|
||
|
private static IPerformanceManager sService;
|
||
|
private static PerformanceManager sInstance;
|
||
|
|
||
|
private PerformanceManager(Context context) {
|
||
|
sService = getService();
|
||
|
|
||
|
try {
|
||
|
if (sService != null) {
|
||
|
mNumberOfProfiles = sService.getNumberOfProfiles();
|
||
|
}
|
||
|
} catch (RemoteException e) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static PerformanceManager getInstance(Context context) {
|
||
|
if (sInstance == null) {
|
||
|
sInstance = new PerformanceManager(context);
|
||
|
}
|
||
|
return sInstance;
|
||
|
}
|
||
|
|
||
|
private static IPerformanceManager getService() {
|
||
|
if (sService != null) {
|
||
|
return sService;
|
||
|
}
|
||
|
IBinder b = ServiceManager.getService(CMContextConstants.CM_PERFORMANCE_SERVICE);
|
||
|
if (b != null) {
|
||
|
sService = IPerformanceManager.Stub.asInterface(b);
|
||
|
return sService;
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
private boolean checkService() {
|
||
|
if (sService == null) {
|
||
|
Log.w(TAG, "not connected to PerformanceManagerService");
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Boost the CPU. Boosts the cpu for the given duration in microseconds.
|
||
|
* Requires the {@link android.Manifest.permission#CPU_BOOST} permission.
|
||
|
*
|
||
|
* @param duration in microseconds to boost the CPU
|
||
|
* @hide
|
||
|
*/
|
||
|
public void cpuBoost(int duration)
|
||
|
{
|
||
|
try {
|
||
|
if (checkService()) {
|
||
|
sService.cpuBoost(duration);
|
||
|
}
|
||
|
} catch (RemoteException e) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of supported profiles, zero if unsupported
|
||
|
* This is queried via the PowerHAL.
|
||
|
*/
|
||
|
public int getNumberOfProfiles() {
|
||
|
return mNumberOfProfiles;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the system power profile
|
||
|
*
|
||
|
* @throws IllegalArgumentException if invalid
|
||
|
*/
|
||
|
public boolean setPowerProfile(int profile) {
|
||
|
if (mNumberOfProfiles < 1) {
|
||
|
throw new IllegalArgumentException("Power profiles not enabled on this system!");
|
||
|
}
|
||
|
|
||
|
boolean changed = false;
|
||
|
try {
|
||
|
if (checkService()) {
|
||
|
changed = sService.setPowerProfile(profile);
|
||
|
}
|
||
|
} catch (RemoteException e) {
|
||
|
throw new IllegalArgumentException(e);
|
||
|
}
|
||
|
return changed;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the current power profile
|
||
|
*
|
||
|
* Returns null if power profiles are not enabled
|
||
|
*/
|
||
|
public int getPowerProfile() {
|
||
|
int ret = -1;
|
||
|
if (mNumberOfProfiles > 0) {
|
||
|
try {
|
||
|
if (checkService()) {
|
||
|
ret = sService.getPowerProfile();
|
||
|
}
|
||
|
} catch (RemoteException e) {
|
||
|
// nothing
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
}
|