view src/aci2/bmi/mmiBookCallListWindow.c @ 639:026c98f757a6

tpudrv12.h & targets/gtm900.h: our current support is for MGC2GSMT version only As it turns out, there exist two different Huawei-made hw platforms both bearing the marketing name GTM900-B: one is MG01GSMT, the other is MGC2GSMT. The two are NOT fw-compatible: aside from flash chip differences which should be handled by autodetection, the two hw platforms are already known to have different RFFEs with different control signals, and there may be other differences not yet known. Our current gtm900 build target is for MGC2GSMT only; we do not yet have a specimen of MG01GSMT on hand, hence no support for that version will be possible until and unless someone provides one.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 30 Jan 2020 18:19:01 +0000
parents 3c2acfa1a72f
children
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:		    MmiBookCallListWindow.c
 $Revision:		1.0                                                       
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		    25/10/00                                                      
                                                                               
********************************************************************************
                                                                              
 Description:

    This module provides the call list window handling for the phone book.
                        
********************************************************************************
 $History: MmiBookCallListWindow.c

       Aug 24, 2004        REF: CRR  22638 xrashmic
	Bug:  E-Sample switches off when you attempt to look at details of a number 
		  in call list. 
	Fix:   Storing the data in a global variable to be used later.


	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 "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 "MmiTimers.h"

#include "MmiBookShared.h"



/*******************************************************************************
                                                                              
                      Local Data Structure Definitions
                                                                              
*******************************************************************************/

#define NO_FAILURE (-1)
int 			idCounter = 0;
static char		missedCalls[40];
char			calls[10];

//       Aug 24, 2004        REF: CRR  22638 xrashmic
tMmiPhbData		g_temp_current ;


/*******************************************************************************
                                                                              
                               Private Methods
                                                                              
*******************************************************************************/


/*******************************************************************************

 $Function:    	bookCallListSetupEntries

 $Description:	Populates the call list display with the current values
 
 $Returns:		None

 $Arguments:	Current, pointer to the entry in question
 
*******************************************************************************/

static void bookCallListSetupEntries( tMmiPhbData *Current )
{
    T_MFW_PHB_ENTRY	p_pEntry;
	int				index;

	/* search the phone book(s)
	*/
	for ( index = 0; index < Current->list.num_entries; index++ )
	{
		//GW Copy name text (for NO_ASCII set/clear) and length
		//GW but only if there is an entry!
		if ( bookFindNameInPhonebook( (const char *) Current->entry[ index ].number, &p_pEntry ) )
			bookCopyPhbName(&Current->entry[ index ], &p_pEntry, PHONEBOOK_ITEM_LENGTH/*SPR2123*/);
	}
}




/*******************************************************************************

 $Function:    	bookCallListDialog

 $Description:	Dialog functino for the phone book call list window
 
 $Returns:		None

 $Arguments:	win, window handle
                event, event to be handled
				value, not used
				parameter, not used
 
*******************************************************************************/

