Newer
Older
Import / projects / LGN-IP3870 / t / orig / sounds.py
from basemodel import Stage, ListStage, NotifyStage, YesNoStage, OkNoStage, EntryStage, SymbolSelectionStage
import runtime, config, utils, status, uiconfig, baseui
from setting import setting
from model import StorageShortStage
import os

#MMW
import stat
#end of MMW

class SoundNotifyStage(NotifyStage):
	def __init__(self, message, cb=None):
		icon = uiconfig.baloon_sound_icon
		NotifyStage.__init__(self, message, icon, cb)

class RecordedAudioStage(ListStage):
	icon = uiconfig.image_image_sound_sound_icon

	def __init__(self, mmsmessage=None):
		self.title = _('RECORDED AUDIOS')
		self.choice = _('Add new'), _('Audio gallery')

		ListStage.__init__(self)
		self.mmsmessage = mmsmessage
		status.supervision_not_allowed = 1

	def activate(self, index):
		if index == 0:
			if status.phonebook_in_calling:
				stage = NotifyStage(_('Audio recorder is not allowed during conversation'), icon=uiconfig.baloon_image_sound_image_icon)
				runtime.manager.stack_stage(stage)
				return
			if status.phone_status != status.Disconnected:
				stage = SoundNotifyStage(_('Recording is not allowed during conversation'))
				runtime.manager.stack_stage(stage)
				return
			# 남은 공간 체크
			if not utils.check_free_storage():
				runtime.manager.stack_stage(StorageShortStage(uiconfig.baloon_record_icon))
				return
			if config.audio_record_max <= utils.get_file_count(config.audio_recorded_dir):
				runtime.manager.stack_stage(NotifyStage(_('Gallery is full!'), uiconfig.baloon_record_icon))
				return
			if config.mm_debug:
				print 'audio capturer'
			import mmtools
			stage = mmtools.AudioReadyStage(self.mmsmessage)
			runtime.manager.stack_stage(stage)
		elif index == 1:
			stage = AudioGalleryStage('recorded', self.mmsmessage)
			if runtime.manager.find_stage('melody choice'):
				if setting.external_ring:
					ring_type = utils.audio_type(setting.external_ring)
					if ring_type == 'recorded':
						stage.set_focus_item(setting.external_ring)
			runtime.manager.stack_stage(stage)
	def destroy(self):
		ListStage.destroy(self)
		status.supervision_not_allowed = 0

class ReceivedMelodyStage(ListStage):
	icon = uiconfig.image_image_sound_sound_icon

	def __init__(self, mmsmessage=None):
		self.title = _('RECEIVED MELODIES')
		self.choice = _('Polyphonic melodies'), _('Other melodies')

		ListStage.__init__(self)
		self.mmsmessage = mmsmessage
		status.supervision_not_allowed = 1

	def activate(self, index):
		if config.mm_debug:
			print 'ReceivedMelodyStage, index:', index
		if index == 0:
			stage = AudioGalleryStage('poly', self.mmsmessage)
			if status.melody_editing:
				if setting.external_ring:
					ring_type = utils.audio_type(setting.external_ring)
					if ring_type == 'poly':
						stage.set_focus_item(setting.external_ring)
		else:
			stage = AudioGalleryStage('other', self.mmsmessage)
			if status.melody_editing:
				if setting.external_ring:
					ring_type = utils.audio_type(setting.external_ring)
					if ring_type == 'other':
						stage.set_focus_item(setting.external_ring)
		runtime.manager.stack_stage(stage)
	def destroy(self):
		ListStage.destroy(self)
		status.supervision_not_allowed = 0

class SortStage(ListStage):
	icon = uiconfig.image_image_sound_sound_icon
	def __init__(self):
		self.title = _('SORT')
		self.choice = _('By name'), _('By size')

		ListStage.__init__(self)
		self.ui.set_focus(setting.audio_sort_rule)

	def activate(self, index):
		setting.audio_sort_rule = index
		stage = runtime.manager.find_stage('audio gallery')
		runtime.manager.back_stage('audio gallery', False)
		stage.refresh_lists()
		stage.change_focus()
		stage.show()

class RenameStage(EntryStage):
	def __init__(self):
		EntryStage.__init__(self, _('Name'), _('RENAME'))
		gallery = runtime.manager.find_stage('audio gallery')
		self.ui.entry.ascii_mode_case3 = True
		self.bell_check = 0
		name = gallery.get_current_name()
		if config.mmi_debug:
			print 'RenameStage name = ', name
		audio_type = utils.audio_type(gallery.get_current_file())
		if audio_type == 'recorded':
			audio_file_ext = gallery.get_current_file()
			ext_name = utils.get_ext(audio_file_ext)
			fullname = config.audio_recorded_dir + unicode(name, 'utf-8').encode('euc-kr') + '.' + ext_name 
			if fullname == setting.external_ring:
				self.bell_check = 1
				if config.mmi_debug:
					print 'RenameStage bell !!'
		#if len(name) > 16:
		#	name = name[:16]
		self.ui.set_text(name)
		self.ui.set_max(16)
		#self.ui.set_fixed_automata(None, False)
		# shchun : global automata change
		if setting.lang == 'Korean':
			self.ui.set_automata('hangul', False)
		else:
			self.ui.set_automata('multitap', 'lower')
		# end shchun		

	def activate_menu1(self):
		new_name = self.ui.get_text()
		if not new_name:
			utils.player.play_effect(config.SETTING_FAILED)
			stage = SoundNotifyStage(_('Empty audio name'))
			runtime.manager.change_stage(stage)
			return

		stage = runtime.manager.find_stage('audio gallery')
		old_name = stage.get_current_name()
		if new_name == old_name:
			utils.player.play_effect(config.SETTING_FAILED)
			runtime.manager.change_stage(SoundNotifyStage(_('No change')))
			return

		if stage:
			if not stage.rename_is_ok(new_name):
				utils.player.play_effect(config.SETTING_FAILED)
				runtime.manager.stack_stage(SoundNotifyStage(_('File exists.')))
				return
				
			for ch in new_name:
				if ch in '\/:*?"<>':
					#runtime.manager.stack_stage(NotifyStage(_('Please, do not use \/:*?"<> characters to make file name'),  uiconfig.baloon_photo_icon))
					msg = runtime.evas.pre_parse(_('Please, do not use %s characters to make file name')%('\/:*?"<>',))
					runtime.manager.stack_stage(NotifyStage(msg,  uiconfig.baloon_photo_icon))
					return
		def cb():
			runtime.manager.back_stage('audio gallery')
			runtime.manager.stage.rename(new_name)

		audio_type = utils.audio_type(stage.get_current_file())
		if audio_type == 'recorded':
			message = _('Audio renamed')
			if self.bell_check == 1:
				audio_file_ext = stage.get_current_file()
				ext_name = utils.get_ext(audio_file_ext)
				setting.external_ring = config.audio_recorded_dir + unicode(new_name, 'utf-8').encode('euc-kr') + '.' + ext_name
				if config.mmi_debug:
					print 'RenameStage bell applied:'+setting.external_ring
		else:
			message = _('Melody renamed')
		utils.player.play_effect(config.SETTING_SUCCEEDED)
		stage = SoundNotifyStage(message, cb)
		runtime.manager.stack_stage(stage)

	def handle_key(self, key):
