# -*- encoding: euc-kr -*-
from basemodel import Stage, ListStage,NotifyStage,YesNoStage, EntryStage
import runtime, uiconfig, status, config
import calldb
from phonedb import phonedb
import time
class CallLogNotifyStage(NotifyStage):
def __init__(self, message, cb=None, icon=None):
if not icon:
icon = uiconfig.baloon_call_log_icon
NotifyStage.__init__(self, message, icon, cb)
#ka...detail 2006.11.07
class DetailStage(Stage):
def __init__(self):
import ui
detail = status.calldb_editing_detail
if not detail.viewed:
if detail.number in ('P', 'O', ''):
detail.viewed = 1
else:
calldb.set_viewed(detail.call_type, detail.number)
calldb.save_db(detail.call_type)
stage = runtime.manager.find_stage('call list')
if stage:
stage.refresh_lists()
number, atime, aduration, vtime, vduration = detail[:5]
year, mon, day, hour, min, sec = time.localtime(atime)[:6]
date = "%02d/%02d/%04d" % (day, mon, year)
call_time = "%02d:%02d:%02d" % (hour, min, sec)
if number == 'P' or number == '':
number = _('No identification')
elif number == 'O':
number = _('Not available')
#ka...CLIP name --name = phonedb.get_name(number)
if detail[7] != 'None' and detail[7] !='P' and detail[7] !='O':
name = detail[7]
else:
name = phonedb.get_name(number)
if name == number:
name = ''
self.ui = ui.CallDetailUI(detail.call_type, number, name, date, call_time, calldb.count_db(detail.call_type, number) - calldb.get_vcount(detail.call_type,number) , \
calldb.get_vcount(detail.call_type,number))
def handle_key(self, key):
if key == config.Menu4 or key== config.Red:
runtime.manager.back_stage()
return True
elif key == config.Menu3:
runtime.manager.stack_stage(DeleteEntryStage)
return True
elif key == config.Menu1:
return
elif key == 'Up' or 'Down':
return self.ui.handle_key(key)
else:
return False
class DetailStage1(DetailStage):
# options으로부터 실행된 detail stage
def __init__(self):
DetailStage.__init__(self)
number = status.calldb_editing_detail.number
if number in ('P', 'O', 'U', ''):
self.ui.set_left('')
else:
self.ui.set_left(_('CALL'))
def handle_key(self, key):
if key == config.Menu1:
number = status.calldb_editing_detail.number
if number in ('P', 'O', 'U', ''):
return True
runtime.manager.start_call(number)
return True
else:
return DetailStage.handle_key(self, key)
class DetailStage2(DetailStage):
# call listup에서 right key에 의해 실행된 detail stage
# left key를 누를 경우 원래의 stage 로 back
def __init__(self, calltype):
self.calltype = calltype
DetailStage.__init__(self)
def handle_key(self, key):
if key == config.Menu1:
stage = OptionsStage(self.calltype)
runtime.manager.change_stage(stage)
return True
elif key == "Left":
runtime.manager.back_stage()
return True
return DetailStage.handle_key(self, key)
class DetailStage3(DetailStage):
def __init__(self):
DetailStage.__init__(self)
number = status.calldb_editing_detail.number
if number in ('P', 'O', 'U', ''):
self.ui.set_left('')
else:
self.ui.set_left(_('CALL'))
def handle_key(self, key):
if key in (config.Menu1, config.Green):
number = status.calldb_editing_detail.number
if number in ('P', 'O', 'U', ''):
return False
runtime.manager.start_call(number)
return True
elif key == config.Video:
number = status.calldb_editing_detail.number
if number in ('P', 'O', 'U', ''):
return True
runtime.manager.start_call(number=number, video_call=True)
return True
else:
return DetailStage.handle_key(self, key)
class SaveStage(EntryStage):
def __init__(self):
EntryStage.__init__(self, _('Name'), _('SAVE IN PHONEBOOK'))
self.ui.set_max(config.max_pb_name)
self.ui.set_left('')
status.phone_item = phonedb.new_item()
status.phone_item.number = status.calldb_editing_detail.number
# KA: [20070831] hangul lvp-2000
# vpark 2006.08.28 automata
self.ui.set_fixed_automata(None, False)
def handle_key(self, key):
if key == config.Red:
self.activate_menu2()
return True
ret = EntryStage.handle_key(self, key)
if ret and self.is_active():
if self.ui.get_text() == '':
self.ui.set_left('')
return True
else:
self.ui.set_left(_('SAVE'))
return ret
def activate_menu1(self):
if self.ui.get_text() == '':
return
import phonebook
name = self.ui.get_text()
status.phone_item.name = name
status.phonebook_save_stage_name = 'calllog options'
if phonedb.has_name(name):
# name complict
stage = phonebook.NameConflictStage()
runtime.manager.stack_stage(stage)
return
phonebook.phone_item_save()
def activate_menu2(self):
runtime.manager.back_stage()
class DeleteEntryStage(YesNoStage):
def __init__(self):
def yes():
# delete this entry: FIXME
def destroy():
call_list_stage = runtime.manager.find_stage('call list')
call_list_stage.refresh_lists()
runtime.manager.back_stage('call list')
return False
stage = CallLogNotifyStage(_('Entry deleted!'), destroy, uiconfig.baloon_call_log_delete_icon)
calldb.remove_call_log(status.calldb_editing_type, status.calldb_editing_index)
status.calldb_editing_index = -1
status.calldb_editing_detail = None
runtime.manager.stack_stage(stage)
def no():
runtime.manager.back_stage()
icon = uiconfig.baloon_call_log_delete_icon
YesNoStage.__init__(self, _('Delete this entry? '), yes, no, '', icon)
class OptionsStage(ListStage):
name = 'calllog options'
def __init__(self, calltype=None):
self.title = _('OPTIONS')
self.choice1 = _('Details'), _('Delete'), _('Send SMS'), _('Send MMS'), _('Voice call'), _('Video call')
self.choice2 = _('Details'), _('Save in phonebook'), _('Delete'), _('Send SMS'), _('Send MMS'), _('Voice call'), _('Video call')
self.choice1_1 = _('Details'), _('Delete'), _('Voice call'), _('Video call')
self.choice2_1 = _('Details'), _('Save in phonebook'), _('Delete'), _('Voice call'), _('Video call')
self.choice3= _('Save in phonebook'), _('Send SMS'), _('Send MMS'), _('Delete all calls')
self.calltype = calltype
self.refresh_item_by_editing_number()
if calltype == 'missed':
self.icon = uiconfig.call_log_missed_icon
elif calltype == 'received':
self.icon = uiconfig.call_log_received_icon
elif calltype == 'dialed':
self.icon = uiconfig.call_log_dialled_icon
else:
pass
ListStage.__init__(self, None, None, None, None, _('OK'), '', '', menu4=_('BACK'))
def activate(self, index):
from profile import profile
currentprofile = profile.get_profile()
import status
choice = self.choice[index]
number = status.calldb_editing_detail.number
if index == 3:
if self.calltype == 'missed':
type = 0
elif self.calltype == 'received':
type = 1
elif self.calltype == 'dialed':
type = 2
stage = CallDeleteYesNoStage(type)
runtime.manager.stack_stage(stage)
return
if choice == _('Voice call'): # Call
runtime.manager.start_call(number)
return
elif choice == _('Hidden voice call'): # Hidden Call
number = config.FAC_HIDE_ID_CODE + number
runtime.manager.start_call(number)
return
elif choice == _('Video call'): # video call
runtime.manager.start_call(number, video_call=True)
return
elif choice == _('Hidden video call'): # Hidden video call
number = config.FAC_HIDE_ID_CODE + number
runtime.manager.start_call(number, video_call=True)
return
elif choice == _('Send SMS') and not currentprofile:
import smsstage
stage = smsstage.SmsCompose()
from smsstage import Set_SmsPhoneNumber
Set_SmsPhoneNumber(number)
runtime.manager.stack_stage(stage)
return
elif choice == _('Send MMS') and not currentprofile:
from mmsmanager import mmsmgr
import mmscomposestage
mmsmgr.initmsg()
mmsmgr.load_message()
status.save_callback = mmscomposestage.save_callback
mmsmgr.reply_address = mmsmgr.get_reply_number(number)
stage = mmscomposestage.MMSCreateStage()
runtime.manager.stack_stage(stage)
elif choice == _('Save in phonebook'):
# phonedb max size check
import phonebook
if phonedb.has_number(number):
# should be impossible
stage = phonebook.PhonebookNotifyStage(_('Number already in phonebook'))
elif phonedb.count() >= config.phone_db_size:
stage = phonebook.PhonebookNotifyStage(_('Memory full'))
else:
import phonebook
stage = phonebook.AddPhoneBookStage
#SaveStage
runtime.manager.stack_stage(stage)
return
elif choice == _('Details'):
runtime.manager.stack_stage(DetailStage1)
elif choice == _('Delete'):
runtime.manager.stack_stage(DeleteEntryStage)
def refresh_lists(self):
self.refresh_item_by_editing_number()
self.change_choice(self.choice)
def refresh_item_by_editing_number(self):
number = status.calldb_editing_detail.number
#if number in ('P', 'O', ''):
self.choice = self.choice3
'''
if phonedb.has_number(number):
# already registered. so save is not valid options
self.choice = self.choice3_2
else:
self.choice = self.choice3_1
#if self.calltype == 'missed' and self.choice != self.choice3:
# self.choice = self.choice[:-1]
'''
class CallDBStage(ListStage):
name = 'call list'
def __init__(self, call_type):
self.no_message_type = {'missed':_('No missed calls'),\
'received':_('No received calls'),\
'dialed':_('No dialed calls'),\
'all':_('No calls'),\
'performed':_('No dialed calls')}
self.no_message_icon = {'missed':uiconfig.baloon_call_log_missed_icon, 'received':uiconfig.baloon_call_log_received_icon, \
'dialed':uiconfig.baloon_call_log_dialled_icon, 'all':uiconfig.baloon_call_log_icon, 'performed':uiconfig.baloon_call_log_icon}
self.call_type = call_type
self.calllist = calldb.get_list(call_type)
tit_image = uiconfig.Third_title_PB_callhistory
if self.call_type == 'received':
ListStage.__init__(self, choice=self.get_names(), titleimage = tit_image, icon=uiconfig.call_log_received_icon, left=_('MENU'), right=_('DETAILS'), menu3=_('DELETE'), menu4=_('BACK'))
elif self.call_type == 'dialed':
ListStage.__init__(self, choice=self.get_names(), titleimage = tit_image, icon=uiconfig.call_log_dialled_icon, left=_('MENU'), right=_('DETAILS'), menu3=_('DELETE'), menu4=_('BACK'))
else:
ListStage.__init__(self, self.get_names(), titleimage = tit_image, left=_('MENU'), right=_('DETAILS'), menu3=_('DELETE'), menu4=_('BACK'))
status.calldb_editing_index = 0
status.calldb_editing_type = self.call_type
self.refresh_lists(False)
self.need_refresh = False
if len(self.calllist) != 0:
self.ui.set_left(_('OPTIONS'))
self.check_viewed()
def get_names(self):
choice = []
for number, count, index in self.calllist:
if number == 'P' or number == '':
choice.append(_('No identification'))
elif number == 'O':
choice.append(_('Not available'))
else:
if count > 1:
choice.append("%s (%d)" % (number, count))
else:
choice.append(number)
return choice
def refresh_lists(self, reset_list=True):
# self.ui.remove_all_icon_columns()
self.calllist = calldb.get_list(self.call_type)
if len(self.calllist) == 0:
def show_noentry():
stage = NotifyStage(self.no_message_type[self.call_type], self.no_message_icon[self.call_type])
runtime.manager.change_stage(stage)
return False
runtime.evas.idle_add(show_noentry)
self.change_choice(self.get_names())
# self.make_icon()
def make_icon(self):
if self.call_type in ('received', 'dialed'):
return
icons = []
for number, count, index in self.calllist:
detail = calldb.get_detail(self.call_type, index)
if detail.numberofvcalls:
icons.append(uiconfig.list_icon_calllog_type_video)
else:
if detail.viewed:
icons.append(uiconfig.list_icon_calllog_type_received)
else:
icons.append(uiconfig.list_icon_calllog_type_missed)
continue
type = detail.call_type
if type == calldb.CALL_MISSED:
icons.append(uiconfig.list_icon_calllog_type_missed )
elif type == calldb.CALL_RECEIVED:
icons.append(uiconfig.list_icon_calllog_type_received )
elif type == calldb.CALL_DIALED:
icons.append(uiconfig.list_icon_calllog_type_dialed )
self.ui.create_icon_column( uiconfig.calllog_list_icon_type_x, icons )
def handle_key(self, key):
if len(self.calllist) == 0:
return False
if key == config.Menu2:
self.check_refresh()
index = self.ui.get_focus()
status.calldb_editing_detail = calldb.get_detail(self.call_type, self.calllist[index][2])
stage = DetailStage2(self.call_type)
runtime.manager.stack_stage(stage)
return True
elif key == config.Menu3:
runtime.manager.stack_stage(DeleteEntryStage)
return True
ret = ListStage.handle_key(self, key)
if key in ('Up', 'Down'):
self.check_refresh()
status.calldb_editing_index = self.calllist[self.ui.get_focus()][2]
self.check_viewed()
return ret
def check_refresh(self):
if self.need_refresh:
focus = self.ui.list.focus
top_index = self.ui.list.top_index
self.refresh_lists()
self.show()
self.ui.list.set_init_focus(focus, top_index)
self.need_refresh = False
def check_viewed(self):
detail = calldb.get_detail(self.call_type, status.calldb_editing_index)
if not detail.viewed:
if detail.number in ('P', 'O', ''):
detail.viewed = 1
else:
calldb.set_viewed(detail.call_type, detail.number)
calldb.save_db(detail.call_type)
self.need_refresh = True
def activate(self, index):
status.calldb_editing_detail = calldb.get_detail(self.call_type, self.calllist[index][2])
# self.make_icon()
stage = OptionsStage(self.call_type)
runtime.manager.stack_stage(stage)
def show(self):
if len(self.calllist) > 0:
ListStage.show(self)
status.calldb_editing_index = self.calllist[self.ui.get_focus()][2]
return
if len(self.ui.list.labels) == 0:
def show_noentry():
stage = NotifyStage(self.no_messaage_type[self.call_type], uiconfig.baloon_call_log_icon)
runtime.manager.change_stage(stage)
return False
runtime.evas.idle_add(show_noentry)
return
def destroy(self):
ListStage.destroy(self)
status.calldb_editing_index = -1
class MissedCallStage(CallDBStage):
title = _('MISSED CALLS')
def __init__(self):
CallDBStage.__init__(self, 'missed')
status.missed_call_count = 0
class ReceivedCallStage(CallDBStage):
title = _('RECEIVED CALLS')
def __init__(self):
CallDBStage.__init__(self, 'received')
class DialedCallStage(CallDBStage):
title = _('DIALED CALLS')
def __init__(self):
CallDBStage.__init__(self, 'dialed')
class PerformedCallStage(CallDBStage):
title = _('DIALED CALLS')
def __init__(self):
CallDBStage.__init__(self, 'performed')
if self.ui.list.nrow == 0:
return
self.ui.set_left(_('CALL'))
def handle_key(self, key):
ret = CallDBStage.handle_key(self, key)
return ret
def activate(self, index):
# call
calllist = calldb.get_list(self.call_type)
detail = calldb.get_detail(self.call_type, calllist[index][2])
number = detail.number
if number in ('P', 'O'):
return
#ka....3800 2007.06.02 Calllog에서 Menu1눌러 눌러 전화하는 경우 ALSA모드로 전화하도록
if status.modem_audio_state == status.IDLE:
dspg = runtime.dspg
status.set_modem_audio_state(status.SPK)
dspg.set_state(dspg.ST_V_SPK_OFFHK_LPLAY)
runtime.manager.start_call(number)
class CallDeleteYesNoStage(YesNoStage):
title = _('DELETE')
icon = uiconfig.baloon_call_log_delete_icon
def __init__(self, index=3):
self.index = index
msg = (_('Delete all missed calls?'),_('Delete all received calls?'),_('Delete all dialed calls?'),_('Delete all calls?'))[index]
YesNoStage.__init__(self, msg, self.yes_cb, self.no_cb, '', self.icon)
def yes_cb(self):
calldb.delete_db(call_type)
msg = (_('All missed calls deleted!'),_('All received calls deleted!'),_('All dialed calls deleted!'),_('All calls deleted!'))[self.index]
if self.index == 0 or self.index == 3:
status.missed_call_count = 0
if self.index == 3:
stage = CallLogNotifyStage(msg, None, uiconfig.baloon_call_log_delete_icon)
runtime.manager.change_stage(stage, clear_history=True)
else:
stage = CallLogNotifyStage(msg, None, uiconfig.baloon_call_log_delete_icon)
runtime.manager.change_stage(stage)
def no_cb(self):
runtime.manager.back_stage()
class CallDeleteStage(ListStage):
icon = uiconfig.call_log_delete_icon
def __init__(self):
self.title = _('DELETE')
self.choice = _('Missed calls'),_('Received calls'),_('Dialed calls'),_('All calls')
ListStage.__init__(self)
def activate(self):
call_type = ('missed', 'received', 'dialed', 'all')[index]
no_message_type = _('No missed calls'),_('No received calls'),_('No dialed calls'),_('No calls')
no_message_icon = (uiconfig.baloon_call_log_missed_icon, uiconfig.baloon_call_log_received_icon, \
uiconfig.baloon_call_log_dialled_icon, uiconfig.baloon_call_log_icon)
if index < 3 and calldb.is_empty(call_type):
stage = CallLogNotifyStage(no_message_type[index], None, no_message_icon[index])
runtime.manager.stack_stage(stage)
return
if index == 3 and calldb.is_empty('all'):
stage = CallLogNotifyStage(no_message_type[index], None, no_message_icon[index])
runtime.manager.stack_stage(stage)
return
def yes_cb():
calldb.delete_db(call_type)
delete_message_type = _('All missed calls deleted!'),_('All received calls deleted!'),_('All dialed calls deleted!'),_('All calls deleted!')
if index == 0 or index == 3:
status.missed_call_count = 0
if index == 3:
stage = CallLogNotifyStage(delete_message_type[index], None, uiconfig.baloon_call_log_delete_icon)
runtime.manager.change_stage(stage, clear_history=True)
else:
stage = CallLogNotifyStage(delete_message_type[index], None, uiconfig.baloon_call_log_delete_icon)
runtime.manager.change_stage(stage)
def no_cb():
runtime.manager.back_stage()
icon = uiconfig.baloon_call_log_delete_icon
all_message_type = _('Delete all missed calls?'),_('Delete all received calls?'),_('Delete all dialed calls?'),_('Delete all calls?')
message = all_message_type[index]
stage = YesNoStage(message, yes_cb, no_cb, '', icon)
runtime.manager.stack_stage(stage)
_stages = ReceivedCallStage, DialedCallStage, MissedCallStage, CallDeleteYesNoStage
def get_stage(index):
return _stages[index]
if 0 <= index <= 2:
lists = calldb.get_list(('missed', 'received', 'dialed')[index])
if len(lists) == 0:
stage = NotifyStage(_('Empty call history'), uiconfig.baloon_call_log_icon)
return stage