Newer
Older
Import / projects / LGN-IP3870 / t / new / mmsbox.py
from basemodel import ListStage
from mmsmanager import mmsmgr, MMSMessageInfo
from basemodel import Stage, EntryStage

from mmssmil import MMS_smilmake
import smsstage, runtime, config, utils, mmscomposestage, uiconfig, mmsconfig, status, baseui
from phonedb import phonedb

class MMSBoxactivateStage(smsstage.JobAndNotify):
	def __init__(self, boxtype, index):
		smsstage.JobAndNotify.__init__(self, _('Wait...'), cb=self.box_cb, icon=uiconfig.baloon_message_mms_icon)
		self.boxtype = boxtype
		self.index = index
		self.result = False

	def do_job(self):
		from mms_net_pdu import Parse_MMS
		mmsmgr.initmsg()
		mmsmgr.current_slide = 0
		if self.boxtype == mmsconfig.MMS_INBOX:
			mmsmgr.infoindex = 1000+self.index
			self.result = Parse_MMS(mmsmgr.inbox_info[self.index][0])
			try:
				if not mmsmgr.msg.info_inbox_sender:
					mmsmgr.msg.info_inbox_sender = mmsmgr.inbox_info[self.index][3]
					#Roxia Begin cmlim 06.06.12
					if 0 < mmsmgr.msg.info_inbox_sender.find('/'):
						mmsmgr.msg.info_inbox_sender = mmsmgr.msg.info_inbox_sender[:mmsmgr.msg.info_inbox_sender.find('/')]
					#Roxia End cmlim
			except:
				pass
			if not mmsmgr.msg.subject:
				mmsmgr.msg.subject = mmsmgr.inbox_info[self.index][5]
		elif self.boxtype == mmsconfig.MMS_OUTBOX:
			mmsmgr.infoindex = 2000+self.index
			self.result = Parse_MMS(mmsmgr.outbox_info[self.index][0])
			if not mmsmgr.msg.subject:
				mmsmgr.msg.subject = mmsmgr.outbox_info[self.index][4]
		elif self.boxtype == mmsconfig.MMS_SENTBOX:
			mmsmgr.infoindex = 3000+self.index
			self.result = Parse_MMS(mmsmgr.sentbox_info[self.index][0])
			if not mmsmgr.msg.subject:
				mmsmgr.msg.subject = mmsmgr.sentbox_info[self.index][4]
		elif self.boxtype == mmsconfig.MMS_DRAFTBOX:
			mmsmgr.infoindex = 4000+self.index
			self.result = Parse_MMS(mmsmgr.draftbox_info[self.index][0])
			if not mmsmgr.msg.subject:
				mmsmgr.msg.subject = mmsmgr.draftbox_info[self.index][4]

	def error_cb(self):
		mmsmgr.initmsg()
		runtime.manager.queue_backward(2)

	def success_cb(self):
		if self.boxtype == mmsconfig.MMS_INBOX:
			from mmsplayer import PlayStage
			runtime.manager.change_stage(PlayStage(mmsmgr.msg.media, mmsmgr.msg.fname_smil, True, mmsmgr.get_player_title()))
		elif self.boxtype == mmsconfig.MMS_OUTBOX or self.boxtype == mmsconfig.MMS_SENTBOX or\
			self.boxtype == mmsconfig.MMS_DRAFTBOX:
			runtime.manager.change_stage(mmscomposestage.MMSMsgViewer(True))
		else:
			rutime.manager.back_stage()

	def box_cb(self):
		self.success_cb()

	def handle_key(self, key):
		if key == config.Red:
			fstage = runtime.manager.find_stage('inboxlist')
			if fstage:
				runtime.manager.back_stage('inboxlist')
			else:
				runtime.manager.back_stage('outboxlist')
		else:
			smsstage.JobAndNotify.handle_key(self, key)