#ka...hangul 2007.02.05 modify
#		if key == '*':
#			if self.ui.entry.ascii_mode_case3:
#				runtime.manager.stack_stage(SymbolSelectionStage(self, case=3))
#				return True
#		elif key == '#':
#		if key == 'SOFT4':
#			# vpark 2006.08.28 automata		
#			self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)
#			if setting.lang == 'Korean':			
#				self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)	
#				self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]		
#			else:			
#				self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list)			
#				self.ui.automata = config.automata_list[self.ui.automata_idx]		
#			self.ui.set_automata(*self.ui.automata)
#			return True
		if key == config.Menu4:
			runtime.manager.back_stage()
			return True
		return EntryStage.handle_key(self, key)

def AssignStage():
	import phonebook
	from phonedb import phonedb
	if phonedb.is_empty():
		return phonebook.PhoneBookTempEmptyStage()
	gallery = runtime.manager.find_stage('audio gallery')
	status.assign_melody = gallery.get_current_file()

	def phonelist_activate(phonelist, index):
		item = phonelist.get_phonedb_item(index)
# eicho modify 06.10.02
		#item.melody = status.assign_melody
		#phonedb.save()
# end
		def cb():
			runtime.manager.back_stage('audio gallery')
		audio_type = utils.audio_type(status.assign_melody)
		
		if audio_type == 'recorded':
			message = _('Audio assigned')
		else:
			message = _('Melody assigned')
		utils.player.play_effect(config.SETTING_SUCCEEDED)
		stage = NotifyStage(message, uiconfig.baloon_phonebook_icon, cb)
		runtime.manager.change_stage(stage)
		runtime.evas.render_now()
		ret_melody = utils.player.set_as_user_ring(status.assign_melody)
		if ret_melody == True:
			item.melody = status.assign_melody
			phonedb.save()
			
# end.		
		
	status.phonelist_activate = phonelist_activate
	return phonebook.FindStage()

class AudioDetailStage(Stage):
	def __init__(self):
		gallery = runtime.manager.find_stage('audio gallery')
		detail = gallery.get_detail()
		from ui import AudioDetailUI
		self.ui = AudioDetailUI(*detail)
	def handle_key(self, key):
		if key == config.Menu4 or key == 'CLR':
			runtime.manager.back_stage()
			return True

class AudioOptionStage(ListStage):
	def __init__(self, audio_type):
		self.title = _('OPTIONS')
		self.choice1 = _('Set as ringing'), _('Send'), _('Delete'), _('Rename'), _('Assign to contact'), _('Sort'), _('Details')
		self.choice2 = _('Set as ringing'), _('Assign to contact'), _('Sort'), _('Details')
		self.choice3 = _('Set as ringing'), _('Delete'), _('Delete all'), _('Rename'), _('Details')

		self.audio_type = audio_type
		if audio_type == 'ring':
			self.choice = self.choice2
		else:
			from profile import profile
			if profile.get_profile() == 0:
				self.choice = self.choice1
			else:
				self.choice = self.choice3
		ListStage.__init__(self)

	def activate(self, index):
		gallery_stage = runtime.manager.find_stage('audio gallery')
		if self.choice[index] == _('Set as ringing'):
##### eicho modify 06.07.26
			gallery = runtime.manager.find_stage('audio gallery')
			#gallery.set_as_ring()
			#message = _('External calls ringing set')
			message = _('New ringtone set')
			def done_cb():
				runtime.manager.back_stage('audio gallery') # newair7:audio gallery-->audio setting
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			stage = SoundNotifyStage(message, done_cb)
			runtime.manager.stack_stage(stage)
			runtime.evas.render_now()
			gallery.set_as_ring()
			return

		elif self.choice[index] == _('Send'):
			import mmsconfig
			from mmscomposestage import MMSCreateStage, MMSSize_excess
			from mmsmanager import mmsmgr
			if mmsmgr.setmedia(mmsconfig.MEDIA_SOUND, gallery_stage.get_current_file()):
				runtime.manager.stack_stage(MMSCreateStage(addmedia_type=mmsconfig.MEDIA_SOUND))
			else:
				MMSSize_excess()
			return
		elif self.choice[index] == _('Rename'):
			try:			
				gallery = runtime.manager.find_stage('audio gallery')		
				unicode(gallery.get_current_name(),'utf-8')			
				stage = RenameStage	
			except:			
				stage = NotifyStage(_('No change'), uiconfig.baloon_photo_icon)
		elif self.choice[index] == _('Assign to contact'):
			stage = AssignStage()
		elif self.choice[index] == _('Sort'):
			stage = SortStage
		elif self.choice[index] == _('Details'):
			stage = AudioDetailStage
		elif self.choice[index] == _('Delete'):
			def yes():
				def delete_done():
					gallery_stage.delete()
					if len(gallery_stage.lists) == 0:
						runtime.manager.change_stage(NotifyStage(_('Gallery empty!'), uiconfig.baloon_sound_icon))
						if runtime.manager.find_stage('MMToolsStage'):
							runtime.manager.back_stage('MMToolsStage')
						elif runtime.manager.find_stage('my album'):
							runtime.manager.back_stage('my album')
						else:
							runtime.manager.back_stage('idle')
					else:
						#runtime.manager.back_stage('audio gallery')
						#gallery_stage.set_focus_item(gallery_stage.get_current_file())
						stage = AudioGalleryStage('recorded')
						runtime.manager.change_stage(stage)

				if self.audio_type == 'recorded':
					message = _('Voice deleted') #_('Audio deleted')
				else:
					message = _('Voice deleted') #_('Melody deleted')
				utils.player.play_effect(config.SETTING_SUCCEEDED)
				stage = SoundNotifyStage(message, delete_done)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()

			if self.audio_type == 'recorded':
				message = _('Do you want to delete voice?') #_('Delete audio?')
			else:
				message = _('Do you want to delete voice?') #_('Delete melody?')
			stage = YesNoStage(message, yes, no, '', uiconfig.baloon_sound_icon)
		elif self.choice[index] == _('Delete all'):
			def yes():
				def delete_done():
					gallery_stage.delete_all()
					if len(gallery_stage.lists) == 0:
						runtime.manager.change_stage(NotifyStage(_('Gallery empty!'), uiconfig.baloon_sound_icon))
						if runtime.manager.find_stage('MMToolsStage'):
							runtime.manager.back_stage('MMToolsStage')
						elif runtime.manager.find_stage('my album'):
							runtime.manager.back_stage('my album')
						else:
							runtime.manager.back_stage('idle')
					else:
						#runtime.manager.back_stage('audio gallery')
						#gallery_stage.set_focus_item(gallery_stage.get_current_file())
						stage = AudioGalleryStage('recorded')
						runtime.manager.change_stage(stage)

				utils.player.play_effect(config.SETTING_SUCCEEDED)
				stage = SoundNotifyStage(_('Voice deleted'), delete_done)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()

			stage = YesNoStage(_('Do you want to delete all voices?'), yes, no, '', uiconfig.baloon_sound_icon)
			print 'state =', stage

		runtime.manager.stack_stage(stage)

