zoukankan      html  css  js  c++  java
  • Android源码分析(十)-----关机菜单中如何添加飞行模式选项

    一:关机菜单添加飞行模式选项

    源码路径:frameworks/base/core/res/res/values/config.xml
    增加<item>airplane</item>

        <!-- Defines the default set of global actions. Actions may still be disabled or hidden based
             on the current state of the device.
             Each item must be one of the following strings:
             "power" = Power off
             "settings" = An action to launch settings
             "airplane" = Airplane mode toggle
             "bugreport" = Take bug report, if available
             "silent" = silent mode
             "users" = list of users
             "restart" = restart device
             -->
        <string-array translatable="false" name="config_globalActionsList">
            <item>power</item>
            <item>restart</item>
            <item>airplane</item>
            <item>bugreport</item>
            <item>users</item>
        </string-array>
    
    二:GlobalActionsDialog.java

    源码路径:com/android/systemui/globalactions/GlobalActionsDialog.java
    主要关注createDialog()方法,如果需要定制Dialog请自行去研究ActionDialog 此处不做过多解释

        /**
         * Create the global actions dialog.
         *
         * @return A new dialog.
         */
        private ActionsDialog createDialog() {
            // Simple toggle style if there's no vibrator, otherwise use a tri-state
            if (!mHasVibrator) {
                mSilentModeAction = new SilentModeToggleAction();
            } else {
                mSilentModeAction = new SilentModeTriStateAction(mContext, mAudioManager, mHandler);
            }
            mAirplaneModeOn = new ToggleAction(
                    R.drawable.ic_lock_airplane_mode,
                    R.drawable.ic_lock_airplane_mode_off,
                    R.string.global_actions_toggle_airplane_mode,
                    R.string.global_actions_airplane_mode_on_status,
                    R.string.global_actions_airplane_mode_off_status) {
    
                void onToggle(boolean on) {
                    if (mHasTelephony && Boolean.parseBoolean(
                            SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
                        mIsWaitingForEcmExit = true;
                        // Launch ECM exit dialog
                        Intent ecmDialogIntent =
                                new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null);
                        ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        mContext.startActivity(ecmDialogIntent);
                    } else {
                        changeAirplaneModeSystemSetting(on);
                    }
                }
    
                @Override
                protected void changeStateFromPress(boolean buttonOn) {
                    if (!mHasTelephony) return;
    
                    // In ECM mode airplane state cannot be changed
                    if (!(Boolean.parseBoolean(
                            SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE)))) {
                        mState = buttonOn ? State.TurningOn : State.TurningOff;
                        mAirplaneState = mState;
                    }
                }
    
                public boolean showDuringKeyguard() {
                    return true;
                }
    
                public boolean showBeforeProvisioning() {
                    return false;
                }
            };
            onAirplaneModeChanged();
    
            mItems = new ArrayList<Action>();
            String[] defaultActions = mContext.getResources().getStringArray(
                    R.array.config_globalActionsList);
    
            ArraySet<String> addedKeys = new ArraySet<String>();
            for (int i = 0; i < defaultActions.length; i++) {
                String actionKey = defaultActions[i];
                if (addedKeys.contains(actionKey)) {
                    // If we already have added this, don't add it again.
                    continue;
                }
                if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) {
                    mItems.add(new PowerAction());
                } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) {
                    mItems.add(mAirplaneModeOn);
                } else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) {
                    if (Settings.Global.getInt(mContext.getContentResolver(),
                            Settings.Global.BUGREPORT_IN_POWER_MENU, 0) != 0 && isCurrentUserOwner()) {
                        mItems.add(new BugReportAction());
                    }
                } else if (GLOBAL_ACTION_KEY_SILENT.equals(actionKey)) {
                    if (mShowSilentToggle) {
                        mItems.add(mSilentModeAction);
                    }
                } else if (GLOBAL_ACTION_KEY_USERS.equals(actionKey)) {
                    if (SystemProperties.getBoolean("fw.power_user_switcher", false)) {
                        addUsersToMenu(mItems);
                    }
                } else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {
                    mItems.add(getSettingsAction());
                } else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {
                    mItems.add(getLockdownAction());
                } else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {
                    mItems.add(getVoiceAssistAction());
                } else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {
                    mItems.add(getAssistAction());
                } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
                    mItems.add(new RestartAction());
                } else {
                    Log.e(TAG, "Invalid global action key " + actionKey);
                }
                // Add here so we don't add more than one.
                addedKeys.add(actionKey);
            }
    
            if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {
                mItems.add(getEmergencyAction());
            }
    
            mAdapter = new MyAdapter();
    
            OnItemLongClickListener onItemLongClickListener = new OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position,
                        long id) {
                    final Action action = mAdapter.getItem(position);
                    if (action instanceof LongPressAction) {
                        mDialog.dismiss();
                        return ((LongPressAction) action).onLongPress();
                    }
                    return false;
                }
            };
            ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener);
            dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
            dialog.setKeyguardShowing(mKeyguardShowing);
    
            dialog.setOnDismissListener(this);
    
            return dialog;
        }
    

    如果关机菜单中显示有问题,请按下面修改,Andnroid8.0代码中有些布局文件同名,可能出现引用错误

    @@ -944,8 +944,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
                     LayoutInflater inflater) {
                 willCreate();
     
    -            View v = inflater.inflate(R
    -                    .layout.global_actions_item, parent, false);
    +            View v = inflater.inflate(com
    +                    .android.systemui.R.layout.global_actions_item, parent, false);
     
                 ImageView icon = (ImageView) v.findViewById(R.id.icon);
                 TextView messageView = (TextView) v.findViewById(R.id.message);
    

    如果飞行模式功能无效, 尝试下面修改

    @@ -1179,7 +1179,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
     
         private void onAirplaneModeChanged() {
             // Let the service state callbacks handle the state.
    -        if (mHasTelephony) return;
    +        if (!mHasTelephony) return;
     
             boolean airplaneModeOn = Settings.Global.getInt(
                     mContext.getContentResolver(),
    

    如果显示样式和开关机选项有差别, 按如下修改,隐藏statusView

    @@ -966,7 +966,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
     
                 if (statusView != null) {
                     statusView.setText(on ? mEnabledStatusMessageResId : mDisabledStatusMessageResId);
    -                statusView.setVisibility(View.VISIBLE);
    +                statusView.setVisibility(View.GONE);
                     statusView.setEnabled(enabled);
                 }
                 v.setEnabled(enabled);
    

    喜欢源码分析系列可参考其他文章:
    Android源码分析(一)-----如何快速掌握Android编译文件
    Android源码分析(二)-----如何编译修改后的framework资源文件
    Android源码分析(三)-----系统框架设计思想
    Android源码分析(四)-----Android源码编译及刷机步骤

  • 相关阅读:
    .Net自动生成Html新闻系统V1.0 Beta 下载
    Visual Studio .NET 2003中自己找到的一个小技巧[图]
    多表连接的SQL写法(SqlServer、Oracle)
    在线人数统计 V1.0(Asp.net+ SqlServer) 源码下载
    Visual Studio 2005安装后,原来的Asp.net1.1不能执行的解决方法。
    [函数]截取固定长的字符串(双字节的计2位)
    [原创]asp.net 2.0下的自定义树(myTreeView)
    通用的数据库操作助手类
    关于时间国际化的方案
    HTTPS Cipher Suite问题
  • 原文地址:https://www.cnblogs.com/ljx646566715/p/10893923.html
Copyright © 2011-2022 走看看