def MMSboxdeleteNotify_cb():
	boxtype, index = mmsmgr.MMSBoxtype()
	mmsmgr.remove_info(index, boxtype)

	_len = 0

	if boxtype == mmsconfig.MMS_INBOX:
		fstage = runtime.manager.find_stage('inboxlist')
		if fstage:
			jump = 'inboxlist'
		else:
			jump = 'messagehotkey'
		_len  = len(mmsmgr.inbox_info)
	else:
		jump = 'outboxlist'
		if boxtype == mmsconfig.MMS_OUTBOX:
			_len = len(mmsmgr.outbox_info)
		elif boxtype == mmsconfig.MMS_SENTBOX:
			_len = len(mmsmgr.sentbox_info)
		elif boxtype == mmsconfig.MMS_DRAFTBOX:
			_len = len(mmsmgr.draftbox_info)

	if _len <= 0:
		if jump == 'messagehotkey':
			runtime.manager.back_stage(jump)
		else:
			runtime.manager.back_stage(jump, isshow=False)
			runtime.manager.back_stage()
	else:
		runtime.manager.back_stage(jump)

def MMSInboxlist_activate(index):
	mmsmgr.initmsg()
	mmsmgr.infoindex = 1000+index
	_list, _isread = mmsmgr.box_list(mmsconfig.MMS_INBOX)
	if _isread[index] == 2:
		from mms_net_stage import MMS_Downloading_Stage
		runtime.manager.stack_stage(MMS_Downloading_Stage(mmsmgr.inbox_info[index]))
	else:
		from mms_net_pdu import Parse_MMS
		Parse_MMS(mmsmgr.inbox_info[index][0])
		mmsmgr.current_slide = 0
		if _isread[index] == 0:
			mmsmgr.inbox_info[index][2] = 1
			mmsmgr.save_infos(mmsconfig.MMS_INBOX)

		from mmsplayer import PlayStage
		runtime.manager.stack_stage(PlayStage(mmsmgr.msg.media, mmsmgr.msg.fname_smil, True, mmsmgr.get_player_title()))

class MMSInboxlistStage(ListStage):
	name = 'inboxlist'
	def __init__(self):
		self._list, self._isread = self.makelist()
		_title = _('INBOX MMS') + '(%d)'%len(mmsmgr.inbox_info)
		ListStage.__init__(self, self._list, title=_title)
		self.makeicon()

	def show(self):
		mmsmgr.MMS_Remove_Tempmsg()
		_list, _isread = self.makelist()
		if self._list != _list or self._isread!= _isread:
			self._list = _list
			self._isread = _isread
			self.change_choice(self._list)
			self.makeicon()
		ListStage.show(self)
		if self._isread[self.ui.get_focus()] == 2:
			self.ui.set_left(_('DOWNLOAD'))
		else:
			self.ui.set_left(_('OK'))
		_title = _('INBOX MMS') + '(%d)'%len(mmsmgr.inbox_info)
		self.ui.set_title(_title)

	def makeicon(self):
		self.ui.remove_all_icon_columns()
		list_icon = []
		for r in self._isread:
			if r == 0:
				list_icon.append(uiconfig.list_icon_mms_received)
			elif r == 2:
				list_icon.append(uiconfig.list_icon_mms_unload)
			else:
				list_icon.append(uiconfig.list_icon_mms_saved)
		self.ui.create_icon_column(70, tuple(list_icon))

	def makelist(self):
		return mmsmgr.box_list(mmsconfig.MMS_INBOX)

	def activate(self, index):
		if self._isread[index] == 2:
			from mms_net_stage import MMS_Downloading_Stage
			mmsmgr.initmsg()
			mmsmgr.infoindex = 1000+index
			runtime.manager.stack_stage(MMS_Downloading_Stage(mmsmgr.inbox_info[index]))
		else:
			runtime.manager.stack_stage(MMSBoxactivateStage(mmsconfig.MMS_INBOX, index))
			if self._isread[index] == 0:
				mmsmgr.inbox_info[index][2] = 1
				mmsmgr.save_infos(mmsconfig.MMS_INBOX)

	def back_activate_menu1(self):
		runtime.manager.stack_stage(MMSInboxoptions())

	def back_activate_menu2(self):
		pass

	def handle_key(self, key):
		if key in ('Up', 'Down'):
			result = ListStage.handle_key(self, key)
			if self._isread[self.ui.get_focus()] == 2:
				self.ui.set_left(_('DOWNLOAD'))
			else:
				self.ui.set_left(_('OK'))
			return result
		else:
			return ListStage.handle_key(self, key)