audio_paths = {'ring': config.audio_dir_effect, 	#config.audio_def_dir,
	       'recorded': config.audio_recorded_dir,
	       'poly': config.audio_polyphonic_dir,
	       'other': config.audio_other_dir,
	       'mp3':config.mp3_dir,
	       'basic': config.audio_dir_basic,
	       'sweet':config.audio_dir_sweet,
	       'merry':config.audio_dir_merry,
	       'classic':config.audio_dir_classic,
	       'effect': config.audio_dir_effect,
	       'download':config.audio_dir_download}

def get_audio_gallery_list(type):
	dirname = audio_paths[type]
	return dirname, utils.get_file_lists(dirname)


def AudioGalleryStage(audio_type, mmsmessage=None,ipemailMessage = None, audio_index=0): # newair7:20080419
	#status.supervision_not_allowed = 1
	dirname, lists = get_audio_gallery_list(audio_type)
	if len(lists) == 0:
		utils.player.play_effect(config.SETTING_FAILED)
		return NotifyStage(_('Gallery empty!'), uiconfig.baloon_sound_icon)
	stage = _AudioGalleryStage(audio_type, dirname, lists, mmsmessage,ipemailMessage, audio_index) 
	return stage


class _AudioGalleryStage(ListStage):
	name = 'audio gallery'
	def __init__(self, audio_type, dirname, lists, mmsmessage=None,ipemailMessage = None, audio_index=0):
		self.title = _('AUDIO GALLERY')

		#status.supervision_not_allowed = 1
		self.mmsmessage = mmsmessage
		self.ipemailMessage = ipemailMessage
		self.audio_type = audio_type
		print 'audio_type'
		self.audio_dir = dirname
		self.player_pid = None
		self.lists = lists
		self.audio_index = audio_index # newair7:20080419
		self.audio_number = len(lists)
		ListStage.__init__(self)
		self.refresh_lists(True)
		#self.refresh_lists()

		# title image	검색
		#titleimage = uiconfig.Third_title_audio_gallery
		#name, pos = titleimage
		#title_image = utils.put_image(name, pos)
		#title_image.hide()
		#self.ui.add(title_image)

		# recording Background
		ag_img = uiconfig.audio_gallery_img
		name, pos = ag_img
		ag_image = utils.put_image(name, pos)
		ag_image.hide()
		self.ui.add(ag_image)
	

		if status.melody_editing:
			self.ui.set_left(_('SET'))
		else:
			if self.mmsmessage or self.ipemailMessage:
				self.ui.set_left(_('OK'))
			else:
				self.ui.set_left(_('MENU'))
		#audio_titles= {'ring': _("VIDEOPHONE'S MELODIES"), 'recorded': _('AUDIO GALLERY'), 'poly': _('POLYPHONIC MELODIES'), 'other': _('OTHER MELODIES'), 'mp3':_('MP3GALLERY')}
		#self.ui.set_title(audio_titles[self.audio_type])

	def change_focus(self):
		self.audio_index = 0
		self.ui.set_focus(0)
	
	def refresh_lists(self, isfirst=False):
		if config.stage_debug:
			print '_AudioGalleryStage:refresh_lists'
		names = []
		atype_icons = []
		#thang [20080317 -2] update list satge
		#self.ui.remove_all_icon_columns()
		
		dirname, lists = get_audio_gallery_list(self.audio_type)
		self.lists = lists
		self.audio_number = len(lists)

		self.sort()

		for item in self.lists:
			name = self.get_list_label(item)
			names.append(name)
			ext = utils.get_ext(item[0])
			if ext.lower() == 'imy':
				atype_icons.append(uiconfig.list_icon_melody_mono)
			else:
				atype_icons.append(uiconfig.list_icon_melody_poly)
		if isfirst:
			self.ui.update_lists(names)
			self.choice = names
		else:
			self.change_choice(names)
		#self.ui.create_icon_column( 60, atype_icons )
		#thang [20080317 -2] update list satge
		
	def set_focus_item(self, file):
		file = file.split('/')[-1]
		for i, item in enumerate(self.lists):
			if file == item[0]:
				if config.mm_debug:
					print 'focus item change ->', i
				self.ui.set_focus(i)
				self.audio_index = i
				break

	def get_list_label(self, item):
		fullname = self.audio_dir + item[0]
		name = item[0]
		last_dot = name.rfind('.')
		if last_dot > 0:
			name = name[:last_dot]
			# yylee: added for korean file name support
			try:
				name = unicode(name, 'euc-kr').encode('utf-8')
			except:
				pass

		# name resize
		name = name + " [%dKB]" % utils.get_size_kb(fullname)

		return name

	def handle_key(self, key):
		if key == config.Menu4 or key == 'CLR':
			stage = runtime.manager.find_stage('MMToolsStage')
			if stage:
				runtime.manager.back_stage('MMToolsStage')
			else:
				stage = runtime.manager.find_stage('my album')
				if stage:
					runtime.manager.back_stage('my album')
				else:
					runtime.manager.back_stage()
			return True
			
		ret = ListStage.handle_key(self, key)
		if key in ('Up', 'Down'):
			new_audio_index = self.ui.get_focus()
			runtime.evas.render_now()
			if self.audio_index != new_audio_index:
				self.audio_index = new_audio_index
				self.stop_audio()
				self.play_audio()
		return ret

	def activate(self, index):
		if status.editing_phone_number_index >= 0:
			if status.melody_editing:
