MTK6225-IDLE SCREEN键盘锁与解锁

开机函数执行过程(倒过来看):

EntryIdleScreen() line 3082

BeforeEntryIdleScr() line 5254

mmi_bootup_entry_network_searching() line 1464

mmi_bootup_exit_welcome_screen() line 1390

ShowWelcomeScr() line 5076

exit_custom_startup_screen() line 448

goto_opening_screen() line 419

SimPasswdReqResponse(void * 0x0a890d80 _gSMUPwdDataStruct) line 3950

PowerOnBatteryIndicationCompletePhase2() line 5908 + 10 bytes

mmi_bootup_entry_security_check() line 1311

mmi_bootup_exit_nand_check_query() line 1288

PowerOnBatteryIndicationComplete() line 5974

mmi_bootup_entry_nand_check_query() line 1262

mmi_bootup_exit_low_battery_warning() line 1239

BatteryCheckAfterPowerOnAnimation() line 6012

mmi_bootup_entry_low_battery_warning() line 1213

mmi_bootup_exit_animation() line 1189

CallBackPowerOnAnimationComplete(int 0) line 6093

mmi_pwron_show_image_callback(int 0) line 682 + 7 bytes

cat166_animation_complete_callback_int(int 0) line 12968 + 12 bytes

gdi_anim_callback_timer(void * 0x000000d9) line 143 + 16 bytes

TimerCallBack(void * 0x00000000) line 254 + 9 bytes

MMI_task(void * 0x0000000b) line 1713 + 15 bytes

 

变量:gIsIdleScreenReentry用来控制是否是重复进入IDLE SCREEN,以便设置自动键盘锁和屏幕保护。 通过在simulator操作,发现只有在一种情况下,这个变量才为1,也就是重复进入IDLE SCREEN。即:已经处于IDLE SCREEN时,进入自动键盘锁。这个时候,再次进入函数EntryIdleScreen时,gIsIdleScreenReentry就为1。 在其他情况下,进入IDLE SCREEN,都算作第一次进入。

 

假如是开机第一次进入:

EntryIdleScreen()

{

       gIsIdleScreenReentry = TRUE;

       g_idle_context.IsOnIdleScreen = 1;

       g_idle_context.IsOnDialerScreen = 0;

 

       if (!gIsIdleScreenReentry)

       {

             mmi_idle_start_keypad_lock();

                这个函数:如果当前键盘没context.gKeyPadLockFlag=0),就读取自动键盘锁的时间。如果时间大于0的话,就启动定时器:

                     IDLE_APP_AUTO_LOCK_TIMER_ID,响应:IdleSetKeyPadLockFlag()。

              mmi_idle_start_screensaver();

                   这个函数:如果屏幕保护开启,就启动定时器:SCREENSAVER_TIMER,应是:

                  EntryIdleSetScreenSaver()。

     }

     gIsIdleScreenReentry = MMI_FALSE;

 

       if (g_keylock_context.gKeyPadLockFlag == 0)   //键盘没有锁

       {

              mmi_idle_entry_idle_screen();   /* idle screen */

       }
       else

       {

              mmi_idle_set_keypad_lock_string();     //设置左右软件的显示

                     先初始化

                         g_keylock_context.KeyLockRSKStringID = 0;

                         g_keylock_context.KeyLockRSKIconID = 0;

                         g_keylock_context.KeyLockLSKStringID = 0;

                         g_keylock_context.KeyLockLSKIconID = 0;

                     然后:g_keylock_context.KeyLockRSKStringID =开锁;

 

              ShowCategory33Screen();

 

              //设置左软件:解锁

              SetLeftSoftkeyFunction(EntryScrAfterPessingRSK, KEY_EVENT_DOWN);

 

              IdleSetLRKey();

       }

}

 

 

//进入IDLE的函数:

void mmi_idle_entry_idle_screen(void)

{

       ShowCategory33Screen()//左软件:菜单;右软件:电话簿

       SetGroupKeyHandler(HandleIdleScreenDigitEntry);  //处理数字输入

       IdleSetLRKey();              //设置左软件,右软件的响应

}

void IdleSetLRKey(void)

