--- /dev/null
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.deskclock;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.database.Cursor;
+import android.graphics.Typeface;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.Settings;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnCreateContextMenuListener;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CursorAdapter;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.Calendar;
+
+/**
+ * AlarmClock application.
+ */
+public class AlarmClock extends Activity implements OnItemClickListener {
+
+ final static String PREFERENCES = "AlarmClock";
+
+ /** This must be false for production. If true, turns on logging,
+ test code, etc. */
+ final static boolean DEBUG = false;
+
+ private SharedPreferences mPrefs;
+ private LayoutInflater mFactory;
+ private ListView mAlarmsList;
+ private Cursor mCursor;
+
+ private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,
+ Alarm alarm) {
+ bar.setImageResource(enabled ? R.drawable.ic_indicator_on
+ : R.drawable.ic_indicator_off);
+ Alarms.enableAlarm(this, alarm.id, enabled);
+ if (enabled) {
+ SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
+ alarm.daysOfWeek);
+ }
+ }
+
+ private class AlarmTimeAdapter extends CursorAdapter {
+ public AlarmTimeAdapter(Context context, Cursor cursor) {
+ super(context, cursor);
+ }
+
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ View ret = mFactory.inflate(R.layout.alarm_time, parent, false);
+
+ DigitalClock digitalClock = (DigitalClock) ret.findViewById(R.id.digitalClock);
+ digitalClock.setLive(false);
+ if (Log.LOGV) Log.v("newView " + cursor.getPosition());
+ return ret;
+ }
+
+ public void bindView(View view, Context context, Cursor cursor) {
+ final Alarm alarm = new Alarm(cursor);
+
+ View indicator = view.findViewById(R.id.indicator);
+
+ // Set the initial resource for the bar image.
+ final ImageView barOnOff =
+ (ImageView) indicator.findViewById(R.id.bar_onoff);
+ barOnOff.setImageResource(alarm.enabled ?
+ R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);
+
+ // Set the initial state of the clock "checkbox"
+ final CheckBox clockOnOff =
+ (CheckBox) indicator.findViewById(R.id.clock_onoff);
+ clockOnOff.setChecked(alarm.enabled);
+
+ // Clicking outside the "checkbox" should also change the state.
+ indicator.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ clockOnOff.toggle();
+ updateIndicatorAndAlarm(clockOnOff.isChecked(),
+ barOnOff, alarm);
+ }
+ });
+
+ DigitalClock digitalClock =
+ (DigitalClock) view.findViewById(R.id.digitalClock);
+
+ // set the alarm text
+ final Calendar c = Calendar.getInstance();
+ c.set(Calendar.HOUR_OF_DAY, alarm.hour);
+ c.set(Calendar.MINUTE, alarm.minutes);
+ digitalClock.updateTime(c);
+ digitalClock.setTypeface(Typeface.DEFAULT);
+
+ // Set the repeat text or leave it blank if it does not repeat.
+ TextView daysOfWeekView =
+ (TextView) digitalClock.findViewById(R.id.daysOfWeek);
+ final String daysOfWeekStr =
+ alarm.daysOfWeek.toString(AlarmClock.this, false);
+ if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
+ daysOfWeekView.setText(daysOfWeekStr);
+ daysOfWeekView.setVisibility(View.VISIBLE);
+ } else {
+ daysOfWeekView.setVisibility(View.GONE);
+ }
+
+ // Display the label
+ TextView labelView =
+ (TextView) view.findViewById(R.id.label);
+ if (alarm.label != null && alarm.label.length() != 0) {
+ labelView.setText(alarm.label);
+ labelView.setVisibility(View.VISIBLE);
+ } else {
+ labelView.setVisibility(View.GONE);
+ }
+ }
+ };
+
+ @Override
+ public boolean onContextItemSelected(final MenuItem item) {
+ final AdapterContextMenuInfo info =
+ (AdapterContextMenuInfo) item.getMenuInfo();
+ final int id = (int) info.id;
+ switch (item.getItemId()) {
+ case R.id.delete_alarm:
+ // Confirm that the alarm will be deleted.
+ new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.delete_alarm))
+ .setMessage(getString(R.string.delete_alarm_confirm))
+ .setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface d,
+ int w) {
+ Alarms.deleteAlarm(AlarmClock.this, id);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null)
+ .show();
+ return true;
+
+ case R.id.enable_alarm:
+ final Cursor c = (Cursor) mAlarmsList.getAdapter()
+ .getItem(info.position);
+ final Alarm alarm = new Alarm(c);
+ Alarms.enableAlarm(this, alarm.id, !alarm.enabled);
+ if (!alarm.enabled) {
+ SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
+ alarm.daysOfWeek);
+ }
+ return true;
+
+ case R.id.edit_alarm:
+ Intent intent = new Intent(this, SetAlarm.class);
+ intent.putExtra(Alarms.ALARM_ID, id);
+ startActivity(intent);
+ return true;
+
+ default:
+ break;
+ }
+ return super.onContextItemSelected(item);
+ }
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mFactory = LayoutInflater.from(this);
+ mPrefs = getSharedPreferences(PREFERENCES, 0);
+ mCursor = Alarms.getAlarmsCursor(getContentResolver());
+
+ updateLayout();
+ }
+
+ private void updateLayout() {
+ setContentView(R.layout.alarm_clock);
+ mAlarmsList = (ListView) findViewById(R.id.alarms_list);
+ AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);
+ mAlarmsList.setAdapter(adapter);
+ mAlarmsList.setVerticalScrollBarEnabled(true);
+ mAlarmsList.setOnItemClickListener(this);
+ mAlarmsList.setOnCreateContextMenuListener(this);
+
+ View addAlarm = findViewById(R.id.add_alarm);
+ addAlarm.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ addNewAlarm();
+ }
+ });
+ // Make the entire view selected when focused.
+ addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+ public void onFocusChange(View v, boolean hasFocus) {
+ v.setSelected(hasFocus);
+ }
+ });
+
+ ImageButton deskClock =
+ (ImageButton) findViewById(R.id.desk_clock_button);
+ deskClock.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ startActivity(new Intent(AlarmClock.this, DeskClock.class));
+ }
+ });
+ }
+
+ // Version of addNewAlarm that can be called from any activity, e.g. DeskClock
+ protected static void addNewAlarm(Context context) {
+ final Uri uri = Alarms.addAlarm(context.getContentResolver());
+ final String segment = uri.getPathSegments().get(1);
+ int newId = Integer.parseInt(segment);
+ if (Log.LOGV) {
+ Log.v("In AlarmClock, new alarm id = " + newId);
+ }
+ final Intent intent = new Intent(context, SetAlarm.class);
+ intent.putExtra(Alarms.ALARM_ID, newId);
+ context.startActivity(intent);
+ }
+
+ private void addNewAlarm() {
+ addNewAlarm(this);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ ToastMaster.cancelToast();
+ mCursor.deactivate();
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View view,
+ ContextMenuInfo menuInfo) {
+ // Inflate the menu from xml.
+ getMenuInflater().inflate(R.menu.context_menu, menu);
+
+ // Use the current item to create a custom view for the header.
+ final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
+ final Cursor c =
+ (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);
+ final Alarm alarm = new Alarm(c);
+
+ // Construct the Calendar to compute the time.
+ final Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.HOUR_OF_DAY, alarm.hour);
+ cal.set(Calendar.MINUTE, alarm.minutes);
+ final String time = Alarms.formatTime(this, cal);
+
+ // Inflate the custom view and set each TextView's text.
+ final View v = mFactory.inflate(R.layout.context_menu_header, null);
+ TextView textView = (TextView) v.findViewById(R.id.header_time);
+ textView.setText(time);
+ textView = (TextView) v.findViewById(R.id.header_label);
+ textView.setText(alarm.label);
+
+ // Set the custom view on the menu.
+ menu.setHeaderView(v);
+ // Change the text based on the state of the alarm.
+ if (alarm.enabled) {
+ menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_item_settings:
+ startActivity(new Intent(this, SettingsActivity.class));
+ return true;
+ case R.id.menu_item_desk_clock:
+ startActivity(new Intent(this, DeskClock.class));
+ return true;
+ case R.id.menu_item_add_alarm:
+ addNewAlarm();
+ return true;
+ default:
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.alarm_list_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ public void onItemClick(AdapterView parent, View v, int pos, long id) {
+ Intent intent = new Intent(this, SetAlarm.class);
+ intent.putExtra(Alarms.ALARM_ID, (int) id);
+ startActivity(intent);
+ }
+}