FreeCalypso > hg > fc-tourmaline
view src/ui/bmi/mmiBookMenuWindow.c @ 26:598958aec071
components: switch to new Nucleus
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 17:26:36 +0000 |
parents | 67bfe9f274f6 |
children | c0052fe355d3 |
line wrap: on
line source
/******************************************************************************* CONDAT (UK) ******************************************************************************** This software product is the property of Condat (UK) Ltd and may not be disclosed to any third party without the express permission of the owner. ******************************************************************************** $Project name: Basic MMI $Project code: BMI (6349) $Module: PhoneBook $File: MmiBookMenuWindow.c $Revision: 1.0 $Author: Condat(UK) $Date: 25/10/00 ******************************************************************************** Description: Menu handling for the phone book ******************************************************************************** $History: MmiBookMenuWindow.c Mar 30, 2007 OMAPS00123019 a0393213(R.Prabakar) Description : Reboot of the target when you unplug/plug USB cable using camera application xrashmic 28 Jun 2006, OMAPS00084172 On pressing back from options menu in camera, the midi stopped playing. Hence added stopRingerVolSettingInactivityTimer under the if(getSoundsReason() == SettingVolume) Sep 01, 2005 REF: CRR 32707 x0021334 Description: Select Softkey dosen't work for the second time on choosing Volume option in Ringer menu Fix: Select soft key operation in volume menu has been modified to fix this problem. Apr 05, 2005 REF: ENH 29994 xdeepadh Description: Implementation of Generic Midi Ringer and Modification of existing Midi Test Application Solution: Generic Midi Ringer and Midi Test Application were implemented. 25/10/00 Original Condat(UK) BMI version. $End *******************************************************************************/ /******************************************************************************* Include Files *******************************************************************************/ #define ENTITY_MFW /* includes */ #include <string.h> #include <stdio.h> #include <stdlib.h> #if defined (NEW_FRAME) #include "typedefs.h" #include "vsi.h" #include "pei.h" #include "custom.h" #include "gsm.h" #else #include "STDDEFS.H" #include "custom.h" #include "gsm.h" #include "vsi.h" #endif #include "mfw_sys.h" #include "mfw_mfw.h" #include "mfw_win.h" #include "mfw_kbd.h" #include "mfw_lng.h" /* SPR#1428 - SH - New Editor changes */ #ifndef NEW_EDITOR #include "mfw_edt.h" #endif #include "mfw_icn.h" #include "mfw_mnu.h" #include "mfw_tim.h" #include "mfw_sim.h" #include "mfw_cm.h" #include "mfw_nm.h" #include "mfw_phb.h" #include "mfw_mme.h" #include "mfw_sat.h" #include "mfw_sms.h" #include "dspl.h" #include "ksd.h" #include "psa.h" #include "MmiMain.h" #include "MmiBookController.h" #include "MmiDummy.h" #include "MmiDialogs.h" #include "MmiLists.h" #include "mmiColours.h" #include "MmiMenu.h" #include "mmiCall.h" #include "Mmiicons.h" #include "MmiIdle.h" #include "MmiSoftKeys.h" #include "MmiSounds.h" #include "MmiIdle.h" #include "MmiNetwork.h" #include "mmiSat_i.h" #include "MmiAoc.h" #include "gdi.h" #include "audio.h" #include "cus_aci.h" #include "mfw_ffs.h" #include "MmiTimers.h" #include "MmiBookShared.h" #include "MmiSettings.h" // for keypadlock #include "MmiSounds.h" #include "MmiIdle.h" extern UBYTE HUPKeyOrigin; // Variable to indicate that long end key press is coming from menu /******************************************************************************* External Function Prototype *******************************************************************************/ /* Fix for the melody and volume settings. 3/4/01 MZ */ extern BOOL getScrollSelectMenuItem(void); extern clearScrollSelectMenuItem(void); extern void volMenuItemSelected(void); extern USHORT getSoundsReason(void); extern void startRingerVolSettingInactivityTimer(void); extern void stopRingerVolSettingInactivityTimer(void); extern void restartVolSettingInactivityTimer(void); //Apr 05, 2005 REF: ENH 29994 xdeepadh #ifdef FF_MIDI_RINGER extern MfwHnd hPlayerStartTimer; /* timeout till start of midi file */ #endif /******************************************************************************* Private Methods *******************************************************************************/ /******************************************************************************* $Function: bookMenuMenuCB $Description: Menu handler for the menu window $Returns: MFW_EVENT_CONSUMED if event handled, otherwise MFW_EVENT_PASSED $Arguments: e, event, m, menu handle *******************************************************************************/ static int bookMenuMenuCB( MfwEvt e, MfwMnu *m ) { T_MFW_HND window = mfwParent( mfw_header() ); T_MFW_WIN *win_data = ((T_MFW_HDR *)window)->data; tBookStandard *data = (tBookStandard *) win_data->user; TRACE_FUNCTION( "bookMenuMenuCB()" ); /* We only handle the ESCAPE event in here */ switch( e ) { case E_MNU_ESCAPE: { /* Escape requested, we need to shut down this window */ if (data->Callback) (data->Callback) (data->parent_win, NULL, NULL); bookMenuDestroy( window ); //xrashmic 28 Jun 2006, OMAPS00084172 //On pressing back from options menu in camera, the midi stopped playing. if(getSoundsReason() == SettingVolume) stopRingerVolSettingInactivityTimer(); } break; default: { /* unknown event, pass it up the tree for handling elsewhere */ return MFW_EVENT_PASSED; } /* break; */ /* RAVI */ } /* We got here, event handled, prevent anyone else dealing with it */ return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: bookMenuDialog $Description: Menu window dialog function $Returns: none $Arguments: win, window handle event, event to be handled value, not used parameter, not used *******************************************************************************/ void bookMenuDialog( T_MFW_HND win, USHORT event, SHORT value, void *parameter ) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; tBookStandard *data = (tBookStandard *) win_data->user; /* MfwMnu *mnu; */ /* RAVI */ TRACE_FUNCTION( "bookMenuDialog()" ); /* The menu dialog function has to deal with initialisation and responses from the PIN2 validation methods */ switch( event ) { case MENU_INIT: { /* On initialisation, we can create the menus and display the window */ data->menu = mnuCreate( data->win, (MfwMnuAttr *) parameter, E_MNU_ESCAPE, (MfwCb) bookMenuMenuCB ); mnuLang( data->menu, mainMmiLng ); mnuUnhide( data->menu ); winShow( data->win ); if (value EQ PhbkMainMenu) { // start the timer for the keypadlock tim_start (data->menu_tim); data->status_of_timer = FALSE; } else { data->status_of_timer = TRUE; } if(value == SettingVolume) { /* The ringer volume settings dialog has been invoked, create and start the 4 second time out. */ /* RAVI - 20-1-2006 */ #ifdef NEPTUNE_BOARD setSoundsReason(SettingVolume); #endif /* END RAVI */ startRingerVolSettingInactivityTimer(); } } break; case ADD_CALLBACK: { /* Change the callback from the default menu callback to one specified * in parameter */ data->Callback = (T_VOID_FUNC)parameter; } break; case DEFAULT_OPTION: { /* Highlight an option in the menu when it is opened. Parameter points to a UBYTE. */ mnuChooseVisibleItem(data->menu, *((UBYTE *)parameter)); } break; case PIN2_OK: { /* We have received a PIN2 authorisation, so we can execute the the requested function */ TRACE_EVENT("PIN2_OK: Should carry on to perform phonebook op"); (data->phbk->pin2_next)( data->phbk->menu, data->phbk->item); } break; case E_MNU_ESCAPE: { /* Escape requested, we need to shut down this window */ bookMenuDestroy( win); } break; default: { /* In situations where a PIN2 abort is returned, we can handle it as a default event, and just ignore it */ TRACE_EVENT("PIN2 not OK"); } break; } } /******************************************************************************* $Function: bookMenuTimCB $Description: Menu tim handler $Returns: $Arguments: *******************************************************************************/ static int bookMenuTimCB (T_MFW_EVENT event, T_MFW_TIM *tc) { T_MFW_HND window = mfwParent( mfw_header() ); T_MFW_WIN *win_data = ((T_MFW_HDR *)window)->data; tBookStandard *data = (tBookStandard *) win_data->user; data->status_of_timer = TRUE; /* ADDED RAVI - 25-11-2005 */ return 0; /* END RAVI */ } /******************************************************************************* $Function: bookMenuWindowCB $Description: Menu window handler $Returns: MFW_EVENT_CONSUMED if event handled, otherwise MFW_EVENT_PASSED $Arguments: e, event, m, window handle *******************************************************************************/ static int bookMenuWindowCB( MfwEvt e, MfwWin *w ) { tBookStandard * data = (tBookStandard *)w->user; MfwMnu * mnu; TRACE_FUNCTION( "bookMenuWindowCB()" ); if (!w) return MFW_EVENT_PASSED; switch( e ) { case MfwWinVisible: { dspl_ClearAll(); // sbh - clear screen before update mnu = (MfwMnu *) mfwControl( data->menu ); /* **Check whether the data is valid, if not use 'sensible' default values */ if (mnu) { if (mnu->curAttr) softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, mnu->curAttr->mnuColour); else softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, COLOUR_LIST_SUBMENU); } else softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, COLOUR_LIST_SUBMENU); } break; default: { /* unknown event, pass it up the tree for handling elsewhere */ return MFW_EVENT_PASSED; } /* break; */ /* RAVI */ } /* We got here, event handled, prevent anyone else dealing with it */ return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: bookMenuKbdCB $Description: tbd $Returns: MFW_EVENT_CONSUMED always $Arguments: e, event, k, key handle *******************************************************************************/ static int bookMenuKbdCB( MfwEvt e, MfwKbd *k ) { static BOOL storeSelectedItemToPcm=FALSE; T_MFW_HND window = mfwParent( mfw_header() ); T_MFW_WIN *win_data = ((T_MFW_HDR *)window)->data; tBookStandard *data = (tBookStandard *) win_data->user; MfwMnu *mnu; U8 keycode; /* SPR#1608 - SH */ TRACE_FUNCTION( "bookMenuKbdCB()" ); /* handle the keypress */ switch (k->code) { case KCD_MNUUP: { // keypadLock will not activate anymore data->status_of_timer = TRUE; /* Update the window with the previous element */ mnuUp( data->menu ); /* Special case when setting up ringer volume, the current ringer is played as user scrolls the volume settings Silent -> cresendo. MZ. */ /* RAVI - 20-1-2006 */ #ifdef NEPTUNE_BOARD if (getSoundsReason () == SettingVolume) { volumeMenuScrollUp(); } #endif /* END RAVI */ if(getScrollSelectMenuItem() == TRUE ||(getSoundsReason() == SettingVolume) ) { mnuSelect(data->menu); /* Scroll up in volume setting */ restartVolSettingInactivityTimer(); } } break; case KCD_MNUDOWN: { // keypadLock will not activate anymore data->status_of_timer = TRUE; /* Update the window with the next element */ mnuDown( data->menu ); /* Special case when setting up ringer volume, the current ringer is played as user scrolls the volume settings Silent -> cresendo. MZ. */ /* RAVI - 20-1-2006 */ #ifdef NEPTUNE_BOARD if (getSoundsReason () == SettingVolume) { volumeMenuScrollDown(); } #endif /* END RAVI */ if((getScrollSelectMenuItem() == TRUE) || (getSoundsReason() == SettingVolume)) { mnuSelect(data->menu); restartVolSettingInactivityTimer(); } } break; case KCD_MNUSELECT: case KCD_LEFT: { // keypadLock will not activate anymore data->status_of_timer = TRUE; // Select this element mnuSelect( data->menu ); /*30 Mar 2007 a0393213 (R.Prabakar) OMAPS00123019 ( Reboot of the target when you unplug/plug USB cable using camera application) The usb enumeration option window has to be destroyed automatically once the user selects an option. Earlier the menu was destroyed in the menu select call back function (mmi_usb_enumeration) and the same menu was accesed further in this function. This was resulting in crash. Now the menu is destroyed in this function and returned immediately. */ #ifdef FF_MMI_USBMS if(usb_opt_win && data->menu==((tBookStandard*)(((MfwWin*)(((T_MFW_HDR *)usb_opt_win)->data))->user))->menu) { bookMenuDestroy(usb_opt_win); usb_opt_win=NULL; break; } #endif mnu = (MfwMnu *) mfwControl( data->menu ); if (mnu != NULL) { if (mnu->curAttr != NULL) { // API - 24-01-03 - 1606 - Soft Key updating add this win Focus check if( winIsFocussed(window) ) softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, mnu->curAttr->mnuColour); } } // A volume or tone setting menu has been entered. MZ 2/4/01 if((getScrollSelectMenuItem() == TRUE) || (getSoundsReason() == SettingVolume)) { TRACE_FUNCTION("@@@@ A volume or tone settin"); /* First time pcm flag is false, subsequent selection of menu item will select and terminate the volume settings menu. 3/4/01 MZ. */ if(storeSelectedItemToPcm ==TRUE || getSoundsReason() == SettingVolume ) { clearScrollSelectMenuItem(); volMenuItemSelected(); storeSelectedItemToPcm =FALSE; mnuEscape( data->menu ); if(getSoundsReason() == SettingVolume) { setSoundsReason(SoundsNone); stopRingerVolSettingInactivityTimer(); } //Apr 05, 2005 REF: ENH 29994 xdeepadh #ifdef FF_MIDI_RINGER //Delete the timer for volume scrolling if(hPlayerStartTimer!=NULL) timDelete(hPlayerStartTimer); #endif break; } /* Second time the left soft key is used, store the setting in pcm and terminate the volume settings menu. */ storeSelectedItemToPcm =TRUE; } } break; // POWER key takes us to idle screen. case KCD_POWER: data->status_of_timer = TRUE; HUPKeyOrigin = 0; // sbh - we're coming from the menu screen, so don't shut down right away //return to idle screen if (data->Callback) (data->Callback) (data->parent_win, NULL, NULL); bookMenuDestroy(data->win); stopRingerVolSettingInactivityTimer(); SEND_EVENT(idle_get_window(), IDLE_UPDATE, 0, 0); break; case KCD_RIGHT: case KCD_HUP: { // keypadLock will not activate anymore data->status_of_timer = TRUE; // Sep 01, 2005 REF: CRR 32707 x0021334 // Set storeSelectedItemToPcm to FALSE to enable proper operation every time instead of // handling it in alterate attempts. storeSelectedItemToPcm = FALSE; HUPKeyOrigin = 0; // sbh - we're coming from the menu screen, so don't shut down right away /* get us out of here */ mnuEscape( data->menu ); mnu = (MfwMnu *) mfwControl( data->menu ); if (mnu != NULL) { if (mnu->curAttr != NULL) { // API - 24-01-03 - 1606 - Soft Key updating add this win Focus check if( winIsFocussed(window) ) softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, mnu->curAttr->mnuColour); } } // Return the menu scroll behavior to normal. if(getScrollSelectMenuItem() == TRUE) { clearScrollSelectMenuItem(); } /* If user exits the volume settings menu from the Idle or Incoming call screen. clear the soundsReason. */ if(getSoundsReason() == SettingVolume) { /* RAVI - 20-1-2006 */ #ifdef NEPTUNE_BOARD /* Restore the volume setting */ restorePreviousVolumeSetting (); #endif /* END RAVI */ stopRingerVolSettingInactivityTimer(); setSoundsReason(SoundsNone); //Apr 05, 2005 REF: ENH 29994 xdeepadh #ifdef FF_MIDI_RINGER //Delete teh timer for volume scrolling if(hPlayerStartTimer!=NULL) timDelete(hPlayerStartTimer); #endif } } break; case KCD_STAR: { /* * Keypadlock will lock only * within two seconds by press "*" */ if(data->status_of_timer EQ FALSE) { TRACE_EVENT ("activate KEYpadLOCK"); mnuEscape( data->menu ); settingsKeyPadLockOn (); } /* SPR#1608 - SH - Otherwise, send '*' keypress to idle screen */ else if (window == data->phbk->menu_main_win) { /* Number key presses in phonebook menu returns user to idle screen, add key press to Idle edit screen. */ keycode = k->code; bookMenuDestroy(data->win); SEND_EVENT(idle_get_window(), IDLE_START_DIALLING_NUMBER, 0, &keycode); } } break; case KCD_HASH: { /* * Keypadlock will lock only * within two seconds by press "*" */ if(data->status_of_timer EQ FALSE) { TRACE_EVENT ("activate Silent mode"); if(FFS_flashData.settings_status & SettingsSilentMode) { settingsSilentModeOff(); } else { settingsSilentModeOn(); } mnuEscape( data->menu ); } /* SPR#1608 - SH - Otherwise, send '#' keypress to idle screen */ else if (window == data->phbk->menu_main_win) { /* Number key presses in phonebook menu returns user to idle screen, add key press to Idle edit screen. */ keycode = k->code; bookMenuDestroy(data->win); SEND_EVENT(idle_get_window(), IDLE_START_DIALLING_NUMBER, 0, &keycode); } } break; default: { TRACE_EVENT("bookMenuKbdCb - DEFAULT!"); /* SH - only allow dialling if we are in the main menu */ if (window == data->phbk->menu_main_win) { /* keypadLock will not activate anymore */ data->status_of_timer = TRUE; /* Number key presses in phonebook menu returns user to idle screen, add key press to Idle edit screen. */ keycode = k->code; bookMenuDestroy(data->win); /* x0045876, 14-Aug-2006 (WR - pointless comparison of unsigned integer with zero) */ /* if ((k->code>=KCD_0 && k->code<=KCD_9)) */ if (k->code<=KCD_9) { TRACE_EVENT("Idle Editor Start!"); SEND_EVENT(idle_get_window(), IDLE_START_DIALLING_NUMBER, 0, &keycode); } } } break; } /* always consume the event */ return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: bookMenuKbdLongCB $Description: keyboard long press event handler $Returns: MFW_EVENT_CONSUMED always $Arguments: e, event, k, key handle *******************************************************************************/ static int bookMenuKbdLongCB( MfwEvt e, MfwKbd *k ) { T_MFW_HND window = mfwParent( mfw_header() ); T_MFW_WIN *win_data = ((T_MFW_HDR *)window)->data; tBookStandard *data = (tBookStandard *) win_data->user; TRACE_FUNCTION( "bookMenuKbdLongCB()" ); if ( ( e & KEY_CLEAR ) && ( e & KEY_LONG ) ) { mnuEscape( data->menu ); return MFW_EVENT_CONSUMED; } /*if long press on END key*/ if ( ( e & KEY_HUP) && ( e & KEY_LONG ) ) { U8 keycode; U8 uMode; uMode = dspl_Enable(0); // keypadLock will not activate anymore data->status_of_timer = TRUE; //return to idle screen keycode = k->code; if (data->Callback) (data->Callback) (data->parent_win, NULL, NULL); bookMenuDestroy(data->win); stopRingerVolSettingInactivityTimer(); SEND_EVENT(idle_get_window(), IDLE_UPDATE, 0, &keycode); dspl_Enable(uMode); } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: bookMenuCreate $Description: Create the menu window $Returns: handle of newly created window, or NULL if error $Arguments: parent, handle of the parent window *******************************************************************************/ static T_MFW_HND bookMenuCreate( MfwHnd parent ) { T_MFW_WIN *parent_win_data = ( (T_MFW_HDR *) parent )->data; T_phbk *phbk = (T_phbk *)parent_win_data->user; T_MFW_WIN *win_data; tBookStandard *data; TRACE_FUNCTION( "bookMenuCreate()" ); /* allocate memory for our control block */ if ( ( data = (tBookStandard *) ALLOC_MEMORY( sizeof( tBookStandard ) ) ) == NULL ) return NULL; /* Create the window if we can */ if ( ( data->win = win_create( parent, 0, E_WIN_VISIBLE, (T_MFW_CB) bookMenuWindowCB ) ) == NULL ) { FREE_MEMORY( (void *)data, sizeof( tBookStandard ) ); return NULL; } /* Okay, we have created the control block and the window, so we now need to configure the dialog and data pointers */ data->mmi_control.dialog = (T_DIALOG_FUNC) bookMenuDialog; data->mmi_control.data = data; win_data = ((T_MFW_HDR *)data->win)->data; win_data->user = (void *) data; data->phbk = phbk; data->parent_win = parent; /* create keyboards and menus for our window */ data->kbd = kbdCreate ( data->win, KEY_ALL, (MfwCb) bookMenuKbdCB ); data->kbd_long = kbdCreate ( data->win, KEY_ALL | KEY_LONG, (MfwCb) bookMenuKbdLongCB ); data->menu_tim = tim_create (data->win, THREE_SECS, (MfwCb) bookMenuTimCB); data->Callback = NULL; // Use standard menu callback (changed by sending event ADD_CALLBACK) /* And return the handle of the newly created window */ return data->win; } /******************************************************************************* Public Methods *******************************************************************************/ /******************************************************************************* $Function: bookMenuStart $Description: tbd $Returns: tbd $Arguments: tbd *******************************************************************************/ T_MFW_HND bookMenuStart( MfwHnd parent, MfwMnuAttr *menuAttr,SHORT reason ) { T_MFW_HND win; win = bookMenuCreate( parent ); if ( win != NULL ) SEND_EVENT( win, MENU_INIT, reason, (MfwMnuAttr *) menuAttr ); return win; } /******************************************************************************* $Function: bookMenuDestroy $Description: Destroy the menu window $Returns: none $Arguments: window, handle of the window being destroyed *******************************************************************************/ void bookMenuDestroy( MfwHnd window ) { T_MFW_WIN *win_data = ((T_MFW_HDR *)window)->data; tBookStandard *data = (tBookStandard *) win_data->user; char test_string[40]; TRACE_FUNCTION( "bookMenuDestroy()" ); if (window == NULL) { TRACE_EVENT ("Error : Called with NULL Pointer"); return; } if ( data ) { /* If we have the root window here then we use the main phone book destroy method */ if ( data->phbk->root_win == window ) { bookPhonebookDestroy( data->phbk->win ); return; } /* Otherwise clear down our pointers and free the current menu window structures */ if ( data->phbk->search_win == window ) data->phbk->search_win = 0; if ( data->phbk->menu_main_win == window ) data->phbk->menu_main_win = 0; if ( data->phbk->menu_options_win == window ) data->phbk->menu_options_win = 0; if ( data->phbk->menu_options_win_2 == window ) data->phbk->menu_options_win_2 = 0; if ( data->phbk->menu_call_options_win == window ) data->phbk->menu_call_options_win = 0; if ( data->phbk->menu_call_options_win_2 == window ) data->phbk->menu_call_options_win_2 = 0; winDelete( data->win ); FREE_MEMORY( (void *)data, sizeof( tBookStandard ) ); sprintf(test_string, "Bookmenudestroy: %d", mfwCheckMemoryLeft()); TRACE_EVENT(test_string); } } /******************************************************************************* End of File *******************************************************************************/