static void bookCallListDialog( 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;
	tMmiPhbData		*Current    = &data->phbk->current;
	MfwMnu *mnu;
	
	int Failure;
	//Aug 24, 2004        REF: CRR  22638 xrashmic
	//Added a global variable. Also storing the data into this variable after 
	//populating the corresponding variable in this function.	
	g_temp_current = data->phbk->current;
    TRACE_FUNCTION ("bookCallListDialog()");
    TRACE_EVENT ("jgg-bookCallListDialog()");

	/* Handle the dialog events
	*/
    switch (event)
	{
		case CALLS_LIST_INIT:
		{
			/* Initialise message
			*/			
			Current->selectedName = Current->missedCallsOffset;
			data->phbk->current.index		= 1;
			data->phbk->current.status.book = (int)parameter;

			/* If we are currently loading the phone book we can't go any
			   further, so indicate a failure condition
			*/
			Failure = ( phb_get_mode() == PHB_LOADING ) ? TxtPleaseWait : NO_FAILURE;

			/* grab the current status of the phone book, and
			   check that it's okay
			*/
			if ( Failure == NO_FAILURE )
			{
				bookGetCurrentStatus( &data->phbk->current.status );

				/* Issue 2538, MZ 25/09/03 Only read the number of used records from the Service Table
				    when initialising the calls list. */
	
				Failure = ( bookFindName(data->phbk->current.status.used_entries, &data->phbk->current ) != MFW_PHB_OK )
					? TxtReadError : NO_FAILURE;
			}

			/* Check for an empty list
			*/
			if ( Failure == NO_FAILURE )
				Failure = ( data->phbk->current.index == 0 ) ? TxtEmptyList : NO_FAILURE;

			/* api patch 03-04-02
			*/
			if ((Failure != NO_FAILURE) &&  (idCounter > 0))
				Failure = NO_FAILURE;
			
			/* If everything is okay we can try to find the name in the
			   phone book, otherwise Failure will contain an error message
			*/
			if ( Failure == NO_FAILURE )
			{
				bookCallListSetupEntries( &data->phbk->current );
                                //       Aug 24, 2004        REF: CRR  22638 xrashmic
				g_temp_current = data->phbk->current;
				winShow( data->win );
			}
			else
			{
				/* If we get to here and the failure flag isn't NO_FAILURE then
				   it'll be set to the id of the message we need to present, so
				   show the information dialog and destroy the call list window
				*/
				bookShowInformation( data->phbk->win, Failure, NULL, NULL );
				bookCallListDestroy( data->win );
			}
		}
		break;
		case SEARCH_SCROLL_UP:
		{
			/* Scroll up
			*/
			if(( Current->selectedName == 1) && (Current->status.used_entries == 1))
				Current->selectedName = Current->selectedName;
							
			else if ( ( Current->index == 1 ) && ( Current->selectedName == Current->missedCallsOffset ) )
			{
				if ( (Current->status.used_entries + Current->missedCallsOffset) < MAX_SEARCH_CALL_LIST )
					Current->selectedName = Current->status.used_entries -1;
				else
					Current->selectedName =  MAX_SEARCH_CALL_LIST - 1;
				Current->index = Current->status.used_entries + Current->missedCallsOffset - Current->selectedName;
			}	
			else
			{
				if(Current->selectedName == Current->missedCallsOffset)
				{
					if(Current->index == 1 + Current->missedCallsOffset)
						Current->selectedName = Current->missedCallsOffset;
					Current->index--;
				}
				else
					Current->selectedName--;
			}
			mnu = (MfwMnu *) mfwControl( data->menu );
			mnu->lCursor[mnu->level] = Current->selectedName;
			bookFindName( MAX_SEARCH_CALL_LIST, &data->phbk->current );
			bookCallListSetupEntries( &data->phbk->current );
		}
		break;

		case SEARCH_SCROLL_DOWN:
		{
			/* Scroll Down
			*/		
			if ( ( Current->index + Current->selectedName ) == Current->status.used_entries + Current->missedCallsOffset)
			{
				Current->index = 1;
				Current->selectedName = 0 + Current->missedCallsOffset;
			}
			else
			{
				if ( Current->selectedName == MAX_SEARCH_CALL_LIST - 1 )
					Current->index++;
				else
					Current->selectedName++;
			}
			mnu = (MfwMnu *) mfwControl( data->menu );
			mnu->lCursor[mnu->level] = Current->selectedName;
			bookFindName( MAX_SEARCH_CALL_LIST, &data->phbk->current );
			bookCallListSetupEntries( &data->phbk->current );
		}
		break;

		default:
		{
			/* No need to deal with any other events
			*/
		}
		break;
	}
}


/*******************************************************************************

 $Function:    	bookCallListWinCB

 $Description:	Window Event Handler
 
 $Returns:		MFW_EVENT_CONSUMED if event handled, otherwise MFW_EVENT_PASSED

 $Arguments:	standard window event handler, e, event, w, window handle
 
*******************************************************************************/

