replicant-vendor_cmsdk/sdk/src/java/cyanogenmod/power/PerformanceManager.java

207 lines
5.7 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();
if (context.getPackageManager().hasSystemFeature(
CMContextConstants.Features.PERFORMANCE) && sService == null) {
throw new RuntimeException("Unable to get PerformanceManagerService. The service" +
" either crashed, was not started, or the interface has been called to early" +
" in SystemServer init");
}
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;
}
/** @hide */
public 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, -1 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;
}
/**
* Check if profile has app-specific profiles
*
* Returns true if profile has app-specific profiles.
*/
public boolean getProfileHasAppProfiles(int profile) {
boolean ret = false;
if (mNumberOfProfiles > 0) {
try {
if (checkService()) {
ret = sService.getProfileHasAppProfiles(profile);
}
} catch (RemoteException e) {
// nothing
}
}
return ret;
}
}