1e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova/* 2e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * Copyright (C) 2015 The Android Open Source Project 3e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * 4e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * Licensed under the Apache License, Version 2.0 (the "License"); 5e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * you may not use this file except in compliance with the License. 6e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * You may obtain a copy of the License at 7e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * 8e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * http://www.apache.org/licenses/LICENSE-2.0 9e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * 10e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * Unless required by applicable law or agreed to in writing, software 11e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * distributed under the License is distributed on an "AS IS" BASIS, 12e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * See the License for the specific language governing permissions and 14e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova * limitations under the License. 15e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova */ 16e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovapackage com.android.deskclock; 17e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 1897149ea89a5c0e057f25b89b87eef6224b82a777Daria Evdokimovaimport android.app.Activity; 19e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.app.ListActivity; 20e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.content.Context; 21e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.content.Intent; 22e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.os.AsyncTask; 23e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.os.Bundle; 24e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.os.Parcelable; 25e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.view.View; 26e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.widget.Button; 27e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport android.widget.ListView; 28e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 29e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport com.android.deskclock.provider.Alarm; 30e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport com.android.deskclock.widget.selector.AlarmSelection; 31e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport com.android.deskclock.widget.selector.AlarmSelectionAdapter; 32e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 33e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport java.util.ArrayList; 34e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovaimport java.util.List; 35e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 36e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimovapublic class AlarmSelectionActivity extends ListActivity { 37e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 38e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova public static final String EXTRA_ALARMS = "com.android.deskclock.EXTRA_ALARMS"; 39e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 40e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova private final List<AlarmSelection> mSelections = new ArrayList<>(); 41e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 42e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova @Override 43e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova protected void onCreate(Bundle savedInstanceState) { 44e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // this activity is shown if: 45e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // a) no search mode was specified in which case we show all 46e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // enabled alarms 47e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // b) if search mode was next and there was multiple alarms firing next 48e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // (at the same time) then we only show those alarms firing at the same time 49e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // c) if search mode was time and there are multiple alarms with that time 50e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // then we only show those alarms with that time 51e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 52e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova super.onCreate(savedInstanceState); 53e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova setContentView(R.layout.selection_layout); 54e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 55e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova final Button cancelButton = (Button) findViewById(R.id.cancel_button); 56e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova cancelButton.setOnClickListener(new View.OnClickListener() { 57e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova @Override 58e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova public void onClick(View v) { 59e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova finish(); 60e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 61e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova }); 62e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 63e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova final Intent intent = getIntent(); 64e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova final Parcelable[] alarmsFromIntent = intent.getParcelableArrayExtra(EXTRA_ALARMS); 65e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 66e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // reading alarms from intent 67e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // PickSelection is started only if there are more than 1 relevant alarm 68e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // so no need to check if alarmsFromIntent is empty 69e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova for (Parcelable parcelable : alarmsFromIntent) { 70e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova final Alarm alarm = (Alarm) parcelable; 71e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 72e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // filling mSelections that go into the UI picker list 73e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova final String label = String.format("%d %02d", alarm.hour, alarm.minutes); 74e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova mSelections.add(new AlarmSelection(label, alarm)); 75e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 76e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 77e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova setListAdapter(new AlarmSelectionAdapter(this, R.layout.alarm_row, mSelections)); 78e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 79e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 80e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova @Override 81e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova public void onListItemClick(ListView l, View v, int position, long id) { 82e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova super.onListItemClick(l, v, position, id); 83e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova // id corresponds to mSelections id because the view adapter used mSelections 84e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova final AlarmSelection selection = mSelections.get((int) id); 85e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova final Alarm alarm = selection.getAlarm(); 86e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova if (alarm != null) { 8797149ea89a5c0e057f25b89b87eef6224b82a777Daria Evdokimova new ProcessAlarmActionAsync(this, alarm, this).execute(); 88e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 89e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova finish(); 90e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 91e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 92e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova private static class ProcessAlarmActionAsync extends AsyncTask<Void, Void, Void> { 93e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 94e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova private final Context mContext; 95e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova private final Alarm mAlarm; 9697149ea89a5c0e057f25b89b87eef6224b82a777Daria Evdokimova private final Activity mActivity; 97e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 9897149ea89a5c0e057f25b89b87eef6224b82a777Daria Evdokimova public ProcessAlarmActionAsync(Context context, Alarm alarm, Activity activity) { 99e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova mContext = context; 100e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova mAlarm = alarm; 10197149ea89a5c0e057f25b89b87eef6224b82a777Daria Evdokimova mActivity = activity; 102e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 103e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova 104e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova @Override 105e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova protected Void doInBackground(Void... parameters) { 10697149ea89a5c0e057f25b89b87eef6224b82a777Daria Evdokimova HandleApiCalls.dismissAlarm(mAlarm, mContext, mActivity); 107e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova return null; 108e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 109e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova } 110e6f73547d9fed9f9e0a44e6baf2894d317e6ef78Daria Evdokimova} 111