static int bookCallListWinCB( MfwEvt e, MfwWin *w )
{
	tBookStandard	*data = (tBookStandard *)w->user;
	tMmiPhbData		*Current    = &data->phbk->current;
	char			*ptr;
//	MfwMnu *mnu;	    // RAVI
	int				index, i;
//	int				Withheld;   // RAVI
	int				displayStart, missedOutput;  


	TRACE_FUNCTION("bookCallListWinCB");
	missedOutput = FALSE;

	/* api introduction to display withheld numbers in recent calls list
	   03-04-02
	*/
	switch( e )
    {
        case MfwWinVisible:
		{	
			/* Handle the window visible event, show default screen,
			   populate the call list menu and put up default soft keys
			*/
			TRACE_EVENT_P1("<<<<idCounter Value is %d", idCounter);			
		    MmiBookShowDefault();

			if(idCounter > 0)
			{
				missedOutput = TRUE;
				displayStart = 1;
				strcpy(missedCalls,MmiRsrcGetText(TxtUnknown));
				strcat(missedCalls,": ");
				sprintf(calls,"%d",idCounter);
				strcat(missedCalls,calls);
				data->phbk->current.missedCallsOffset = 1;
				strcpy( (char*)MmiBookCallList( 0 ), (char*)missedCalls);
			}
			else
				displayStart = 0;
			
			index = 0;
			
			for ( i = displayStart; i < NAME_LIST_SIZE; i++ )
			{
#ifdef NO_ASCIIZ
				if ( data->phbk->current.entry[index].name.len > 0 )
					ptr = (char *) data->phbk->current.entry[index].name.data;
				else if(strlen((char *) data->phbk->current.entry[index].number) > 0)
					ptr = (char *) data->phbk->current.entry[index].number;
				else
					ptr = "";

#else
				if ( strlen( (char *) data->phbk->current.entry[index].name ) > 0 )
					ptr = (char *) data->phbk->current.entry[index].name;
				else if (strlen((char *) data->phbk->current.entry[index].number) > 0)
					ptr = (char *) data->phbk->current.entry[index].number;
				else
					ptr = "";
#endif				

					strcpy( (char*)MmiBookCallList( i ), ptr);
					TRACE_FUNCTION((char*)MmiBookCallList( i ));
					index ++;
					strcpy( (char*)MmiBookCallList( index ), (char*)ptr);
					TRACE_EVENT((char*)MmiBookCallList( index ));
			}

			mnuUnhide(data->menu);
			
			if((idCounter > 0) && (Current->status.used_entries == 0))
				displaySoftKeys( TxtNull, TxtSoftBack );
			else if((idCounter > 0) && (Current->status.used_entries > 0))
				displaySoftKeys( TxtSoftOptions, TxtSoftBack );
			else
				displaySoftKeys( TxtSoftOptions, TxtSoftBack );
		}
		break;

        default:
		{
			/* If it's not a window visible event we ignore it and
			   pass it back up the tree to be handled
			*/
			return MFW_EVENT_PASSED;
		}
//		break;   // RAVI
    }

    return MFW_EVENT_CONSUMED;
}


/*******************************************************************************

 $Function:    	bookCallListKbdCB

 $Description:	Keyboard event handler
 
 $Returns:		MFW_EVENT_CONSUMED always

 $Arguments:	e, event, k, keyboard handle
 
*******************************************************************************/

static int bookCallListKbdCB( MfwEvt e, MfwKbd *k )
{
    T_MFW_HND		win			= mfwParent( mfw_header() );
    T_MFW_WIN		*win_data	= ((T_MFW_HDR *)win)->data;
    tBookStandard	*data		= (tBookStandard *) win_data->user;
    tMmiPhbData		*Current    = &data->phbk->current;


	/* Handle the events provided by the key
	*/
    switch (k->code)
    {
        case KCD_MNUUP:
        {
	        SEND_EVENT( data->win, SEARCH_SCROLL_UP, 0, 0 );
            winShow(win);
		}
        break;

        case KCD_MNUDOWN:
		{
	        SEND_EVENT( data->win, SEARCH_SCROLL_DOWN, 0, 0 );
            winShow(win);
		}
        break;
        case KCD_RIGHT:
			bookPhonebookDestroy( data->phbk->win );
		break;
		case KCD_CALL:
		{
			/* selected to call the number
			*/
			mnuHide( data->menu );
			callNumber( data->phbk->current.entry[data->phbk->current.selectedName - data->phbk->current.missedCallsOffset].number );
			bookPhonebookDestroy( data->phbk->win );
		}
        break;

		case KCD_MNUSELECT:
        case KCD_LEFT:
		{
			/* Selected the options menu so display them
			*/
			if(Current->status.used_entries > 0)
				data->phbk->menu_call_options_win = bookMenuStart( data->phbk->win, bookRepRedOptionsMenuAttributes(),0 );
			else
				break;
		}
        break;

        case KCD_HUP:
		{
			/* Selected to get out of here, so destroy the window
			*/
			bookCallListDestroy( data->win );
		}
		break;

		default:
		{
			/* No other handling required here
			*/
		}
		break;
    }

	/* Always consume the event
	*/
    return MFW_EVENT_CONSUMED;
}


/*******************************************************************************

 $Function:    	bookCallListKbdLongCB

 $Description:	Keyboard Long Press event handler
 
 $Returns:		MFW_EVENT_CONSUMED always

 $Arguments:	e, event, k, keyboard handle
 
*******************************************************************************/