{

       if (g_keylock_context.gKeyPadLockFlag)    //键盘锁

       {

              //主要是有触摸屏时的一些设置

       }

       else

       {

              //左软件:进入主菜单;右软件:进入电话簿

              SetLeftSoftkeyFunction(EntryMainMenuFromIdleScreen, KEY_EVENT_UP); 

             SetRightSoftkeyFunction(mmi_phb_idle_enter_phb_list, KEY_EVENT_UP);

       }
}

      

 

键盘锁分2中:手动和自动。

1.手动键盘锁

       在进入IDLE SCREEN时,如果键盘没有锁,左软件的响应是进入主菜单:EntryMainMenuFromIdleScreen()

{

       #ifdef __MMI_KEYPAD_LOCK_PATTERN_2__

           g_idle_context.ToMainMenuScrFromIdleApp = 1;

       #endif

      goto_main_menu();

}

 

void goto_main_menu(void)

{

       获取显示信息;

       ShowCategory14Screen(); 显示九宫图(根据显示风格设置)

      

       #if (defined(__MMI_KEYPAD_LOCK_PATTERN_2__)

              && !defined(__MMI_DISABLE_KEYPAD_LOCK__))

           if (g_idle_context.ToMainMenuScrFromIdleApp == 1)       //从IDLE进入的

           {

                   //在KEYPAD_LOCK_TIMEOUT时间之内,如果按下*,则锁键盘。如果超时,则*键锁键

                    盘失效。

                     //函数IdleHandleKeypadLockProcess ()的作用就是停止定时器,并设置变量

                     g_idle_context.ToMainMenuScrFromIdleApp = 0(使*键失效)。

               StartTimer(KEYPAD_LOCK_TIMER, KEYPAD_LOCK_TIMEOUT,

                                          IdleHandleKeypadLockProcess);

               SetKeyHandler(IdleHandlePoundKeyForKeypadLock, KEY_STAR,

                                          KEY_EVENT_UP);

           }

       #endif

      register_menu_shortcut_selected(main_menu_shortcut_executer);     //快捷操作

      SetRightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);          

}

 

此时按下*键,进入:

void IdleHandlePoundKeyForKeypadLock(void)

{

       #ifdef __MMI_KEYPAD_LOCK_PATTERN_2__

           if (g_idle_context.ToMainMenuScrFromIdleApp == 0)

           {

                //就是上面超时响应函数IdleHandleKeypadLockProcess()的杰作:让*失效。

               return;

           }

           g_idle_context.ToMainMenuScrFromIdleApp = 0;

       #endif

      

       //开始锁键盘

       StopTimer(KEYPAD_LOCK_TIMER);

       g_keylock_context.gKeyPadLockFlag = 1;

 

       IdleSetStatusIcon(STATUS_ICON_KEYPAD_LOCK);

       DisplayIdleScreen();

}

void DisplayIdleScreen(void)

{

       ExecuteRootMainHistoryScreen(NULL);

}

U8 ExecuteRootMainHistoryScreen(void *funcPtr)

{

       historyData[0].entryFuncPtr();//回到Idle screen的入口函数:EntryIdleScreen()。此

       时进入时,键盘就是锁定的了。并且注册左软件的解锁响应函数:

       EntryScrAfterPessingRSK()                                                     

}

 

2.自动键盘锁

定时器IDLE_APP_AUTO_LOCK_TIMER_ID溢出,进入自动锁屏:

void IdleSetKeyPadLockFlag(void)

{

       g_keylock_context.gKeyPadLockFlag = 1;

       if (g_idle_context.ScreenSaverRunFlag != 1)       //屏保没有执行

       {

              EntryIdleScreen(); 

              SetGroupKeyHandler(NULL, (PU16) PresentAllKeys,               //使按键失效

                            (U8) TOTAL_KEYS , KEY_EVENT_DOWN);

 

              IdleSetStatusIcon(STATUS_ICON_KEYPAD_LOCK);

       }

       else

       {

             

       }

}

 

问题:在自动键盘锁中,有明确的使其他按键失效的代码。那么在手动锁键盘时,在哪里使其他按键失效呢?

