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。

 

posted on 2012-02-06 12:06  杨军_JuRin  阅读(349)  评论(0编辑  收藏  举报

导航