OSDN Git Service

Post a runnable during configuration changes to avoid an ANR.
[android-x86/packages-apps-DeskClock.git] / src / com / android / alarmclock / AlarmClock.java
index f84db84..657b935 100644 (file)
@@ -22,11 +22,11 @@ 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.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;
@@ -34,34 +34,33 @@ 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.CheckBox;
 import android.widget.CursorAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
-import android.widget.CheckBox;
 
-import java.util.Calendar;
 import java.text.DateFormatSymbols;
+import java.util.Calendar;
 
 /**
  * AlarmClock application.
  */
 public class AlarmClock extends Activity implements OnItemClickListener {
 
-    final static String PREFERENCES = "AlarmClock";
-    final static String PREF_CLOCK_FACE = "face";
-    final static String PREF_SHOW_CLOCK = "show_clock";
+    static final String PREFERENCES = "AlarmClock";
+    static final String PREF_CLOCK_FACE = "face";
+    static final String PREF_SHOW_CLOCK = "show_clock";
 
     /** Cap alarm count at this number */
-    final static int MAX_ALARM_COUNT = 12;
+    static final int MAX_ALARM_COUNT = 12;
 
     /** This must be false for production.  If true, turns on logging,
         test code, etc. */
-    final static boolean DEBUG = false;
+    static final boolean DEBUG = false;
 
     private SharedPreferences mPrefs;
     private LayoutInflater mFactory;
@@ -78,9 +77,9 @@ public class AlarmClock extends Activity implements OnItemClickListener {
     private int mFace = -1;
 
     /*
-     * FIXME: it would be nice for this to live in an xml config file.
+     * TODO: it would be nice for this to live in an xml config file.
      */
-    final static int[] CLOCKS = {
+    static final int[] CLOCKS = {
         R.layout.clock_basic_bw,
         R.layout.clock_googly,
         R.layout.clock_droid2,
@@ -99,16 +98,16 @@ public class AlarmClock extends Activity implements OnItemClickListener {
             ((TextView) ret.findViewById(R.id.am)).setText(mAm);
             ((TextView) ret.findViewById(R.id.pm)).setText(mPm);
 
-            DigitalClock digitalClock = (DigitalClock)ret.findViewById(R.id.digitalClock);
+            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);
 
-            CheckBox onButton = (CheckBox)view.findViewById(R.id.alarmButton);
+            CheckBox onButton = (CheckBox) view.findViewById(R.id.alarmButton);
             onButton.setChecked(alarm.enabled);
             onButton.setOnClickListener(new OnClickListener() {
                     public void onClick(View v) {
@@ -202,33 +201,30 @@ public class AlarmClock extends Activity implements OnItemClickListener {
         mAm = ampm[0];
         mPm = ampm[1];
 
-        // sanity check -- no database, no clock
-        if (getContentResolver() == null) {
-            new AlertDialog.Builder(this)
-                    .setTitle(getString(R.string.error))
-                    .setMessage(getString(R.string.dberror))
-                    .setPositiveButton(
-                            android.R.string.ok,
-                            new DialogInterface.OnClickListener() {
-                                public void onClick(DialogInterface dialog, int which) {
-                                    finish();
-                                }
-                            })
-                    .setOnCancelListener(
-                            new DialogInterface.OnCancelListener() {
-                                public void onCancel(DialogInterface dialog) {
-                                    finish();
-                                }})
-                    .setIcon(android.R.drawable.ic_dialog_alert)
-                    .create().show();
-            return;
-        }
-
-        setContentView(R.layout.alarm_clock);
         mFactory = LayoutInflater.from(this);
         mPrefs = getSharedPreferences(PREFERENCES, 0);
-
         mCursor = Alarms.getAlarmsCursor(getContentResolver());
+
+        updateLayout();
+        setClockVisibility(mPrefs.getBoolean(PREF_SHOW_CLOCK, true));
+    }
+
+    private final Handler mHandler = new Handler();
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        // Send a message to avoid a possible ANR.
+        mHandler.post(new Runnable() {
+            public void run() {
+                updateLayout();
+                inflateClock();
+            }
+        });
+    }
+
+    private void updateLayout() {
+        setContentView(R.layout.alarm_clock);
         mAlarmsList = (ListView) findViewById(R.id.alarms_list);
         mAlarmsList.setAdapter(new AlarmTimeAdapter(this, mCursor));
         mAlarmsList.setVerticalScrollBarEnabled(true);
@@ -238,13 +234,12 @@ public class AlarmClock extends Activity implements OnItemClickListener {
         mClockLayout = (ViewGroup) findViewById(R.id.clock_layout);
         mClockLayout.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
-                    final Intent intent = new Intent(AlarmClock.this, ClockPicker.class);
+                    final Intent intent =
+                            new Intent(AlarmClock.this, ClockPicker.class);
                     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                     startActivity(intent);
                 }
             });
-
-        setClockVisibility(mPrefs.getBoolean(PREF_SHOW_CLOCK, true));
     }
 
     @Override
@@ -253,10 +248,11 @@ public class AlarmClock extends Activity implements OnItemClickListener {
 
         int face = mPrefs.getInt(PREF_CLOCK_FACE, 0);
         if (mFace != face) {
-            if (face < 0 || face >= AlarmClock.CLOCKS.length)
+            if (face < 0 || face >= AlarmClock.CLOCKS.length) {
                 mFace = 0;
-            else
+            } else {
                 mFace = face;
+            }
             inflateClock();
         }
     }
@@ -353,7 +349,8 @@ public class AlarmClock extends Activity implements OnItemClickListener {
         switch (item.getItemId()) {
             case R.id.menu_add_alarm:
                 Uri uri = Alarms.addAlarm(getContentResolver());
-                // FIXME: scroll to new item?
+                // TODO: Create new alarm _after_ SetAlarm so the user has the
+                // chance to cancel alarm creation.
                 String segment = uri.getPathSegments().get(1);
                 int newId = Integer.parseInt(segment);
                 if (Log.LOGV) {