from basemodel import Stage, ListStage, YesNoStage, NotifyStage
import runtime, config, uiconfig
from setting import setting
import baseui, ui
import utils
from sounds import AudioGalleryStage
from model import StorageShortStage
import os, status

class PhotoQualityStage(ListStage):
	# Phase2 136
	icon = uiconfig.image_image_sound_image_icon
# eicho add  06.11.14
	name = 'photorelatedstage'
	
	def __init__(self):
		self.title = _('QUALITY')
		self.choice = _('High'), _('Low')

		ListStage.__init__(self)
		self.ui.set_focus(1 - setting.photo_quality)
	def activate(self, index):
		setting.photo_quality = 1 - index
		def cb():
			runtime.manager.queue_backward(2)
		stage = NotifyStage(_('Quality set'), uiconfig.baloon_photo_icon, cb)
		runtime.manager.change_stage(stage)

class PhotoOptionStage(ListStage):
	name = 'photorelatedstage'
	icon=uiconfig.ico_mm_recorder
	titleimage=uiconfig.Third_title_mm_recorder
	
	def __init__(self, preview_stage):
		self.title = _('OPTIONS')
		self.choice = _('Camera timer'), _('Camera setting')
	
		status.supervision_not_allowed = 0
		self.preview_stage = preview_stage
		ListStage.__init__(self)

	def activate(self, index):
		if index == 0:
			def start_capture():
				self.preview_stage.start_timer()
				runtime.manager.queue_backward(1)

			stage = NotifyStage(_('Camera timer set'), uiconfig.baloon_photo_icon, start_capture)
			runtime.manager.change_stage(stage)
		elif index == 1:
			import menu
			stage = menu.NewCameraSettingStage
			#stage = menu.CameraBrightnessSettingStage
			runtime.manager.stack_stage(stage)
		'''
		elif index == 2:
			import menu
			stage = menu.WhiteBalanceSettingStage
			runtime.manager.stack_stage(stage)
		'''

	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':
			#stage = PhotoPreviewStage
			#runtime.manager.change_stage(stage)
			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
		'''
		return False

# eicho recover 06.10.16 as revision 1.3
# revision 1.4 failed. 
class PhotoCaptureStage(Stage):
	agenda_forbidden = True
# eicho add  06.11.14
	name = 'photorelatedstage'
	
	def __init__(self, mms_mode=0):
		self.mms_mode = mms_mode
		self.filename = self.make_image_name()
		# convert dump image to png image
		self.fullname = config.image_taken_dir + self.filename
#MMW
		self.captured = utils.player.picture_capture(self.fullname)
#end of MMW
		# camera stop, close
		#utils.player.preview_stop()

		title = "%s[%dKB]" % (self.filename[:-4], utils.get_size_kb(self.fullname))
		self.ui = baseui.PreviewUI(_('SAVE'), '', title, '', _('BACK'))

		self.image = None

#		# ¾Ë ¼ö ¾ø´Â ÀÌÀ¯·Î ÀÎÇÑ capture ½ÇÆÐ½Ã(ÆÄÀÏÀÌ »ý¼º ¾ÈµÇ¾úÀ» ½Ã)
#		if not os.access(self.fullname, os.R_OK):
#			def back_cb():
#				utils.player.preview_stop()
#				utils.player.play_effect(config.SETTING_FAILED)
#				stage = NotifyStage(_('No taken photos available'), uiconfig.baloon_photo_icon)
#				runtime.manager.pop_stage().destroy()
#				runtime.manager.change_stage(stage)
#				return False
#			runtime.evas.idle_add(back_cb)
#			return
			
		color = uiconfig.cam_subtitle_color
		font = uiconfig.cam_subtitle_font
		self.pic_info = runtime.evas.text(pos=(0,0),color=color,font=font)
		self.pic_info.text = title
		self.align_center(self.pic_info, uiconfig.cam_cap_style_name_center_pos)
		self.ui.add(self.pic_info)

	
	def align_center(self, l, pos):
		x, y = pos
		width,height = l.size
		l.move(x - width/2, y)
		
	def make_image_name(self):
		filename = ''
		if 0:
			import time, ntptime
			year, mon, day = time.localtime(ntptime.ntime())[:3]
			date = "%02d%02d%02d" % (year%1000, mon, day)
			if date != setting.photo_serial_day:
				setting.photo_serial_day = date
				setting.photo_serial = 0
		else:
			date = "photo"
		findex = setting.photo_serial
		while 1:
#ka...3800 Temporary 2007.04.02
			filename = date + "%03d.jpg" % findex
			#filename = date + "%03d.png" % findex
			if not os.access(config.image_taken_dir + filename, os.R_OK):
				break
			findex = (findex + 1) % 1000
		return filename

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			utils.player.clip_disable()
			utils.player.preview_stop()
			#print 'FIXME: save photo capture here!!!'
			
			# flash memory full check
			free_flash = utils.get_free_flash_memory()
			#print "[yylee debug] free_flash", free_flash
			if free_flash < config.media_min_free_storage:
				utils.remove(config.image_taken_dir + self.filename)
				utils.player.play_effect(config.SETTING_FAILED)
				stage = NotifyStage(_('Gallery is full!'), uiconfig.baloon_photo_icon)
				runtime.manager.change_stage(stage)
				return False
			def saved_cb():
				if status.background_editing:
					from phonesetting import BackgroundGalleryStage
					stage = BackgroundGalleryStage('taken', _('PHOTO GALLERY'))
				else:
					#Phase2 137
					from images import PhotoGalleryStage
					stage = PhotoGalleryStage('taken', self.mms_mode, isshow=False)
				pop = runtime.manager.pop_stage()
				pop.destroy()
				runtime.manager.change_stage(stage)
				stage.set_file(self.filename)
#MMW
				utils.file_time_adaptation(self.captured)
#end of MMW				
				try:
					filenum = self.filename[-3:]
					filenum = filenum.replace('.jpg', '')
					setting.photo_serial = int(filenum)+1
				except:
					setting.photo_serial += 1
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			stage = NotifyStage(_('Photo saved'), uiconfig.baloon_photo_icon, saved_cb)
			runtime.manager.change_stage(stage)
		elif key == config.Menu4 or key == 'CLR':
			utils.player.clip_disable()
			utils.player.preview_stop()
			#ka...3800 MMI¸¦ À§·Î 2007.05.04
			##os.system('fb0top 1')
			def yes():
				#def cb():
				#	runtime.manager.queue_backward(2)
				#utils.player.play_effect(config.SETTING_SUCCEEDED)
				#stage = NotifyStage(_('Photo deleted'), uiconfig.baloon_photo_icon, cb)
				#runtime.manager.change_stage(stage)
				utils.remove(config.image_taken_dir + self.filename)
				runtime.manager.queue_backward(2)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Save will cancel, continue?'), yes, no, '', uiconfig.baloon_photo_icon)
			runtime.manager.stack_stage(stage)
		elif key in (config.Red, config.OffHook):
			utils.player.clip_disable()
			utils.remove(config.image_taken_dir + self.filename)
			return False
		else:
			return False
		return True
		
#ka...3800 2007.06.06 CaptureÈÄ Delete NOÈÄ BackStageµ¹¾Æ¿Â°æ¿ì 
	def show(self):
		#print "[yylee debug] PhotoCaptureStage::show() -", self.fullname
		Stage.show(self)
		##os.system('fb0top 0')
		#runtime.evas.set_clip()
		#utils.player.clip_enable()
		if self.image:
			self.image.free()
		# ¾Ë ¼ö ¾ø´Â ÀÌÀ¯·Î ÀÎÇÑ capture ½ÇÆÐ½Ã(ÆÄÀÏÀÌ »ý¼º ¾ÈµÇ¾úÀ» ½Ã)
		if not os.access(self.fullname, os.R_OK):
			def back_cb():
				utils.player.preview_stop()
				utils.player.play_effect(config.SETTING_FAILED)
				stage = NotifyStage(_('No taken photos available'), uiconfig.baloon_photo_icon)
				runtime.manager.pop_stage().destroy()
				runtime.manager.change_stage(stage)
				return False
			runtime.evas.idle_add(back_cb)
			return

		self.image = utils.put_image(self.fullname, uiconfig.picture_preview_pos)
		utils.image_sized(self.image, uiconfig.picture_preview_pos, uiconfig.picture_preview_size)
		
#ka...3800 2007.05.10 S|W ¹Þ°í stage º¯°æ½Ã¿¡ media Á¤¸®¸¦ À§ÇØ
	def destroy(self):
		Stage.destroy(self)
		#utils.player.preview_stop()
####### answer delay
		##os.system('fb0top 1')
		status.not_screen_saver = False
		if self.image:
			self.image.free()


class PhotoPreviewStage(Stage):
	agenda_forbidden = True
# eicho add  06.11.14
	name = 'photorelatedstage'
	
	def __init__(self, mms_mode=0):
		status.supervision_not_allowed = 1
		self.mms_mode = mms_mode
		#self.ui = baseui.PreviewUI( _('MENU'),'', _('PHOTO CAMERA'), _('SIZE'), _('BACK'))
		self.ui = baseui.PreviewUI( _('MENU'),'', '', _('SIZE'), _('BACK')) # to fix clip error
		
		self.capture_ok_timer = 0
		self.counter = 0
		self.capture_ready = False
		self.interrupted_by_sms = False
		self.timer = 0
		self.timer_img = utils.put_image('time%02d.png'%10, uiconfig.camera_preview_timer_pos)
		self.ui.add(self.timer_img)

		if setting.screen_saver_enabled:
			status.not_screen_saver = True

		color = uiconfig.cam_subtitle_color
		font = uiconfig.cam_subtitle_font
		self.res_info = runtime.evas.text(pos=(0,0),color=color,font=font)
		self.res_info.text = uiconfig.cam_cap_style_name[setting.photo_quality]
		self.align_center(self.res_info, uiconfig.cam_cap_style_name_center_pos)
		self.ui.add(self.res_info)


	def align_center(self, l, pos):
		x, y = pos
		width,height = l.size
		l.move(x - width/2, y)
		
	def handle_key(self, key):
		'''
		if key == config.Menu1:
			if self.timer:
				self.timer = 0
			self.capture_ok_timer = 0
			self.capture_ready = False
			self.ui.set_right('')
			utils.player.preview_stop()
			stage = PhotoOptionStage(self)
			runtime.manager.stack_stage(stage)
			return True
		'''
		if key == config.Menu1:
			utils.player.clip_disable()
			if self.timer:
				self.timer = 0
			self.capture_ok_timer = 0
			self.capture_ready = False
			utils.player.preview_stop()
			stage = PhotoOptionStage(self)
			runtime.manager.stack_stage(stage)
			return True
			'''
			self.start_timer()
			return True
			'''
			'''
			def start_capture():
				self.start_timer()
				runtime.manager.back_stage()
			stage = NotifyStage(_('Camera timer set'), uiconfig.baloon_photo_icon, start_capture)
			runtime.manager.change_stage(stage)
			'''

		if key == config.Menu2  or key == 'OK':
			if not self.capture_ready:
				return True

			if self.timer:
				self.timer = 0
				self.timer_img.hide()
				self.ui.set_right(_('CAPTURE'))
				return True
				
			utils.player.clip_disable()
			
# eicho 06.08.18		INCOMING callÀÌ µé¾î¿Â »óÅÂ
#			if status.call_status == status.IncomingCall :
#				print '\n### STOP CAPTURE for INCOMING call!'
#				return True
			
			self.capture_ok_timer = 0
			self.capture_ready = False
			# camera stop, make temp image
			utils.player.preview_pause()
			stage = PhotoCaptureStage(self.mms_mode)
			runtime.manager.stack_stage(stage)
			return True

		if key == config.Menu3:
			utils.player.clip_disable()
			utils.player.preview_stop()
			setting.photo_quality = (setting.photo_quality + 1) % 5
			self.res_info.text = uiconfig.cam_cap_style_name[setting.photo_quality]
			self.align_center(self.res_info, uiconfig.cam_cap_style_name_center_pos)
			self.show()
		elif key == config.Menu4 or key == 'CLR':
			utils.player.clip_disable()
			runtime.manager.back_stage()
			return True
		return False

	def start_timer(self):
		self.counter = 11
		self.timer = utils.Timer(1000, self.decrease_counter)
		#self.timer_img.pos = uiconfig.camera_preview_timer_pos[setting.photo_quality]
		self.timer_img.pos = uiconfig.camera_preview_timer_pos

	def decrease_counter(self):
		self.counter -= 1
		if self.counter >= 0:
			self.timer_img.file = uiconfig.image_dir+'time%02d.png'%self.counter
			self.timer_img.show()
			runtime.evas.render_now()

			return True
		self.timer = 0
		self.capture()
		setting.reset_screen_saver_timer()
		status.screensaver_activated = False
		return False

	def capture(self):
		self.timer_img.hide()
		runtime.evas.render_now()
		# camera stop, make temp image
		utils.player.preview_pause()
		stage = PhotoCaptureStage(self.mms_mode)
		runtime.manager.stack_stage(stage)

	def show(self):
		if setting.screen_saver_enabled:
			status.not_screen_saver = True
		Stage.show(self)

		runtime.evas.render_now()
		utils.player.preview_start()
		runtime.evas.render_now()
		
		if not self.timer:
			self.timer_img.hide()
		else:
			#self.ui.set_right(_('TIMER CANCEL'))
			self.ui.set_right(_('Cancel timer'))
			self.capture_ready = True
			return

		if self.interrupted_by_sms:
			self.interrupted_by_sms = False
# utils¿¡ run camera¿¡¼­ ¼öÇà
#			if setting.photo_quality == 0:
#				#runtime.evas.set_clip(72, 40, 176, 144)
#				runtime.evas.set_clip(0, 0, 480, 272)
#			else:
#				runtime.evas.set_clip(80, 52, 160, 120)
			self.ui.set_right(_('CAPTURE'))
			self.capture_ready = True
			return 
		
		def check_ok():
# KA: [20070711] ci-capture
			if os.access('/var/run/vengine.id', os.R_OK):
				self.ui.set_right(_('CAPTURE'))
				self.capture_ready = True
				runtime.evas.render_now()
				return False
			self.ui.set_right('')
			return True

		if check_ok():
			self.capture_ok_timer = utils.Timer(20, check_ok)
		runtime.evas.render_now()

	def hide(self):
		status.not_screen_saver = False
		setting.reset_screen_saver_timer()
		self.timer = 0
		self.capture_ok_timer = 0

		self.timer_img.file = uiconfig.image_dir+'time%02d.png'%10
		# self.timer_img.file = 'time%02d.png'%10
		if status.incoming_sms:# or status.bluetooth_activated:
			if config.mm_debug:
				print '>>> incoming sms, clip disable'
			self.interrupted_by_sms = True
			runtime.evas.set_clip()
# KA: [20070711] ci-capture
#		else:
#			utils.player.preview_stop()
#			print 'debug fb0top ----- hide() -1)'
			#os.system('fb0top 0')
		utils.player.clip_disable()
		Stage.hide(self)

	def destroy(self):
		Stage.destroy(self)
		self.timer = 0
		self.capture_ok_timer = 0
		utils.player.preview_stop()
		utils.player.clip_disable()
		print 'debug fb0top ----- destroy() -2)'
####### answer delay
		##os.system('fb0top 1')
		status.supervision_not_allowed = 0
		status.not_screen_saver = False

class AudioRecordDoneStage(Stage):
	def __init__(self, duration, filename, mmsmessage=None):
		self.mmsmessage = mmsmessage
		self.duration = duration
		self.filename = filename
		#utils.player.record_stop()

		#file_size = utils.get_size_kb('/usr/local/lgvp/arec.3gp')
		#file_size = utils.get_size_kb('/usr/local/lgvp/arec.mp4')
		file_size = utils.get_size_kb('/usr/local/lgvp/arec.amr')
		title = "%s[%dKB]" % (self.filename[:-4], file_size)

		if config.mm_debug:
			print title

		self.ui = ui.AudioRecordUI(_('SAVE'),'', _('AUDIO RECORDER'), title,'', _('BACK'))
		# self.ui.duration.text = _('Duration: ') + ('%02d:%02d' % divmod(self.duration, 60))
		self.ui.duration.text = ('%02d:%02d' % divmod(self.duration, 60))
		self.ui.set_max_duration(config.audio_record_duration)
		self.ui.set_value(self.duration)

		audio_recording_done = uiconfig.mmp_recording_done
		name, pos = audio_recording_done
		self.audio_recording_done_icon = utils.put_image(name, pos)
		self.audio_recording_done_icon.hide()
		self.ui.add(self.audio_recording_done_icon)

		pos = uiconfig.audio_rec_subtitle_pos
		color = uiconfig.audio_rec_subtitle_color
		font = uiconfig.audio_rec_subtitle_font
		self.subtitle = runtime.evas.text(pos=pos,color=color,font=font)
		#self.subtitle.text = _('Recording done') + title
		self.subtitle.text = title
		self.ui.add(self.subtitle)
		

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			from mmsutils import MMS_filemove
			# flash memory full check
			free_flash = utils.get_free_flash_memory()
			#print "[yylee debug] free_flash", free_flash
			if free_flash < config.media_min_free_storage:
				MMS_filemove('/usr/local/lgvp/arec.amr', config.audio_recorded_dir + self.filename)
				utils.player.play_effect(config.SETTING_FAILED)
				stage = NotifyStage(_('Gallery is full!'), uiconfig.baloon_photo_icon)
				runtime.manager.change_stage(stage)
				return False
			def cb():
				# after audio save, change to AudioGalleryStage

				runtime.manager.back_stage(name='', isshow=False)
				stage = AudioGalleryStage('recorded', self.mmsmessage)
				if stage.name != 'audio gallery':
					return
				stage.set_focus_item(self.filename)
				runtime.manager.change_stage(stage)
#MMW
				recorded_file_name = '/usr/local/lgvp/audios/audios/recorded/'+ self.filename
				utils.file_time_adaptation(recorded_file_name)
#end of MMW
				try:
					filenum = self.filename[-3:]
					filenum = filenum.replace('.amr', '')
					setting.audio_serial = int(filenum)+1
				except:
					setting.audio_serial += 1
			
			try:
				#MMS_filemove('/usr/local/lgvp/arec.3gp', config.audio_recorded_dir + self.filename)
				#MMS_filemove('/usr/local/lgvp/arec.mp4', config.audio_recorded_dir + self.filename)
				MMS_filemove('/usr/local/lgvp/arec.amr', config.audio_recorded_dir + self.filename)
			except:
				def cb_full():
					runtime.manager.back_stage('audioreadystage')
				utils.player.play_effect(config.SETTING_FAILED)
				runtime.manager.change_stage(NotifyStage(_('Save failed'), uiconfig.baloon_record_icon, cb_full))
				return
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			stage = NotifyStage(_('Voice saved'), uiconfig.baloon_record_icon, cb)
			runtime.manager.change_stage(stage)
			return True
		elif key == config.Menu4 or key == 'CLR':
			def yes():
				#utils.remove('/usr/local/lgvp/arec.3gp')
				#utils.remove('/usr/local/lgvp/arec.mp4')
				utils.remove('/usr/local/lgvp/arec.amr')
				runtime.manager.back_stage('audioreadystage')
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Save will cancel, continue?'), yes, no, '', uiconfig.baloon_record_icon)
			runtime.manager.stack_stage(stage)
			return True

class AudioRecordStage(Stage):
	agenda_forbidden = True
# eicho add  06.11.14
	name = 'audiorelatedstage'
	
	def __init__(self, audiopid, filename, mmsmessage=None):
		self.audiopid = audiopid
		self.mmsmessage = mmsmessage
		if setting.lang == 'Korean':
			self.ui = ui.AudioRecordUI(_('STOP'), '', _('AUDIO RECORDER'), _('Audio recording'))
		else:
			self.ui = ui.AudioRecordUI(_('STOP'), '', _('AUDIO RECORDER'), _('Recording...'))
		self.timer = utils.Timer(1000, self.update_time)
		self.duration = 0
		self.max_duration = config.audio_record_duration
		self.filename = filename
		self.ui.set_max_duration(self.max_duration)
		if config.mm_debug:
			print 'audio filename:', self.filename
		self.update_duration_display()
		self.interrupted_by_sms = False
		self.interrupted = True
		utils.player.amr_record_start()
		if setting.screen_saver_enabled:
			status.not_screen_saver = True

		audio_recording = uiconfig.mmp_recording
		name, pos = audio_recording
		self.audio_recording_icon = utils.put_image(name, pos)
		self.audio_recording_icon.hide()
		self.ui.add(self.audio_recording_icon)

		pos = uiconfig.audio_rec_subtitle_pos
		color = uiconfig.audio_rec_subtitle_color
		font = uiconfig.audio_rec_subtitle_font
		self.subtitle = runtime.evas.text(pos=pos,color=color,font=font)
		self.subtitle.text = _('Audio recording')
		self.ui.add(self.subtitle)

	def update_duration_display(self):
		# self.ui.duration.text = _('Duration: ') + '%02d:%02d' % divmod(self.duration, 60)
		self.ui.duration.text = '%02d:%02d' % divmod(self.duration, 60)
		self.ui.set_value(self.duration)

	def update_time(self):
		if not self.timer:
			return False
		self.duration += 1
		self.update_duration_display()
		runtime.evas.render_now()
		if self.duration >= self.max_duration:
			utils.player.stop(self.audiopid)
			self.audiopid = None
			self.pid = 0
			stage = AudioRecordDoneStage(self.duration, self.filename, self.mmsmessage)
			runtime.manager.change_stage(stage)
			setting.reset_screen_saver_timer()
			status.screensaver_activated = False
			return False
		return True

	def timer_stop(self):
		self.timer = 0

	def destroy(self):
		self.timer = 0
		self.ui.set_left('')
		runtime.evas.render()
		utils.player.stop(self.audiopid)
		self.audiopid = None
		Stage.destroy(self)
		status.not_screen_saver = False
		setting.reset_screen_saver_timer()
		status.screensaver_activated = False
	
	def show(self):
		if setting.screen_saver_enabled:
			status.not_screen_saver = True
		Stage.show(self)
		if self.interrupted_by_sms:
			runtime.manager.change_stage(AudioReadyStage)

	def hide(self):
		self.timer = 0
		self.interrupted_by_sms = True
		self.ui.set_left('')
		Stage.hide(self)
		runtime.evas.render()
		utils.player.stop(self.audiopid)
		self.audiopid = None
		if self.filename:
			utils.remove(config.audio_recorded_dir + self.filename)
		status.not_screen_saver = False
		setting.reset_screen_saver_timer()
		status.screensaver_activated = False
	
	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			utils.player.stop(self.audiopid)
			self.audiopid = None
			self.pid = 0
			#self.audio_recording_icon.hide()
			#self.subtitle.hide()		
			stage = AudioRecordDoneStage(self.duration, self.filename, self.mmsmessage)
			runtime.manager.change_stage(stage)
			return True
		elif key == config.Red:
			self.ui.set_left('')
			runtime.evas.render()
			utils.player.stop(self.audiopid)
			self.audiopid = None
			self.pid = 0		
			utils.remove(config.audio_recorded_dir + self.filename)
			runtime.manager.back_stage()
			return True
		else:
			return False

class AudioReadyStage(Stage):
	name = 'audioreadystage'
	def __init__(self, mmsmessage=None):
		status.supervision_not_allowed = 1
		self.mmsmessage = mmsmessage
		#self.ui = ui.AudioRecordUI('', _('BACK'), _('AUDIO RECORDER'), '')
		self.ui = ui.AudioRecordUI('', '', _('AUDIO RECORDER'), '', '', _('BACK'))
		self.ui.set_max_duration(config.audio_record_duration)
		self.filename = ''
		self.recordstage_timer = None
		self.go_recordstage = False
		self.audiopid = None

		audio_rec_standby = uiconfig.mmp_record_standby
		name, pos = audio_rec_standby
		self.audio_rec_standby_icon = utils.put_image(name, pos)
		self.audio_rec_standby_icon.hide()
		self.ui.add(self.audio_rec_standby_icon)

		pos = uiconfig.audio_rec_subtitle_pos
		color = uiconfig.audio_rec_subtitle_color
		font = uiconfig.audio_rec_subtitle_font
		self.subtitle = runtime.evas.text(pos=pos,color=color,font=font)
		self.subtitle.text = _('Standby')
		self.ui.add(self.subtitle)

	def show(self):
# KA: [20070730] video È­¸éÀ» °¡¸®±â À§ÇØ 
		##os.system('fb0top 1')
		self.go_recordstage = False
		self.ui.set_left('')
		Stage.show(self)
		runtime.evas.render()
		#utils.remove('/usr/local/lgvp/arec.3gp')
		#utils.remove('/usr/local/lgvp/arec.mp4')
		utils.remove('/usr/local/lgvp/arec.amr')
		self.audiopid = utils.player.amr_record_ready()

		self.recordstage_timer = utils.Timer(200, self.check_ok)

	def check_ok(self):
#ka...Temporary 2007.07.23
#		if os.access('/usr/local/lgvp/arec.3gp', os.R_OK):
		self.recordstage_timer = None
		#self.ui.set_left(_('AUDIO RECORD'))
		self.ui.set_left(_('RECORD'))
		
		return True
#		else:
#			return True

	def hide(self):
		if not self.go_recordstage:
			# utils.remove('/usr/local/lgvp/arec.3gp')
			#utils.remove('/usr/local/lgvp/arec.mp4')
			utils.remove('/usr/local/lgvp/arec.amr')
			utils.player.stop(self.audiopid)
			self.audiopid = None
		self.recordstage_timer = None
		Stage.hide(self)

	def destroy(self):
		self.go_recordstage = False
		#utils.remove('/usr/local/lgvp/arec.3gp')
		#utils.remove('/usr/local/lgvp/arec.mp4')
		utils.remove('/usr/local/lgvp/arec.amr')
		utils.player.stop(self.audiopid)
		self.audiopid = None
		self.recordstage_timer = None
		Stage.destroy(self)
		status.supervision_not_allowed = 0

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			if self.recordstage_timer:
				return True
			self.go_recordstage = True
			self.filename = self.make_audio_name()
			#self.audio_rec_standby_icon.hide()
			#self.subtitle.hide()
			stage = AudioRecordStage(self.audiopid, self.filename, self.mmsmessage)
			runtime.manager.stack_stage(stage)
			return True
		elif key in (config.Menu4, 'CLR'):
			runtime.manager.back_stage()
			return True

	def make_audio_name(self):
		filename = ''
		if 0:
			import time, ntptime
			year, mon, day = time.localtime(ntptime.ntime())[:3]
			date = "%02d%02d%02d" % (year%1000, mon, day)
			if date != setting.audio_serial_day:
				setting.audio_serial_day = date
				setting.audio_serial = 0
		else:
			date = "audio"
		findex = setting.audio_serial
		while 1:
			#filename = date + "%03d.3gp" % findex
			#filename = date + "%03d.mp4" % findex
			filename = date + "%03d.amr" % findex
			if not os.access(config.audio_recorded_dir + filename, os.R_OK):
				break
			findex = (findex + 1) % 1000
		return filename

class VideoRecordDoneStage(Stage):
# eicho add  06.11.14
	name = 'videorecorddonestage'
	
	def __init__(self, duration, filename, mmsmessage=None):
		self.mmsmessage = mmsmessage
		self.filename = filename
		if config.video_record_format == '3gp':
			filesize = utils.get_size_kb('/usr/local/lgvp/avrec.3gp')
		elif config.video_record_format == 'mp4':
			filesize = utils.get_size_kb('/usr/local/lgvp/avrec.mp4')
		else:
			filesize = utils.get_size_kb('/usr/local/lgvp/avrec.3gp')
			
		fname = self.filename.split('/')[-1]
		dot = fname.rfind('.')
		if dot >=0:
			fname = fname[:dot]
		sub_title = "%s [%dKB]" % (fname, filesize)
		self.ui = ui.VideoPreviewUI(_('SAVE'), '', _('VIDEO RECORDER'), sub_title, '', _('BACK'))
		self.duration = duration
		self.ui.duration.text = '%02d:%02d' % divmod(self.duration, 60)
		self.ui.set_max_duration(config.video_record_duration)
		self.ui.set_value(self.duration)
		if os.access('/usr/local/lgvp/avrec.png', os.R_OK):
			self.image = utils.put_image('/usr/local/lgvp/avrec.png', uiconfig.gallery_pos)
		else:
			self.image = utils.put_image(uiconfig.image_dir+'icon_image_sound_video.png', uiconfig.gallery_pos)
		#utils.image_center_sized(self.image, 24 + 176/2, 56 + 144/2, 176, 144)
		#utils.image_center_sized(self.image, 22 + 220/2, 51 + 180/2, 220, 180)
		utils.image_sized(self.image, uiconfig.video_rec_preview_pos, uiconfig.video_rec_preview_size)
		self.ui.add(self.image)

		audio_recording_done = uiconfig.mmp_recording_done
		name, pos = audio_recording_done
		self.audio_recording_done_icon = utils.put_image(name, pos)
		self.audio_recording_done_icon.hide()
		self.ui.add(self.audio_recording_done_icon)

		pos = uiconfig.audio_rec_subtitle_pos
		color = uiconfig.audio_rec_subtitle_color
		font = uiconfig.audio_rec_subtitle_font
		self.subtitle = runtime.evas.text(pos=pos,color=color,font=font)
		#self.subtitle.text = _('Recording done') + title
		self.subtitle.text = sub_title
		self.ui.add(self.subtitle)

		pos = uiconfig.video_rec_res_info_pos
		color = uiconfig.video_rec_res_info_color
		ont = uiconfig.video_rec_res_info_font
		self.res_info = runtime.evas.text(pos=pos,color=color,font=font)
		if setting.video_record_res == 0:
			self.res_info.text = 'QCIF: 176x144'
		else:
			self.res_info.text = 'CIF: 352x288'
		self.ui.add(self.res_info)

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			# flash memory full check
			free_flash = utils.get_free_flash_memory()
			#print "[yylee debug] free_flash", free_flash
			if free_flash < config.media_min_free_storage:
				utils.remove_cmd('/usr/local/lgvp/*.3gp')
				utils.remove_cmd('/usr/local/lgvp/*.png')
				utils.remove_cmd('/usr/local/lgvp/*.yuv420')
				utils.player.play_effect(config.SETTING_FAILED)
				stage = NotifyStage(_('Gallery is full!'), uiconfig.baloon_photo_icon)
				runtime.manager.change_stage(stage)
				return False
			def cb():
				from videos import VideoGalleryStage
				runtime.manager.back_stage(name='', isshow=False)
				stage = VideoGalleryStage('recorded', self.mmsmessage, isshow=False)
				runtime.manager.change_stage(stage)
				
				if config.video_record_format == '3gp':
					stage.set_file(self.filename+'.3gp')
					video_recorded_file_name = '/usr/local/lgvp/videos/recorded/'+ self.filename+'.3gp'
				elif config.video_record_format == 'mp4':
					stage.set_file(self.filename+'.mp4')
					video_recorded_file_name = '/usr/local/lgvp/videos/recorded/'+ self.filename+'.mp4'
				else:
					stage.set_file(self.filename+'.3gp')
					video_recorded_file_name = '/usr/local/lgvp/videos/recorded/'+ self.filename+'.3gp'
	
				utils.file_time_adaptation(video_recorded_file_name)
				
				try:
					filenum = self.filename[-3:]
					if config.video_record_format == '3gp':
						filenum = filenum.replace('.3gp', '')
					elif config.video_record_format == 'mp4':
						filenum = filenum.replace('.mp4', '')
					else:
						filenum = filenum.replace('.3gp', '')
					setting.video_serial = int(filenum)+1
				except:
					setting.video_serial += 1
			from mmsutils import MMS_filemove
			try:
				if config.video_record_format == '3gp':
					MMS_filemove('/usr/local/lgvp/avrec.3gp', config.video_recorded_dir + self.filename + '.3gp')
				elif config.video_record_format == 'mp4':
					MMS_filemove('/usr/local/lgvp/avrec.mp4', config.video_recorded_dir + self.filename + '.mp4')
				else:
					MMS_filemove('/usr/local/lgvp/avrec.3gp', config.video_recorded_dir + self.filename + '.3gp')
			except:
				def cb_full():
					runtime.manager.back_stage('video preview')
				utils.remove_cmd('/usr/local/lgvp/*.3gp')
				utils.remove_cmd('/usr/local/lgvp/*.mp4')
				utils.remove_cmd('/usr/local/lgvp/*.png')
				utils.remove_cmd('/usr/local/lgvp/*.yuv420')
				utils.player.play_effect(config.SETTING_FAILED)
				runtime.manager.change_stage(NotifyStage(_('Save failed'), uiconfig.baloon_video_icon, cb_full))
				return
			try:
				MMS_filemove('/usr/local/lgvp/avrec.png', config.video_recorded_thumnail_dir + self.filename + '.png')
			except:
				pass
			utils.remove_cmd('/usr/local/lgvp/*.png')
			utils.remove_cmd('/usr/local/lgvp/*.yuv420')
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			stage = NotifyStage(_('Movie saved'), uiconfig.baloon_video_icon, cb)
			runtime.manager.change_stage(stage)
		elif key == config.Menu4 or key == 'CLR':
			def yes():
				utils.remove_cmd('/usr/local/lgvp/*.3gp')
				utils.remove_cmd('/usr/local/lgvp/*.png')
				utils.remove_cmd('/usr/local/lgvp/*.yuv420')
				runtime.manager.queue_backward(2)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Save will cancel, continue?'), yes, no, '', uiconfig.baloon_video_icon)
			runtime.manager.stack_stage(stage)

class VideoRecordStage(Stage):
	agenda_forbidden = True
	name = 'videorecordstage'
	def __init__(self, mmsmessage=None):
		self.mmsmessage = mmsmessage
		self.interrupted_by_sms = False
		if setting.lang == 'Korean':
			self.ui = ui.VideoPreviewUI(_('STOP'), '', _('VIDEO RECORDER'), _('Video recording'))
		else:
			self.ui = ui.VideoPreviewUI(_('STOP'), '', _('VIDEO RECORDER'), _('Recording...'))
		self.timer = utils.Timer(1000, self.update_time)
		self.duration = 0
		self.max_duration = config.video_record_duration
		self.ui.set_max_duration(self.max_duration)
		self.update_duration_display()
		self.filename = ''
		self.make_video_name()
		utils.player.video_record_start()
		if setting.screen_saver_enabled:
			status.not_screen_saver = True

		video_recording = uiconfig.mmp_recording
		name, pos = video_recording
		self.video_recording_icon = utils.put_image(name, pos)
		self.video_recording_icon.hide()
		self.ui.add(self.video_recording_icon)

		pos = uiconfig.audio_rec_subtitle_pos
		color = uiconfig.audio_rec_subtitle_color
		font = uiconfig.audio_rec_subtitle_font
		self.subtitle = runtime.evas.text(pos=pos,color=color,font=font)
		self.subtitle.text = _('Video recording')
		self.ui.add(self.subtitle)

		pos = uiconfig.video_rec_res_info_pos
		color = uiconfig.video_rec_res_info_color
		ont = uiconfig.video_rec_res_info_font
		self.res_info = runtime.evas.text(pos=pos,color=color,font=font)
		if setting.video_record_res == 0:
			self.res_info.text = 'QCIF: 176x144'
		else:
			self.res_info.text = 'CIF: 352x288'
		self.ui.add(self.res_info)
		
	def show(self):
		if setting.screen_saver_enabled:
			status.not_screen_saver = True
		Stage.show(self)

	def make_video_name(self):
		filename = ''
		if 0:
			import time, ntptime
			year, mon, day = time.localtime(ntptime.ntime())[:3]
			date = "%02d%02d%02d" % (year%1000, mon, day)
			if date != setting.audio_serial_day:
				setting.video_serial_day = date
				setting.video_serial = 0
		else:
			date = "video"
		findex = setting.video_serial
		while 1:
			filename = date + "%03d" % findex
			if not os.access(config.video_recorded_dir + filename, os.R_OK):
				break
			findex = (findex + 1) % 1000
		self.filename = filename

	def update_duration_display(self):
		self.ui.duration.text = '%02d:%02d' % divmod(self.duration, 60)
		self.ui.set_value(self.duration)

	def update_time(self):
		if not self.timer:
			return False
		self.duration += 1
		self.update_duration_display()
		runtime.evas.render_now()

		if self.duration >= self.max_duration:
			##os.system('fb0top 1')
			utils.player.video_end()
			stage = VideoRecordDoneStage(self.duration, self.filename, self.mmsmessage)
			runtime.manager.change_stage(stage)
			setting.reset_screen_saver_timer()
			status.screensaver_activated = False
			return False
		return True

	def timer_stop(self):
		self.timer = 0

	def destroy(self):
		self.timer = 0
		self.ui.set_left('')
		runtime.evas.render()
		# CHECK MERGE 09.05
		##os.system('fb0top 1')
		utils.player.video_end(False)
		Stage.destroy(self)
		status.not_screen_saver = False
		setting.reset_screen_saver_timer()
		status.screensaver_activated = False

# eicho add 06.11.22
	def stop_play(self):
		self.timer = 0
		##os.system('fb0top 1')
		self.ui.set_left('')
		runtime.evas.render()
		utils.player.video_end(False)
		if self.filename:
			utils.remove(config.video_recorded_dir + self.filename)
			utils.remove(config.video_recorded_thumnail_dir + self.filename)
		if status.incoming_sms or status.bluetooth_activated:
			if config.mm_debug:
				print '>>> incoming sms, clip disable'
			self.interrupted_by_sms = True
			runtime.evas.set_clip()
		status.not_screen_saver = False
		setting.reset_screen_saver_timer()
		status.screensaver_activated = False
		
	def hide(self):
		self.timer = 0
		##os.system('fb0top 1')
		self.ui.set_left('')
		runtime.evas.render()
		utils.player.video_end(False)
		if self.filename:
			utils.remove(config.video_recorded_dir + self.filename)
			utils.remove(config.video_recorded_thumnail_dir + self.filename)
		if status.incoming_sms or status.bluetooth_activated:
			if config.mm_debug:
				print '>>> incoming sms, clip disable'
			self.interrupted_by_sms = True
			runtime.evas.set_clip()
		Stage.hide(self)
		status.not_screen_saver = False
		setting.reset_screen_saver_timer()
		status.screensaver_activated = False
	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			##os.system('fb0top 1')
			utils.player.video_end()
			stage = VideoRecordDoneStage(self.duration, self.filename, self.mmsmessage)
			runtime.manager.change_stage(stage)
			return True
		else:
			return Stage.handle_key(self, key)

class VideoPreviewStage(Stage):
	agenda_forbidden = True
	name = 'video preview'
	def __init__(self, mmsmessage=None):
		status.supervision_not_allowed = 1
		self.mmsmessage = mmsmessage
		#self.ui = ui.VideoPreviewUI('', '', _('VIDEO RECORDER'), _('Stand by'))
		self.ui = ui.VideoPreviewUI(_('RECORD'), ' ', _('VIDEO RECORDER'), _('Stand by'),_('SIZE'), _('BACK'))
		self.ui.set_max_duration(config.video_record_duration)
		self.interrupted_by_sms = False
		self.recordstage_timer = None
		self.go_recordstage = False

		if setting.screen_saver_enabled:
			status.not_screen_saver = True

		video_rec_standby = uiconfig.mmp_record_standby
		name, pos = video_rec_standby
		self.video_rec_standby_icon = utils.put_image(name, pos)
		self.video_rec_standby_icon.hide()
		self.ui.add(self.video_rec_standby_icon)

		pos = uiconfig.video_rec_subtitle_pos
		color = uiconfig.video_rec_subtitle_color
		font = uiconfig.video_rec_subtitle_font
		self.subtitle = runtime.evas.text(pos=pos,color=color,font=font)
		self.subtitle.text = _('Standby')
		self.ui.add(self.subtitle)

		pos = uiconfig.video_rec_res_info_pos
		color = uiconfig.video_rec_res_info_color
		ont = uiconfig.video_rec_res_info_font
		self.res_info = runtime.evas.text(pos=pos,color=color,font=font)
		self.res_info.text = ''
		self.ui.add(self.res_info)

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			if self.recordstage_timer:
				return True
			self.go_recordstage = True
			stage = VideoRecordStage(self.mmsmessage)
			runtime.manager.stack_stage(stage)
			return True
		elif key == config.Menu3:
			utils.player.video_end(False)
			utils.remove_cmd('/tmp/*.3gp')
			utils.remove_cmd('/tmp/*.png')
			utils.remove_cmd('/tmp/*.yuv420')
			setting.video_record_res = 1-setting.video_record_res
			self.show()
			
			pass
		elif key in (config.Menu4, 'CLR'):
			runtime.manager.back_stage()
			return True
		return False

	def hide(self):
		self.recordstage_timer = None
		if status.incoming_sms or status.bluetooth_activated:
			if config.mm_debug:
				print '>>> incoming sms, clip disable'
			self.interrupted_by_sms = True
			runtime.evas.set_clip()
		if not self.go_recordstage:
			##os.system('fb0top 1')
			utils.remove_cmd('/usr/local/lgvp/*.3gp')
			utils.remove_cmd('/usr/local/lgvp/*.png')
			utils.remove_cmd('/usr/local/lgvp/*.yuv420')
			utils.player.video_end(False)
		Stage.hide(self)

		status.not_screen_saver = False
		if setting.screen_saver_enabled:
			setting.reset_screen_saver_timer()
			status.screensaver_activated = False
# eicho add 06.11.22
	def stop_play(self):
		self.recordstage_timer = None
		if status.incoming_sms or status.bluetooth_activated:
			if config.mm_debug:
				print '>>> incoming sms, clip disable'
			self.interrupted_by_sms = True
			runtime.evas.set_clip()
		if not self.go_recordstage:
			##os.system('fb0top 1')
			utils.remove_cmd('/usr/local/lgvp/*.3gp')
			utils.remove_cmd('/usr/local/lgvp/*.png')
			utils.remove_cmd('/usr/local/lgvp/*.yuv420')
			utils.player.video_end(False)

		status.not_screen_saver = False
		if setting.screen_saver_enabled:
			setting.reset_screen_saver_timer()
			status.screensaver_activated = False
	
	def show(self):
		self.ui.set_left('')
		# self.ui.set_right(_('BACK'))
		# eicho add 06.11.23
		if status.flag_state_incoming_ss:
			Stage.show(self)
			if setting.screen_saver_enabled:
				status.not_screen_saver = True
			print '#### preview: status.flag_state_incoming_ss is TRUE!!! ####'
			return
			
		Stage.show(self)
		runtime.evas.render()
		self.go_recordstage = False
		if setting.screen_saver_enabled:
			status.not_screen_saver = True

		if self.interrupted_by_sms:
			self.interrupted_by_sms = False
		#os.system('fb0top 0')
		utils.remove_cmd('/usr/local/lgvp/*.3gp')
		utils.remove_cmd('/usr/local/lgvp/*.png')
		utils.remove_cmd('/usr/local/lgvp/*.yuv420')


		if setting.video_record_res == 0:
			self.res_info.text = 'QCIF: 176x144'
		else:
			self.res_info.text = 'CIF: 352x288'
# KA: [20070719] recply
#		campos = (56, 24, 204, 256)
# top left bottom right
		#campos = (56, 24, 200, 206)
		#campos = (51, 22, 231, 242) # top, leftp, bottom, right => 220 x 180 
		campos = (uiconfig.video_rec_preview_pos[1], uiconfig.video_rec_preview_pos[0],\
					uiconfig.video_rec_preview_pos[1]+uiconfig.video_rec_preview_size[1],\
					uiconfig.video_rec_preview_pos[0]+uiconfig.video_rec_preview_size[0])
		utils.player.video_record_ready(campos)
		self.recordstage_timer = utils.Timer(200, self.check_ok)

	def check_ok(self):
# eicho move. 06.11.23	
		##os.system('fb0top 0')
# KA: [200700713_2] video recording
		if os.access('/var/run/vengine.id', os.R_OK):
			self.recordstage_timer = None
			#self.recordstage_timer = utils.Timer(200, self.check_ok2)
			self.check_ok2()
			return False
		else:
			return True

	def check_ok2(self):
		self.recordstage_timer = None
		#self.ui.set_left(_('VIDEO RECORD'))
		self.ui.set_left(_('RECORD'))
		
		return False

	def destroy(self):
		self.recordstage_timer = None
		##os.system('fb0top 1')
		utils.player.video_end(False)
		utils.remove_cmd('/tmp/*.3gp')
		utils.remove_cmd('/tmp/*.png')
		utils.remove_cmd('/tmp/*.yuv420')
		Stage.destroy(self)
		status.supervision_not_allowed = 0
		status.not_screen_saver = False
		if setting.screen_saver_enabled:
			setting.reset_screen_saver_timer()
			status.screensaver_activated = False

class MMToolsStage(ListStage):
	# Phase2 135
	name = 'MMToolsStage'
	icon=uiconfig.ico_mm_recorder
	#titleimage=uiconfig.Third_title_mm_recorder

	def __init__(self):
		self.title = _('MULTIMEDIA TOOLS')
		self.choice = _('Photo capture'), _('Video record'), _('Voice record')
	
		ListStage.__init__(self)
		menu_icons = (uiconfig.list_icon_photo,\
			uiconfig.list_icon_audio)
#			uiconfig.list_icon_video)
#		self.ui.create_icon_column(60, menu_icons)
		#status.supervision_not_allowed = 1

	def activate(self, index):
		# ³²Àº °ø°£ Ã¼Å©
		if not utils.check_free_storage():
			runtime.manager.stack_stage(StorageShortStage)
			return
		# max size Ã¼Å©
		if index == 0 and config.snap_shot_max <= utils.get_file_count(config.image_taken_dir):
			runtime.manager.stack_stage(NotifyStage(_('Gallery is full!'), uiconfig.baloon_photo_icon))
			return
		elif index == 2 and 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
		elif index == 1:
			from videos import get_video_gallery_list
			dirname, thumb_dirname, lists = get_video_gallery_list('recorded')
			if config.video_record_max <= len(lists):
				runtime.manager.stack_stage(NotifyStage(_('Gallery is full!'), uiconfig.baloon_photo_icon))
				return

		stage = (PhotoPreviewStage, VideoPreviewStage, AudioReadyStage)[index]
		runtime.manager.stack_stage(stage)

	def destroy(self):
		ListStage.destroy(self)
		status.supervision_not_allowed = 0



