OSDN Git Service

am 2ff01ef6: Fine-tuning the DeskClock UI.
[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.database.DataSetObserver;
28 import android.net.Uri;
29 import android.os.Bundle;
30 import android.os.Handler;
31 import android.view.ContextMenu;
32 import android.view.ContextMenu.ContextMenuInfo;
33 import android.view.LayoutInflater;
34 import android.view.Menu;
35 import android.view.MenuItem;
36 import android.view.View;
37 import android.view.View.OnClickListener;
38 import android.view.ViewGroup;
39 import android.widget.AdapterView;
40 import android.widget.AdapterView.AdapterContextMenuInfo;
41 import android.widget.AdapterView.OnItemClickListener;
42 import android.widget.Button;
43 import android.widget.CheckBox;
44 import android.widget.CursorAdapter;
45 import android.widget.ListView;
46 import android.widget.TextView;
47
48 import java.util.Calendar;
49
50 /**
51  * AlarmClock application.
52  */
53 public class AlarmClock extends Activity implements OnItemClickListener {
54
55     static final String PREFERENCES = "AlarmClock";
56
57     /** Cap alarm count at this number */
58     static final int MAX_ALARM_COUNT = 12;
59
60     /** This must be false for production.  If true, turns on logging,
61         test code, etc. */
62     static final boolean DEBUG = false;
63
64     private SharedPreferences mPrefs;
65     private LayoutInflater mFactory;
66     private ListView mAlarmsList;
67     private Cursor mCursor;
68
69     private class AlarmTimeAdapter extends CursorAdapter {
70         public AlarmTimeAdapter(Context context, Cursor cursor) {
71             super(context, cursor);
72         }
73
74         public View newView(Context context, Cursor cursor, ViewGroup parent) {
75             View ret = mFactory.inflate(R.layout.alarm_time, parent, false);
76
77             DigitalClock digitalClock =
78                     (DigitalClock) ret.findViewById(R.id.digitalClock);
79             digitalClock.setLive(false);
80             return ret;
81         }
82
83         public void bindView(View view, Context context, Cursor cursor) {
84             final Alarm alarm = new Alarm(cursor);
85
86             CheckBox onButton = (CheckBox) view.findViewById(R.id.alarmButton);
87             onButton.setChecked(alarm.enabled);
88             onButton.setOnClickListener(new OnClickListener() {
89                     public void onClick(View v) {
90                         boolean isChecked = ((CheckBox) v).isChecked();
91                         Alarms.enableAlarm(AlarmClock.this, alarm.id,
92                             isChecked);
93                         if (isChecked) {
94                             SetAlarm.popAlarmSetToast(AlarmClock.this,
95                                 alarm.hour, alarm.minutes, alarm.daysOfWeek);
96                         }
97                     }
98             });
99
100             DigitalClock digitalClock =
101                     (DigitalClock) view.findViewById(R.id.digitalClock);
102
103             // set the alarm text
104             final Calendar c = Calendar.getInstance();
105             c.set(Calendar.HOUR_OF_DAY, alarm.hour);
106             c.set(Calendar.MINUTE, alarm.minutes);
107             digitalClock.updateTime(c);
108
109             // Set the repeat text or leave it blank if it does not repeat.
110             TextView daysOfWeekView =
111                     (TextView) digitalClock.findViewById(R.id.daysOfWeek);
112             final String daysOfWeekStr =
113                     alarm.daysOfWeek.toString(AlarmClock.this, false);
114             if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
115                 daysOfWeekView.setText(daysOfWeekStr);
116                 daysOfWeekView.setVisibility(View.VISIBLE);
117             } else {
118                 daysOfWeekView.setVisibility(View.GONE);
119             }
120
121             // Display the label
122             TextView labelView =
123                     (TextView) digitalClock.findViewById(R.id.label);
124             if (alarm.label != null && alarm.label.length() != 0) {
125                 labelView.setText(alarm.label);
126                 labelView.setVisibility(View.VISIBLE);
127             } else {
128                 labelView.setVisibility(View.GONE);
129             }
130         }
131     };
132
133     @Override
134     public boolean onContextItemSelected(final MenuItem item) {
135         final AdapterContextMenuInfo info =
136                 (AdapterContextMenuInfo) item.getMenuInfo();
137         final int id = (int) info.id;
138         switch (item.getItemId()) {
139             case R.id.delete_alarm:
140                 // Confirm that the alarm will be deleted.
141                 new AlertDialog.Builder(this)
142                         .setTitle(getString(R.string.delete_alarm))
143                         .setMessage(getString(R.string.delete_alarm_confirm))
144                         .setPositiveButton(android.R.string.ok,
145                                 new DialogInterface.OnClickListener() {
146                                     public void onClick(DialogInterface d,
147                                             int w) {
148                                         Alarms.deleteAlarm(AlarmClock.this, id);
149                                     }
150                                 })
151                         .setNegativeButton(android.R.string.cancel, null)
152                         .show();
153                 return true;
154
155             case R.id.enable_alarm:
156                 final Cursor c = (Cursor) mAlarmsList.getAdapter()
157                         .getItem(info.position);
158                 final Alarm alarm = new Alarm(c);
159                 Alarms.enableAlarm(this, alarm.id, !alarm.enabled);
160                 if (!alarm.enabled) {
161                     SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
162                             alarm.daysOfWeek);
163                 }
164                 return true;
165
166             default:
167                 break;
168         }
169         return super.onContextItemSelected(item);
170     }
171
172     @Override
173     protected void onCreate(Bundle icicle) {
174         super.onCreate(icicle);
175
176         mFactory = LayoutInflater.from(this);
177         mPrefs = getSharedPreferences(PREFERENCES, 0);
178         mCursor = Alarms.getAlarmsCursor(getContentResolver());
179
180         updateLayout();
181     }
182
183     private void updateLayout() {
184         setContentView(R.layout.alarm_clock);
185         mAlarmsList = (ListView) findViewById(R.id.alarms_list);
186         AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);
187         mAlarmsList.setAdapter(adapter);
188         mAlarmsList.setVerticalScrollBarEnabled(true);
189         mAlarmsList.setOnItemClickListener(this);
190         mAlarmsList.setOnCreateContextMenuListener(this);
191
192         final Button addAlarm = (Button) findViewById(R.id.add_alarm);
193         addAlarm.setOnClickListener(new View.OnClickListener() {
194                 public void onClick(View v) {
195                     Uri uri = Alarms.addAlarm(getContentResolver());
196                     // FIXME: scroll to new item?
197                     String segment = uri.getPathSegments().get(1);
198                     int newId = Integer.parseInt(segment);
199                     if (Log.LOGV) {
200                         Log.v("In AlarmClock, new alarm id = " + newId);
201                     }
202                     Intent intent =
203                         new Intent(AlarmClock.this, SetAlarm.class);
204                     intent.putExtra(Alarms.ALARM_ID, newId);
205                     startActivity(intent);
206                 }
207             });
208         // Update the enabled state of the "Add alarm" menu item depending on
209         // how many alarms are set.
210         adapter.registerDataSetObserver(new DataSetObserver() {
211             public void onChanged() {
212                 updateAddAlarmButton(addAlarm);
213             }
214             public void onInvalidate() {
215                 updateAddAlarmButton(addAlarm);
216             }
217         });
218
219         Button settings = (Button) findViewById(R.id.settings);
220         settings.setOnClickListener(new View.OnClickListener() {
221                 public void onClick(View v) {
222                     startActivity(
223                         new Intent(AlarmClock.this, SettingsActivity.class));
224                 }
225             });
226     }
227
228     private void updateAddAlarmButton(Button b) {
229         b.setEnabled(mAlarmsList.getAdapter().getCount() < MAX_ALARM_COUNT);
230     }
231
232     @Override
233     protected void onDestroy() {
234         super.onDestroy();
235         ToastMaster.cancelToast();
236         mCursor.deactivate();
237     }
238
239     @Override
240     public void onCreateContextMenu(ContextMenu menu, View view,
241             ContextMenuInfo menuInfo) {
242         // Inflate the menu from xml.
243         getMenuInflater().inflate(R.menu.context_menu, menu);
244
245         // Use the current item to create a custom view for the header.
246         final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
247         final Cursor c =
248                 (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);
249         final Alarm alarm = new Alarm(c);
250
251         // Construct the Calendar to compute the time.
252         final Calendar cal = Calendar.getInstance();
253         cal.set(Calendar.HOUR_OF_DAY, alarm.hour);
254         cal.set(Calendar.MINUTE, alarm.minutes);
255         final String time = Alarms.formatTime(this, cal);
256
257         // Inflate the custom view and set each TextView's text.
258         final View v = mFactory.inflate(R.layout.context_menu_header, null);
259         TextView textView = (TextView) v.findViewById(R.id.header_time);
260         textView.setText(time);
261         textView = (TextView) v.findViewById(R.id.header_label);
262         textView.setText(alarm.label);
263
264         // Set the custom view on the menu.
265         menu.setHeaderView(v);
266         // Change the text to "disable" if the alarm is already enabled.
267         if (alarm.enabled) {
268             menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
269         }
270     }
271
272     public void onItemClick(AdapterView parent, View v, int pos, long id) {
273         Intent intent = new Intent(this, SetAlarm.class);
274         intent.putExtra(Alarms.ALARM_ID, (int) id);
275         startActivity(intent);
276     }
277 }