class MMSInboxoptions(ListStage):
	name = 'mmsinboxoptions'
	icon = uiconfig.message_mms_icon
	def __init__(self):
		if mmsmgr.msg.isdrm_forward:
			choice = (_('Delete'), _('Play'), _('Reply'), _('Modify'), _('Details'), _('Use number'))
		else:
			choice = (_('Delete'), _('Play'), _('Save object'), _('Reply'), _('Forward'), _('Modify'), _('Details'), _('Use number'))
		ListStage.__init__(self, choice, _('OPTIONS'))
		self.playmode = -1
		self.backup_address = None
		self.backup_rinfo = None

	def show(self):
		if self.backup_address:
			mmsmgr.msg.info_received = self.backup_address
			self.backup_address = None
		if self.backup_rinfo:
			mmsmgr.rinfo = self.backup_rinfo
			self.backup_rinfo = None
		status.save_callback = None
		ListStage.show(self)

	def destroy(self):
		mmsmgr.isforward = False
		ListStage.destroy(self)

	def activate(self, index):
		stage = None
		if mmsmgr.msg.isdrm_forward:
			if index == 0:
				runtime.manager.stack_stage(mmscomposestage.MMSYesNo(_('Delete MMS?'), self.yes_cb, self.no_cb))
			elif index == 1:
				from mmsplayer import PlayStage
				stage = PlayStage(mmsmgr.msg.media, mmsmgr.msg.fname_smil, False, mmsmgr.get_player_title())
			elif index == 2: stage = MMSInboxoptions_replay()
			elif index == 3:
				media, path_media, media_type, slide_list = mmsmgr.media_list()
				if len(media) <= 0:
					runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('No media')))
					return
				stage = mmscomposestage.MMSModify()
			elif index == 4: stage = mmscomposestage.MMSDetailStage()
			elif index == 5: stage = MMSOptions_usenumber()
		else:
			if index == 0:
				runtime.manager.stack_stage(mmscomposestage.MMSYesNo(_('Delete MMS?'), self.yes_cb, self.no_cb))
			elif index == 1:
				from mmsplayer import PlayStage
				stage = PlayStage(mmsmgr.msg.media, mmsmgr.msg.fname_smil, False, mmsmgr.get_player_title())
			elif index == 2:
				media, path_media, media_type, slide_list = mmsmgr.media_list(istext=False)
				if len(media) <= 0:
					runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('No media')))
					return
				stage = MMSInboxoptions_save()
			elif index == 3: stage = MMSInboxoptions_replay()
			elif index == 4:
				media, path_media, media_type, slide_list = mmsmgr.media_list()
				if len(media) <= 0:
					runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('No media')))
					return
				status.save_callback = mmscomposestage.save_callback
				self.backup_address = mmsmgr.msg.info_received
				self.backup_rinfo = mmsmgr.rinfo
				mmsmgr.msg.info_received = [[[],[],[]], [[],[],[]]]
				mmsmgr.rinfo = []
				mmsmgr.isforward = True
				stage = mmscomposestage.MMSInputaddress()
			elif index == 5:
				media, path_media, media_type, slide_list = mmsmgr.media_list()
				if len(media) <= 0:
					runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('No media')))
					return
				stage = mmscomposestage.MMSModify(isinbox=True)
			elif index == 6: stage = mmscomposestage.MMSDetailStage()
			elif index == 7: stage = MMSOptions_usenumber()

		if stage != None:
			runtime.manager.stack_stage(stage)

	def yes_cb(self):
		runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('MMS Delete'), MMSboxdeleteNotify_cb))

	def no_cb(self):
		runtime.manager.back_stage()

	def back_activate_menu1(self):
		pass

	def back_activate_menu2(self):
		runtime.manager.back_stage()

