zoukankan      html  css  js  c++  java
  • MTK6577+Android4.0之增加重启功能

    MTK6577+Android4.0之增加重启功能

     

    长按power按键,弹出下图:


    图1

    这里要实现增加Reboot的功能,下面记下要实现所做的修改。

    1.     在长按power按键弹出的界面增加Reboot界面

     

    首先关机的那个弹出菜单是在

    frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java这个文件中的private AlertDialog createDialog(),如下:

       

     /**
         * Create the global actions dialog.
         * @return A new dialog.
         */
        private AlertDialog createDialog() {
            mSilentModeAction = newSilentModeAction(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 (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 voidchangeStateFromPress(boolean buttonOn) {
                    // In ECM mode airplane statecannot 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 booleanshowBeforeProvisioning() {
                    return false;
                }
               
                //M{
               public boolean isEnabled() {
                   if(KeyguardUpdateMonitor.dual_sim_setting == 0){
                        Log.e(TAG, "if userunselect the dual sim mode setting on phone starting, the airplane mode can notbe set.");
                        return false; //if user hasnot yet selected any item in the dual_sim_mode_setting dialog on phonestarting, the airplane mode should be disabled.
                    }
                    else {
                           returnsuper.isEnabled();
                    }
                }
                //}M
            };
     
            mItems = new ArrayList<Action>();
     
            // first: power off
            mItems.add(
                new SinglePressAction(
                       com.android.internal.R.drawable.ic_lock_power_off,
                       R.string.global_action_power_off) {
     
                    public void onPress() {
                        // shutdown by making sureradio and power are handled accordingly.
                       ShutdownThread.shutdown(mContext, true);
                    }
     
                    public booleanshowDuringKeyguard() {
                        return true;
                    }
     
                    public booleanshowBeforeProvisioning() {
                        return true;
                    }
                });
                 
            
            // next: airplane mode
            mItems.add(mAirplaneModeOn);
     
            // last: silent mode
            if (SHOW_SILENT_TOGGLE) {
                mItems.add(mSilentModeAction);
            }
     
            mAdapter = new MyAdapter();
     
            final AlertDialog.Builder ab = newAlertDialog.Builder(mContext);
     
            ab.setAdapter(mAdapter, this)
                    .setInverseBackgroundForced(true);
     
            final AlertDialog dialog = ab.create();
           dialog.getListView().setItemsCanFocus(true);
           dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
     
            dialog.setOnDismissListener(this);
     
            return dialog;
    }

    上面的代码在// first: power off和// next: airplane mode之间增加了reboot部分,代码如下:

    // second:reboot,kandi add at 2015.01.21
             mItems.add(
                new SinglePressAction(
                       com.android.internal.R.drawable.ic_lock_reboot,
                       R.string.global_action_reboot) {
     
                    public void onPress() {
                        // shutdown by making sureradio and power are handled accordingly.
                        ShutdownThread.reboot(mContext,null, true);
                    }
     
                    public booleanshowDuringKeyguard() {
                        return true;
                    }
     
                    public booleanshowBeforeProvisioning() {
                        return true;
                    }
                });

    此代码主要阐述下面几点:

    (1)  增加字符串global_action_reboot和图片资源ic_lock_reboot,这些的定义在后面描述。

    (2)  ShutdownThread.reboot(mContext,null, true)此函数是调用

    /**
         * Request a clean shutdown, waiting forsubsystems to clean up their
         * state etc.  Must be called from a Looper thread in whichits UI
         * is shown.
         *
         * @param context Context used to displaythe shutdown progress dialog.
         * @param reason code to pass to the kernel(e.g. "recovery"), or null.
         * @param confirm true if user confirmationis needed before shutting down.
         */
        public static void reboot(final Contextcontext, String reason, boolean confirm) {
            mReboot = true;
            mRebootReason = reason;
            shutdown(context, confirm);
    }

    reason 如果值为是null,正常重启;如果是recovery,系统重启进入recovery mode

    confirm true显示关机提示框,需要用户;false不显示提示框,直接关机。


    2.     增加点击Reboot后的重启

    为了在按下重启选项之后,能出现”重启“之类的提示,还需要修改frameworksasecorejavacomandroidinternalapp ShutdownThread.java中的shutdown函数和beginShutdownSequence函数:

     

    (1)  shutdown函数

    修改之前
    final intresourceId = longPressBehavior == 2
        ? com.android.internal.R.string.shutdown_confirm_question
    : com.android.internal.R.string.shutdown_confirm;
    修改之后
    final intresourceId = longPressBehavior == 2
        ? com.android.internal.R.string.shutdown_confirm_question
        : (mReboot ?com.android.internal.R.string.reboot_confirm :
        com.android.internal.R.string.shutdown_confirm);

    (2)  beginShutdownSequence函数

    修改之前:
    pd.setTitle(context.getText(com.android.internal.R.string.power_off));        
    pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
     
    修改之后:
    if(mReboot)
                  {
                         pd.setTitle(context.getText(com.android.internal.R.string.global_action_reboot));
                               pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
                  }
                  else
                  {
                         pd.setTitle(context.getText(com.android.internal.R.string.power_off));
                              pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
                  }

    3.     增加字符串和图片资源

     

    (1)  增加字符串

    在frameworks/base/core/res/res/values/strings.xml中添加一下字符串:

    <stringname="reboot_progress">Reboot...u2026</string>
    <stringname="reboot_confirm" product="default">Your phone willReboot.</string>
    <stringname="reboot_confirm" product="default">Your phone willReboot.</string>
    <stringname="global_action_reboot">Reboot</string>
    <stringname="reboot">Reboot2</string>

    在frameworksasecore es esvaluespublic.xml增加以下字符串

    <publictype="drawable" name="ic_menu_sort_by_size"id="0x0108009d" />//已有
    <publictype="drawable" name="ic_lock_reboot"id="0x0108009e" />//增加


    (2)  增加重启的图片资源

    把ic_lock_reboot.png拷贝到frameworksasecore es esdrawable-hdpi目录下

     

    4.     编译及升级

    ./mk r dr,然后单独升级system.img

  • 相关阅读:
    linux CentOS6.5 yum安装mysql 5.6
    CentOS6.5安装指定的PHP版本(php5.5)(转)
    openssl加密文件过程
    我的投资
    我的unity3d之路_01_序言
    我为什么想转Unity3d
    TensorFlow_01_真正从零开始,TensorFlow详细安装入门图文教程!
    为什么掌握 UML 建模是成为编程高手的一条捷径?
    《UML面向对象建模与设计》一书
    OOAD基本概念
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298300.html
Copyright © 2011-2022 走看看