#### eicho add 06.08.24
				self.stop_audio()
				'''
				ret_melody = utils.player.set_as_user_ring(self.get_current_file())
				if ret_melody==True :
					from phonedb import phonedb
					phonedb.set_melody(self.get_current_file())
				'''
				def cb():
					runtime.manager.back_stage('modify kind')
				stage = NotifyStage(_('Melody modified'), uiconfig.baloon_phonebook_icon, cb)
				runtime.manager.change_stage(stage)
				runtime.evas.render_now()
				
				ret_melody = utils.player.set_as_user_ring(self.get_current_file())
				if ret_melody==True :
					from phonedb import phonedb
					phonedb.set_melody(self.get_current_file())
# end.
				return
		if status.melody_editing:
			stage = runtime.manager.find_stage('add last')
			if stage:
				# phonebook add entry에서 파생된 Stage인 경우
#### eicho add 06.08.25
				self.stop_audio()
				def cb():
					runtime.manager.back_stage('add last')
				stage = NotifyStage(_('Melody selected'), uiconfig.baloon_phonebook_icon, cb)
				runtime.manager.change_stage(stage)
				runtime.evas.render_now()
				ret_melody = utils.player.set_as_user_ring(self.get_current_file())
				if ret_melody==True :
					status.phone_item.melody = self.get_current_file()
				'''
				status.phone_item.melody = self.get_current_file()
				def cb():
					runtime.manager.back_stage('add last')
				stage = NotifyStage(_('Melody selected'), uiconfig.baloon_phonebook_icon, cb)
				runtime.manager.change_stage(stage)
				'''
# end.
				return
			message = _('Melody for calls set!')
			def done_cb():
				runtime.manager.back_stage('ringing setting')

			#self.set_as_ring()
			stage = SoundNotifyStage(message, done_cb)
			runtime.manager.stack_stage(stage)
			runtime.evas.render_now()
			self.set_as_ring()
			return
		if self.ipemailMessage:
			from ipemailstage import IpEmailAttachNotify
			runtime.manager.stack_stage(IpEmailAttachNotify(_('Recorded audio attached'), \
				unicode(self.get_current_file())))
			return
		if self.mmsmessage:
			from mmsmanager import mmsmgr
			from mmscomposestage import MMSMessageNotify, MMSMessageNotify_cb, MMSSize_excess
			from mmsconfig import MEDIA_SOUND

			if mmsmgr.setmedia(MEDIA_SOUND, self.get_current_file()):
				runtime.manager.change_stage(MMSMessageNotify(self.mmsmessage, MMSMessageNotify_cb))
			else:
				MMSSize_excess()
		else:
			stage = AudioOptionStage(self.audio_type)
			runtime.manager.stack_stage(stage)

	def play_audio(self):
		if status.phone_status != status.Disconnected:
			return
		if len(self.lists) == 0:
			return
		audio_file = self.get_current_file()
		try:
			audio_file = unicode(audio_file, 'utf-8').encode('euc-kr')
		except:
			pass

#		spkOffHook = runtime.SP_context.SPK_OffHook()
#		if spkOffHook.next():
#			spkOffHook.next()

		
		#self.player_pid = utils.player.play(audio_file)
		utils.player.play_stereo(audio_file, gallery=True)

	def stop_audio(self):
		#print 'ka......STOP_audio/ phone_status=', status.phone_status
		if status.phone_status != status.Disconnected:
			return

#		runtime.SP_context.SP_stopPlayback()
#		spkOnHook = runtime.SP_context.SPK_OnHook()
#		if spkOnHook.next():
#			spkOnHook.next()
#			spkOnHook.next()

		#print 'ka......stop----------done'		
		#utils.player.stop(self.player_pid)
		utils.player.stop_ring()

	def sort(self):
		'''
		if config.mm_debug:
			print '_AudioGalleryStage:sort'
		if setting.audio_sort_rule == 0: # name
			def sort_func(x,y):
				return cmp(x[0].lower(), y[0].lower())
		elif setting.audio_sort_rule == 1: # size
			def sort_func(x,y,sort_col=setting.audio_sort_rule):
				return cmp(x[sort_col], y[sort_col])
		else: # date(new 가 먼저)
			def sort_func(x,y,sort_col=setting.audio_sort_rule):
				return -(cmp(x[sort_col], y[sort_col]))
		'''
		def sort_func(x, y):
			return cmp(y[2], x[2])
		self.lists.sort(sort_func)
		
# eicho remove. following occurs error when debug mode is enabled.
		'''
		if config.mm_debug:
			print 'sort', 'col', setting.audio_sort_rule, first
		'''

	def get_current_file(self):
		if config.mm_debug:
			print '************** get current', self.audio_index
		return self.audio_dir + self.lists[self.audio_index][0]
		
	def set_as_ring(self):
		audio_file = self.get_current_file()
		try:
			audio_file = unicode(audio_file, 'utf-8').encode('euc-kr')
		except:
			pass
		if config.mm_debug:
			print 'external'

##############################################
		# eicho modify 06.07.25
		'''
		self.player_pid = utils.player.set_ring_amr(audio_file)

		if self.player_pid == '' or self.player_pid == None:
			if config.mm_debug:
				print '### Can not change audio_file /ring=', setting.external_ring
		else:
			setting.external_ring = audio_file
			if config.mm_debug:
				print 'set this melody to ring', audio_file
		'''
		
		if audio_file.lower().endswith('.amr'):
			utils.player.set_as_ring_cmd(audio_file)
		else:
			setting.external_ring = audio_file
		#eicho modify 06.07.26 setting.external_ring = audio_file
			
	def stop_set_as_ring(self):
		utils.player.stop_change_amr(self.player_pid)
