3 展讯Sprd设置-电池-onPowerSaveModeChanging接口

0. 前言

上接展讯Sprd设置-电池-setPowerSaveMode

源码走读的开始位置

  • vendor/sprd/platform/frameworks/base/services/core/java/com/android/server/power/PowerController.java

1. PowerController.handlePowerSaveModeChanged

package com.android.server.power;

public class PowerController //extends IPowerController.Stub

    private List<PowerSaveHelper> mHelpers;

    // handle the power save mode changed
    private void handlePowerSaveModeChanged(int newMode) {

        if (mInitFinished && mPowerSaveMode == newMode) return;

        // notify helpers power save mode changing
        for (int i = 0; i < mHelpers.size(); i++) {
            PowerSaveHelper helper = mHelpers.get(i);
            helper.onPowerSaveModeChanging(newMode);
        }

        exitPowerSaveMode(mPowerSaveMode);
        enterPowerSaveMode(newMode);
        if (mPowerSaveMode != newMode) {
            Slog.e(TAG, "Something error!! mPowerSaveMode change fail!!old mode:" + mPowerSaveMode
                + " new mode:" + newMode);
        }

        // notify helpers power save mode changed
        for (int i = 0; i < mHelpers.size(); i++) {
            PowerSaveHelper helper = mHelpers.get(i);
            helper.onPowerSaveModeChanged(newMode);
        }

    }

2. PowerSaveHelper的事件监听器

  • vendor/sprd/platform/frameworks/base/services/core/java/com/android/server/power/PowerSaveHelper.java

下述中,8.1代码中只有 BackgroundCleanHelper.updateLauncherAppEnabledSettings 有对应监听事件下的逻辑动作

    // create helpers
    private void createPowerSaveHelpers() {
        Slog.d(TAG, "Begin create helpers ");
        mPowerGuruHelper = new PowerGuruHelper(mContext, mActivityManager, msgHandler);
        mAppIdleHelper = new AppIdleHelper(mContext, mActivityManager, msgHandler);
        mWakelockConstraintHelper = new WakelockConstraintHelper(mContext, mActivityManager, msgHandler);
        mBackgroundCleanHelper = new BackgroundCleanHelper(mContext, mActivityManager, msgHandler);
        mGpsConstraintHelper = new GpsConstraintHelper(mContext, mActivityManager, msgHandler);

        mHelpers = new ArrayList<PowerSaveHelper>();
        mHelpers.add(mPowerGuruHelper);
        mHelpers.add(mAppIdleHelper);
        mHelpers.add(mWakelockConstraintHelper);
        mHelpers.add(mBackgroundCleanHelper);
        mHelpers.add(mGpsConstraintHelper);
    }


2.1 PowerSaveHelper.onPowerSaveModeChanging
package com.android.server.power;

abstract class PowerSaveHelper {

    void onPowerSaveModeChanging(int newMode) {
    
    }
2.2 PowerSaveHelpers -> PowerGuruHelper
package com.android.server.power;

// Class PowerGuruHelper to make decision of What apps should be put
// into the PowerGuru Constrained App List
public class PowerGuruHelper extends PowerSaveHelper{

    // 没有实现 onPowerSaveModeChanging 方法
2.3 PowerSaveHelpers -> AppIdleHelper
package com.android.server.power;

// Class AppIdleHelper to make decision of What apps should be put
// into AppIdle state
public class AppIdleHelper extends PowerSaveHelper{

    // 没有实现 onPowerSaveModeChanging 方法
2.4 PowerSaveHelpers -> WakelockConstraintHelper
package com.android.server.power;

// Class WakeLockConstrainHelper to make decision of What apps should be put
// into a wake lock constrained list
public class WakelockConstraintHelper extends PowerSaveHelper {

    // 没有实现 onPowerSaveModeChanging 方法
2.5 PowerSaveHelpers -> BackgroundCleanHelper
package com.android.server.power;

public class BackgroundCleanHelper extends PowerSaveHelper {

    @Override
    void onPowerSaveModeChanging(int newMode) {
        mNextPowerSaveMode = newMode;

        if (PowerManagerEx.MODE_ULTRASAVING == newMode) {
            try {
                mRunAppList = mActivityManager.getRunningAppProcesses();
            } catch (Exception e) {}
        }

        updateLauncherAppEnabledSettings(newMode);
    }
2.5.1 BackgroundCleanHelper.updateLauncherAppEnabledSettings

在这个事件中,主要完成 loadLauncherApps() 和 setApplicationEnabledSetting 的操作,其他为一些状态位。大体逻辑是通过 loadLauncherApps得到可被设置为省电操作的应用列表,列表主要是规避一些白名单,过滤后的列表就可以通过 setApplicationEnabledSetting 进行组件或者应用级进行禁用和启用的省电操作了。

BackgroundCleanHelper.updateLauncherAppEnabledSettings

