package jp.co.cyberagent.stf.compat;
import android.os.SystemClock;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import jp.co.cyberagent.stf.util.InternalApi;
public class PowerManagerWrapper {
private Object powerManager;
private WakeInjector wakeInjector;
public PowerManagerWrapper() {
powerManager = InternalApi.getServiceAsInterface("power", "android.os.IPowerManager$Stub");
try {
wakeInjector = new NewUserActivityWakeInjector();
}
catch (UnsupportedOperationException e) {
try {
wakeInjector = new WakeUpWakeInjector();
}
catch (UnsupportedOperationException e2) {
// Let it bubble
wakeInjector = new OldUserActivityWakeInjector();
}
}
}
public void wakeUp() {
wakeInjector.wakeUp();
}
private interface WakeInjector {
public boolean wakeUp();
}
/**
* WakeInjector for newer API
*/
private class WakeUpWakeInjector implements WakeInjector {
private Method injector;
public WakeUpWakeInjector() {
try {
injector = powerManager.getClass()
// public void wakeUp(long time) throws android.os.RemoteException
.getMethod("wakeUp", long.class);
}
catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("WakeUpWakeInjector is not supported");
}
}
public boolean wakeUp() {
try {
injector.invoke(powerManager, SystemClock.uptimeMillis());
return true;
}
catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
catch (InvocationTargetException e) {
e.printStackTrace();
return false;
}
}
}
/**
* WakeInjector for newer API using userActivity()
*/
private class NewUserActivityWakeInjector implements WakeInjector {
private Method injector;
public NewUserActivityWakeInjector() {
try {
injector = powerManager.getClass()
// public void userActivity(long when, int event, int flags) throws android.os.RemoteException
.getMethod("userActivity", long.class, int.class, int.class);
}
catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("UserActivityWakeInjector is not supported");
}
}
public boolean wakeUp() {
try {
// public static final int USER_ACTIVITY_EVENT_OTHER = 0
injector.invoke(powerManager, SystemClock.uptimeMillis(), 0, 0);
return true;
}
catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
catch (InvocationTargetException e) {
e.printStackTrace();
return false;
}
}
}
/**
* WakeInjector for older API
*/
private class OldUserActivityWakeInjector implements WakeInjector {
private Method injector;
public OldUserActivityWakeInjector() {
try {
injector = powerManager.getClass()
// public void userActivityWithForce(long when, boolean noChangeLights,
// boolean force) throws android.os.RemoteException
.getMethod("userActivityWithForce", long.class, boolean.class, boolean.class);
}
catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("UserActivityWakeInjector is not supported");
}
}
public boolean wakeUp() {
try {
injector.invoke(powerManager, SystemClock.uptimeMillis(), false, true);
return true;
}
catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
catch (InvocationTargetException e) {
e.printStackTrace();
return false;
}
}
}
}