##############################################

	def get_current_name(self):
		name = self.lists[self.audio_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
			try:
				name = unicode(name, 'euc-kr').encode('utf-8')
			except:
				pass
		return name

	def rename_is_ok(self, name):
		old = self.get_current_file()
		ext = utils.get_ext(old)
		name = name + '.' + ext
		new_name = self.audio_dir + name
		try:
			name = unicode(name, 'utf-8').encode('euc-kr')
		except:
			pass
		import os.path
		if os.path.exists(new_name):
			return False
		return True

	def rename(self, name):
		audio_file = self.get_current_file()
		ext = utils.get_ext(audio_file)
		new_name = self.audio_dir + name + '.' + ext
		try:
			audio_file = unicode(audio_file, 'utf-8').encode('euc-kr')
		except:
			pass
		try:
			new_name = unicode(new_name, 'utf-8').encode('euc-kr')
		except:
			pass
			
		if utils.rename(audio_file, new_name):
# eicho add 06.11.23 same as BT, for amw2wav ring
			if config.mm_debug:
				print '   audio_file =', audio_file
				print '   new_name=', new_name
			if audio_file == setting.external_ring:
				setting.external_ring = config.def_melody
			if audio_file.lower().endswith('.amr'):
				p_filename = utils.player.change_name_audiowav(audio_file)
				if os.access(p_filename, os.R_OK):
					utils.remove(p_filename)
			from phonedb import phonedb
			if phonedb.count() >= 1:
				for i in range(phonedb.count()):
					item = phonedb.get_item(i)
					if audio_file == item.melody:
						item.melody=''
						phonedb.save()
# end. 06.11.23
			self.refresh_lists()
			self.set_focus_item(new_name)
			self.show()
			self.ui.set_focus(self.audio_index)

	def delete(self):
		audio_file = self.get_current_file()
		print audio_file
		try:
			audio_file = unicode(audio_file, 'utf-8').encode('euc-kr')
		except:
			pass
		print audio_file

		if audio_file == setting.external_ring:
			setting.external_ring = config.def_melody
# eicho add 06.11.23 same as BT, for amw2wav ring
		if audio_file.lower().endswith('.amr'):
			p_filename = utils.player.change_name_audiowav(audio_file)
			if os.access(p_filename, os.R_OK):
				utils.remove(p_filename)

		from phonedb import phonedb
		if phonedb.count() >= 1:
			for i in range(phonedb.count()):
				item = phonedb.get_item(i)
				if audio_file == item.melody:
					item.melody=''
					phonedb.save()
# end. 06.11.23

		from groupdb import groupdb
		if groupdb.count() >= 1:
			for i in range(groupdb.count()):
				if audio_file == groupdb.get_melody(i):
					groupdb.set_melody(i, path='', name='')
					groupdb.save()

		if utils.remove(audio_file):
			del self.lists[self.audio_index]
			self.audio_number = len(self.lists)
			if self.audio_number > 0:
				if self.audio_index >= self.audio_number:
					self.audio_index = self.audio_number - 1
			self.refresh_lists()
		if config.mm_debug:
			print 'delete this melody', audio_file
			print 'new index:', self.audio_index

	def delete_all(self):
		for i in range(self.audio_number):
			name = self.audio_dir + self.lists[i][0]

			try:
				name = unicode(name, 'utf-8').encode('euc-kr')
			except:
				pass

			utils.remove(name)
		del self.lists[:]

		if not os.path.exists(setting.external_ring):
			setting.external_ring = config.def_melody


	def get_detail(self):
		audio_file = self.get_current_file()

		import time
		stat_audio = os.stat(audio_file)
#MMW	
		atime = os.stat(audio_file)[stat.ST_ATIME]
#		print 'atime**********************', atime
		mtime = os.stat(audio_file)[stat.ST_MTIME]
#		print 'atime**********************', mtime

		ctime = time.localtime(atime)

		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])

#		print 'atime', date 
		
		ctime = time.localtime(mtime)

		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])

#		print 'mtime', date 


#end of MMW
		size = (stat_audio[6] + 1023)/ 1024
		name = audio_file.split('/')[-1]
		try:
			name = unicode(name, 'euc-kr').encode('utf-8')
		except:
			pass
		return (name, date, '%dKB' % size)

	def show(self):
		self.play_audio()
		ListStage.show(self)

	def hide(self):
		self.stop_audio()
		ListStage.hide(self)

	def destroy(self):
		self.stop_audio()
		ListStage.destroy(self)

class SoundsStage(ListStage):
	icon = uiconfig.image_image_sound_sound_icon

	def __init__(self):
		self.title = _('SOUNDS')
		self.choice = _('Recorded audios'), _("Videophone's melodies"), _("Received melodies")
	
		ListStage.__init__(self)
		
	def activate(self, index):
		if index == 1:
			stage = AudioGalleryStage('ring')
			runtime.manager.stack_stage(stage)
			return
		stage = (RecordedAudioStage,None,ReceivedMelodyStage)[index]
		runtime.manager.stack_stage(stage)

class DeleteReceivedAudioStage(ListStage):
	icon = uiconfig.image_image_sound_sound_delete_icon

	def __init__(self):
		self.title = _('DELETE')
		self.choice = _('Polyphonic melodies'), _('Other melodies')
	
		ListStage.__init__(self)
		
	def activate(self, index):
		if index == 0:
			dirname, lists = get_audio_gallery_list('poly')
			if len(lists) == 0:
				stage = SoundNotifyStage(_('No polyphonic melodies'))
				runtime.manager.stack_stage(stage)
				return
			message = _('Delete all polyphonic melodies?')
		else:
			dirname, lists = get_audio_gallery_list('other')
			if len(lists) == 0:
				stage = SoundNotifyStage(_('No other melodies'))
				runtime.manager.stack_stage(stage)
				return
			message = _('Delete all other melodies?')
		def yes():
			if index == 0:
				if config.mm_debug:
					print 'FIXME: delete all polyphonic melodies!!'
				utils.remove_dir(utils.get_audio_dir('poly'))
# eicho add 06.11.23 same as BT.
				utils.remove_dir(config.audio_amr2wav_polyphonic_dir)				
# end.
				stage = NotifyStage(_('All polyphonic melodies deleted'), uiconfig.baloon_sound_delete_icon)
			else:
				if config.mm_debug:
					print 'FIXME: delete all other melodies!!'
				utils.remove_dir(utils.get_audio_dir('other'))
# eicho add 06.11.23 same as BT.				
				utils.remove_dir(config.audio_amr2wav_other_dir)
# end.
				stage = NotifyStage(_('All other melodies deleted'), uiconfig.baloon_sound_delete_icon)
			runtime.manager.change_stage(stage)
		def no():
			runtime.manager.back_stage()
		stage = OkNoStage(message, yes, no, '', uiconfig.baloon_sound_delete_icon)
		runtime.manager.change_stage(stage)