static int bookCallListKbdLongCB( MfwEvt e, MfwKbd *k )
{
    T_MFW_HND		win			= mfwParent( mfw_header() );
    T_MFW_WIN		*win_data	= ((T_MFW_HDR *)win)->data;
    tBookStandard	*data		= (tBookStandard *) win_data->user;

	/* hand a long clear event only
	*/
	if ( ( e & KEY_CLEAR ) && ( e & KEY_LONG ) )
		bookCallListDestroy( data->win );

	return MFW_EVENT_CONSUMED;
}




/*******************************************************************************

 $Function:		bookCallListCreate

 $Description:	Create the call list window
 
 $Returns:		Handle of the window, or NULL if there is an error

 $Arguments:	parent, handle of the parent window
 
*******************************************************************************/

static T_MFW_HND bookCallListCreate( 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;	
	MfwMnu *mnu;

	TRACE_FUNCTION ("bookCallListCreate()");

	/* 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) bookCallListWinCB ) ) == NULL )
	{
		FREE_MEMORY( (void *)data, sizeof( tBookStandard ) );
		return NULL;
	}
	/*SPR 2123, MC allocate memory for phonebook list*/
	if (create_mmi_phonebook_names_list() == NULL)
		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) bookCallListDialog;
    data->mmi_control.data		= data;
    win_data					= ((T_MFW_HDR *)data->win)->data;
 	win_data->user				= (void *) data;
	data->phbk					= phbk;
	data->phbk->root_win        = data->win;
	data->phbk->calls_list_win  = data->win;
	data->parent_win			= parent;

	/* create keyboards and menus for our window
	*/
	data->kbd		= kbdCreate( data->win, KEY_ALL,            (MfwCb) bookCallListKbdCB );
    data->kbd_long	= kbdCreate( data->win, KEY_ALL | KEY_LONG, (MfwCb) bookCallListKbdLongCB );
	data->menu		= mnuCreate( data->win, (MfwMnuAttr *)MmiBookMenuDetailsList(), 0, 0 );

	mnu = (MfwMnu *) mfwControl( data->menu );
	
	/* api 19-04-02 - path to move cursor down one 
	in missed calls list. */

	if(idCounter > 0)
		mnu->lCursor[mnu->level] = 1;
	else
		mnu->lCursor[mnu->level] = 0;
	
	mnuScrollMode(data->menu,0);

	/* allow the window and menu to be created
	*/
	mnuUnhide(data->menu);
	winShow(data->win);

	/* And return the handle of the newly created window
	*/
    return data->win;
}


/*******************************************************************************
                                                                              
                               Public Methods
                                                                              
*******************************************************************************/

/*******************************************************************************

 $Function:    	bookCallListStart

 $Description:	Entry point for the call list window
 
 $Returns:		Handle of window

 $Arguments:	parent, handle of parent window
 
*******************************************************************************/

T_MFW_HND bookCallListStart( MfwHnd parent,int parameter )
{
	T_MFW_HND win;

	/* create and initialise the window
	*/
    if ( ( win = bookCallListCreate( parent ) ) != NULL )
		SEND_EVENT( win, CALLS_LIST_INIT, 0, (void*)parameter );

	/* return the handle, or NULL if we have had an error
	*/
    return win;
}


/*******************************************************************************

 $Function:    	bookCallListDestroy

 $Description:	destroys the call list window
 
 $Returns:		None

 $Arguments:	window, the window to be killed
 
*******************************************************************************/

void bookCallListDestroy( MfwHnd window )
{
	T_MFW_WIN		*win  = ((T_MFW_HDR *)window)->data;
	tBookStandard	*data = (tBookStandard *)win->user;

	TRACE_FUNCTION ("bookCallListDestroy()");
	/* Remove the Withheld counter from the list
	*/
	idCounter = 0;
	memset (missedCalls, '\0', 40);
	memset(calls, '\0', 10);
	
	/* Only actually do something if the data pointer is valid
	*/
	if ( ! data )
		return;


	/* If we are the root window then we need to deal with the
	   phonebook destruction
	*/
	if (  data->phbk->root_win == window )
		bookPhonebookDestroy(data->phbk->win);
	else
	{
		/* delete our window and free the allocated memory
		*/
		data->phbk->calls_list_win = 0;
		winDelete ( data->win );
		FREE_MEMORY( (void *)data, sizeof( tBookStandard ) );
	}
	/*SPR2123, MC deallocate memory for phonebook list*/
	destroy_mmi_phonebook_names_list(MmiBookMenuDetailsList());
}



/*******************************************************************************
                                                                              
                                End of File
                                                                              
*******************************************************************************/