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