class SoundDeleteStage(ListStage):

	icon = uiconfig.image_image_sound_sound_delete_icon
	def __init__(self):
		self.title = _('DELETE')
		self.choice = _('Recorded audio'),_('All sounds')
	
		ListStage.__init__(self)
	def activate(self, index):
		if index == 0:
			dirname, lists = get_audio_gallery_list('recorded')
			if len(lists) == 0:
				stage = SoundNotifyStage(_('No recorded audios'))
				runtime.manager.stack_stage(stage)
				return
			message = _('Delete all recorded audios?')
			def yes():
				if config.mm_debug:
					print 'FIXME: delete all recorded audios!!'
				utils.remove_dir(utils.get_audio_dir('recorded'))
# eicho add 06.11.23 same as BT.
				utils.remove_dir(config.audio_amr2wav_recorded_dir)
# end.
				stage = NotifyStage(_('All recorded audios deleted'), uiconfig.baloon_sound_delete_icon)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = OkNoStage(message, yes, no, '', uiconfig.baloon_sound_delete_icon)
			runtime.manager.stack_stage(stage)
#ka...3800 malaga 2007.04.02
#		elif index == 1:
#			stage = DeleteReceivedAudioStage()
#			runtime.manager.stack_stage(stage)
		else:
			dirname, lists1 = get_audio_gallery_list('recorded')
			dirname, lists2 = get_audio_gallery_list('poly')
			dirname, lists3 = get_audio_gallery_list('other')
			if len(lists1)+len(lists2)+len(lists3) == 0:
				stage = SoundNotifyStage(_('No sounds'))
				runtime.manager.stack_stage(stage)
				return
			message = _('Delete all sounds?')
			def yes():
				if config.mm_debug:
					print 'FIXME: delete all Sounds!!'
# eicho add 06.11.23 same as BT.
				utils.remove_dir(utils.get_audio_dir('recorded'))
				utils.remove_dir(config.audio_amr2wav_recorded_dir)
				utils.remove_dir(utils.get_audio_dir('poly'))
				utils.remove_dir(config.audio_amr2wav_polyphonic_dir)
				utils.remove_dir(utils.get_audio_dir('other'))
				utils.remove_dir(config.audio_amr2wav_other_dir)
# end.
				stage = NotifyStage(_('All sounds deleted'), uiconfig.baloon_sound_delete_icon)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = OkNoStage(message, yes, no, '', uiconfig.baloon_sound_delete_icon)
			runtime.manager.stack_stage(stage)


class SRSWOWSettingStage(Stage):
	name = 'SRS WOW setting'
	def __init__(self):
		self.ui = baseui.SRSWOWSettingUI(_('SAVE'), '',  '', _('BACK'))
	
	def handle_key(self,key):
		if key == config.Menu1 or key == 'OK':
			setting.srswow_enable = self.ui.srs_wow_set.get_index()
			setting.srswow_preset = self.ui.srs_wow_preset.get_index()
			if setting.srswow_enable == 1:
				utils.enable_srswow()
			else:
				utils.disable_srswow()
			utils.set_srswow_preset(setting.srswow_preset)	
			setting.save()
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			#stage = NotifyStage(_('Wow HD setting saved'), uiconfig.baloon_phonebook_icon) # CHECKME icon
			stage = NotifyStage(_('Set is saved'), uiconfig.baloon_sound_icon)
			runtime.manager.change_stage(stage)
			return True
		elif key == config.Menu4 or key == 'CLR':
			runtime.manager.back_stage()
			return True
		elif key == 'Right' or key == 'Left':
			if self.ui.index == 0:				
				self.ui.srs_wow_set.handle_key(key)
			else:
				self.ui.srs_wow_preset.handle_key(key)
			return True			

		elif key == 'Up':
			if self.ui.index == 0:
				self.ui.index = 1
			else:
				self.ui.index = 0				
			self.ui.set_focus(self.ui.index)			
			return True
		elif key == 'Down':
			if self.ui.index == 0:
				self.ui.index = 1
			else:
				self.ui.index = 0
			self.ui.set_focus(self.ui.index)
			return True	
			