class MMSInboxoptions_save(ListStage):
	name = 'MMSInboxoptions_save'
	def __init__(self):
		self.player_pid = None
		self.sound = None
		self.media = []
		self.path_media = []
		self.media_type = []
		self.slide_list = []
		self.media, self.path_media, self.media_type, self.slide_list = mmsmgr.media_list(istext=False)#, mmsmgr.current_slide)
		if self.media:
			choice = tuple(self.media)
			ListStage.__init__(self, choice, _('SAVE OBJECT'), icon=None, titleimage=None, left=_('OK'), right=_('BACK'))
		else:
			runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('No media')))
		self._type = -1

		self.audio_play_timer = None

	def show(self):
		focus = self.ui.get_focus()
		try:
			if self.media_type[focus] == 2:
				self.sound = self.path_media[focus]
				self.play_audio()
			else:
				self.stop_audio()
		except:
			pass
		self.makeicon(focus)
		ListStage.show(self)

	def makeicon(self, focus=-1):
		icons = []
		index = 0
		import os.path
		for w in self.media_type:
			if w == 0:
				icons.append(uiconfig.list_icon_text)
			elif w == 1:
				icons.append(uiconfig.list_icon_image)
			elif w == 2:
				try:
					ext = utils.get_ext(self.path_media[index])
					if ext.lower() == 'imy':
						icons.append(uiconfig.list_icon_melody_mono)
					else:
						icons.append(uiconfig.list_icon_melody_poly)
				except:
					icons.append(uiconfig.list_icon_melody_poly)
			elif w == 3:
				icons.append(uiconfig.list_icon_video_saved)
			index += 1
		self.ui.remove_all_icon_columns()
		resize = [25, 25]
		self.ui.create_icon_column(60, tuple(icons), resize)

	def activate(self, index):
		if not utils.check_free_storage():
			runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('Storage is short')))
			return
		path = ''
		message = ''
		if self.media_type[index] == 0:
			#assert self.media
			return
		elif self.media_type[index] == 1:
			message = _('Gallery is full!')
			path = config.image_wallpaper_dir
		elif self.media_type[index] == 2:
			import os.path
			message = _('Melodies gallery is full!')
			ext = ''
			filename = os.path.split(self.path_media[index])[-1]
			dot = filename.rfind('.')
			if dot >=0:
				ext = filename[dot+1:]
			if ext:
				if ext == 'imy':
					path = config.audio_other_dir
				else:
					path = config.audio_polyphonic_dir
			else:
				path = config.audio_other_dir
		elif self.media_type[index] == 3:
			message = _('Video gallery is full!')
			path = config.video_received_dir

		if config.media_save_max <= utils.get_file_count(path):
			runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(message))
			return
		self._type = self.media_type[index]
		runtime.manager.stack_stage(MMSChangename(index, self.media[index], self.media_type[index], self.slide_list[index]))

	def hide(self):
		self.audio_play_timer = None
		self.stop_audio()
		ListStage.hide(self)

	def destroy(self):
		self.audio_play_timer = None
		self.stop_audio()
		ListStage.destroy(self)

	def play_audio(self):
		if not self.sound and status.phone_status != status.Disconnected:
			return
		self.player_pid = utils.player.play(self.sound)

	def stop_audio(self):
		if not self.sound and status.phone_status != status.Disconnected:
			return
		utils.player.stop(self.player_pid)

	def play_audio_cb(self):
		self.play_audio()
		self.audio_play_timer = None

	def handle_key(self, key):
		if key in ('Up', 'Down'):
			ret = ListStage.handle_key(self, key)
			ListStage.show(self)
			runtime.evas.render_now()
			focus = self.ui.get_focus()
			self.audio_play_timer = None
			try:
				if self.media_type[focus] == 2:
					self.sound = self.path_media[focus]
					self.audio_play_timer = utils.Timer(300, self.play_audio_cb)
				else:
					self.stop_audio()
			except:
				pass
			return ret
		else:
			return ListStage.handle_key(self, key)

