OSDN Git Service

adfe740960523c9f7125e077fb449d70a408154b
[android-x86/packages-apps-DeskClock.git] / src / com / android / deskclock / AlarmClock.java
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.deskclock;
18
19 import android.app.Activity;
20 import android.app.AlertDialog;
21 import android.content.Context;
22 import android.content.DialogInterface;
23 import android.content.Intent;
24 import android.content.SharedPreferences;
25 import android.content.res.Configuration;
26 import android.database.Cursor;
27 import android.graphics.Typeface;
28 import android.net.Uri;
29 import android.os.Bundle;
30 import android.os.Handler;
31 import android.provider.Settings;
32 import android.view.ContextMenu;
33 import android.view.ContextMenu.ContextMenuInfo;
34 import android.view.LayoutInflater;
35 import android.view.Menu;
36 import android.view.MenuItem;
37 import android.view.View;
38 import android.view.View.OnClickListener;
39 import android.view.View.OnCreateContextMenuListener;
40 import android.view.ViewGroup;
41 import android.widget.AdapterView;
42 import android.widget.AdapterView.AdapterContextMenuInfo;
43 import android.widget.AdapterView.OnItemClickListener;
44 import android.widget.Button;
45 import android.widget.CheckBox;
46 import android.widget.CursorAdapter;
47 import android.widget.ImageButton;
48 import android.widget.ImageView;
49 import android.widget.ListView;
50 import android.widget.TextView;
51
52 import java.util.Calendar;
53
54 /**
55  * AlarmClock application.
56  */
57 public class AlarmClock extends Activity implements OnItemClickListener {
58
59     final static String PREFERENCES = "AlarmClock";
60
61     /** This must be false for production.  If true, turns on logging,
62         test code, etc. */
63     final static boolean DEBUG = false;
64
65     private SharedPreferences mPrefs;
66     private LayoutInflater mFactory;
67     private ListView mAlarmsList;
68     private Cursor mCursor;
69
70     private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,
71             Alarm alarm) {
72         bar.setImageResource(enabled ? R.drawable.ic_indicator_on
73                 : R.drawable.ic_indicator_off);
74         Alarms.enableAlarm(this, alarm.id, enabled);
75         if (enabled) {
76             SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
77                     alarm.daysOfWeek);
78         }
79     }
80
81     private class AlarmTimeAdapter extends CursorAdapter {
82         public AlarmTimeAdapter(Context context, Cursor cursor) {
83             super(context, cursor);
84         }
85
86         public View newView(Context context, Cursor cursor, ViewGroup parent) {
87             View ret = mFactory.inflate(R.layout.alarm_time, parent, false);
88
89             DigitalClock digitalClock = (DigitalClock) ret.findViewById(R.id.digitalClock);
90             digitalClock.setLive(false);
91             if (Log.LOGV) Log.v("newView " + cursor.getPosition());
92             return ret;
93         }
94
95         public void bindView(View view, Context context, Cursor cursor) {
96             final Alarm alarm = new Alarm(cursor);
97
98             View indicator = view.findViewById(R.id.indicator);
99
100             // Set the initial resource for the bar image.
101             final ImageView barOnOff =
102                     (ImageView) indicator.findViewById(R.id.bar_onoff);
103             barOnOff.setImageResource(alarm.enabled ?
104                     R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);
105
106             // Set the initial state of the clock "checkbox"
107             final CheckBox clockOnOff =
108                     (CheckBox) indicator.findViewById(R.id.clock_onoff);
109             clockOnOff.setChecked(alarm.enabled);
110
111             // Clicking outside the "checkbox" should also change the state.
112             indicator.setOnClickListener(new OnClickListener() {
113                     public void onClick(View v) {
114                         clockOnOff.toggle();
115                         updateIndicatorAndAlarm(clockOnOff.isChecked(),
116                                 barOnOff, alarm);
117                     }
118             });
119
120             DigitalClock digitalClock =
121                     (DigitalClock) view.findViewById(R.id.digitalClock);
122
123             // set the alarm text
124             final Calendar c = Calendar.getInstance();
125             c.set(Calendar.HOUR_OF_DAY, alarm.hour);
126             c.set(Calendar.MINUTE, alarm.minutes);
127             digitalClock.updateTime(c);
128             digitalClock.setTypeface(Typeface.DEFAULT);
129
130             // Set the repeat text or leave it blank if it does not repeat.
131             TextView daysOfWeekView =
132                     (TextView) digitalClock.findViewById(R.id.daysOfWeek);
133             final String daysOfWeekStr =
134                     alarm.daysOfWeek.toString(AlarmClock.this, false);
135             if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
136                 daysOfWeekView.setText(daysOfWeekStr);
137                 daysOfWeekView.setVisibility(View.VISIBLE);
138             } else {
139                 daysOfWeekView.setVisibility(View.GONE);
140             }
141
142             // Display the label
143             TextView labelView =
144                     (TextView) view.findViewById(R.id.label);
145             if (alarm.label != null && alarm.label.length() != 0) {
146                 labelView.setText(alarm.label);
147                 labelView.setVisibility(View.VISIBLE);
148             } else {
149                 labelView.setVisibility(View.GONE);
150             }
151         }
152     };
153
154     @Override
155     public boolean onContextItemSelected(final MenuItem item) {
156         final AdapterContextMenuInfo info =
157                 (AdapterContextMenuInfo) item.getMenuInfo();
158         final int id = (int) info.id;
159         switch (item.getItemId()) {
160             case R.id.delete_alarm:
161                 // Confirm that the alarm will be deleted.
162                 new AlertDialog.Builder(this)
163                         .setTitle(getString(R.string.delete_alarm))
164                         .setMessage(getString(R.string.delete_alarm_confirm))
165                         .setPositiveButton(android.R.string.ok,
166                                 new DialogInterface.OnClickListener() {
167                                     public void onClick(DialogInterface d,
168                                             int w) {
169                                         Alarms.deleteAlarm(AlarmClock.this, id);
170                                     }
171                                 })
172                         .setNegativeButton(android.R.string.cancel, null)
173                         .show();
174                 return true;
175
176             case R.id.enable_alarm:
177                 final Cursor c = (Cursor) mAlarmsList.getAdapter()
178                         .getItem(info.position);
179                 final Alarm alarm = new Alarm(c);
180                 Alarms.enableAlarm(this, alarm.id, !alarm.enabled);
181                 if (!alarm.enabled) {
182                     SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
183                             alarm.daysOfWeek);
184                 }
185                 return true;
186
187             case R.id.edit_alarm:
188                 Intent intent = new Intent(this, SetAlarm.class);
189                 intent.putExtra(Alarms.ALARM_ID, id);
190                 startActivity(intent);
191                 return true;
192
193             default:
194                 break;
195         }
196         return super.onContextItemSelected(item);
197     }
198
199     @Override
200     protected void onCreate(Bundle icicle) {
201         super.onCreate(icicle);
202
203         mFactory = LayoutInflater.from(this);
204         mPrefs = getSharedPreferences(PREFERENCES, 0);
205         mCursor = Alarms.getAlarmsCursor(getContentResolver());
206
207         updateLayout();
208     }
209
210     private void updateLayout() {
211         setContentView(R.layout.alarm_clock);
212         mAlarmsList = (ListView) findViewById(R.id.alarms_list);
213         AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);
214         mAlarmsList.setAdapter(adapter);
215         mAlarmsList.setVerticalScrollBarEnabled(true);
216         mAlarmsList.setOnItemClickListener(this);
217         mAlarmsList.setOnCreateContextMenuListener(this);
218
219         View addAlarm = findViewById(R.id.add_alarm);
220         addAlarm.setOnClickListener(new View.OnClickListener() {
221                 public void onClick(View v) {
222                     addNewAlarm();
223                 }
224             });
225         // Make the entire view selected when focused.
226         addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {
227                 public void onFocusChange(View v, boolean hasFocus) {
228                     v.setSelected(hasFocus);
229                 }
230         });
231
232         ImageButton deskClock =
233                 (ImageButton) findViewById(R.id.desk_clock_button);
234         deskClock.setOnClickListener(new View.OnClickListener() {
235                 public void onClick(View v) {
236                     startActivity(new Intent(AlarmClock.this, DeskClock.class));
237                 }
238         });
239     }
240
241     // Version of addNewAlarm that can be called from any activity, e.g. DeskClock
242     protected static void addNewAlarm(Context context) {
243         final Uri uri = Alarms.addAlarm(context.getContentResolver());
244         final String segment = uri.getPathSegments().get(1);
245         int newId = Integer.parseInt(segment);
246         if (Log.LOGV) {
247             Log.v("In AlarmClock, new alarm id = " + newId);
248         }
249         final Intent intent = new Intent(context, SetAlarm.class);
250         intent.putExtra(Alarms.ALARM_ID, newId);
251         context.startActivity(intent);
252     }
253
254     private void addNewAlarm() {
255         addNewAlarm(this);
256     }
257
258     @Override
259     protected void onDestroy() {
260         super.onDestroy();
261         ToastMaster.cancelToast();
262         mCursor.deactivate();
263     }
264
265     @Override
266     public void onCreateContextMenu(ContextMenu menu, View view,
267             ContextMenuInfo menuInfo) {
268         // Inflate the menu from xml.
269         getMenuInflater().inflate(R.menu.context_menu, menu);
270
271         // Use the current item to create a custom view for the header.
272         final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
273         final Cursor c =
274                 (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);
275         final Alarm alarm = new Alarm(c);
276
277         // Construct the Calendar to compute the time.
278         final Calendar cal = Calendar.getInstance();
279         cal.set(Calendar.HOUR_OF_DAY, alarm.hour);
280         cal.set(Calendar.MINUTE, alarm.minutes);
281         final String time = Alarms.formatTime(this, cal);
282
283         // Inflate the custom view and set each TextView's text.
284         final View v = mFactory.inflate(R.layout.context_menu_header, null);
285         TextView textView = (TextView) v.findViewById(R.id.header_time);
286         textView.setText(time);
287         textView = (TextView) v.findViewById(R.id.header_label);
288         textView.setText(alarm.label);
289
290         // Set the custom view on the menu.
291         menu.setHeaderView(v);
292         // Change the text based on the state of the alarm.
293         if (alarm.enabled) {
294             menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
295         }
296     }
297
298     @Override
299     public boolean onOptionsItemSelected(MenuItem item) {
300         switch (item.getItemId()) {
301             case R.id.menu_item_settings:
302                 startActivity(new Intent(this, SettingsActivity.class));
303                 return true;
304             case R.id.menu_item_desk_clock:
305                 startActivity(new Intent(this, DeskClock.class));
306                 return true;
307             case R.id.menu_item_add_alarm:
308                 addNewAlarm();
309                 return true;
310             default:
311                 break;
312         }
313         return super.onOptionsItemSelected(item);
314     }
315
316     @Override
317     public boolean onCreateOptionsMenu(Menu menu) {
318         getMenuInflater().inflate(R.menu.alarm_list_menu, menu);
319         return super.onCreateOptionsMenu(menu);
320     }
321
322     public void onItemClick(AdapterView parent, View v, int pos, long id) {
323         Intent intent = new Intent(this, SetAlarm.class);
324         intent.putExtra(Alarms.ALARM_ID, (int) id);
325         startActivity(intent);
326     }
327 }