view src/aci2/bmi/mmiBookInputWindow.c @ 662:8cd8fd15a095

SIM speed enhancement re-enabled and made configurable TI's original code supported SIM speed enhancement, but Openmoko had it disabled, and OM's disabling of speed enhancement somehow caused certain SIM cards to start working which didn't work before (OM's bug #666). Because our FC community is much smaller in year 2020 than OM's community was in their day, we are not able to find one of those #666-affected SIMs, thus the real issue they had encountered remains elusive. Thus our solution is to re-enable SIM speed enhancement and simply wait for if and when someone runs into a #666-affected SIM once again. We provide a SIM_allow_speed_enhancement global variable that allows SIM speed enhancement to be enabled or disabled per session, and an /etc/SIM_spenh file in FFS that allows it to enabled or disabled on a non-volatile basis. SIM speed enhancement is now enabled by default.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 24 May 2020 05:02:28 +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:		    MmiBookInputWindow.h
 $Revision:		1.0                                                       
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		    25/10/00                                                      
                                                                               
********************************************************************************
                                                                              
 Description:

    This module provides the functionality for the input window of the
	phone book module.
	                    
********************************************************************************
 $History: MmiBookInputWindow.h

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

#include "MmiBookShared.h"
#ifdef EASY_TEXT_ENABLED
#include "MmiChineseInput.h"
#endif

#include "mmiColours.h"
/* SPR#1428 - SH - New Editor
 * This file is obsolete with new editor and should not be compiled */
#ifndef NEW_EDITOR

#define NAME 	0
#define NUMBER  1

static int DoNextLongPress = FALSE;
static UBYTE UPPER_CASE = TRUE;
static UBYTE MODE;
extern int upCase;


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

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

 $Function:		bookInputDialog

 $Description:	Dialog function for the input window
 
 $Returns:		None

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

static void bookInputDialog( 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;
	tInputSpecifics	*properties = (tInputSpecifics *) parameter;

    TRACE_FUNCTION ("bookInputDialog()");

	/* Handle the input event, ew only deal with initialise and
	   destroy of the window in here
	*/
    switch( event )
	{
		case INPUT_INIT:
		{
			/* Initialise the input window
			*/
			data->properties.abc			= properties->abc;
			data->properties.text			= properties->text;
			data->properties.edt_attr_input	= properties->edt_attr_input;
			data->properties.left_soft_key	= properties->left_soft_key;
			data->properties.right_soft_key = properties->right_soft_key;
			data->properties.callback		= properties->callback;
            data->edt						= edtCreate( data->win, data->properties.edt_attr_input, 0, 0 );

			/* activate our editor, stopping any others before doing so
			*/
			editDeactivate();
			editActivate( data->edt, properties->abc );
			edtChar( data->edt, ecBottom );

			/* show the window
			*/
			winShow( data->win );
		}
		break;

		case INPUT_DESTROY:
		{
			/* destroy the input window
			*/
			bookInputDestroy( win );
		}
		break;
	}
}






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

 $Function:		bookInputWindowCB

 $Description:	Window event handler
 
 $Returns:		MFW_CONSUMED for the visible event, MFW_PASSED otherwise

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

static int bookInputWindowCB( MfwEvt e, MfwWin *w )
{
	tBookStandard *data = (tBookStandard *) w->user;

    TRACE_FUNCTION ("bookInputWindowCB()");

	/* Handle the visible event, otherwise return MFW_EVENT_PASSED
	*/
	switch( e )
    {
        case MfwWinVisible:
		{
			/* Window visible
			*/
		    MmiBookShowDefault();
			edtShow( data->edt );
		    PROMPT( MmiBookMenuArea().px, MmiBookMenuArea().py, 0, data->properties.text );
			softKeys_displayId(data->properties.left_soft_key, data->properties.right_soft_key, 0, COLOUR_LIST_SUBMENU);
		}
		break;

        default:
		{
			/* unabel to handle event, pass handling of event back up tree
			*/
			return MFW_EVENT_PASSED;
		}
    }

	/* if we get here, we have handled the event
	*/
    return MFW_EVENT_CONSUMED;
}






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

 $Function:		bookInputKbdCB

 $Description:	Input window keyboard handler
 
 $Returns:		MFW_EVENT_CONSUMED always, this will pass LEFT, RIGHT and CLEAR
				events back to the calling window using the installed callback
				method

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