class MMSChangename(EntryStage):
	def __init__(self, index, media, media_type, nslide):
		self.index = index
		self.media = media
		self.media_type = media_type
		self.nslide = nslide

		EntryStage.__init__(self, _('Name'), _('RENAME'))
		last_dot = media.rfind('.')
		media = media[:last_dot]
		try:
			self.ui.set_text(str(media[:16]))
		except:
			self.ui.set_text(str(media))
		self.ui.set_max(16)
		self.ui.set_automata('multitap', 'lower')
		self.ui.automata_idx = 3
		self.save_pos = 0	#1 ->other

	def activate_menu1(self):
		text = self.ui.get_text()
		ext = ''
		if len(text) <= 0:
			runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('No text inserted.')))
		else:
			if self.media_type == 0:
				return
			elif self.media_type == 1:
				src_fname = mmsmgr.msg.media[self.nslide].fname_image
				try:
					ext = utils.get_ext(mmsmgr.msg.media[self.nslide].fname_image)
					dst_fname = config.image_wallpaper_dir+text+'.'+ext
				except:
					dst_fname = config.image_wallpaper_dir+text
			elif self.media_type == 2:
				src_fname = mmsmgr.msg.media[self.nslide].fname_sound
				try:
					ext = utils.get_ext(mmsmgr.msg.media[self.nslide].fname_sound)
					dst_fname = text+'.'+ext
				except:
					dst_fname = text
				if ext:
					if ext == 'imy':
						self.save_pos = 1
						dst_fname = config.audio_other_dir + dst_fname
					else:
						dst_fname = config.audio_polyphonic_dir  + dst_fname
				else:
					dst_fname = config.audio_other_dir  + dst_fname
			elif self.media_type == 3:
				src_fname = mmsmgr.msg.media[self.nslide].fname_video
				try:
					ext = utils.get_ext(mmsmgr.msg.media[self.nslide].fname_video)
					dst_fname = config.video_received_dir+text+'.'+ext
				except:
					dst_fname = config.video_received_dir+text

			import os.path
			if not os.path.exists(src_fname):
				runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('The file does not exist')))
				return
			if os.path.exists(dst_fname):
				runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('The file exists already')))
				return

			if not utils.check_free_storage():
				runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('Storage is short')))
				return
			try:
				utils.file_copy(src_fname, dst_fname)
				try:
					if self.media_type == 3:
						image_dstf = ''
						image_srcf = ''
						path_dstf = os.path.split(dst_fname)
						dot = path_dstf[-1].rfind('.')
						image_dstf = config.video_received_thumnail_dir + path_dstf[-1][:dot] + '.png'

						path_srcf = os.path.split(src_fname)
						dot = path_srcf[-1].rfind('.')
						image_srcf = path_srcf[0] + '/' + path_srcf[-1][:dot] + '.png'
						utils.file_copy(image_srcf, image_dstf)
				except:
					pass

				fstage = runtime.manager.find_stage('MMSInboxoptions_save')
				fstage.media.pop(self.index)
				fstage.path_media.pop(self.index)
				fstage.media_type.pop(self.index)
				fstage.slide_list.pop(self.index)
				runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('Saving'), self.MMSObjectsave_cb))
			except:
				runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('Copy failed')))

	def MMSObjectsave_cb(self):
		fstage = runtime.manager.find_stage('MMSInboxoptions_save')
		if fstage._type == 1:
			if self.save_pos == 1:
				runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('Saved in pictures gallery'), self.MMSObjectsave_cb2))
			else:
				runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('Saved in wallpapers gallery'), self.MMSObjectsave_cb2))
		elif fstage._type == 2:
			if self.save_pos == 1:
				runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('Saved in other melodies gallery'), self.MMSObjectsave_cb2))
			else:
				runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('Saved in ployphonic melodies gallery'), self.MMSObjectsave_cb2))
		elif fstage._type == 3:
			runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('Saved in received videos gallery'), self.MMSObjectsave_cb2))
		else:
			pass
			#assert False, 'media type error'

	def MMSObjectsave_cb2(self):
		runtime.manager.back_stage('mmsinboxoptions')