    // disable/enable appropriate launcher app for saving mode 
    private void updateLauncherAppEnabledSettings(int newMode) {

        // if mLauncherAppList is empty and mBootCompleted is false, then try to load launcher app first
        if (!mBootCompleted && mLauncherAppList.size() == 0
            && PowerManagerEx.MODE_ULTRASAVING == newMode) {
            Slog.d(TAG, "updateLauncherAppEnabledSettings: try to load launcher apps first!");
            loadLauncherApps();
        }

        int state = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
        boolean changed = false;

        int stateOfSaveLauncher = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;

        try {
            stateOfSaveLauncher = AppGlobals.getPackageManager()
                .getApplicationEnabledSetting("com.sprd.powersavemodelauncher", mCurrentUserId);
        } catch (Exception e) {
            Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
        }
        // new mode is not ultra saving mode, then disable com.sprd.powersavemodelauncher
        if (PowerManagerEx.MODE_ULTRASAVING != newMode
            && stateOfSaveLauncher != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {

            Slog.d(TAG, "updateLauncherAppEnabledSettings disable powersavemodelauncher");
            try {
                AppGlobals.getPackageManager().setApplicationEnabledSetting("com.sprd.powersavemodelauncher",
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0, mCurrentUserId, mContext.getOpPackageName());
            } catch (Exception e) {
                Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
            }
        } else if (PowerManagerEx.MODE_ULTRASAVING == newMode
            && stateOfSaveLauncher != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
            Slog.d(TAG, "updateLauncherAppEnabledSettings enable powersavemodelauncher");
            // enable com.sprd.powersavemodelauncher first
            try {
                AppGlobals.getPackageManager().setApplicationEnabledSetting("com.sprd.powersavemodelauncher",
                    PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0, mCurrentUserId, mContext.getOpPackageName());
            } catch (Exception e) {
                Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
            }
        }

        if ((PowerManagerEx.MODE_ULTRASAVING  == mPowerSaveMode
                && PowerManagerEx.MODE_ULTRASAVING != newMode)
            || (DEFAULT_POWER_MODE == mPowerSaveMode
                && newMode == mPowerSaveMode)) {
            // exit ultra saving mode
            state = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
            changed =true;
        } else if (PowerManagerEx.MODE_ULTRASAVING  != mPowerSaveMode
            && PowerManagerEx.MODE_ULTRASAVING == newMode) {
            // enter ultra saving mode
            state = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
            changed = true;
        }

        if (changed) {
            int enabledCount = 0;
            ArrayList<String> launcherAppList = getLauncherList();
            for (int i=0;i<launcherAppList.size();i++) {
                String name = launcherAppList.get(i);
                if ("com.sprd.powersavemodelauncher".equals(name)) continue;

                if (PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state
                    && !mPowerControllerInternal.isDisabledLauncherApp(name)) {
                    if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings:" + name
                        + " NOT disable by PowerContoller, DON'T enable it here!");
                    continue;
                }

               if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state) {
                    int enabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
                    try {
                        enabled = getApplicationEnabledSetting(name, mCurrentUserId);
                    } catch (Exception e) {
                        Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
                    }
                    boolean packageDisabled = (enabled != PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                            && enabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
                    if (packageDisabled) {
                        if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings:" + name
                            + " is disabled by other app, DON'T disable it here!");
                        continue;
                    }

                    String packageName = name;
                    if (USE_COMPONENT)
                        packageName =  ComponentName.unflattenFromString(name).getPackageName();

                    if (ArrayUtils.contains(mExceptionLauncherAppList, packageName)) {
                        if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings:" + packageName
                            + " NOT a launcher app, DON'T disable it here!");
                        continue;
                    }
                }

                //Slog.d(TAG, "updateLauncherAppEnabledSettings:" + name + " state:" + state
                //    + " newMode:" + newMode);
                try {
                    //SPRD: modify for Bug 886084 BEG
                    
                    setApplicationEnabledSetting(name, state, PackageManager.DONT_KILL_APP,
                        mCurrentUserId, mContext.getOpPackageName());
                        
                    //SPRD: modify for Bug 886084 END
                    if (PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state) enabledCount++;
                    else if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state) {
                        mPowerControllerInternal.addDisabledLauncherAppWithoutSave(name);
                    }
                } catch (Exception e) {
                    Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
                }
            }