static int bookInputKbdCB( 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;

    TRACE_FUNCTION ("bookInputKbdCB()");

	/* make sure the active editor is ours
	*/
    if ( activeEditor() != data->edt )
        editActivate( data->edt, data->properties.abc );

	/* Handle the key press
	*/
    switch (k->code)
    {
		case KCD_MNUUP:
		{
			/* move right
			*/
			edtChar( data->edt, ecRight );
		}
		break;

	    case KCD_MNUDOWN:
		{
			/* move left
			*/
		    edtChar( data->edt, ecLeft );
		}
		break;

		case KCD_MNUSELECT:
	    case KCD_LEFT:
		{
			/* select the entry using the parent window callback
			*/
		    data->properties.callback( data->parent_win, INPUT_LEFT );
		   
		}
		break;

		case KCD_HUP:
		{
            /* get edit control block
			*/
            MfwEdt *edt = ( (MfwHdr *) data->edt )->data;

                data->properties.callback( data->parent_win, INPUT_CLEAR );
		}
		break;

		case KCD_RIGHT:
		{
			MfwEdt *edt = ( (MfwHdr *) data->edt )->data;
			/* select the entry using the parent windows callback
			*/
			//If we have any data input, delete the char before cursor
			if ( edt->attr->text[0] )
				edtChar( data->edt, ecBack );
			else	
			{
				data->properties.callback( data->parent_win, INPUT_RIGHT );
				displaySoftKeys_edition (TxtNull, TxtNull ,TxtNull);
				MODE = NUMBER;
			}
			 
		}
		break;

		case KCD_HASH:
		{
			/* deal with hash key 
			*/
	        edtChar( data->edt, '#' );
		}
		break;

	    case KCD_STAR:
		{
			/* deal with star key
			*/
		    edtChar( data->edt, '*' );
		}
		break;

	    default:
		{
			/* default handling for the key being pressed
			*/

			/*NM, p015a    */
			/* it is better to use these two function for different mode*/
			if (data->properties.abc EQ TRUE)
				editEventKey(e, k); /* alpha-mode*/
			else
				edtChar(data->edt ,editControls[k->code]); /*digit -mode*/

			edtShow(data->edt);
			/*p015a  end  */
			
		}
		break;
    }

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






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

 $Function:		bookInputKbdLongCB

 $Description:	Keyboard long event handler
 
 $Returns:		MFW_EVENT_CONSUMED always

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

static int bookInputKbdLongCB( 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;

    TRACE_FUNCTION ("bookInputKbdLongCB()");


    /* subpress unwanted longpresses (mfw throws more than one long press event for one long press on a key)*/
    if ( e & KEY_LONG )
    {
	   	if ( DoNextLongPress EQ FALSE )
	       DoNextLongPress = TRUE; 
		else
	       DoNextLongPress = FALSE; 
    }
    if ( !DoNextLongPress )
        return MFW_EVENT_CONSUMED;      /* don't do current long press */

	

	/* Handling the long keypress events needs to deal with a 
	   number of characters in the input window, not just the
	   normal clear event
	*/
	
	/* if the event is long key clear and the buffer is not empty then
	   clear the buffer.  Otherwise if the buffer is empty then destroy
	   the input editor
	*/

	switch(k->code)
	{
		case KCD_HUP:	
		{
		    MfwEdt *edt;

			/* get edit control block
			*/
			edt = ((MfwHdr *) data->edt)->data;
	
			/* if buffer empty then kill the editor window, otherwise clear the buffer
			*/
			if ( edt->attr->text[0] )
			{
				char *c_ptr = data->properties.edt_attr_input->text;
				memset( c_ptr, '\0', strlen( c_ptr ) );
				edtReset( data->edt );
				edtShow( data->edt );
			}
			else
				bookInputDestroy( data->win );
		}
		break;

		case KCD_HASH:
			edtChar( data->edt, ecBack );
			edtChar( data->edt, 'p' );
		break;

		case KCD_0:
			edtChar( data->edt, ecBack );
			edtChar( data->edt, '+' );
		break;


		default:
		if (MODE EQ NAME)
		{
			
			if (UPPER_CASE EQ FALSE)
			{
				TRACE_EVENT("UPPER_CASE EQ FALSE");
				UPPER_CASE = TRUE;
				upCase = FALSE;	
				displaySoftKeys_edition (TxtLowercase, TxtNull ,TxtNull);														

			}
			else
			{
			    TRACE_EVENT("UPPER_CASE EQ TRUE");
				UPPER_CASE = FALSE;		
				upCase = TRUE;
				displaySoftKeys_edition (TxtUppercase, TxtNull ,TxtNull);														
			}
			edtChar(data->edt, ecBack);
		}
			break;
			
	}

	/* always handle the event
	*/
	return  MFW_EVENT_CONSUMED;
}





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

 $Function:		bookInputCreate

 $Description:	Create the input window and asociate it's handlers
 
 $Returns:		handle of new window, or NULL if failure

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

static T_MFW_HND bookInputCreate( MfwHnd parent )
{
    T_MFW_WIN		*parent_win_data    = ( (T_MFW_HDR *) parent )->data;
    tBookStandard   *parent_data        = (tBookStandard *) parent_win_data->user;
	T_phbk			*phbk               = parent_data->phbk;
	T_MFW_WIN		*win_data;
	tBookStandard	*data;

	TRACE_FUNCTION ("bookInputCreate()");

	/* 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) bookInputWindowCB ) ) == 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) bookInputDialog;
    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) bookInputKbdCB );
    data->kbd_long	= kbdCreate( data->win, KEY_ALL | KEY_LONG, (MfwCb) bookInputKbdLongCB );

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





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

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

 $Function:		bookInputStart

 $Description:	Start the input handler
 
 $Returns:		Handle of newly created window, or NULL if failure

 $Arguments:	parent, parent window handle, properties, input window property
				control block.
 
*******************************************************************************/

MfwHnd bookInputStart( MfwHnd parent,tInputSpecifics *properties )
{
	T_MFW_HND win;

	TRACE_FUNCTION ("bookInputStart()");

	/* allocate window, and if successful initialise it
	*/
	if ( ( win = bookInputCreate( parent ) ) != NULL )
		SEND_EVENT( win, INPUT_INIT, 0, properties );
	return win;
}


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

 $Function:		bookInputStartNumberEditor

 $Description:	Start the input handler using default properties
 
 $Returns:		Handle of newly created window, or NULL if failure

 $Arguments:	parent, parent window handle, buffer, input buffer
 
*******************************************************************************/

MfwHnd bookInputStartNumberEditor( MfwHnd parent, void *buffer )
{
    T_MFW_HND	    win         = parent;
    T_MFW_WIN       *win_data   = ( (T_MFW_HDR *) win )->data;
    tBookStandard   *data       = (tBookStandard *) win_data->user;
    T_phbk          *Phbk       = data->phbk;
    tInputSpecifics DefaultParameters;

	TRACE_FUNCTION ("bookInputStartNumberEditor()");
	MODE = NUMBER;
	
    /* Set up the default parameters for the input window
    */
	bookSetEditAttributes( NUMBER_EDITOR, COLOUR_EDITOR_XX, 0, edtCurBar1, 0, 
		(char *) buffer, NUMBER_LENGTH, &Phbk->edt_attr_number );

	DefaultParameters.abc               = FALSE;
	DefaultParameters.text              = TxtEnterNumber;
	DefaultParameters.edt_attr_input    = &Phbk->edt_attr_number;
	DefaultParameters.left_soft_key     = TxtSoftOK;
	DefaultParameters.right_soft_key    = TxtDelete;//Changed text
	// dunno if that changes softkey functionality
	DefaultParameters.callback          = bookAddNumberCB;

	/* allocate window, and if successful initialise it
	*/
    return bookInputStart( parent, &DefaultParameters );
}



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

 $Function:		bookInputStartNameEditor

 $Description:	Start the input handler using default properties
 
 $Returns:		Handle of newly created window, or NULL if failure

 $Arguments:	parent, parent window handle, buffer, input buffer
 
*******************************************************************************/

MfwHnd bookInputStartNameEditor( MfwHnd parent, void *buffer )
{
    T_MFW_WIN       *win_data   = ( (T_MFW_HDR *) parent )->data;
    tBookStandard   *data       = (tBookStandard *) win_data->user;
    T_phbk          *Phbk       = data->phbk;

    tInputSpecifics DefaultParameters;

	MODE = NAME;

	TRACE_FUNCTION ("bookInputStartNameEditor()");

    /* Set up the default parameters for the input window */

    /*MC 1957, name strings should use MAX_ALPHA_LEN*/
	bookSetEditAttributes( NUMBER_EDITOR, COLOUR_EDITOR_XX, 0, edtCurBar1, 0, 
		(char *) buffer, MAX_ALPHA_LEN, &Phbk->edt_attr_name );

 /*SPR 1434*/

 /*SPR 1526, changed #ifdef to #if*/
#if defined(CHINESE_MMI) && defined(EASY_TEXT_ENABLED)
/*MC, the chinese editor MUST have a unicode string as input*/
/*MC , SPR 1242 merged in from b-sample build*/
	if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
	{	T_CHINESE_DATA chinese_data;
		chinese_data.TextString = (char*) Phbk->edt_buf_name;
		if (chinese_data.TextString[0]== 0)//if, empty string
		{	chinese_data.TextString[0] = 0x80;//give string Unicode tag
			chinese_data.TextString[1] = 0x7F;
		}
		else
		{	char l_name[MAX_ALPHA_LEN];
			int ascii_len = strlen(chinese_data.TextString);
			int i;
			if (chinese_data.TextString[0]!= 0x80)/*If ASCII string*/
			{	memset(l_name, '\0', MAX_ALPHA_LEN);
				l_name[0] = 0x80;//give Unicode tag
				l_name[1] = 0x7F;	
				/*convert ascii string to unicode*/
				{	for (i =0; i < (ascii_len); i++) 
						{	if ((2+2*i+1)>=MAX_ALPHA_LEN)
								break;
							l_name[2+2*i] = 0x00; 
							l_name[2+2*i+1] = chinese_data.TextString[i]; 
						}
						if ((2+2*i+1)<=MAX_ALPHA_LEN)
						{	l_name[2+2*i] = 0x00;		//double null termination
							l_name[2+2*i+1] = 0x00;
						}
				}
				memcpy(chinese_data.TextString, l_name, MAX_ALPHA_LEN);
			}
		}
		/*MC end*/

		chinese_data.Callback = (T_EDIT_CB)bookAddNameCB;
		chinese_data.Identifier = INPUT_LEFT ;
		chinese_data.LeftSoftKey = TxtSave;
		chinese_data.DestroyEditor = TRUE;
		chinese_data.EditorSize = (USHORT)((MAX_ALPHA_LEN-4)/2);//i.e.8
		return chinese_input(parent, &chinese_data);
	}
	else
#endif
	{
		DefaultParameters.abc               = TRUE;
		DefaultParameters.text              = TxtEnterName;
		DefaultParameters.edt_attr_input    = &Phbk->edt_attr_name;
		DefaultParameters.left_soft_key     = TxtSoftOK;
		DefaultParameters.right_soft_key    = TxtDelete;//Changed text - MC
		DefaultParameters.callback          = bookAddNameCB;

		/* allocate window, and if successful initialise it
		*/
   		return bookInputStart( parent, &DefaultParameters );
	}
}



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

 $Function:		bookInputDestroy

 $Description:	Destroy Input Window
 
 $Returns:		None

 $Arguments:	Handle of window to be destroyed
 
*******************************************************************************/

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

	TRACE_FUNCTION ("bookInputDestroy()");

	if (data)
	{
        editDeactivate();
     
		winDelete ( data->win );
		FREE_MEMORY( (void *) data, sizeof( tBookStandard ) );
	}
}

#endif /* NEW_EDITOR */

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