class MMSInboxoptions_replay(ListStage):
	icon = uiconfig.message_mms_icon
	def __init__(self):
		title = _('REPLY')
		choice = (_('By SMS'), _('By MMS'))
		ListStage.__init__(self, choice, title)
		self.index = -1

		self.current_slide = -1
		self.rinfo = []
		self.rinfo_index = -1
		self.infoindex = -1
		self.msg = None

	def show(self):
		status.save_callback = None
		ListStage.show(self)
		if self.msg:
			mmsconfig.issend_mms = False
			if self.index == 1:
				self.manager_load()
				self.index = -1

	def activate(self, index):
		self.index = index
		box, pos = mmsmgr.MMSBoxtype()
		if index == 0:
			ret = mmsmgr.inbox_info[pos][3].split(':')
			tnum = ''
			if len(ret) == 2:
				tnum = ret[1]

			status.sms_phone_number = ret[0]
			if tnum:
				status.callee_terminal_number = tnum
			runtime.manager.stack_stage(smsstage.SmsCompose('new'))
		elif index == 1:
			self.manager_save()
			mmsmgr.initmsg()
			mmsmgr.load_message()
			mmsmgr.reply_address = mmsmgr.get_reply_number(mmsmgr.inbox_info[pos][3])
			status.save_callback = mmscomposestage.save_callback
			mmsmgr.isreply_mms = True
			runtime.manager.stack_stage(mmscomposestage.MMSCreateStage())
			mmsconfig.issend_mms = True

	def manager_save(self):
		self.current_slide = mmsmgr.current_slide
		self.rinfo = mmsmgr.rinfo
		self.rinfo_index = mmsmgr.rinfo_index
		self.infoindex = mmsmgr.infoindex
		import copy
		self.msg = copy.copy(mmsmgr.msg)

	def manager_load(self):
		mmsmgr.current_slide = self.current_slide
		mmsmgr.rinfo = self.rinfo
		mmsmgr.rinfo_index = self.rinfo_index
		mmsmgr.infoindex = self.infoindex
		import copy
		mmsmgr.msg = None
		mmsmgr.msg = copy.copy(self.msg)


def MMSGet_numbers_from_message():
	import os.path
	def get_number(s):
		s = s.replace('-', '')
		# 최대 18, 최소 3
		if not s.isdigit() or len(s) < 3 or len(s) > 50:
			return
		return s

	numbers = []

	for m in mmsmgr.msg.media:
		if m.fname_text:
			if os.path.exists(m.fname_text):
				fp = open(m.fname_text)
				text = fp.read()
				fp.close()
				if text:
					text = text.strip()
					textlist = text.split()
					for c in textlist:
						c=c.strip()
						number = get_number(c)
						if number:
							numbers.append(number)
	return numbers

class MMSOptions_usenumber(ListStage):
	title = _('USE NUMBER')
	icon = uiconfig.message_mms_icon
	def __init__(self):
		boxtype, pos = mmsmgr.MMSBoxtype()
		self.choice = []
		if boxtype == mmsconfig.MMS_INBOX:
			if mmsmgr.inbox_info[pos][3] and mmsmgr.inbox_info[pos][3].isdigit():
				self.choice.append(mmsmgr.inbox_info[pos][3])
		elif boxtype == mmsconfig.MMS_OUTBOX:
			if mmsmgr.outbox_info[pos][2] and mmsmgr.outbox_info[pos][2].isdigit():
				self.choice.append(mmsmgr.outbox_info[pos][2])
		elif boxtype == mmsconfig.MMS_SENTBOX:
			if mmsmgr.sentbox_info[pos][2] and mmsmgr.sentbox_info[pos][2].isdigit():
				self.choice.append(mmsmgr.sentbox_info[pos][2])
		elif boxtype == mmsconfig.MMS_DRAFTBOX:
			if mmsmgr.draftbox_info[pos][2] and mmsmgr.draftbox_info[pos][2].isdigit():
				self.choice.append(mmsmgr.draftbox_info[pos][2])
		self.choice += MMSGet_numbers_from_message()

		ListStage.__init__(self, self.choice, _('USE NUMBER'), None, None, _('OPTIONS'), _('BACK'))

		if len(self.choice) == 0:
			self.no_num_tag = utils.Idle(self.launch_nonum_notify)

	def launch_nonum_notify(self):
		runtime.manager.change_stage(mmscomposestage.MMSMessageNotify(_('No numbers found')))
		return False

	def handle_key(self, key):
		if key in (config.OffHook, config.Green):
			status.dial_number = self.choice[self.ui.get_focus()]
			return False
		return ListStage.handle_key(self, key)

	def activate(self, index):
		runtime.manager.stack_stage(MMSUsenumberStage(self.choice[index]))

class SaveStage(EntryStage):
	# Page 39에 의한 Save
	def __init__(self, num):
		EntryStage.__init__(self, _('Name'), _('SAVE'))
		self.ui.set_max(config.max_pb_name)
		status.phone_item = phonedb.new_item()
		if len(num) > config.max_phone_number:
			num = num[:config.max_phone_number]
		status.phone_item.number = num
		self.ui.set_automata('multitap', 'lower')
		self.ui.automata_idx = 3

	def activate_menu1(self):
		text = self.ui.get_text()
		status.phone_item.name = text

		import phonebook

		status.phonebook_save_stage_name = 'mmsusenumberstage'
		if phonedb.has_name(text):
			# name complict
			stage = phonebook.NameConflictStage()
			runtime.manager.stack_stage(stage)
			return
		phonebook.phone_item_save()

	def activate_menu2(self):
		runtime.manager.back_stage()

