Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0a3c8c5 authored by Nicholas Ambur's avatar Nicholas Ambur
Browse files

add SoundTrigger service modes in battery saver

Control over the SoundTrigger service behavior in battery saver mode is
expanded to from a boolean to multiple modes. Modes include enabled,
disabled, and privileged. Adding the privedged mode allows for the
SoundTrigger service to selectively control clients which are deemed
esential to the Android system.

Bug: 172294448
Test: atest BatterySaverPolicyTest
Test: atest CtsBatterySavingTestCases
Test: atest PowerManagerTest
Test: build and verify backward compatibility with SoundTrigger system
service behavior

Change-Id: Ib701963b07b205e5902ef265198b390a9850cb88
parent 54c8ade4
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -7870,7 +7870,7 @@ package android.os {
    method public boolean getDisableAod();
    method public boolean getDisableLaunchBoost();
    method public boolean getDisableOptionalSensors();
    method public boolean getDisableSoundTrigger();
    method @Deprecated public boolean getDisableSoundTrigger();
    method public boolean getDisableVibration();
    method public boolean getEnableAdjustBrightness();
    method public boolean getEnableDataSaver();
@@ -7880,6 +7880,7 @@ package android.os {
    method public boolean getForceAllAppsStandby();
    method public boolean getForceBackgroundCheck();
    method public int getLocationMode();
    method public int getSoundTriggerMode();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.os.BatterySaverPolicyConfig> CREATOR;
  }
@@ -7896,7 +7897,7 @@ package android.os {
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableAod(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableLaunchBoost(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableOptionalSensors(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableSoundTrigger(boolean);
    method @Deprecated @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableSoundTrigger(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableVibration(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableAdjustBrightness(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableDataSaver(boolean);
@@ -7906,6 +7907,7 @@ package android.os {
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setForceAllAppsStandby(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setForceBackgroundCheck(boolean);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setLocationMode(int);
    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setSoundTriggerMode(int);
  }
  public final class BatteryStatsManager {
@@ -8266,6 +8268,9 @@ package android.os {
    field public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; // 0x1
    field public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; // 0x0
    field public static final String REBOOT_USERSPACE = "userspace";
    field public static final int SOUND_TRIGGER_MODE_ALL_DISABLED = 2; // 0x2
    field public static final int SOUND_TRIGGER_MODE_ALL_ENABLED = 0; // 0x0
    field public static final int SOUND_TRIGGER_MODE_CRITICAL_ONLY = 1; // 0x1
    field public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3; // 0x3
    field public static final int USER_ACTIVITY_EVENT_BUTTON = 1; // 0x1
    field public static final int USER_ACTIVITY_EVENT_OTHER = 0; // 0x0
+35 −8
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ public final class BatterySaverPolicyConfig implements Parcelable {
    private final boolean mDisableAod;
    private final boolean mDisableLaunchBoost;
    private final boolean mDisableOptionalSensors;
    private final boolean mDisableSoundTrigger;
    private final boolean mDisableVibration;
    private final boolean mEnableAdjustBrightness;
    private final boolean mEnableDataSaver;
@@ -52,6 +51,7 @@ public final class BatterySaverPolicyConfig implements Parcelable {
    private final boolean mForceAllAppsStandby;
    private final boolean mForceBackgroundCheck;
    private final int mLocationMode;
    private final int mSoundTriggerMode;

    private BatterySaverPolicyConfig(Builder in) {
        mAdjustBrightnessFactor = Math.max(0, Math.min(in.mAdjustBrightnessFactor, 1f));
@@ -64,7 +64,6 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        mDisableAod = in.mDisableAod;
        mDisableLaunchBoost = in.mDisableLaunchBoost;
        mDisableOptionalSensors = in.mDisableOptionalSensors;
        mDisableSoundTrigger = in.mDisableSoundTrigger;
        mDisableVibration = in.mDisableVibration;
        mEnableAdjustBrightness = in.mEnableAdjustBrightness;
        mEnableDataSaver = in.mEnableDataSaver;
@@ -75,6 +74,8 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        mForceBackgroundCheck = in.mForceBackgroundCheck;
        mLocationMode = Math.max(PowerManager.MIN_LOCATION_MODE,
                Math.min(in.mLocationMode, PowerManager.MAX_LOCATION_MODE));
        mSoundTriggerMode = Math.max(PowerManager.MIN_SOUND_TRIGGER_MODE,
                Math.min(in.mSoundTriggerMode, PowerManager.MAX_SOUND_TRIGGER_MODE));
    }

    private BatterySaverPolicyConfig(Parcel in) {
@@ -99,7 +100,6 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        mDisableAod = in.readBoolean();
        mDisableLaunchBoost = in.readBoolean();
        mDisableOptionalSensors = in.readBoolean();
        mDisableSoundTrigger = in.readBoolean();
        mDisableVibration = in.readBoolean();
        mEnableAdjustBrightness = in.readBoolean();
        mEnableDataSaver = in.readBoolean();
@@ -110,6 +110,8 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        mForceBackgroundCheck = in.readBoolean();
        mLocationMode = Math.max(PowerManager.MIN_LOCATION_MODE,
                Math.min(in.readInt(), PowerManager.MAX_LOCATION_MODE));
        mSoundTriggerMode = Math.max(PowerManager.MIN_SOUND_TRIGGER_MODE,
                Math.min(in.readInt(), PowerManager.MAX_SOUND_TRIGGER_MODE));
    }

    public static final @android.annotation.NonNull Creator<BatterySaverPolicyConfig> CREATOR =
@@ -149,7 +151,6 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        dest.writeBoolean(mDisableAod);
        dest.writeBoolean(mDisableLaunchBoost);
        dest.writeBoolean(mDisableOptionalSensors);
        dest.writeBoolean(mDisableSoundTrigger);
        dest.writeBoolean(mDisableVibration);
        dest.writeBoolean(mEnableAdjustBrightness);
        dest.writeBoolean(mEnableDataSaver);
@@ -159,6 +160,7 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        dest.writeBoolean(mForceAllAppsStandby);
        dest.writeBoolean(mForceBackgroundCheck);
        dest.writeInt(mLocationMode);
        dest.writeInt(mSoundTriggerMode);
    }

    @NonNull
@@ -184,7 +186,7 @@ public final class BatterySaverPolicyConfig implements Parcelable {
                + "launch_boost_disabled=" + mDisableLaunchBoost + ","
                + "optional_sensors_disabled=" + mDisableOptionalSensors + ","
                + "quick_doze_enabled=" + mEnableQuickDoze + ","
                + "soundtrigger_disabled=" + mDisableSoundTrigger + ","
                + "soundtrigger_mode=" + mSoundTriggerMode + ","
                + "vibration_disabled=" + mDisableVibration + ","
                + sb.toString();
    }
@@ -242,12 +244,21 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        return mDisableOptionalSensors;
    }

    /**
     * Get the SoundTrigger mode while in Battery Saver.
     */
    public int getSoundTriggerMode() {
        return mSoundTriggerMode;
    }

    /**
     * Whether or not to disable {@link android.hardware.soundtrigger.SoundTrigger}
     * while in Battery Saver.
     * @deprecated Use {@link #getSoundTriggerMode()} instead.
     */
    @Deprecated
    public boolean getDisableSoundTrigger() {
        return mDisableSoundTrigger;
        return mSoundTriggerMode == PowerManager.SOUND_TRIGGER_MODE_ALL_DISABLED;
    }

    /** Whether or not to disable vibration while in Battery Saver. */
@@ -315,7 +326,6 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        private boolean mDisableAod = false;
        private boolean mDisableLaunchBoost = false;
        private boolean mDisableOptionalSensors = false;
        private boolean mDisableSoundTrigger = false;
        private boolean mDisableVibration = false;
        private boolean mEnableAdjustBrightness = false;
        private boolean mEnableDataSaver = false;
@@ -325,6 +335,7 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        private boolean mForceAllAppsStandby = false;
        private boolean mForceBackgroundCheck = false;
        private int mLocationMode = PowerManager.LOCATION_MODE_NO_CHANGE;
        private int mSoundTriggerMode = PowerManager.SOUND_TRIGGER_MODE_ALL_ENABLED;

        public Builder() {
        }
@@ -416,10 +427,26 @@ public final class BatterySaverPolicyConfig implements Parcelable {
        /**
         * Set whether or not to disable  {@link android.hardware.soundtrigger.SoundTrigger}
         * while in Battery Saver.
         * @deprecated Use {@link #setSoundTriggerMode(int)} instead.
         */
        @Deprecated
        @NonNull
        public Builder setDisableSoundTrigger(boolean disableSoundTrigger) {
            mDisableSoundTrigger = disableSoundTrigger;
            if (disableSoundTrigger) {
                mSoundTriggerMode = PowerManager.SOUND_TRIGGER_MODE_ALL_DISABLED;
            } else {
                mSoundTriggerMode = PowerManager.SOUND_TRIGGER_MODE_ALL_ENABLED;
            }
            return this;
        }

        /**
         * Set the SoundTrigger mode while in Battery Saver.
         */
        @NonNull
        public Builder setSoundTriggerMode(
                @PowerManager.SoundTriggerPowerSaveMode int soundTriggerMode) {
            mSoundTriggerMode = soundTriggerMode;
            return this;
        }

+59 −0
Original line number Diff line number Diff line
@@ -885,6 +885,45 @@ public final class PowerManager {
    })
    public @interface LocationPowerSaveMode {}

    /**
     * In this mode, all active SoundTrigger recognitions are enabled by the SoundTrigger system
     * service.
     * @hide
     */
    @SystemApi
    public static final int SOUND_TRIGGER_MODE_ALL_ENABLED = 0;
    /**
     * In this mode, only privileged components of the SoundTrigger system service should be
     * enabled. This functionality is to be used to limit SoundTrigger recognitions to those only
     * deemed necessary by the system.
     * @hide
     */
    @SystemApi
    public static final int SOUND_TRIGGER_MODE_CRITICAL_ONLY = 1;
    /**
     * In this mode, all active SoundTrigger recognitions should be disabled by the SoundTrigger
     * system service.
     * @hide
     */
    @SystemApi
    public static final int SOUND_TRIGGER_MODE_ALL_DISABLED = 2;

    /** @hide */
    public static final int MIN_SOUND_TRIGGER_MODE = SOUND_TRIGGER_MODE_ALL_ENABLED;
    /** @hide */
    public static final int MAX_SOUND_TRIGGER_MODE = SOUND_TRIGGER_MODE_ALL_DISABLED;

    /**
     * @hide
     */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = {"SOUND_TRIGGER_MODE_"}, value = {
            SOUND_TRIGGER_MODE_ALL_ENABLED,
            SOUND_TRIGGER_MODE_CRITICAL_ONLY,
            SOUND_TRIGGER_MODE_ALL_DISABLED,
    })
    public @interface SoundTriggerPowerSaveMode {}

    /** @hide */
    public static String locationPowerSaveModeToString(@LocationPowerSaveMode int mode) {
        switch (mode) {
@@ -1832,6 +1871,26 @@ public final class PowerManager {
        return powerSaveState.locationMode;
    }

    /**
     * Returns how SoundTrigger features should behave when battery saver is on. When battery saver
     * is off, this will always return {@link #SOUND_TRIGGER_MODE_ALL_ENABLED}.
     *
     * <p>This API is normally only useful for components that provide use SoundTrigger features.
     *
     * @see #isPowerSaveMode()
     * @see #ACTION_POWER_SAVE_MODE_CHANGED
     *
     * @hide
     */
    @SoundTriggerPowerSaveMode
    public int getSoundTriggerPowerSaveMode() {
        final PowerSaveState powerSaveState = getPowerSaveState(ServiceType.SOUND);
        if (!powerSaveState.batterySaverEnabled) {
            return SOUND_TRIGGER_MODE_ALL_ENABLED;
        }
        return powerSaveState.soundTriggerMode;
    }

    /**
     * Returns true if the device is currently in idle mode.  This happens when a device
     * has been sitting unused and unmoving for a sufficiently long period of time, so that
+10 −0
Original line number Diff line number Diff line
@@ -36,11 +36,13 @@ public class PowerSaveState implements Parcelable {
     */
    public final boolean globalBatterySaverEnabled;
    public final int locationMode;
    public final int soundTriggerMode;
    public final float brightnessFactor;

    public PowerSaveState(Builder builder) {
        batterySaverEnabled = builder.mBatterySaverEnabled;
        locationMode = builder.mLocationMode;
        soundTriggerMode = builder.mSoundTriggerMode;
        brightnessFactor = builder.mBrightnessFactor;
        globalBatterySaverEnabled = builder.mGlobalBatterySaverEnabled;
    }
@@ -49,6 +51,7 @@ public class PowerSaveState implements Parcelable {
        batterySaverEnabled = in.readByte() != 0;
        globalBatterySaverEnabled = in.readByte() != 0;
        locationMode = in.readInt();
        soundTriggerMode = in.readInt();
        brightnessFactor = in.readFloat();
    }

@@ -62,6 +65,7 @@ public class PowerSaveState implements Parcelable {
        dest.writeByte((byte) (batterySaverEnabled ? 1 : 0));
        dest.writeByte((byte) (globalBatterySaverEnabled ? 1 : 0));
        dest.writeInt(locationMode);
        dest.writeInt(soundTriggerMode);
        dest.writeFloat(brightnessFactor);
    }

@@ -69,6 +73,7 @@ public class PowerSaveState implements Parcelable {
        private boolean mBatterySaverEnabled = false;
        private boolean mGlobalBatterySaverEnabled = false;
        private int mLocationMode = 0;
        private int mSoundTriggerMode = PowerManager.SOUND_TRIGGER_MODE_ALL_ENABLED;
        private float mBrightnessFactor = 0.5f;

        public Builder() {}
@@ -83,6 +88,11 @@ public class PowerSaveState implements Parcelable {
            return this;
        }

        public Builder setSoundTriggerMode(int mode) {
            mSoundTriggerMode = mode;
            return this;
        }

        public Builder setLocationMode(int mode) {
            mLocationMode = mode;
            return this;
+12 −10
Original line number Diff line number Diff line
@@ -61,7 +61,6 @@ static struct BatterySaverPolicyConfigFieldId {
    jfieldID disableAod;
    jfieldID disableLaunchBoost;
    jfieldID disableOptionalSensors;
    jfieldID disableSoundTrigger;
    jfieldID disableVibration;
    jfieldID enableAdjustBrightness;
    jfieldID enableDataSaver;
@@ -71,6 +70,7 @@ static struct BatterySaverPolicyConfigFieldId {
    jfieldID forceAllAppsStandby;
    jfieldID forceBackgroundCheck;
    jfieldID locationMode;
    jfieldID soundTriggerMode;
} gBSPCFieldIds;

static jobject nativeObtainParcel(JNIEnv* env) {
@@ -171,10 +171,11 @@ static void nativeUnparcelAndVerifyWorkSource(JNIEnv* env, jobject /* obj */, jo

static jobject nativeObtainPowerSaveStateParcel(JNIEnv* env, jobject /* obj */,
        jboolean batterySaverEnabled, jboolean globalBatterySaverEnabled,
        jint locationMode, jfloat brightnessFactor) {
        jint locationMode, jint soundTriggerMode, jfloat brightnessFactor) {
    PowerSaveState ps = PowerSaveState(static_cast<bool>(batterySaverEnabled),
            static_cast<bool>(globalBatterySaverEnabled),
            static_cast<LocationMode>(locationMode),
            static_cast<SoundTriggerMode>(soundTriggerMode),
            static_cast<float>(brightnessFactor));
    jobject psParcel = nativeObtainParcel(env);
    Parcel* parcel = nativeGetParcelData(env, psParcel);
@@ -189,7 +190,7 @@ static jobject nativeObtainPowerSaveStateParcel(JNIEnv* env, jobject /* obj */,

static void nativeUnparcelAndVerifyPowerSaveState(JNIEnv* env, jobject /* obj */, jobject psParcel,
        jboolean batterySaverEnabled, jboolean globalBatterySaverEnabled,
        jint locationMode, jfloat brightnessFactor) {
        jint locationMode, jint soundTriggerMode, jfloat brightnessFactor) {
    PowerSaveState ps = {};
    Parcel* parcel = nativeGetParcelData(env, psParcel);
    status_t err = ps.readFromParcel(parcel);
@@ -200,6 +201,7 @@ static void nativeUnparcelAndVerifyPowerSaveState(JNIEnv* env, jobject /* obj */
    PowerSaveState psOrig = PowerSaveState(static_cast<bool>(batterySaverEnabled),
            static_cast<bool>(globalBatterySaverEnabled),
            static_cast<LocationMode>(locationMode),
            static_cast<SoundTriggerMode>(soundTriggerMode),
            static_cast<float>(brightnessFactor));
    if (ps == psOrig) {
        return;
@@ -229,7 +231,6 @@ static jobject nativeObtainBSPConfigParcel(JNIEnv* env, jobject /* obj */,
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableAod),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableLaunchBoost),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableOptionalSensors),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableSoundTrigger),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableVibration),
        env->GetBooleanField(bsObj, gBSPCFieldIds.enableAdjustBrightness),
        env->GetBooleanField(bsObj, gBSPCFieldIds.enableDataSaver),
@@ -238,7 +239,8 @@ static jobject nativeObtainBSPConfigParcel(JNIEnv* env, jobject /* obj */,
        env->GetBooleanField(bsObj, gBSPCFieldIds.enableQuickDoze),
        env->GetBooleanField(bsObj, gBSPCFieldIds.forceAllAppsStandby),
        env->GetBooleanField(bsObj, gBSPCFieldIds.forceBackgroundCheck),
        static_cast<LocationMode>(env->GetIntField(bsObj, gBSPCFieldIds.locationMode)));
        static_cast<LocationMode>(env->GetIntField(bsObj, gBSPCFieldIds.locationMode)),
        static_cast<SoundTriggerMode>(env->GetIntField(bsObj, gBSPCFieldIds.soundTriggerMode)));

    jobject bsParcel = nativeObtainParcel(env);
    Parcel* parcel = nativeGetParcelData(env, bsParcel);
@@ -279,7 +281,6 @@ static void nativeUnparcelAndVerifyBSPConfig(JNIEnv* env, jobject /* obj */,
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableAod),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableLaunchBoost),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableOptionalSensors),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableSoundTrigger),
        env->GetBooleanField(bsObj, gBSPCFieldIds.disableVibration),
        env->GetBooleanField(bsObj, gBSPCFieldIds.enableAdjustBrightness),
        env->GetBooleanField(bsObj, gBSPCFieldIds.enableDataSaver),
@@ -288,7 +289,8 @@ static void nativeUnparcelAndVerifyBSPConfig(JNIEnv* env, jobject /* obj */,
        env->GetBooleanField(bsObj, gBSPCFieldIds.enableQuickDoze),
        env->GetBooleanField(bsObj, gBSPCFieldIds.forceAllAppsStandby),
        env->GetBooleanField(bsObj, gBSPCFieldIds.forceBackgroundCheck),
        static_cast<LocationMode>(env->GetIntField(bsObj, gBSPCFieldIds.locationMode)));
        static_cast<LocationMode>(env->GetIntField(bsObj, gBSPCFieldIds.locationMode)),
        static_cast<SoundTriggerMode>(env->GetIntField(bsObj, gBSPCFieldIds.soundTriggerMode)));

    if (bs == bsOrig) {
        return;
@@ -307,9 +309,9 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
                (void*) nativeObtainWorkSourceParcel },
        { "nativeUnparcelAndVerifyWorkSource", "(Landroid/os/Parcel;[I[Ljava/lang/String;)V",
                (void*) nativeUnparcelAndVerifyWorkSource },
        { "nativeObtainPowerSaveStateParcel", "(ZZIF)Landroid/os/Parcel;",
        { "nativeObtainPowerSaveStateParcel", "(ZZIIF)Landroid/os/Parcel;",
                (void*) nativeObtainPowerSaveStateParcel },
        { "nativeUnparcelAndVerifyPowerSaveState", "(Landroid/os/Parcel;ZZIF)V",
        { "nativeUnparcelAndVerifyPowerSaveState", "(Landroid/os/Parcel;ZZIIF)V",
                (void*) nativeUnparcelAndVerifyPowerSaveState },
        { "nativeObtainBSPConfigParcel",
                "(Landroid/os/BatterySaverPolicyConfig;"
@@ -340,7 +342,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
    GET_FIELD_ID(gBSPCFieldIds.disableAod, bspcClazz, "mDisableAod", "Z");
    GET_FIELD_ID(gBSPCFieldIds.disableLaunchBoost, bspcClazz, "mDisableLaunchBoost", "Z");
    GET_FIELD_ID(gBSPCFieldIds.disableOptionalSensors, bspcClazz, "mDisableOptionalSensors", "Z");
    GET_FIELD_ID(gBSPCFieldIds.disableSoundTrigger, bspcClazz, "mDisableSoundTrigger", "Z");
    GET_FIELD_ID(gBSPCFieldIds.disableVibration, bspcClazz, "mDisableVibration", "Z");
    GET_FIELD_ID(gBSPCFieldIds.enableAdjustBrightness, bspcClazz, "mEnableAdjustBrightness", "Z");
    GET_FIELD_ID(gBSPCFieldIds.enableDataSaver, bspcClazz, "mEnableDataSaver", "Z");
@@ -350,6 +351,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
    GET_FIELD_ID(gBSPCFieldIds.forceAllAppsStandby, bspcClazz, "mForceAllAppsStandby", "Z");
    GET_FIELD_ID(gBSPCFieldIds.forceBackgroundCheck, bspcClazz, "mForceBackgroundCheck", "Z");
    GET_FIELD_ID(gBSPCFieldIds.locationMode, bspcClazz, "mLocationMode", "I");
    GET_FIELD_ID(gBSPCFieldIds.soundTriggerMode, bspcClazz, "mSoundTriggerMode", "I");

    jniRegisterNativeMethods(env, "android/os/PowerManagerTest", methodTable,
                sizeof(methodTable) / sizeof(JNINativeMethod));
Loading