# Newair7: [20080415] Sound setting --> select bell
class NewSelectBellStage(Stage):
	name = 'new_select_bell'
	def __init__(self):
		#self.ui = baseui.NewSelectBellUI(_('SAVE'), _('LIST'),  '', _('BACK'))
		self.ui = baseui.NewSelectBellUI(_('SAVE'), '',  '', _('BACK'))	# LIST key is blocked...
		self.player_pid = None		
		#dirname, lists = get_audio_gallery_list('basic')	
		#self.audio_dir = dirname		
		#self.lists = lists
		self.play_audio_timer = None

	def get_current_file(self):
		if config.mmi_debug: 
			print 'self.ui.audio_file_index=', self.ui.audio_file_index
		filename = self.ui.full_lists[self.ui.audio_file_index]
		if config.mmi_debug:
			print '************** get current index=', self.ui.audio_file_index
			print 'ui.audio_dir =', self.ui.audio_dir
			print 'filename =', filename
			print 'filename[0]=', filename[0]
			print 'result =', self.ui.audio_dir + filename[0]
			
		return self.ui.audio_dir + filename[0]
		
	def play_audio(self):
		if status.phone_status != status.Disconnected:
			return
		if self.ui.audio_file_index <= -1:
			if config.mmi_debug: print 'index invalid. so not play'
			return
		audio_file = self.get_current_file()
		if config.mmi_debug: print 'audio filename = ', audio_file
		utils.player.play_ring(audio_file)

	def stop_audio(self):
		utils.player.stop_ring()
		
	def destroy(self):
		self.stop_audio()
		Stage.destroy(self)	
		self.play_audio_timer = None

	def handle_key(self,key):
		if key == config.Menu1 or key == 'OK':
			self.play_audio_timer = None
			self.stop_audio()
			runtime.mmedia.unload()
			if self.ui.audio_file_index == -1:	
				stage = NotifyStage(_('Invalid ring for external calls'), uiconfig.baloon_phonebook_icon) # CHECKME icon
				runtime.manager.change_stage(stage)
				utils.player.play_effect(config.SETTING_FAILED)
			else:
				audio_file = self.get_current_file()
				if config.mmi_debug: print 'audio_file = ', audio_file
				if os.access(audio_file, os.R_OK): # 20080419 added
					# KA: [20080527] for test- mmf ring
					setting.mmf_external_ring = ''
					if audio_file.endswith('mmf'):
						setting.mmf_external_ring = audio_file
						os.system('cp \"%s\" /mfs/ram/mmf/ring.mmf'%audio_file)
						audio_file = '/mfs/ram/mmf/ring.mmf'
					# KA: [20080527] for test- mmf ring
					if audio_file.lower().endswith('.amr'):
						utils.player.set_as_ring_cmd(audio_file)
					else:
						setting.external_ring = audio_file
					setting.save()
					message = _('Set is saved')
					
					stage = NotifyStage(message, uiconfig.baloon_phonebook_icon) # CHECKME icon
					runtime.manager.change_stage(stage)
					utils.player.play_effect(config.SETTING_SUCCEEDED)
				else:
					stage = NotifyStage(_('Already deleted or renamed'), uiconfig.baloon_phonebook_icon) # CHECKME icon
					runtime.manager.change_stage(stage)
					utils.player.play_effect(config.SETTING_FAILED)
				
			return True
		elif key == config.Menu2:
			return True	# List key is blocked...
			self.stop_audio()
			import menu
			if self.ui.index == 0:
				runtime.manager.stack_stage(SelectBellListStage)
				runtime.manager.stage.ui.set_focus(self.ui.audio_dir_index)  # audio_dir_index
			else:
				runtime.manager.stack_stage(SelectBellListStage)			
				runtime.manager.stage.ui.set_focus(self.ui.audio_dir_index)
				if self.ui.audio_file_index == -1:
					self.ui.audio_file_index = 0
				runtime.manager.stage.activate(self.ui.audio_dir_index, self.ui.audio_file_index,  stage_change=True) # 20080419 added					
				runtime.manager.stage.ui.set_focus(self.ui.audio_file_index)				
				self.ui.index = 0
				#self.ui.audio_file_index = -1
				#file_index = self.ui.audio_file_index
			return True
		elif key == config.Menu3:				
			return True
		elif key == config.Menu4 or key == 'CLR':
			self.play_audio_timer = None
			self.stop_audio()
			runtime.manager.back_stage()
			return True
		elif key == 'Right':
			self.play_audio_timer = None
			if self.ui.index == 0:				
				self.ui.change_melody_dir(True)
			else:
				self.stop_audio()
				self.ui.change_melody_file(True)
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			return True			
		elif key == 'Left':
			self.play_audio_timer = None
			if self.ui.index == 0:				
				self.ui.change_melody_dir(False)
			else:
				self.stop_audio()
				self.ui.change_melody_file(False)
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			return True
		elif key == 'Up':
			self.play_audio_timer = None
			if self.ui.index == 0:
				self.ui.index = 1
				#self.stop_audio()
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			else:
				self.ui.index = 0				
				self.stop_audio()
			self.ui.set_focus(self.ui.index)			
			return True
		elif key == 'Down':
			self.play_audio_timer = None
			if self.ui.index == 0:
				self.ui.index = 1
				#self.stop_audio()
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			else:
				self.ui.index = 0
				self.stop_audio()
			self.ui.set_focus(self.ui.index)
			return True			
		elif key == config.OffHook or key == config.Green or key == config.Red or key == config.Video:
			self.play_audio_timer = None
			return False
		else:
			if config.mmi_debug: print 'CHECKME more!!! key=', key
			return True


class SelectBellListStage(ListStage):
	def __init__(self):
		self.title = _('SELECT BELL')
		#self.choice = _('Basic bell'), _('Sweet bell'), _('Merry bell'), _('Classic bell'), _('Effect bell'), _('Download bell')
		self.choice = _('Basic bell'), _('Sweet bell'), _('Merry bell'), _('Classic bell'), _('Effect bell')

		ListStage.__init__(self,titleimage=uiconfig.Third_title_select_bell)
	
	def activate(self, dir_index=0, audio_index=0, stage_change=False):
		bell_type = ['basic', 'sweet', 'merry', 'classic', 'effect', 'download']	
		if config.mmi_debug: 
			print '### bell_type name =', bell_type[dir_index]
			print '### audio_index =', audio_index
		stage = AudioGalleryStage(bell_type[dir_index], audio_index=audio_index)
		if stage_change == False:
			runtime.manager.stack_stage(stage)
		else:
			runtime.manager.change_stage(stage)
		return

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			if self.ui.get_focus() >= 0:
				self.activate(self.ui.get_focus())
			return True
		# yylee modified to add new soft key
		# elif key == config.Menu2:
		elif key == config.Menu4 or key == 'CLR':
			if self.isactivate2:
				self.activate2(self.ui.get_focus())
			else:
				runtime.manager.back_stage()
			return True
		elif key in ('Up', 'Down'):
			return self.ui.handle_key(key)
		elif key == '1':
			self.activate(0)
			return True
		elif key == '2':
			self.activate(1)
			return True
		elif key == '3':
			self.activate(2)
			return True	
		elif key == '4':
			self.activate(3)
			return True
		elif key == '5':
			self.activate(4)
			return True
		elif key == '6':
			self.activate(5)
			return True	
		elif key == '7':
			self.activate(6)
			return True
		elif key == '8':
			self.activate(7)
			return True
		elif key == '9':
			self.activate(8)
			return True
		return False
		