class MMSUsenumberStage(ListStage):
	title = _('Number')
	choice = (_('Save in phonebook'), _('Send SMS'), _('Send MMS'), _('Call'))
	name = 'mmsusenumberstage'
	icon = uiconfig.message_mms_icon
	def __init__(self, number):
		self.number = number
		self.index = -1
		ListStage.__init__(self)

		self.current_slide = -1
		self.rinfo = []
		self.rinfo_index = -1
		self.infoindex = -1
		self.msg = None

	def show(self):
		status.save_callback = None
		ListStage.show(self)
		if self.msg:
			mmsconfig.issend_mms = False
			if self.index == 2:
				self.manager_load()
				self.index = -1

	def activate(self, index):
		self.index = index
		if index == 0:
			import phonebook
			from phonedb import phonedb
			if phonedb.has_number(self.number):
				stage = phonebook.PhonebookNotifyStage(_('Number already in phonebook'))
				runtime.manager.stack_stage(stage)
				return

			# phonedb max size check
			if phonedb.count() >= config.phone_db_size:
				runtime.manager.stack_stage(phonebook.PhonebookNotifyStage(_('Memory full')))
				return
			runtime.manager.stack_stage(SaveStage(self.number))
		elif index == 1:
			status.sms_phone_number = self.number
			runtime.manager.stack_stage(smsstage.SmsCompose('new'))
		elif index == 2:
			mmsconfig.issend_mms = True
			self.manager_save()
			mmsmgr.initmsg()
			mmsmgr.load_message()
			mmsmgr.reply_address = mmsmgr.get_reply_number(self.number)
			status.save_callback = mmscomposestage.save_callback
			mmsmgr.isreply_mms = True
			runtime.manager.stack_stage(mmscomposestage.MMSCreateStage())
		elif index == 3:
			if status.phone_status == status.Disconnected:
				runtime.manager.start_call(self.number)

	def manager_save(self):
		self.current_slide = mmsmgr.current_slide
		self.rinfo = mmsmgr.rinfo
		self.rinfo_index = mmsmgr.rinfo_index
		self.infoindex = mmsmgr.infoindex
		import copy
		self.msg = copy.copy(mmsmgr.msg)

	def manager_load(self):
		mmsmgr.current_slide = self.current_slide
		mmsmgr.rinfo = self.rinfo
		mmsmgr.rinfo_index = self.rinfo_index
		mmsmgr.infoindex = self.infoindex
		import copy
		mmsmgr.msg = None
		mmsmgr.msg = copy.copy(self.msg)

class MMSOutboxlistStage(ListStage):
	name = 'outboxlist'
	def __init__(self, boxtype):
		self.boxtype = boxtype
		self._list, self._isread = self.makelist()

		if self.boxtype == mmsconfig.MMS_OUTBOX:
			_title = _('OUTBOX MMS')+'(%d)'%len(mmsmgr.outbox_info)
			_icon = uiconfig.message_mms_outbox_icon
		elif self.boxtype == mmsconfig.MMS_SENTBOX:
			_title = _('SENT MMS')+'(%d)'%len(mmsmgr.sentbox_info)
			_icon = uiconfig.message_mms_sent_icon
		elif self.boxtype == mmsconfig.MMS_DRAFTBOX:
			_title = _('DRAFT MMS')+'(%d)'%len(mmsmgr.draftbox_info)
			_icon = uiconfig.message_mms_draft_icon
		ListStage.__init__(self, self._list, title=_title, icon=_icon)

	def show(self):
		mmsmgr.MMS_Remove_Tempmsg()
		_list, _isread = self.makelist()
		if len(_list) <= 0:
			runtime.manager.back_stage()
			return
		if self._list != _list or self._isread != _isread:
			self._list = _list
			self._isread = _isread
			ListStage.change_choice(self, self._list)
		ListStage.show(self)
		if self.boxtype == mmsconfig.MMS_OUTBOX:
			_title = _('OUTBOX MMS')+'(%d)'%len(mmsmgr.outbox_info)
		elif self.boxtype == mmsconfig.MMS_SENTBOX:
			_title = _('SENT MMS')+'(%d)'%len(mmsmgr.sentbox_info)
		elif self.boxtype == mmsconfig.MMS_DRAFTBOX:
			_title = _('DRAFT MMS')+'(%d)'%len(mmsmgr.draftbox_info)
		self.ui.set_title(_title)

	def makelist(self):
		if self.boxtype == mmsconfig.MMS_OUTBOX:
			return mmsmgr.box_list(mmsconfig.MMS_OUTBOX)
		elif self.boxtype == mmsconfig.MMS_SENTBOX:
			return mmsmgr.box_list(mmsconfig.MMS_SENTBOX)
		elif self.boxtype == mmsconfig.MMS_DRAFTBOX:
			return mmsmgr.box_list(mmsconfig.MMS_DRAFTBOX)


	def activate(self, index):
		runtime.manager.stack_stage(MMSBoxactivateStage(self.boxtype, index))


