From abbb956fbfa369434a3759555fb41b9c2721bd00 Mon Sep 17 00:00:00 2001 From: fgau Date: Tue, 23 Dec 2008 17:21:25 +0000 Subject: [PATCH] add sms detail view git-svn-id: http://www.neo1973-germany.de/svn@218 46df4e5c-bc4e-4628-a0fc-830ba316316d --- epydial/data/themes/blackwhite/sms_detail.edc | 200 ++++++++++++++++++ epydial/data/themes/blackwhite/sms_screen.edc | 52 ++++- epydial/epydial.py | 93 ++++++-- epydial/hon_screen.py | 1 - epydial/incall_screen.py | 19 +- epydial/sms_detail.py | 30 +++ epydial/sms_screen.py | 64 +++++- 7 files changed, 430 insertions(+), 29 deletions(-) create mode 100755 epydial/data/themes/blackwhite/sms_detail.edc create mode 100644 epydial/sms_detail.py diff --git a/epydial/data/themes/blackwhite/sms_detail.edc b/epydial/data/themes/blackwhite/sms_detail.edc new file mode 100755 index 0000000..ddc5bef --- /dev/null +++ b/epydial/data/themes/blackwhite/sms_detail.edc @@ -0,0 +1,200 @@ +// sms_detail.edc +// this is a theme for epydial, a pyneo dialer + +data { + item: "author" "thomasg [thomas (a) gstaedtner (.) net] , fgau (fgau@gau-net.de)"; + item: "version" "prototype"; + item: "name" "epydial_blackwhite"; +} + +fonts { + font: "Vera.ttf" "Vera"; + font: "VeraBd.ttf" "VeraBd"; +} + +images { + image: "bg.png" COMP; +} + +color_classes { + color_class { + name: "unvisible"; + color: 0 0 0 0; + color2: 128 128 128 255; + color3: 128 128 128 255; + } + color_class { + name: "button_inactive"; + color: 255 255 255 128; + color2: 128 128 128 255; + color3: 128 128 128 255;; + } + color_class { + name: "scale"; + color: 255 255 255 56; + color2: 0 0 0 255; + color3: 0 0 0 255; + } +} + +styles { + style { + name: "textblock_style"; + base: "font=Vera font_size=28 align=left valign=top color=#fff wrap=word"; + tag: "h1" "+ font_size=36"; + tag: "/h1" "- \n"; + tag: "p" "+"; + tag: "/p" "- \n"; + tag: "em" "+ style=underline underline_color=#000A underline2_color=#0005"; + tag: "/em" "-"; + tag: "br" "\n"; + tag: "c1" "+ color=#fff"; + tag: "/c1" "-"; + tag: "c2" "+ color=#f3f"; + tag: "/c2" "-"; + } +} + +#define BUTTON(button_number, rel1x, rel1y, rel2x, rel2y, button_caption) \ +part { \ + name: "button_"button_number; \ + type: RECT; \ + description { \ + state: "default" 0; \ + color_class: "unvisible"; \ + rel1 { relative: rel1x rel1y; offset: 0 0; }; \ + rel2 { relative: rel2x rel2y; offset: 0 0; }; \ + } \ + description { \ + state: "default" 0.5; \ + inherit: "default" 0; \ + color_class: "unvisible"; \ + rel1.offset: 0 -5; \ + rel2.offset: 0 5; \ + } \ + description { \ + state: "default" 1; \ + inherit: "default" 0; \ + } \ +} \ +part { \ + name: "button_"button_number"_caption"; \ + type: TEXT; \ + mouse_events: 0; \ + description { \ + state: "default" 0; \ + color_class: "button_inactive"; \ + rel1 { \ + to: "button_"button_number; \ + relative: 0 0; \ + } \ + rel2 { \ + to: "button_"button_number; \ + relative: 1 1; \ + } \ + text { \ + text: button_caption; \ + size: 18; \ + font: "Sans:style=Bold,Edje-Vera"; \ + fit: 1 1; \ + } \ + } \ +} \ +program { \ + name: "button_"button_number"_signal_emit"; \ + signal: "mouse,down,*"; \ + source: "button_"button_number; \ + action: SIGNAL_EMIT "hon_send" button_caption; \ +} \ +program { \ + name: "button_"button_number"_animation"; \ + signal: "mouse,down,*"; \ + source: "button_"button_number; \ + action: STATE_SET "default" 0.5; \ + target: "button_"button_number; \ +} \ +program { \ + name: "button_"button_number"_animation_end"; \ + signal: "mouse,up,*"; \ + source: "button_"button_number; \ + action: STATE_SET "default" 1; \ + target: "button_"button_number; \ + transition: DECELERATE 0.1; \ +} + +#define ITEM(item_number, rel1x, rel1y, rel2x, rel2y) \ +part { \ + name: item_number; \ + type: RECT; \ + description { \ + state: "default" 0; \ + color_class: "scale"; \ + rel1 { relative: rel1x rel1y;}; \ + rel2 { relative: rel2x rel2y;}; \ + } \ +} \ +part { \ + name: "sms_text_"item_number; \ + type: TEXTBLOCK; \ + mouse_events: 0; \ + description { \ + state: "default" 0; \ + color_class: "button_inactive"; \ + align: 0.5 0.5; \ + fixed: 1 1; \ + rel1 { \ + to: item_number; \ + relative: 1/20 0; \ + } \ + rel2 { \ + to: item_number; \ + relative: 19/20 1; \ + } \ + text { \ + text: "muaaaah "; \ + style: "textblock_style"; \ + } \ + } \ +} \ + + +collections { + group { + name: "pyneo/sms/detail"; + min: 100 100; + max: 800 800; + parts { + part { + name: "background"; + type: IMAGE; + mouse_events: 0; + description { + state: "default" 0; + rel1 { relative: 0 0; offset: 0 0; } + rel2 { relative: 1 1; offset: 0 0; } + image { normal: "bg.png"; } + } + } + part { + name: "headline"; + type: TEXT; + description { + state: "default" 0; + color_class: "button_inactive"; + rel1 { relative: 1/20 1/20; } + rel2 { relative: 19/20 3/20; } + text { + text: "sms detail"; + size: 20; + font: "VeraBd"; + fit: 1 1; + } + } + } + ITEM(1, 1/20, 9/40, 19/20, 28/40); + BUTTON(10, 0, 58/70 , 1/3, 68/70, "<"); + BUTTON(11, 1/3, 58/70, 2/3, 68/70, "<"); + BUTTON(12, 2/3, 58/70, 3/3, 68/70, ">"); + } + } +} diff --git a/epydial/data/themes/blackwhite/sms_screen.edc b/epydial/data/themes/blackwhite/sms_screen.edc index 9f797f0..95893b1 100755 --- a/epydial/data/themes/blackwhite/sms_screen.edc +++ b/epydial/data/themes/blackwhite/sms_screen.edc @@ -134,7 +134,7 @@ part { \ } \ } \ part { \ - name: "contact_"item_number; \ + name: "sms_status_"item_number; \ type: TEXT; \ mouse_events: 0; \ description { \ @@ -146,7 +146,7 @@ part { \ } \ rel2 { \ to: item_number; \ - relative: 19/20 1; \ + relative: 3/20 1; \ } \ text { \ text: ""; \ @@ -157,6 +157,54 @@ part { \ } \ } \ } \ +part { \ + name: "sms_time_number_"item_number; \ + type: TEXT; \ + mouse_events: 0; \ + description { \ + state: "default" 0; \ + color_class: "button_inactive"; \ + rel1 { \ + to: item_number; \ + relative: 4/20 0; \ + } \ + rel2 { \ + to: item_number; \ + relative: 19/20 1/2; \ + } \ + text { \ + text: ""; \ + size: 16; \ + font: "Sans:style=Bold,Edje-Vera"; \ + /*fit: 1 1; */\ + align: 0 0.5; \ + } \ + } \ +} \ +part { \ + name: "sms_text_"item_number; \ + type: TEXT; \ + mouse_events: 0; \ + description { \ + state: "default" 0; \ + color_class: "button_inactive"; \ + rel1 { \ + to: item_number; \ + relative: 4/20 1/2; \ + } \ + rel2 { \ + to: item_number; \ + relative: 19/20 1; \ + } \ + text { \ + text: ""; \ + size: 22; \ + font: "Sans:style=Bold,Edje-Vera"; \ + /*fit: 1 1; */\ + align: 0 0.5; \ + } \ + } \ +} \ collections { diff --git a/epydial/epydial.py b/epydial/epydial.py index b2b3647..ac6971c 100755 --- a/epydial/epydial.py +++ b/epydial/epydial.py @@ -30,6 +30,7 @@ CALC_SCREEN_NAME = "pyneo/calc/screen" PIX_SCREEN_NAME = "pyneo/pix/screen" CONTACTS_SCREEN_NAME = "pyneo/contacts/screen" SMS_SCREEN_NAME = "pyneo/sms/screen" +SMS_DETAIL_SCREEN_NAME = "pyneo/sms/detail" from datetime import datetime from dbus import SystemBus @@ -96,6 +97,9 @@ class PyneoController(object): brightness_value = None + call = None + callsigs = [] + @classmethod def register_callback(class_, event_name, callback): print "In register_callback: ", event_name @@ -127,6 +131,8 @@ class PyneoController(object): class_.hon_hotornot = object_by_url(class_.hon.GetDevice('hotornot')) class_.call_type = 'nix' class_.brightness_value = 60 + class_.call = None + class_.callsigs = [] except Exception, e: print "Pyneo error: " + str(e) @@ -139,8 +145,9 @@ class PyneoController(object): # No error (anymore) if class_._dbus_timer: class_._dbus_timer.stop() - # Register our own D-Bus callbacks + # Register our own D-Bus callbacks (device status, new calls, power status, new sms) class_.gsm_wireless.connect_to_signal("Status", class_.on_gsm_wireless_status, dbus_interface=DIN_WIRELESS) + class_.gsm_wireless.connect_to_signal('New', class_.check_new_call, dbus_interface=DIN_WIRELESS) class_.pwr.connect_to_signal("Status", class_.on_pwr_status, dbus_interface=DIN_POWERED) class_.gsm_sms.connect_to_signal('New', class_.check_new_sms, dbus_interface=DIN_STORAGE) @@ -165,6 +172,10 @@ class PyneoController(object): def vote_hon(class_, vote): class_.hon_hotornot.HotOrNot(vote, dbus_interface=DIN_HOTORNOT) + @classmethod + def show_sms_detail(class_, number): + class_.notify_callbacks("show_sms_detail", number) + @classmethod def power_up_gsm(class_): try: @@ -220,20 +231,20 @@ class PyneoController(object): os.system('alsactl -f /usr/share/openmoko/scenarios/gsmhandset.state restore') class_.notify_callbacks("gsm_phone_call_start") name = class_.gsm_wireless.Initiate(number, dbus_interface=DIN_VOICE_CALL_INITIATOR, timeout=200) - call = object_by_url(name) + class_.call = object_by_url(name) @classmethod def gsm_hangup(class_): os.system('alsactl -f /usr/share/openmoko/scenarios/stereoout.state restore') class_.call_type = 'nix' - call = object_by_url('dbus:///org/pyneo/gsmdevice/Call/1') - call.Hangup(dbus_interface=DIN_CALL) + class_.call = object_by_url('dbus:///org/pyneo/gsmdevice/Call/1') + class_.call.Hangup(dbus_interface=DIN_CALL) @classmethod def gsm_accept(class_): os.system('alsactl -f /usr/share/openmoko/scenarios/gsmhandset.state restore') - call = object_by_url('dbus:///org/pyneo/gsmdevice/Call/1') - call.Accept(dbus_interface=DIN_CALL) +# class_.call = object_by_url('dbus:///org/pyneo/gsmdevice/Call/1') + class_.call.Accept(dbus_interface=DIN_CALL) @classmethod def gsm_details(class_): @@ -259,17 +270,17 @@ class PyneoController(object): elif nw_status == 4: raise NotImplementedError("GSM registration has unknown state") - if status.has_key('phone_activity_status'): - ph_status = status['phone_activity_status'] - - if class_.call_type != 'outgoing': - if ph_status == 0: - class_.notify_callbacks("gsm_phone_call_end") - os.system('alsactl -f /usr/share/openmoko/scenarios/stereoout.state restore') - if ph_status == 3: - class_.notify_callbacks("gsm_phone_ringing") - if ph_status == 4: - class_.notify_callbacks("gsm_phone_call_start") +# if status.has_key('phone_activity_status'): +# ph_status = status['phone_activity_status'] +# +# if class_.call_type != 'outgoing': +# if ph_status == 0: +# class_.notify_callbacks("gsm_phone_call_end") +# os.system('alsactl -f /usr/share/openmoko/scenarios/stereoout.state restore') +# if ph_status == 3: +# class_.notify_callbacks("gsm_phone_ringing") +# if ph_status == 4: +# class_.notify_callbacks("gsm_phone_call_start") if status.has_key('rssi'): class_.notify_callbacks("gsm_signal_strength_change", status['rssi']) @@ -409,6 +420,44 @@ class PyneoController(object): def show_contacts_screen(class_): class_.notify_callbacks("show_contacts_screen") + @classmethod + def check_new_call(class_, newmap): + def CallStatus(newmap): + newmap = dedbusmap(newmap) + print '---', 'CallStatus' +# for n, v in newmap.items(): +# print '\t', n, ':', v + + def CallRing(newmap): + newmap = dedbusmap(newmap) + class_.notify_callbacks("gsm_phone_ringing") + if newmap['number']: class_.notify_callbacks("gsm_number_display", newmap['number']) + print '---', 'CallRing' +# for n, v in newmap.items(): +# print '\t', n, ':', v + + def CallEnd(newmap): + class_.notify_callbacks("gsm_phone_call_end") + os.system('alsactl -f /usr/share/openmoko/scenarios/stereoout.state restore') + newmap = dedbusmap(newmap) + print '---', 'CallEnd' +# for n, v in newmap.items(): +# print '\t', n, ':', v + if class_.call: + class_.call = None + while class_.callsigs: + class_.callsigs.pop().remove() + + newmap = dedbusmap(newmap) + print '---', 'CallNew' + os.system('alsactl -f /usr/share/openmoko/scenarios/gsmhandset.state restore') + for n, v in newmap.items(): +# print '\t', n, ':', v + class_.call = object_by_url(n) + class_.callsigs.append(class_.call.connect_to_signal('Ring', CallRing, dbus_interface=DIN_CALL, )) + class_.callsigs.append(class_.call.connect_to_signal('Status', CallStatus, dbus_interface=DIN_CALL, )) + class_.callsigs.append(class_.call.connect_to_signal('End', CallEnd, dbus_interface=DIN_CALL, )) + @classmethod def check_new_sms(class_, newmap,): def InsertSms(status, from_msisdn, time, text): @@ -449,6 +498,10 @@ class PyneoController(object): def show_sms_screen(class_): class_.notify_callbacks("show_sms_screen") + @classmethod + def show_sms_screen_detail(class_): + class_.notify_callbacks("show_sms_screen_detail") + from dialer_screen import * from incall_screen import * @@ -459,6 +512,7 @@ from calc_screen import * from pix_screen import * from contacts_screen import * from sms_screen import * +from sms_detail import * class Dialer(object): screens = None @@ -484,6 +538,7 @@ class Dialer(object): PyneoController.register_callback("show_pix_screen", self.on_pix_screen) PyneoController.register_callback("show_contacts_screen", self.on_contacts_screen) PyneoController.register_callback("show_sms_screen", self.on_sms_screen) + PyneoController.register_callback("show_sms_screen_detail", self.on_sms_screen_detail) # Initialize the D-Bus interface to pyneo dbus_ml = e_dbus.DBusEcoreMainLoop() @@ -554,6 +609,10 @@ class Dialer(object): self.init_screen(SMS_SCREEN_NAME, SmsScreen(self)) self.show_screen(SMS_SCREEN_NAME) + def on_sms_screen_detail(self): + self.init_screen(SMS_DETAIL_SCREEN_NAME, SmsDetail(self)) + self.show_screen(SMS_DETAIL_SCREEN_NAME) + class EvasCanvas(object): def __init__(self, fullscreen, engine_name): diff --git a/epydial/hon_screen.py b/epydial/hon_screen.py index de88273..1ffce9b 100644 --- a/epydial/hon_screen.py +++ b/epydial/hon_screen.py @@ -19,7 +19,6 @@ class HonScreen(EdjeGroup): def register_pyneo_callbacks(self): PyneoController.register_callback("get_hon", self.on_get_hon) - PyneoController.register_callback("vote_hon", self.on_vote_hon) def on_get_hon(self, status): img = object_by_url(status['img']).read() diff --git a/epydial/incall_screen.py b/epydial/incall_screen.py index a418825..92f1330 100644 --- a/epydial/incall_screen.py +++ b/epydial/incall_screen.py @@ -17,14 +17,19 @@ class InCallScreen(EdjeGroup): def on_gsm_number_display(self, number): connection = connect(DB_FILE_PATH) cursor = connection.cursor() - cursor.execute("SELECT * FROM contacts WHERE mobil LIKE '%" + str(number) + "' OR home LIKE '%" + str(number) + "' OR work LIKE '%" + str(number) + "'") - for row in cursor: - CallerNamemap = row[0], row[1], row[2], row[3], row[4] + try: + cursor.execute("SELECT * FROM contacts WHERE mobil LIKE '%" + str(number) + "' OR home LIKE '%" + str(number) + "' OR work LIKE '%" + str(number) + "'") + for row in cursor: + CallerNamemap = row[0], row[1], row[2], row[3], row[4] - if CallerNamemap[1] and CallerNamemap[0]: - self.part_text_set("incall_number_text", "%s"% (CallerNamemap[1] + ', ' + CallerNamemap[0])) - else: - self.part_text_set("incall_number_text", "unbekannt") + if CallerNamemap[2] == str(number): source = 'mobil' + elif CallerNamemap[3] == str(number): source = 'home' + elif CallerNamemap[4] == str(number): source = 'work' + + if CallerNamemap[1] and CallerNamemap[0]: + self.part_text_set("incall_number_text", "%s: %s"% (source, CallerNamemap[1] + ', ' + CallerNamemap[0])) + except: + self.part_text_set("incall_number_text", "unknown") @edje.decorators.signal_callback("dialer_incall_send", "*") def on_edje_signal_dialer_incall_triggered(self, emission, source): diff --git a/epydial/sms_detail.py b/epydial/sms_detail.py new file mode 100644 index 0000000..4c27668 --- /dev/null +++ b/epydial/sms_detail.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python2.5 +# -*- coding: utf-8 -*- +__author__ = "Soeren Apel (abraxa@dar-clan.de), Frank Gau (fgau@gau-net.de), Thomas Gstaedtner (thomas (a) gstaedtner (.) net)" +__version__ = "prototype" +__copyright__ = "Copyright (c) 2008" +__license__ = "GPL3" + +from epydial import * + +class SmsDetail(EdjeGroup): + + def __init__(self, screen_manager): + EdjeGroup.__init__(self, screen_manager, SMS_DETAIL_SCREEN_NAME) + + def register_pyneo_callbacks(self): + PyneoController.register_callback("show_sms_detail", self.on_show_sms_detail) + + def on_show_sms_detail(self, sms_number): + connection = connect(DB_FILE_PATH) + cursor = connection.cursor() + cursor.execute("SELECT * FROM sms WHERE status='%s' ORDER BY time DESC LIMIT 1 OFFSET %s" %('REC UNREAD', sms_number)) + for row in cursor: + self.part_text_set("sms_text_1", row[3]) + + @edje.decorators.signal_callback("mouse,up,1", "*") + def on_edje_signal_dialer_status_triggered(self, emission, source): + if source == "button_10": + PyneoController.show_dialer_screen() + print 'source: ', source + diff --git a/epydial/sms_screen.py b/epydial/sms_screen.py index 689967b..24bb500 100644 --- a/epydial/sms_screen.py +++ b/epydial/sms_screen.py @@ -8,13 +8,73 @@ __license__ = "GPL3" from epydial import * class SmsScreen(EdjeGroup): + sms_offset = 0 + sorted_by = 'REC UNREAD' + detail = False def __init__(self, screen_manager): EdjeGroup.__init__(self, screen_manager, SMS_SCREEN_NAME) + self.show_sms() + + def del_displayed_sms(self): + x=1 + while x < 5: + self.part_text_set("sms_status_%s" %x, "") + self.part_text_set("sms_time_number_%s" %x, "") + self.part_text_set("sms_text_%s" %x, "") + x += 1 + + def show_sms(self): + x = 1 + self.detail = False + self.del_displayed_sms() + self.part_text_set("sort_by", "sorted by: %s" %self.sorted_by) + connection = connect(DB_FILE_PATH) + cursor = connection.cursor() + cursor.execute("SELECT * FROM sms WHERE status='%s' ORDER BY time DESC LIMIT 4 OFFSET %s" %(self.sorted_by, self.sms_offset)) + for row in cursor: + if row[0] == 'REC UNREAD': + read_status = 'U: ' + elif row[0] == 'REC READ': + read_status = 'R: ' + self.part_text_set("sms_status_%s" %x, "%s" %read_status) + self.part_text_set("sms_time_number_%s" %x, "%s, %s" %(row[2][:14], row[1])) + self.part_text_set("sms_text_%s" %x, row[3]) + x += 1 @edje.decorators.signal_callback("mouse,up,1", "*") def on_edje_signal_dialer_status_triggered(self, emission, source): - if source == "button_10": - PyneoController.show_dialer_screen() + if self.detail == False: + if source == "1": + PyneoController.show_sms_screen_detail() + PyneoController.show_sms_detail(self.sms_offset) + if source == "2": + self.sms_offset += 1 + PyneoController.show_sms_screen_detail() + PyneoController.show_sms_detail(self.sms_offset) + if source == "3": + self.sms_offset += 2 + PyneoController.show_sms_screen_detail() + PyneoController.show_sms_detail(self.sms_offset) + if source == "4": + self.sms_offset += 3 + PyneoController.show_sms_screen_detail() + PyneoController.show_sms_detail(self.sms_offset) + if source == "button_10": + PyneoController.show_dialer_screen() + if source == "button_12": + self.sms_offset += 4 + self.show_sms() + if source == "button_11": + self.sms_offset -= 4 + self.show_sms() + if source == "headline" and self.sorted_by == "REC UNREAD": + self.sorted_by = 'REC READ' + self.sms_offset = 0 + self.show_sms() + elif source == "headline" and self.sorted_by == "REC READ": + self.sorted_by = 'REC UNREAD' + self.sms_offset = 0 + self.show_sms() print 'source: ', source