解答: simulator跟踪(执行顺序反过来看)

ClearKeyHandler(unsigned short 0, unsigned short 0) line 1684

reset_menu_shortcut_handler() line 1005 + 9 bytes

ExitCategory14Screen() line 2895

dm_exit_category_function() line 1486 + 8 bytes

UI_common_screen_exit() line 1145 + 8 bytes

ExecuteCurrExitHandler_Ext() line 1244

ExecuteCurrExitHandler() line 1055

EntryNewScreen(unsigned short 20501, void (void)* 0x004c77d0 ExitIdleScreen(void), void (void)* 0x00000000, void * 0x00000000) line 1131

EntryIdleScreen() line 3124 + 19 bytes

ExecuteRootMainHistoryScreen(void * 0x00000000) line 2890 + 8 bytes

DisplayIdleScreen() line 2790 + 7 bytes

IdleHandlePoundKeyForKeypadLock() line 5700

 

ExitCategory14Screen()

{

       reset_softkeys();

       reset_menu_shortcut_handler();

       {

              clear_keyboard_input_handler();

              ClearKeyHandler(KEY_0, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_1, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_2, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_3, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_4, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_5, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_6, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_7, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_8, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_9, KEY_EVENT_DOWN);

       }

       reset_fixed_list();

       {

              clear_keyboard_key_handler();

              ClearKeyHandler(KEY_UP_ARROW, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_DOWN_ARROW, KEY_EVENT_DOWN);

       }

       reset_fixed_matrix();

       {

              clear_keyboard_key_handler();

              ClearKeyHandler(KEY_UP_ARROW, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_DOWN_ARROW, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_LEFT_ARROW, KEY_EVENT_DOWN);

              ClearKeyHandler(KEY_RIGHT_ARROW, KEY_EVENT_DOWN);

       }

}

      

然后清除左软件,右软件:

clear_softkey_handler(int 10) line 1288

clear_category_screen_key_handlers() line 599 + 7 bytes

SetupCategoryKeyHandlers() line 2578

ShowCategory33Screen_ext(unsigned short 20511, unsigned short 0, unsigned short 0, unsigned short 0, unsigned char * 0x00000000) line 3945

ShowCategory33Screen(unsigned short 20511, unsigned short 0, unsigned short 0, unsigned short 0, unsigned char * 0x00000000) line 4165 + 29 bytes

EntryIdleScreen() line 3463 + 38 bytes

 

 

解锁

void EntryScrAfterPessingRSK(void)

{

       ShowCategory64Screen() //显示:按 * 解按键锁

 

       //启动超时定时器

       StartTimer(KEYPADUNLOCKEDHELPMESSAGE_TIMER,                                                                   

                  KEYPADUNLOCK_TIMEOUT, GoBackHistory);

 

       SetGroupKeyHandler(GoBackHistory, (PU16) PresentAllKeys,

                          (U8) TOTAL_KEYS, (U16) KEY_EVENT_DOWN);

 

       //*键解锁响应

       SetKeyHandler(HandlePoundKeyForUnlock, KEY_STAR, KEY_EVENT_DOWN);

       playRequestedTone(SUCCESS_TONE);

       TurnOnBacklight(1);

}

 

在定时器溢出之前,按下*键:

void HandlePoundKeyForUnlock(void)

{

       StopTimer(KEYPADUNLOCKEDMESSAGE_TIMER);

       g_keylock_context.gKeyPadLockFlag = 0;

 

       playRequestedTone(SUCCESS_TONE);

       EntryScrKeyPadUnlockMessage();

              这个函数显示信息:解除键盘锁,启动定时器:

              KEYPADUNLOCKEDMESSAGE_TIMER:GoBackHistory().

              并注册:SetGroupKeyHandler(DisplayIdleScreen, (PU16) PresentAllKeys);

       IdleResetStatusIcon(STATUS_ICON_KEYPAD_LOCK);

}

定时器溢出后,GoBackHistory(),进入IDLE SCREEN。

 

     以上是在学习中整理,如有错误,请不吝赐教!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IOT物联网小镇

赏点银子去植发

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

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

打赏作者

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

抵扣说明:

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

余额充值