dd8d9e11f2dfc6528a53949bc812c7c6ef9795cc
[gregoa/zavai.git] / src / app_notify.vala
1 /*
2  * app_notify - zavai notification system
3  *
4  * Copyright (C) 2010  Enrico Zini <enrico@enricozini.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 using GLib;
22
23 namespace zavai {
24 namespace ui {
25 namespace notify {
26
27 public abstract class Notifier : Gtk.Dialog
28 {
29     public string notifier_name { get; construct; }
30
31     construct {
32         set_transient_for(zavai.app);
33         set_modal(true);
34         set_position(Gtk.WindowPosition.CENTER_ON_PARENT);
35     }
36
37     protected virtual bool push_aux_state()
38     {
39         return false;
40     }
41
42     protected virtual bool push_vibrator_state()
43     {
44         return false;
45     }
46
47     protected virtual bool push_ringtone_state()
48     {
49         return false;
50     }
51
52     public int run()
53     {
54         ui.power.backlight.request(notifier_name);
55
56         // Setup our attention seeking strategy
57         bool has_aux = zavai.led.aux != null && push_aux_state();
58         bool has_vibrator = zavai.led.vibrator != null && push_vibrator_state();
59         bool has_ringtone = zavai.audio.soundplayer != null && push_ringtone_state();
60
61         // Run dialog
62         int res = base.run();
63
64         if (has_ringtone) zavai.audio.soundplayer.pop_state(notifier_name);
65         if (has_vibrator) zavai.led.vibrator.pop_state(notifier_name);
66         if (has_aux) zavai.led.aux.pop_state(notifier_name);
67         ui.power.backlight.release(notifier_name);
68         return res;
69     }
70 }
71
72 protected class CallNotifierDialog : ui.notify.Notifier
73 {
74     protected Gtk.Label message;
75     protected Gtk.Button message_button;
76
77     public CallNotifierDialog(string title, string text)
78     {
79         Object(
80             notifier_name: "call",
81             title: title
82         );
83
84         set_size_request(300, 500);
85
86         add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK);
87         add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL);
88         set_default_response(Gtk.ResponseType.OK);
89
90         weak Gtk.VBox vbox = (Gtk.VBox)get_content_area();
91
92         message = new Gtk.Label(text);
93         message_button = new Gtk.Button();
94         message_button.set_image(message);
95         message_button.clicked += (b) => { response(Gtk.ResponseType.OK); };
96         vbox.pack_start(message_button, true, true, 0);
97         message_button.show();
98     }
99
100     protected override bool push_aux_state()
101     {
102         var state = new zavai.led.LedState(notifier_name);
103         state.set_blink(255);
104         zavai.led.aux.push_state(state);
105         return true;
106     }
107
108     protected override bool push_vibrator_state()
109     {
110         var state = new zavai.led.LedState(notifier_name);
111         state.set_blink(255);
112         zavai.led.vibrator.push_state(state);
113         return true;
114     }
115
116     protected override bool push_ringtone_state()
117     {
118         var state = new zavai.audio.PlayerState(notifier_name, config.ringtone_call, true);
119         zavai.audio.soundplayer.push_state(state);
120         return true;
121     }
122 }
123
124 public class CallNotifier : zavai.Resource, ui.notify.Notifier
125 {
126     protected int call_index = -1;
127     protected CallNotifierDialog dialog = null;
128
129     public CallNotifier()
130     {
131         zavai.registry.register(this);
132
133         zavai.gsm.gsm.new_call += trigger;
134         zavai.gsm.gsm.end_call += done;
135     }
136
137     public void trigger(int index)
138     {
139         call_index = index;
140         dialog = new CallNotifierDialog("Call", "TODO");
141
142         if (zavai.led.auxbutton != null)
143             zavai.led.auxbutton.event += on_auxbutton;
144
145         int res = dialog.run();
146         switch (res)
147         {
148             case Gtk.ResponseType.OK:
149                 // TODO clock.alarm_trigger_queue.ack(current);
150                 break;
151             case Gtk.ResponseType.CANCEL:
152                 // TODO clock.alarm_trigger_queue.cancel(current);
153                 break;
154         }
155
156         if (zavai.led.auxbutton != null)
157             zavai.led.auxbutton.event -= on_auxbutton;
158
159         dialog.destroy();
160         dialog = null;
161         call_index = -1;
162     }
163
164     protected bool on_auxbutton(ulong time, bool pressed)
165     {
166         if (dialog == null) return false;
167         dialog.response(Gtk.ResponseType.OK);
168         return true;
169     }
170
171     public void done(int index)
172     {
173         if (call_index != index || dialog == null) return;
174         dialog.response(Gtk.ResponseType.NONE);
175     }
176
177     public void shutdown()
178     {
179         if (dialog == null) return;
180         dialog.response(Gtk.ResponseType.CANCEL);
181     }
182 }
183
184 public CallNotifier call = null;
185
186 public void sms()
187 {
188     var ps = new zavai.audio.PlayerState("gsm", zavai.config.ringtone_sms, false);
189     zavai.audio.soundplayer.push_state(ps);
190 }
191
192 public void init()
193 {
194     call = new CallNotifier();
195
196     zavai.gsm.gsm.new_sms += sms;
197 }
198
199 }
200 }
201 }