class MMSOutboxoptions(ListStage):
	name = 'mmsoutboxoptions'
	def __init__(self):
		choice = (_('Delete'), _('Play'), _('Forward'), _('Modify'),  _('Details'), _('Use number'))
		boxtype, index = mmsmgr.MMSBoxtype()
		if boxtype == mmsconfig.MMS_OUTBOX:
			_icon = uiconfig.message_mms_outbox_icon
		elif boxtype == mmsconfig.MMS_SENTBOX:
			_icon = uiconfig.message_mms_sent_icon
		elif boxtype == mmsconfig.MMS_DRAFTBOX:
			_icon = uiconfig.message_mms_draft_icon
		else:
			_icon = uiconfig.message_mms_icon
		num = mmsmgr.slide_getcount()
		if num == 0:
			ListStage.__init__(self, choice, _('OPTIONS')+'[%d/%d]'%(num, num), _icon)
		else:
			ListStage.__init__(self, choice, _('OPTIONS')+'[%d/%d]'%(mmsmgr.current_slide+1, num), _icon)
		self.playmode = -1
		self.backup_address = None
		self.backup_rinfo = None

	def show(self):
		if self.backup_address:
			mmsmgr.msg.info_received = self.backup_address
			self.backup_address = None
		if self.backup_rinfo:
			mmsmgr.rinfo = self.backup_rinfo
			self.backup_rinfo = None
		status.save_callback = None
		ListStage.show(self)

	def destroy(self):
		mmsmgr.isforward = False
		ListStage.destroy(self)

	def activate(self, index):
		stage = None
		if index == 0:
			runtime.manager.stack_stage(mmscomposestage.MMSYesNo(_('Delete MMS?'), self.yes_cb, self.no_cb))
		elif index == 1:
			from mmsplayer import PlayStage
			stage = PlayStage(mmsmgr.msg.media, mmsmgr.msg.fname_smil, False, mmsmgr.get_player_title())
		elif index == 2:
			media, path_media, media_type, slide_list = mmsmgr.media_list()
			if len(media) <= 0:
				runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('No media')))
				return
			status.save_callback = mmscomposestage.save_callback
			self.backup_address = mmsmgr.msg.info_received
			self.backup_rinfo = mmsmgr.rinfo
			mmsmgr.msg.info_received = [[[],[],[]], [[],[],[]]]
			mmsmgr.rinfo = []
			mmsmgr.isforward = True
			stage = mmscomposestage.MMSInputaddress()
		elif index == 3:
			media, path_media, media_type, slide_list = mmsmgr.media_list()
			if len(media) <= 0:
				runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('No media')))
				return
			stage = mmscomposestage.MMSModify()
		elif index == 4: stage = mmscomposestage.MMSDetailStage()
		elif index == 5: stage = MMSOptions_usenumber()

		if stage != None:
			runtime.manager.stack_stage(stage)

	def yes_cb(self):
		runtime.manager.stack_stage(mmscomposestage.MMSMessageNotify(_('MMS Delete'), MMSboxdeleteNotify_cb))

	def no_cb(self):
		runtime.manager.back_stage()

	def back_activate_menu1(self):
		pass

	def back_activate_menu2(self):
		runtime.manager.back_stage()