            if (enabledCount == 0
                && PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state) {
                Slog.d(TAG, "updateLauncherAppEnabledSettings: NOT launcher app is enabled.ENABLE default!");

                // using disable component instead of disable the whole app
                // when enter/exit ultra-saving mode. See bug#819868
                if (USE_COMPONENT) {
                    for(String s : mDefaultLauncherAppComponentList) {
                        try {
                            ComponentName component = ComponentName.unflattenFromString(s);
                            AppGlobals.getPackageManager().setComponentEnabledSetting(component, state, 0,
                                mCurrentUserId);
                            if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings: enable " + component + " state:" + state
                                    + " newMode:" + newMode);
                        } catch (Exception e) {
                            Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
                        }
                    }
                } else {
                    for(String s : mDefaultLauncherAppList) {
                        try {
                            AppGlobals.getPackageManager().setApplicationEnabledSetting(s, state, 0,
                                mCurrentUserId, mContext.getOpPackageName());
                            if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings: enable " + s + " state:" + state
                                + " newMode:" + newMode);
                        } catch (Exception e) {
                            Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
                        }
                    }
                }
            }
            // clear the disabled launcher app list
            if (PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state) {
                mPowerControllerInternal.updateDisabledLauncherAppList(null);
            }
        }

    }

上述核心接口是 setApplicationEnabledSetting ,禁用应用和禁用组件的方式

    // using disable component instead of disable the whole app
    // when enter/exit ultra-saving mode. See bug#819868
    // --> START
    private void setApplicationEnabledSetting(String appPackageName,
            int newState, int flags, int userId, String callingPackage) {

        try {
            if (USE_COMPONENT) {
                ComponentName component = ComponentName.unflattenFromString(appPackageName);

                AppGlobals.getPackageManager().setComponentEnabledSetting(component, newState, flags, userId);


                if (DEBUG) Slog.d(TAG, "setApplicationEnabledSetting: newState:" + newState
                    + " component:" + component);

            } else {
                AppGlobals.getPackageManager().setApplicationEnabledSetting(appPackageName,
                    newState, flags, userId, callingPackage);
            }

        } catch (Exception e) {
            Slog.d(TAG, "setApplicationEnabledSetting Exception:" + e);
        }
    }

2.5.2 BackgroundCleanHelper.loadLauncherApps

loadLauncherApps 函数主要实现 LauncherAppList.add 和 LauncherAppComponentList.add 的数据建立

