Newer
Older
Import / projects / LGN-IP3870 / t / orig / calllog.py
# -*- 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