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。
以上是在学习中整理,如有错误,请不吝赐教!