# Newair7: [20080415] Sound setting --> select effect
class NewSelectEffectStage(Stage):
	name = 'new_select_effect'
	def __init__(self,index=0):
		self.ui = baseui.NewSelectEffectUI(index, _('SAVE'), '',  '', _('BACK'))
		self.player_pid = None

	def get_current_file(self):
		if config.mm_debug:
			print '************** get current', self.audio_index
		return self.audio_dir + self.lists[self.audio_index][0]
		
	def play_audio(self):
		if status.phone_status != status.Disconnected:
			return
		if len(self.lists) == 0:
			return
		audio_file = self.get_current_file()
		#self.player_pid = utils.player.play(audio_file)

	def stop_audio(self):
		if status.phone_status != status.Disconnected:
			return
		#utils.player.stop(self.player_pid)
		
	def get_current_name(self):
		name = self.lists[self.audio_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
		return name

	def destroy(self):
		self.stop_audio()
		Stage.destroy(self)				

	def handle_key(self,key):
		if key == config.Menu1 or key == 'OK':
			#setting.button_effect_index = self.ui.button_effect_index
			if self.ui.button_effect_index == 1:
				setting.button_effect_index = 1
			elif self.ui.button_effect_index == 2:
				setting.button_effect_index = 3
			elif self.ui.button_effect_index == 3:
				setting.button_effect_index = 4
			else:
				print "[error] execption case while setting button effect"
				setting.button_effect_index = self.ui.button_effect_index
			setting.setting_effect_index = self.ui.setting_effect_index
			#setting.message_effect_index = self.ui.msg_effect_index
			#setting.weather_effect_index = self.ui.weather_effect_index
			setting.save()
			runtime.mmedia.unload()
			
			if setting.button_effect_index == 0:
				runtime.mmedia.unload()
			
			stage = NotifyStage(_('Set is saved'), uiconfig.baloon_phonebook_icon) # CHECKME icon
			runtime.manager.change_stage(stage)
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			return True
		elif key == config.Menu2:	
			return True
		elif key == config.Menu3:				
			return True
		elif key == config.Menu4 or key == 'CLR':				
			runtime.manager.back_stage()
			return True
		elif key == 'Right':
			if self.ui.index == 0:
				self.ui.change_button(True)
			elif self.ui.index == 1:
				self.ui.change_setting(True)
			'''
			elif self.ui.index == 2:
				self.ui.change_message(True)
			'''
			'''
			elif self.ui.index == 3:
				self.ui.change_weather(True)
			'''
			return True			
		elif key == 'Left':
			if self.ui.index == 0:
				self.ui.change_button(False)
			elif self.ui.index == 1:
				self.ui.change_setting(False)
			'''
			elif self.ui.index == 2:
				self.ui.change_message(False)
			'''
			'''
			elif self.ui.index == 3:
				self.ui.change_weather(False)
			'''
			return True	
		elif key == 'Down':
			self.ui.index = 1 - self.ui.index
			'''
			self.ui.index += 1
			if self.ui.index >  2:
				self.ui.index = 0
			'''
			
			self.ui.set_focus(self.ui.index)			
			return True
		elif key == 'Up':
			self.ui.index = 1- self.ui.index
			'''
			self.ui.index -= 1
			if self.ui.index < 0:
				self.ui.index = 2
			'''
			self.ui.set_focus(self.ui.index)
			return True			
		elif key == config.OffHook or key == config.Green or key == config.Red or key == config.Video:
			return False
		else:
			if config.mmi_debug: print 'CHECKME more!!! key=', key
			return True

class GroupBellStage(ListStage):
	name = 'groupbellstage'
#	choice = _('Undefined'), _('Family'), _('Relatives'), _('Friend'), _('Office'), _('School'), _('Etc')
	#titleimage=uiconfig.title_setting_groupbell
	icon = uiconfig.setting_groupbell_icon
	def __init__(self):
		self.title = _('GROUP BELL')

		from groupdb import groupdb
		groupdb.valid_check()
		self.load_group()
		ListStage.__init__(self, left=_('OK'), menu4=_('BACK'))
		self.change_choice(self.choice)
	def load_group(self):
		self.choice= []
		from groupdb import groupdb
		self.choice = groupdb.get_group_list()
		
#	def activate(self, index):
#		stage = EditGroupStage(index)
#		runtime.manager.stack_stage(stage)	

	def select_group(self, index):
		# print "[yylee debug] select_group index:", index
		if index < len(self.choice):
			stage = EditGroupBellStage(index)
			runtime.manager.stack_stage(stage)
			return True
		else:
			return False

	def show(self):
		#self.load_group()
		#self.change_choice(self.choice)
		ListStage.show(self)

	def handle_key(self, key):
		index = self.ui.get_focus()
		if key == config.Menu1 or key == 'OK':
			stage = EditGroupBellStage(index)
			runtime.manager.stack_stage(stage)	
		elif key == config.Menu4 or key == 'CLR':				
			runtime.manager.back_stage()
		elif key in ('Up', 'Down'):
			ListStage.handle_key(self, key)
		elif key in '123456789':
			index = int(key) -1
			self.select_group(index)
		else:
			return False
		return True


class EditGroupBellStage(Stage):
	name = 'EditGroupBell'
	def __init__(self,index):
		self.ui = baseui.EditGroupBellUI(index, _('SAVE'), '', '', _('BACK'))
		self.player_pid = None
		self.play_audio_timer = None

	def get_current_file(self):
		'''
		if config.mm_debug:
			print '************** get current', self.audio_index
		return self.audio_dir + self.lists[self.audio_index][0]
		'''
		return self.ui.get_current_file()
		
	def play_audio(self):
		if status.phone_status != status.Disconnected:
			return
		'''
		if len(self.lists) == 0:
			return
		'''
		audio_file = self.get_current_file()
		if audio_file != '':
			#self.player_pid = utils.player.play(audio_file)
			utils.player.play_ring(audio_file)

	def stop_audio(self):
		if status.phone_status != status.Disconnected:
			return
		#utils.player.stop(self.player_pid)
		utils.player.stop_ring()
		
	def get_current_name(self):
		name = self.lists[self.audio_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
		return name

	def destroy(self):
		Stage.destroy(self)	
		self.stop_audio()
		self.play_audio_timer = None

	def handle_key(self,key):
		if key == config.Menu1 or key == 'OK':
			self.play_audio_timer = None
			# print "[yylee debug] item_index: ", self.ui.item_index
			if self.ui.audio_dir_index != 0:
				if self.ui.audio_file == '' or self.ui.audio_file == _('None'):
					stage = NotifyStage(_('Invalid ring for external calls'), uiconfig.baloon_phonebook_icon) # CHECKME icon
					runtime.manager.stack_stage(stage)
					return True
			from groupdb import groupdb
			groupdb.set_melody(self.ui.item_index, self.ui.path, self.ui.audio_file)		
			import phonebook 
			stage = phonebook.PhonebookNotifyStage(_('Set is saved'))
			runtime.manager.change_stage(stage)
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			return True
		elif key == config.Menu4 or key == config.CLEAR:
			self.play_audio_timer = None
			runtime.manager.back_stage()
			return True
		elif key == 'Right':
			self.play_audio_timer = None
			if self.ui.index == 0:
				self.ui.change_melody_dir(True)
				self.ui.change_melody_file(True, dir_changed=True)
			else:
				self.stop_audio()
				self.ui.change_melody_file(True)
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			return True
		elif key == 'Left':
			self.play_audio_timer = None
			if self.ui.index == 0:
				self.ui.change_melody_dir(False)
				self.ui.change_melody_file(False, dir_changed=True)
			else:
				self.stop_audio()
				self.ui.change_melody_file(False)
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			return True
		elif key == 'Up' or key == 'Down':
			self.play_audio_timer = None
			self.ui.handle_key(key)
			if self.ui.index == 1:
				self.stop_audio()
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			else:
				self.stop_audio()
			return True
		#return False