AlarmClockFragment.java revision dbd989a7aebc7914b2cdec3e0cb69e38fae670fb
15fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project/*
25fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
35fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
45fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
55fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * you may not use this file except in compliance with the License.
65fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * You may obtain a copy of the License at
75fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
85fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
95fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
125fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * See the License for the specific language governing permissions and
145fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * limitations under the License.
155fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project */
165fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
17fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandlerpackage com.android.deskclock;
185fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
19c8824e5633c5f54b9eb42b2336c5f15d7847f1c4Steve Levisimport android.app.ActionBar;
205fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.app.Activity;
215c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.app.Fragment;
225c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.app.FragmentTransaction;
235c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.app.LoaderManager;
245fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.Context;
255fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.Intent;
265c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.content.Loader;
275fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.database.Cursor;
28fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Chengimport android.graphics.Typeface;
293286630083faa144af00617718411bf66eb3242bChiao Chengimport android.media.Ringtone;
305c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.media.RingtoneManager;
315c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.net.Uri;
323286630083faa144af00617718411bf66eb3242bChiao Chengimport android.os.AsyncTask;
335fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.os.Bundle;
34dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Chengimport android.os.Vibrator;
355fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.view.LayoutInflater;
365fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.view.Menu;
375fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.view.MenuItem;
380cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport android.view.MotionEvent;
395fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.view.View;
405fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.view.ViewGroup;
415c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.widget.Button;
42bcfaaa6b567b95df64499c2a2e3c15780438a2dcPatrick Scottimport android.widget.CheckBox;
435fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.widget.CursorAdapter;
445c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.widget.ImageButton;
455c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.widget.LinearLayout;
465fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.widget.TextView;
475c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport android.widget.ToggleButton;
485fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
490cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Chengimport com.android.deskclock.widget.ActionableToastBar;
505c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport com.android.deskclock.widget.swipeablelistview.SwipeableListView;
515c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
525c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport java.text.DateFormatSymbols;
53bcfaaa6b567b95df64499c2a2e3c15780438a2dcPatrick Scottimport java.util.Calendar;
545c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Chengimport java.util.HashSet;
555fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
565fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project/**
575fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * AlarmClock application.
585fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project */
594642e848a91180f6ff87acbfa54de1d0b945f19aChiao Chengpublic class AlarmClock extends Activity implements LoaderManager.LoaderCallbacks<Cursor>,
604642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        AlarmTimePickerDialogFragment.AlarmTimePickerDialogHandler,
614642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        AlarmLabelDialogFragment.AlarmLabelDialogHandler {
625fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
635c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private static final String KEY_EXPANDED_IDS = "expandedIds";
645c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private static final String KEY_REPEAT_CHECKED_IDS = "repeatCheckedIds";
653286630083faa144af00617718411bf66eb3242bChiao Cheng    private static final String KEY_RINGTONE_TITLE_CACHE = "ringtoneTitleCache";
660cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private static final String KEY_DELETED_ALARM = "deletedAlarm";
670cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private static final String KEY_UNDO_SHOWING = "undoShowing";
684e1b06ebcf08dd57240a56bac6f923b2e72ea793Patrick Scott
695c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private static final int REQUEST_CODE_RINGTONE = 1;
704e1b06ebcf08dd57240a56bac6f923b2e72ea793Patrick Scott
715c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private SwipeableListView mAlarmsList;
725c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private AlarmItemAdapter mAdapter;
733286630083faa144af00617718411bf66eb3242bChiao Cheng    private Bundle mRingtoneTitleCache; // Key: ringtone uri, value: ringtone title
740cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private ActionableToastBar mUndoBar;
75185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project
765c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private Alarm mSelectedAlarm;
775fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
7851193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng    // This flag relies on the activity having a "standard" launchMode and a new instance of this
7951193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng    // activity being created when launched.
8051193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng    private boolean mFirstLoad = true;
8151193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng
820cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    // Saved states for undo
830cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private Alarm mDeletedAlarm;
840cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private boolean mUndoShowing = false;
850cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
865fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
875c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    protected void onCreate(Bundle savedState) {
885c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        super.onCreate(savedState);
895c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        initialize(savedState);
905c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        updateLayout();
915c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        getLoaderManager().initLoader(0, null, this);
925c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
930dffdefe54299ee01b45574244c92d3a06507b87Patrick Scott
945c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private void initialize(Bundle savedState) {
955c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        setContentView(R.layout.alarm_clock);
965c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        int[] expandedIds = null;
975c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        int[] repeatCheckedIds = null;
985c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        if (savedState != null) {
995c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            expandedIds = savedState.getIntArray(KEY_EXPANDED_IDS);
1005c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            repeatCheckedIds = savedState.getIntArray(KEY_EXPANDED_IDS);
1013286630083faa144af00617718411bf66eb3242bChiao Cheng            mRingtoneTitleCache = savedState.getBundle(KEY_RINGTONE_TITLE_CACHE);
1020cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            mDeletedAlarm = savedState.getParcelable(KEY_DELETED_ALARM);
1030cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            mUndoShowing = savedState.getBoolean(KEY_UNDO_SHOWING);
1045c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
1053286630083faa144af00617718411bf66eb3242bChiao Cheng
1065c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAdapter = new AlarmItemAdapter(this, expandedIds, repeatCheckedIds);
1070dffdefe54299ee01b45574244c92d3a06507b87Patrick Scott
1083286630083faa144af00617718411bf66eb3242bChiao Cheng        if (mRingtoneTitleCache == null) {
1093286630083faa144af00617718411bf66eb3242bChiao Cheng            mRingtoneTitleCache = new Bundle();
1103286630083faa144af00617718411bf66eb3242bChiao Cheng        }
1113286630083faa144af00617718411bf66eb3242bChiao Cheng
1125c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAlarmsList = (SwipeableListView) findViewById(R.id.alarms_list);
1135c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAlarmsList.setAdapter(mAdapter);
1145c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAlarmsList.setVerticalScrollBarEnabled(true);
1155c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAlarmsList.enableSwipe(true);
1165c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAlarmsList.setOnCreateContextMenuListener(this);
1175c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAlarmsList.setOnItemSwipeListener(new SwipeableListView.OnItemSwipeListener() {
1185c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            @Override
1195c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            public void onSwipe(View view) {
1205c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                final AlarmItemAdapter.ItemHolder itemHolder =
1215c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        (AlarmItemAdapter.ItemHolder) view.getTag();
1220cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                asyncDeleteAlarm(itemHolder.alarm);
1230cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            }
1240cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        });
1250cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        mAlarmsList.setOnTouchListener(new View.OnTouchListener() {
1260cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            @Override
1270cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            public boolean onTouch(View view, MotionEvent event) {
12800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                hideUndoBar(true, event);
1290cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                return false;
13077f14bd0ce48db935911da5d0a92b6348e6197fbPatrick Scott            }
1315c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        });
1320cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
1330cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        mUndoBar = (ActionableToastBar) findViewById(R.id.undo_bar);
1340cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
1350cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        if (mUndoShowing) {
1360cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            mUndoBar.show(new ActionableToastBar.ActionClickedListener() {
1370cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                @Override
1380cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                public void onActionClicked() {
1390cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                    asyncAddAlarm(mDeletedAlarm);
140c042c7818064b644cf1e63dc784241ae6ed365a4Chiao Cheng                    mDeletedAlarm = null;
141c042c7818064b644cf1e63dc784241ae6ed365a4Chiao Cheng                    mUndoShowing = false;
1420cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                }
1430cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            }, 0, getResources().getString(R.string.alarm_deleted), true, R.string.alarm_undo,
1440cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                    true);
1450cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        }
1465fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1475fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
14800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng    private void hideUndoBar(boolean animate, MotionEvent event) {
14900c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        if (mUndoBar != null) {
15000c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            if (event != null && mUndoBar.isEventInToastBar(event)) {
15100c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                // Avoid touches inside the undo bar.
15200c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                return;
15300c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            }
15400c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            mUndoBar.hide(animate);
15500c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        }
15600c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        mDeletedAlarm = null;
15700c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        mUndoShowing = false;
15800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng    }
15900c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng
1605fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
1615c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    protected void onSaveInstanceState(Bundle outState) {
1624642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        super.onSaveInstanceState(outState);
1635c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        outState.putIntArray(KEY_EXPANDED_IDS, mAdapter.getExpandedArray());
1645c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        outState.putIntArray(KEY_REPEAT_CHECKED_IDS, mAdapter.getRepeatArray());
1653286630083faa144af00617718411bf66eb3242bChiao Cheng        outState.putBundle(KEY_RINGTONE_TITLE_CACHE, mRingtoneTitleCache);
1660cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        outState.putParcelable(KEY_DELETED_ALARM, mDeletedAlarm);
1670cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        outState.putBoolean(KEY_UNDO_SHOWING, mUndoShowing);
168cf7307401797b159ca32f85e7cf38d18cececd0dPatrick Scott    }
169cf7307401797b159ca32f85e7cf38d18cececd0dPatrick Scott
170cf7307401797b159ca32f85e7cf38d18cececd0dPatrick Scott    private void updateLayout() {
1715c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        final ActionBar actionBar = getActionBar();
172c8824e5633c5f54b9eb42b2336c5f15d7847f1c4Steve Levis        if (actionBar != null) {
173c8824e5633c5f54b9eb42b2336c5f15d7847f1c4Steve Levis            actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
174c8824e5633c5f54b9eb42b2336c5f15d7847f1c4Steve Levis        }
1755fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1765fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
177ddacabc24b515db4fa6c7a289ef81d8050c8062cDaniel Sandler    private void addNewAlarm() {
1785c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        // TODO: change to async
1795c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAdapter.setNewAlarmCreated(true);
1800cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        asyncAddAlarm();
181f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott    }
182f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott
1835fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
1845fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    protected void onDestroy() {
1855fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        super.onDestroy();
1865fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        ToastMaster.cancelToast();
1870dffdefe54299ee01b45574244c92d3a06507b87Patrick Scott    }
1880dffdefe54299ee01b45574244c92d3a06507b87Patrick Scott
189e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott    @Override
190e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott    public boolean onOptionsItemSelected(MenuItem item) {
19100c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        hideUndoBar(true, null);
192f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott        switch (item.getItemId()) {
193f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott            case R.id.menu_item_settings:
194f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott                startActivity(new Intent(this, SettingsActivity.class));
195f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott                return true;
196f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott            case R.id.menu_item_add_alarm:
197f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott                addNewAlarm();
198f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott                return true;
199c8824e5633c5f54b9eb42b2336c5f15d7847f1c4Steve Levis            case android.R.id.home:
2002527ef1b1ad7c48ffb2f5ed6aaa6271cc971c214Yorke Lee                Intent intent = new Intent(this, DeskClock.class);
2012527ef1b1ad7c48ffb2f5ed6aaa6271cc971c214Yorke Lee                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2022527ef1b1ad7c48ffb2f5ed6aaa6271cc971c214Yorke Lee                startActivity(intent);
20341a754faf657c2ac7e414051d0c711c0ee994457Erik                return true;
204f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott            default:
205f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott                break;
206e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott        }
207f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott        return super.onOptionsItemSelected(item);
208e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott    }
209e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott
210e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott    @Override
211e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott    public boolean onCreateOptionsMenu(Menu menu) {
212e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott        getMenuInflater().inflate(R.menu.alarm_list_menu, menu);
2136fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson        MenuItem help = menu.findItem(R.id.menu_item_help);
2146fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson        if (help != null) {
2156fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson            Utils.prepareHelpMenuItem(this, help);
2166fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson        }
217f1e8069bcd1755d9ef2322b705d8d9d6b83728f0Patrick Scott        return super.onCreateOptionsMenu(menu);
218e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott    }
219e3f01aff06d4bddb09215ccad3d8502de9164966Patrick Scott
2200cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    @Override
2210cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    protected void onRestart() {
2220cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        super.onRestart();
2230cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        // When the user places the app in the background by pressing "home",
2240cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        // dismiss the toast bar. However, since there is no way to determine if
2250cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        // home was pressed, just dismiss any existing toast bar when restarting
2260cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        // the app.
2270cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        if (mUndoBar != null) {
22800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            hideUndoBar(false, null);
2290cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        }
2300cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    }
2310cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
2324642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng    // Callback used by AlarmTimePickerDialogFragment
2334642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng    @Override
2344642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng    public void onDialogTimeSet(Alarm alarm, int hourOfDay, int minute) {
2354642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        alarm.hour = hourOfDay;
2364642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        alarm.minutes = minute;
237d091ee89ab2aa5c47d4b7b05e1f5d7e204b99494Chiao Cheng        alarm.enabled = true;
23800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        asyncUpdateAlarm(alarm, true);
2390cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
2405c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
2415c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
2425c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private void showLabelDialog(final Alarm alarm) {
2434642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        final FragmentTransaction ft = getFragmentManager().beginTransaction();
2444642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        final Fragment prev = getFragmentManager().findFragmentByTag("label_dialog");
2455c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        if (prev != null) {
2465c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            ft.remove(prev);
2475c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
2485c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        ft.addToBackStack(null);
2495c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
2505c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        // Create and show the dialog.
2514642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        final AlarmLabelDialogFragment newFragment = AlarmLabelDialogFragment.newInstance(alarm,
2524642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng                alarm.label);
2535c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        newFragment.show(ft, "label_dialog");
2545c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
2555c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
2564642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng    // Callback used by AlarmLabelDialogFragment.
2574642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng    @Override
2584642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng    public void onDialogLabelSet(Alarm alarm, String label) {
2594642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng        alarm.label = label;
26000c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        asyncUpdateAlarm(alarm, false);
2614642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng    }
2624642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng
26341a754faf657c2ac7e414051d0c711c0ee994457Erik    @Override
2645c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
2655c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        return Alarms.getAlarmsCursorLoader(this);
2665c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
2675c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
2685c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    @Override
2695c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    public void onLoadFinished(Loader<Cursor> cursorLoader, final Cursor data) {
2705c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAdapter.swapCursor(data);
27151193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        gotoAlarmIfSpecified();
27251193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng    }
27351193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng
27451193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng    /**
27551193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng     * Checks if an alarm was passed in.  If so, go to that particular alarm in the list.
27651193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng     */
27751193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng    private void gotoAlarmIfSpecified() {
27851193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        final Intent intent = getIntent();
27951193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        if (mFirstLoad && intent != null) {
28051193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng            final Alarm alarm = (Alarm) intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
28151193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng            if (alarm != null) {
28251193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                for (int i = 0; i < mAdapter.getCount(); i++) {
28351193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                    long id = mAdapter.getItemId(i);
28451193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                    if (id == alarm.id) {
28551193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                        mAdapter.setNewAlarm(alarm.id);
28651193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                        mAlarmsList.setSelection(i);
28751193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng
28851193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                        final int firstPositionId = mAlarmsList.getFirstVisiblePosition();
28951193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                        final int childId = i - firstPositionId;
29051193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng
29151193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                        final View view = mAlarmsList.getChildAt(childId);
29251193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                        mAdapter.getView(i, view, mAlarmsList);
29351193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                        break;
29451193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                    }
29551193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                }
29651193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng            }
29751193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        }
29851193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        mFirstLoad = false;
2995c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
3005c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3015c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    @Override
3025c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    public void onLoaderReset(Loader<Cursor> cursorLoader) {
3035c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mAdapter.swapCursor(null);
3045c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
3055c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3065c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private void launchRingTonePicker(Alarm alarm) {
3075c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mSelectedAlarm = alarm;
3085c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
3095c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, alarm.alert);
310aa3c30991070ed78289964bba6af72a25341cb39Daniel Sandler        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM);
3115c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        startActivityForResult(intent, REQUEST_CODE_RINGTONE);
3125c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
3135c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3145c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    private void saveRingtoneUri(Intent intent) {
3155c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        final Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
3165c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        mSelectedAlarm.alert = uri;
31700c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        asyncUpdateAlarm(mSelectedAlarm, false);
3185c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
3195c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3205c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    @Override
3215c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3225c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        if (resultCode == RESULT_OK) {
3235c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            switch (requestCode) {
3245c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                case REQUEST_CODE_RINGTONE:
3255c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    saveRingtoneUri(data);
3265c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    break;
3275c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                default:
3285c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    Log.w("Unhandled request code in onActivityResult: " + requestCode);
3295c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
3305c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
3315c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    }
3325c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3335c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng    public class AlarmItemAdapter extends CursorAdapter {
3345c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3355c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private Context mContext;
3365c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private LayoutInflater mFactory;
3375c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private String[] mShortWeekDayStrings;
3385c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private int mColorLit;
3395c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private int mColorDim;
3405c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private int mColorRed;
3415c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3425c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private HashSet<Integer> mExpanded = new HashSet<Integer>();
3435c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private HashSet<Integer> mRepeatChecked = new HashSet<Integer>();
3445c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private boolean mNewAlarmCreated = false;
3455c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
346dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng        private boolean mHasVibrator;
347dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng
3485c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        // This determines the order in which it is shown and processed in the UI.
3495c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private final int[] DAY_ORDER = new int[] {
3505c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                Calendar.SUNDAY,
3515c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                Calendar.MONDAY,
3525c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                Calendar.TUESDAY,
3535c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                Calendar.WEDNESDAY,
3545c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                Calendar.THURSDAY,
3555c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                Calendar.FRIDAY,
3565c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                Calendar.SATURDAY,
3575c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        };
3585c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3595c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private class ItemHolder {
3605c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3615c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            // views for optimization
3625c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            DigitalClock clock;
363fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng            ToggleButton onoff;
3645c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            TextView daysOfWeek;
3655c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            TextView label;
3665c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            ImageButton expand;
3675c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            View expandArea;
3685c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            View infoArea;
3695c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            TextView clickableLabel;
3705c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            CheckBox repeat;
3715c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            LinearLayout repeatDays;
3725c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            ToggleButton[] daysButtons = new ToggleButton[7];
3735c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            CheckBox vibrate;
3745c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            ImageButton collapse;
3755c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            Button ringtone;
3765c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3775c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            // Other states
3785c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            Alarm alarm;
3795c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
3805c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3815c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public AlarmItemAdapter(Context context, int[] expandedIds, int[] repeatCheckedIds) {
3825c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            super(context, null, 0);
3835c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mContext = context;
3845c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mFactory = LayoutInflater.from(context);
3855c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3865c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            DateFormatSymbols dfs = new DateFormatSymbols();
3875c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mShortWeekDayStrings = dfs.getShortWeekdays();
3885c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3895c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mColorLit = mContext.getResources().getColor(R.color.clock_white);
3905c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mColorDim = mContext.getResources().getColor(R.color.clock_gray);
3915c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mColorRed = mContext.getResources().getColor(R.color.clock_red);
3925c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
3935c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (expandedIds != null) {
3945c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                buildHashSetFromArray(expandedIds, mExpanded);
3955c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
3965c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (repeatCheckedIds != null) {
3975c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                buildHashSetFromArray(repeatCheckedIds, mRepeatChecked);
3985c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
399dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng
400dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng            mHasVibrator = ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE))
401dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                    .hasVibrator();
4025c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
4035c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4045c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        @Override
4055c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public View getView(int position, View convertView, ViewGroup parent) {
4065c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (!getCursor().moveToPosition(position)) {
4075c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                throw new IllegalStateException("couldn't move cursor to position " + position);
4085c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
4095c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            View v;
4105c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (convertView == null) {
4115c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                v = newView(mContext, getCursor(), parent);
4125c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            } else {
4135c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                // Do a translation check to test for animation. Change this to something more
4145c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                // reliable and robust in the future.
4155c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                if (convertView.getTranslationX() != 0 || convertView.getTranslationY() != 0) {
4165c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    // view was animated, reset
4175c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    v = newView(mContext, getCursor(), parent);
4185c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                } else {
4195c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    v = convertView;
4205c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
4215c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
4225c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            bindView(v, mContext, getCursor());
4235c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            return v;
4245c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
4255c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4265c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        @Override
4275c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public View newView(Context context, Cursor cursor, ViewGroup parent) {
4285c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final View view = mFactory.inflate(R.layout.alarm_time, parent, false);
4295c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4305c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            // standard view holder optimization
4315c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final ItemHolder holder = new ItemHolder();
4325c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.clock = (DigitalClock) view.findViewById(R.id.digital_clock);
4335c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.clock.setLive(false);
434fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng            holder.onoff = (ToggleButton) view.findViewById(R.id.onoff);
4355c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.daysOfWeek = (TextView) view.findViewById(R.id.daysOfWeek);
4365c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.label = (TextView) view.findViewById(R.id.label);
4375c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.expand = (ImageButton) view.findViewById(R.id.expand);
4385c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.expandArea = view.findViewById(R.id.expand_area);
4395c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.infoArea = view.findViewById(R.id.info_area);
4405c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.repeat = (CheckBox) view.findViewById(R.id.repeat_onoff);
4415c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.clickableLabel = (TextView) view.findViewById(R.id.edit_label);
4425c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.repeatDays = (LinearLayout) view.findViewById(R.id.repeat_days);
4435c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4445c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            // Build button for each day.
4455c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            for (int i = 0; i < 7; i++) {
4465c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                final ToggleButton button = (ToggleButton) mFactory.inflate(R.layout.day_button,
4475c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        holder.repeatDays, false);
4485c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                final int dayToShowIndex = DAY_ORDER[i];
4495c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                button.setText(mShortWeekDayStrings[dayToShowIndex]);
4505c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                button.setTextOn(mShortWeekDayStrings[dayToShowIndex]);
4515c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                button.setTextOff(mShortWeekDayStrings[dayToShowIndex]);
4525c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                holder.repeatDays.addView(button);
4535c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                holder.daysButtons[i] = button;
4545c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
4555c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.vibrate = (CheckBox) view.findViewById(R.id.vibrate_onoff);
4565c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.collapse = (ImageButton) view.findViewById(R.id.collapse);
4575c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            holder.ringtone = (Button) view.findViewById(R.id.choose_ringtone);
4585c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4595c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            view.setTag(holder);
4605c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            return view;
4615c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
4625c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4635c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        @Override
4645c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public void bindView(View view, Context context, final Cursor cursor) {
4655c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final Alarm alarm = new Alarm(cursor);
4665c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final ItemHolder itemHolder = (ItemHolder) view.getTag();
4675c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.alarm = alarm;
4685c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4695c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            boolean forceExpand = false;
4700cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            if (cursor.getPosition() == 0) {
4710cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
4720cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                if (mNewAlarmCreated) {
4730cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                    mNewAlarmCreated = false;
4740cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                    forceExpand = true;
4750cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                }
4765c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
4775c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
4785c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.onoff.setChecked(alarm.enabled);
479fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng            if (itemHolder.onoff.isChecked()) {
480fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                itemHolder.onoff.setTextColor(mColorRed);
481fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                itemHolder.onoff.setTypeface(null, Typeface.BOLD);
482fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng            } else {
483fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                itemHolder.onoff.setTextColor(mColorDim);
484fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                itemHolder.onoff.setTypeface(null, Typeface.NORMAL);
485fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng            }
4865c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final View.OnClickListener onOffListener = new View.OnClickListener() {
4875c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
4885c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View v) {
489fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                    //boolean checked = ((ToggleButton) v).isChecked();
490fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                    if (itemHolder.onoff.isChecked()) {
491fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                        itemHolder.onoff.setTextColor(mColorRed);
492fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                        itemHolder.onoff.setTypeface(null, Typeface.BOLD);
493fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                    } else {
494fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                        itemHolder.onoff.setTextColor(mColorDim);
495fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                        itemHolder.onoff.setTypeface(null, Typeface.NORMAL);
496fa2e368e5f00fc8f78b9a47f55d86ccfc99750d2Chiao Cheng                    }
4975c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    alarm.enabled = !alarm.enabled;
49800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                    asyncUpdateAlarm(alarm, alarm.enabled);
4995c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
5005c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            };
5015c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.onoff.setOnClickListener(onOffListener);
5025c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5035c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.clock.updateTime(alarm.hour, alarm.minutes);
5045c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.clock.setClickable(true);
5055c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.clock.setOnClickListener(new View.OnClickListener() {
5065c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
5075c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View view) {
5084642e848a91180f6ff87acbfa54de1d0b945f19aChiao Cheng                    AlarmUtils.showTimeEditDialog(AlarmClock.this.getFragmentManager(), alarm);
50951193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                    expandAlarm(itemHolder);
5105c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
5115c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            });
5125c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5135c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.expandArea.setVisibility(isAlarmExpanded(alarm) ? View.VISIBLE : View.GONE);
5145c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.infoArea.setVisibility(!isAlarmExpanded(alarm) ? View.VISIBLE : View.GONE);
5155c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5165c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            String colons = "";
5175c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            // Set the repeat text or leave it blank if it does not repeat.
5185c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final String daysOfWeekStr = alarm.daysOfWeek.toString(AlarmClock.this, false);
5195c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
5205c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.daysOfWeek.setText(daysOfWeekStr);
5215c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.daysOfWeek.setVisibility(View.VISIBLE);
5225c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                colons = ": ";
5235c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            } else {
5245c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.daysOfWeek.setVisibility(View.GONE);
5255c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
5265c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5275c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (alarm.label != null && alarm.label.length() != 0) {
5285c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.label.setText(alarm.label + colons);
5295c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.label.setVisibility(View.VISIBLE);
5305c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            } else {
5315c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.label.setVisibility(View.GONE);
5325c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
5335c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5345c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.expand.setOnClickListener(new View.OnClickListener() {
5355c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
5365c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View v) {
53751193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                    expandAlarm(itemHolder);
5385c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
5395c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            });
5405c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5415c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (isAlarmExpanded(alarm) || forceExpand) {
54251193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng                expandAlarm(itemHolder);
5435c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
5445c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
5455c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5465c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private void bindExpandArea(final ItemHolder itemHolder, final Alarm alarm) {
5475c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            // Views in here are not bound until the item is expanded.
5485c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5495c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (alarm.label != null && alarm.label.length() > 0) {
5505c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.clickableLabel.setText(alarm.label);
5515c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.clickableLabel.setTextColor(mColorLit);
5525c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            } else {
5535c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.clickableLabel.setText(R.string.label);
5545c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.clickableLabel.setTextColor(mColorDim);
5555c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
5565c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.clickableLabel.setOnClickListener(new View.OnClickListener() {
5575c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
5585c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View view) {
5595c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    showLabelDialog(alarm);
5605c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
5615c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            });
5625c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5633286630083faa144af00617718411bf66eb3242bChiao Cheng            if (mRepeatChecked.contains(alarm.id) || itemHolder.alarm.daysOfWeek.isRepeatSet()) {
5645c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.repeat.setChecked(true);
5655c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.repeat.setTextColor(mColorLit);
5665c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.repeatDays.setVisibility(View.VISIBLE);
5675c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            } else {
5685c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.repeat.setChecked(false);
5695c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.repeat.setTextColor(mColorDim);
5705c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                itemHolder.repeatDays.setVisibility(View.GONE);
5715c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
5725c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.repeat.setOnClickListener(new View.OnClickListener() {
5735c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
5745c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View view) {
5755c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    final boolean checked = ((CheckBox) view).isChecked();
5765c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    if (checked) {
5775c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        // Show days
5785c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        itemHolder.repeatDays.setVisibility(View.VISIBLE);
5795c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        itemHolder.repeat.setTextColor(mColorLit);
5805c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        mRepeatChecked.add(alarm.id);
5815c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    } else {
5825c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        itemHolder.repeatDays.setVisibility(View.GONE);
5835c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        itemHolder.repeat.setTextColor(mColorDim);
5845c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        mRepeatChecked.remove(alarm.id);
585d091ee89ab2aa5c47d4b7b05e1f5d7e204b99494Chiao Cheng
586d091ee89ab2aa5c47d4b7b05e1f5d7e204b99494Chiao Cheng                        // Remove all repeat days
587d091ee89ab2aa5c47d4b7b05e1f5d7e204b99494Chiao Cheng                        alarm.daysOfWeek.set(new Alarm.DaysOfWeek(0));
58800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                        asyncUpdateAlarm(alarm, false);
5895c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    }
5905c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
5915c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            });
5925c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
5935c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            HashSet<Integer> setDays = alarm.daysOfWeek.getSetDays();
5945c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            for (int i = 0; i < 7; i++) {
5955c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                final ToggleButton button = itemHolder.daysButtons[i];
5965c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                if (setDays.contains(DAY_ORDER[i])) {
5975c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    button.setChecked(true);
5985c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    button.setTextColor(mColorLit);
599a3b4c996cbd237c8306e5ea81ff760581c62e1b8Chiao Cheng                    button.setTypeface(null, Typeface.BOLD);
6005c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                } else {
6015c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    button.setChecked(false);
6025c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    button.setTextColor(mColorDim);
603a3b4c996cbd237c8306e5ea81ff760581c62e1b8Chiao Cheng                    button.setTypeface(null, Typeface.NORMAL);
6045c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
6055c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                final int buttonIndex = i;
6065c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                button.setOnClickListener(new View.OnClickListener() {
6075c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    @Override
6085c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    public void onClick(View view) {
6095c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        final boolean checked = ((ToggleButton) view).isChecked();
6105c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        if (checked) {
6115c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                            button.setTextColor(mColorLit);
612a3b4c996cbd237c8306e5ea81ff760581c62e1b8Chiao Cheng                            button.setTypeface(null, Typeface.BOLD);
6135c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        } else {
6145c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                            button.setTextColor(mColorDim);
615a3b4c996cbd237c8306e5ea81ff760581c62e1b8Chiao Cheng                            button.setTypeface(null, Typeface.NORMAL);
6165c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        }
6175c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        int day = DAY_ORDER[buttonIndex];
6185c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        alarm.daysOfWeek.setDayOfWeek(day, checked);
61900c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                        asyncUpdateAlarm(alarm, false);
6205c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    }
6215c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                });
6225c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
6235c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
624dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng
625dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng            if (!mHasVibrator) {
626dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                itemHolder.vibrate.setVisibility(View.INVISIBLE);
6275c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            } else {
628dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                itemHolder.vibrate.setVisibility(View.VISIBLE);
629dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                if (!alarm.vibrate) {
630dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                    itemHolder.vibrate.setChecked(false);
631dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                    itemHolder.vibrate.setTextColor(mColorDim);
632dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                } else {
633dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                    itemHolder.vibrate.setChecked(true);
634dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                    itemHolder.vibrate.setTextColor(mColorLit);
635dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng                }
6365c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
637dbd989a7aebc7914b2cdec3e0cb69e38fae670fbChiao Cheng
6385c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.vibrate.setOnClickListener(new View.OnClickListener() {
6395c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
6405c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View v) {
6415c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    final boolean checked = ((CheckBox) v).isChecked();
6425c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    if (checked) {
6435c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        itemHolder.vibrate.setTextColor(mColorLit);
6445c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    } else {
6455c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                        itemHolder.vibrate.setTextColor(mColorDim);
6465c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    }
6475c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    alarm.vibrate = checked;
64800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                    asyncUpdateAlarm(alarm, false);
6495c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
6505c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            });
6515c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
6525c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.collapse.setOnClickListener(new View.OnClickListener() {
6535c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
6545c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View v) {
6555c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    itemHolder.expandArea.setVisibility(LinearLayout.GONE);
6565c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    itemHolder.infoArea.setVisibility(View.VISIBLE);
6575c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    collapseAlarm(alarm);
6585c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
6595c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            });
6605c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
6615c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final String ringtone;
6625c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            if (alarm.alert == null) {
6635c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                ringtone = mContext.getResources().getString(R.string.silent_alarm_summary);
6645c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            } else {
6653286630083faa144af00617718411bf66eb3242bChiao Cheng                ringtone = getRingToneTitle(alarm.alert);
6665c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
6675c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.ringtone.setText(ringtone);
6685c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.ringtone.setOnClickListener(new View.OnClickListener() {
6695c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                @Override
6705c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                public void onClick(View view) {
6715c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                    launchRingTonePicker(alarm);
6725c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                }
6735c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            });
6745c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
6755c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
6765c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        /**
6773286630083faa144af00617718411bf66eb3242bChiao Cheng         * Does a read-through cache for ringtone titles.
6783286630083faa144af00617718411bf66eb3242bChiao Cheng         *
6793286630083faa144af00617718411bf66eb3242bChiao Cheng         * @param uri The uri of the ringtone.
6803286630083faa144af00617718411bf66eb3242bChiao Cheng         * @return The ringtone title. {@literal null} if no matching ringtone found.
6813286630083faa144af00617718411bf66eb3242bChiao Cheng         */
6823286630083faa144af00617718411bf66eb3242bChiao Cheng        private String getRingToneTitle(Uri uri) {
6833286630083faa144af00617718411bf66eb3242bChiao Cheng            // Try the cache first
6843286630083faa144af00617718411bf66eb3242bChiao Cheng            String title = mRingtoneTitleCache.getString(uri.toString());
6853286630083faa144af00617718411bf66eb3242bChiao Cheng            if (title == null) {
6863286630083faa144af00617718411bf66eb3242bChiao Cheng                // This is slow because a media player is created during Ringtone object creation.
6873286630083faa144af00617718411bf66eb3242bChiao Cheng                Ringtone ringTone = RingtoneManager.getRingtone(mContext, uri);
6883286630083faa144af00617718411bf66eb3242bChiao Cheng                title = ringTone.getTitle(mContext);
6893286630083faa144af00617718411bf66eb3242bChiao Cheng                if (title != null) {
6903286630083faa144af00617718411bf66eb3242bChiao Cheng                    mRingtoneTitleCache.putString(uri.toString(), title);
6913286630083faa144af00617718411bf66eb3242bChiao Cheng                }
6923286630083faa144af00617718411bf66eb3242bChiao Cheng            }
6933286630083faa144af00617718411bf66eb3242bChiao Cheng            return title;
6943286630083faa144af00617718411bf66eb3242bChiao Cheng        }
6953286630083faa144af00617718411bf66eb3242bChiao Cheng
69651193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        public void setNewAlarm(int alarmId) {
69751193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng            mExpanded.add(alarmId);
69851193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        }
69951193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng
7003286630083faa144af00617718411bf66eb3242bChiao Cheng        /**
7015c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng         * Expands the alarm for editing.
7025c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng         *
7035c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng         * @param itemHolder The item holder instance.
7045c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng         */
70551193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng        private void expandAlarm(ItemHolder itemHolder) {
7065c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.expandArea.setVisibility(View.VISIBLE);
7075c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            itemHolder.infoArea.setVisibility(View.GONE);
7085c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
70951193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng            mExpanded.add(itemHolder.alarm.id);
71051193c62415add1a5fcf7e4ac92e6ba543c2fb88Chiao Cheng            bindExpandArea(itemHolder, itemHolder.alarm);
7115c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7125c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
7135c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private boolean isAlarmExpanded(Alarm alarm) {
7145c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            return mExpanded.contains(alarm.id);
7155c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7165c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
7175c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private void collapseAlarm(Alarm alarm) {
7185c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mExpanded.remove(alarm.id);
7195c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7205c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
7215c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        @Override
7225c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public int getViewTypeCount() {
7235c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            return 1;
7245c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7255c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
7265c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public void setNewAlarmCreated(boolean newAlarmCreated) {
7275c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            mNewAlarmCreated = newAlarmCreated;
7285c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7295c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
7305c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public int[] getExpandedArray() {
7315c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final int[] ids = new int[mExpanded.size()];
7325c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            int index = 0;
7335c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            for (int id : mExpanded) {
7345c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                ids[index] = id;
7355c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                index++;
7365c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
7375c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            return ids;
7385c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7395c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
7405c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        public int[] getRepeatArray() {
7415c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            final int[] ids = new int[mRepeatChecked.size()];
7425c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            int index = 0;
7435c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            for (int id : mRepeatChecked) {
7445c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                ids[index] = id;
7455c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                index++;
7465c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
7475c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            return ids;
7485c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7495c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng
7505c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        private void buildHashSetFromArray(int[] ids, HashSet<Integer> set) {
7515c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            for (int id : ids) {
7525c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng                set.add(id);
7535c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng            }
7545c3795c271bc6160f0ae2056627e9e96ffdc335cChiao Cheng        }
7550cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    }
7560cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
7570cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private void asyncAddAlarm() {
7580cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        asyncAddAlarm(new Alarm());
7590cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    }
7600cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
7610cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private void asyncDeleteAlarm(final Alarm alarm) {
7620cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        final AsyncTask<Alarm, Void, Void> deleteTask = new AsyncTask<Alarm, Void, Void>() {
7630cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
7640cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            @Override
7650cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            protected Void doInBackground(Alarm... alarms) {
7660cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                for (final Alarm alarm : alarms) {
7670cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                    Alarms.deleteAlarm(AlarmClock.this, alarm.id);
7680cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                }
7690cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                return null;
7700cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            }
7710cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        };
7720cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        mDeletedAlarm = alarm;
7730cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        mUndoShowing = true;
7740cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        deleteTask.execute(alarm);
7750cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        mUndoBar.show(new ActionableToastBar.ActionClickedListener() {
7760cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            @Override
7770cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            public void onActionClicked() {
7780cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                asyncAddAlarm(alarm);
779c042c7818064b644cf1e63dc784241ae6ed365a4Chiao Cheng                mDeletedAlarm = null;
780c042c7818064b644cf1e63dc784241ae6ed365a4Chiao Cheng                mUndoShowing = false;
7810cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            }
7820cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        }, 0, getResources().getString(R.string.alarm_deleted), true, R.string.alarm_undo, true);
7830cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    }
7840cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng
7850cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng    private void asyncAddAlarm(final Alarm alarm) {
7860cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        final AsyncTask<Void, Void, Void> updateTask = new AsyncTask<Void, Void, Void>() {
7870cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            @Override
78800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            protected Void doInBackground(Void... aVoid) {
7890cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                Alarms.addAlarm(AlarmClock.this, alarm);
7900cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng                return null;
7910cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng            }
79200c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng
79300c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            @Override
79400c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            protected void onPostExecute(Void aVoid) {
79500c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                if (alarm.enabled) {
79600c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                    popToast(alarm);
79700c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                }
79800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            }
7990cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        };
8000cb70993e26f300f92423bfced0d8cb3efc3f304Chiao Cheng        updateTask.execute();
8010dffdefe54299ee01b45574244c92d3a06507b87Patrick Scott    }
8023286630083faa144af00617718411bf66eb3242bChiao Cheng
80300c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng    private void asyncUpdateAlarm(final Alarm alarm, final boolean popToast) {
8043286630083faa144af00617718411bf66eb3242bChiao Cheng        final AsyncTask<Alarm, Void, Void> updateTask = new AsyncTask<Alarm, Void, Void>() {
8053286630083faa144af00617718411bf66eb3242bChiao Cheng            @Override
8063286630083faa144af00617718411bf66eb3242bChiao Cheng            protected Void doInBackground(Alarm... alarms) {
8073286630083faa144af00617718411bf66eb3242bChiao Cheng                for (final Alarm alarm : alarms) {
8083286630083faa144af00617718411bf66eb3242bChiao Cheng                    Alarms.setAlarm(AlarmClock.this, alarm);
8093286630083faa144af00617718411bf66eb3242bChiao Cheng                }
8103286630083faa144af00617718411bf66eb3242bChiao Cheng                return null;
8113286630083faa144af00617718411bf66eb3242bChiao Cheng            }
81200c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng
81300c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            @Override
81400c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            protected void onPostExecute(Void aVoid) {
81500c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                if (popToast) {
81600c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                    popToast(alarm);
81700c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng                }
81800c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng            }
8193286630083faa144af00617718411bf66eb3242bChiao Cheng        };
8203286630083faa144af00617718411bf66eb3242bChiao Cheng        updateTask.execute(alarm);
8213286630083faa144af00617718411bf66eb3242bChiao Cheng    }
8223286630083faa144af00617718411bf66eb3242bChiao Cheng
82300c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng    private void popToast(Alarm alarm) {
82400c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng        AlarmUtils.popAlarmSetToast(this, alarm.hour, alarm.minutes, alarm.daysOfWeek);
82500c0d8672ea4741a23ff875ca1a992b8ad080e78Chiao Cheng    }
8265fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project}
827