BackgroundCleanHelper.loadLauncherApps

    private void loadLauncherApps() {
        try {

            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);

            final List<UserInfo> users = mUserManager.getUsers();
            for (int ui = users.size() - 1; ui >= 0; ui--) {
                UserInfo user = users.get(ui);
                if (DEBUG) Slog.d(TAG, "- loadLauncherApps() for user: " + user.id);
                List<ResolveInfo> resolves =
                    mContext.getPackageManager().queryIntentActivitiesAsUser(intent, PackageManager.MATCH_DISABLED_COMPONENTS, user.id);

                // Look for the original activity in the list...
                final int N = resolves != null ? resolves.size() : 0;
                for (int i=0; i<N; i++) {
                    final ResolveInfo candidate = resolves.get(i);
                    final ActivityInfo info = candidate.activityInfo;
                    if (info != null && info.packageName != null
                        && !mLauncherAppList.contains(info.packageName)) {
                        mLauncherAppList.add(info.packageName);
                    }
                    Slog.d(TAG, "homeApp:" + info.packageName);

                    // using disable component instead of disable the whole app
                    // when enter/exit ultra-saving mode. See bug#819868
                    if (USE_COMPONENT) {
                        if (info != null && info.packageName != null
                             && "com.sprd.powersavemodelauncher".equals(info.packageName)) {
                            if (!mLauncherAppComponentList.contains(info.packageName)) {
                                mLauncherAppComponentList.add(info.packageName);
                            }
                            Slog.d(TAG, "homeComponent:" + info.packageName);
                            continue;
                        }

                        if (info != null && info.packageName != null) {
                            if (ArrayUtils.contains(mExceptionLauncherAppList, info.packageName)) {
                                if (DEBUG) Slog.d(TAG, "loadLauncherApps:" + info.packageName
                                    + " NOT a launcher app!");
                                continue;
                            }

                            ComponentName cn = new ComponentName(info.packageName, info.name);
                            String componetName = cn.flattenToShortString();
                            if (!mLauncherAppComponentList.contains(componetName)) {
                                mLauncherAppComponentList.add(componetName);
                            }
                            Slog.d(TAG, "homeComponent:" + componetName);
                        }
                    }
                }

                // using disable component instead of disable the whole app
                // when enter/exit ultra-saving mode. See bug#819868
                if (USE_COMPONENT) {
                    loadLauncherComponent(user.id);
                }
            }

            /*check if contains the default launcher*/
            for(String s : mDefaultLauncherAppList) {
                if(!mLauncherAppList.contains(s)) {
                    mLauncherAppList.add(s);
                }
            }

            // using disable component instead of disable the whole app
            // when enter/exit ultra-saving mode. See bug#819868
            if (USE_COMPONENT) {
                /*check if contains the default launcher*/
                for(String s : mDefaultLauncherAppComponentList) {
                    if(!mLauncherAppComponentList.contains(s)) {
                        mLauncherAppComponentList.add(s);
                    }
                }
            }

            ResolveInfo resolvedHome = mContext.getPackageManager().resolveActivity(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);
            if (resolvedHome != null) {
                mCurrentHomeLauncher = resolvedHome.activityInfo.packageName;
            }
        } catch (Exception e) {
            Slog.d(TAG, "e:" + e);
        }

        //disbleLauncherAppIfNeed();

        if (DEBUG) {
            Slog.d(TAG, "mCurrentHomeLauncher:" + mCurrentHomeLauncher);
            Slog.d(TAG, "mLauncherAppList: " + mLauncherAppList.size());
            for (int i=0;i<mLauncherAppList.size();i++) {
                Slog.d(TAG, "App:" + mLauncherAppList.get(i));
            }

            Slog.d(TAG, "mLauncherAppComponentList: " + mLauncherAppComponentList.size());
            for (int i=0;i<mLauncherAppComponentList.size();i++) {
                Slog.d(TAG, "Component:" + mLauncherAppComponentList.get(i));
            }
        }
    }
2.5.3 BackgroundCleanHelper.loadLauncherComponent

其中BackgroundCleanHelper.loadLauncherComponent 和 BackgroundCleanHelper.loadLauncherApps 存在重复的代码,代码的目的还是为了添加LauncherAppComponentList,没有其他实质代码。有点像双重检查,个别代码感觉很重复

BackgroundCleanHelper.loadLauncherComponent

    private void loadLauncherComponent(int userId) {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        for (int i=0;i<mLauncherAppList.size();i++) {
            String packageName = mLauncherAppList.get(i);
            if (ArrayUtils.contains(mExceptionLauncherAppList, packageName)) {
                if (DEBUG) Slog.d(TAG, "loadLauncherComponent:" + packageName
                    + " NOT a launcher app!");
                continue;
            }

            intent.setPackage(packageName);

            List<ResolveInfo> resolves =
                mContext.getPackageManager().queryIntentActivitiesAsUser(intent, PackageManager.MATCH_DISABLED_COMPONENTS, userId);

            // Look for the original activity in the list...
            final int SIZE = resolves != null ? resolves.size() : 0;
            for (int n=0; n<SIZE; n++) {
                final ResolveInfo candidate = resolves.get(n);
                final ActivityInfo info = candidate.activityInfo;
                if (info != null && info.packageName != null
                     && "com.sprd.powersavemodelauncher".equals(info.packageName)) {
                    if (!mLauncherAppComponentList.contains(info.packageName)) {
                        mLauncherAppComponentList.add(info.packageName);
                    }
                    Slog.d(TAG, "homeLauncherComponent:" + info.packageName);
                    continue;
                }

                if (info != null && info.packageName != null) {
                    ComponentName cn = new ComponentName(info.packageName, info.name);
                    String componetName = cn.flattenToShortString();
                    if (!mLauncherAppComponentList.contains(componetName)) {
                        mLauncherAppComponentList.add(componetName);
                    }
                    Slog.d(TAG, "homeLauncherComponent:" + componetName);
                }
            }
        }

    }
2.6 PowerSaveHelpers -> GpsConstraintHelper
package com.android.server.power;

public class GpsConstraintHelper extends PowerSaveHelper {

    // 没有实现 onPowerSaveModeChanging 方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值