EventViewUtils.java revision fbce65e53c7a111955f638db5bf8bee35381e5b7
18d69cd014d912e38d2ab37764aaf4aa7700c078bErik/* 28d69cd014d912e38d2ab37764aaf4aa7700c078bErik * Copyright (C) 2010 The Android Open Source Project 38d69cd014d912e38d2ab37764aaf4aa7700c078bErik * 48d69cd014d912e38d2ab37764aaf4aa7700c078bErik * Licensed under the Apache License, Version 2.0 (the "License"); 58d69cd014d912e38d2ab37764aaf4aa7700c078bErik * you may not use this file except in compliance with the License. 68d69cd014d912e38d2ab37764aaf4aa7700c078bErik * You may obtain a copy of the License at 78d69cd014d912e38d2ab37764aaf4aa7700c078bErik * 88d69cd014d912e38d2ab37764aaf4aa7700c078bErik * http://www.apache.org/licenses/LICENSE-2.0 98d69cd014d912e38d2ab37764aaf4aa7700c078bErik * 108d69cd014d912e38d2ab37764aaf4aa7700c078bErik * Unless required by applicable law or agreed to in writing, software 118d69cd014d912e38d2ab37764aaf4aa7700c078bErik * distributed under the License is distributed on an "AS IS" BASIS, 128d69cd014d912e38d2ab37764aaf4aa7700c078bErik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138d69cd014d912e38d2ab37764aaf4aa7700c078bErik * See the License for the specific language governing permissions and 148d69cd014d912e38d2ab37764aaf4aa7700c078bErik * limitations under the License. 158d69cd014d912e38d2ab37764aaf4aa7700c078bErik */ 16fbce65e53c7a111955f638db5bf8bee35381e5b7Erikpackage com.android.calendar.event; 17fbce65e53c7a111955f638db5bf8bee35381e5b7Erik 18fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.R; 198d69cd014d912e38d2ab37764aaf4aa7700c078bErik 208d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.app.Activity; 218d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.content.Context; 228d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.content.res.Resources; 238d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.util.Log; 248d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.view.LayoutInflater; 258d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.view.View; 268d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.ArrayAdapter; 278d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.ImageButton; 288d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.LinearLayout; 298d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.Spinner; 308d69cd014d912e38d2ab37764aaf4aa7700c078bErik 318d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport java.util.ArrayList; 328d69cd014d912e38d2ab37764aaf4aa7700c078bErik 338d69cd014d912e38d2ab37764aaf4aa7700c078bErikpublic class EventViewUtils { 348d69cd014d912e38d2ab37764aaf4aa7700c078bErik 358d69cd014d912e38d2ab37764aaf4aa7700c078bErik private EventViewUtils() { 368d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 378d69cd014d912e38d2ab37764aaf4aa7700c078bErik 388d69cd014d912e38d2ab37764aaf4aa7700c078bErik // Constructs a label given an arbitrary number of minutes. For example, 398d69cd014d912e38d2ab37764aaf4aa7700c078bErik // if the given minutes is 63, then this returns the string "63 minutes". 408d69cd014d912e38d2ab37764aaf4aa7700c078bErik // As another example, if the given minutes is 120, then this returns 418d69cd014d912e38d2ab37764aaf4aa7700c078bErik // "2 hours". 42fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static String constructReminderLabel(Context context, int minutes, boolean abbrev) { 438d69cd014d912e38d2ab37764aaf4aa7700c078bErik Resources resources = context.getResources(); 448d69cd014d912e38d2ab37764aaf4aa7700c078bErik int value, resId; 458d69cd014d912e38d2ab37764aaf4aa7700c078bErik 468d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (minutes % 60 != 0) { 478d69cd014d912e38d2ab37764aaf4aa7700c078bErik value = minutes; 488d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (abbrev) { 498d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Nmins; 508d69cd014d912e38d2ab37764aaf4aa7700c078bErik } else { 518d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Nminutes; 528d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 538d69cd014d912e38d2ab37764aaf4aa7700c078bErik } else if (minutes % (24 * 60) != 0) { 548d69cd014d912e38d2ab37764aaf4aa7700c078bErik value = minutes / 60; 558d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Nhours; 568d69cd014d912e38d2ab37764aaf4aa7700c078bErik } else { 578d69cd014d912e38d2ab37764aaf4aa7700c078bErik value = minutes / (24 * 60); 588d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Ndays; 598d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 608d69cd014d912e38d2ab37764aaf4aa7700c078bErik 618d69cd014d912e38d2ab37764aaf4aa7700c078bErik String format = resources.getQuantityString(resId, value); 628d69cd014d912e38d2ab37764aaf4aa7700c078bErik return String.format(format, value); 638d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 648d69cd014d912e38d2ab37764aaf4aa7700c078bErik 658d69cd014d912e38d2ab37764aaf4aa7700c078bErik /** 668d69cd014d912e38d2ab37764aaf4aa7700c078bErik * Finds the index of the given "minutes" in the "values" list. 678d69cd014d912e38d2ab37764aaf4aa7700c078bErik * 688d69cd014d912e38d2ab37764aaf4aa7700c078bErik * @param values the list of minutes corresponding to the spinner choices 698d69cd014d912e38d2ab37764aaf4aa7700c078bErik * @param minutes the minutes to search for in the values list 708d69cd014d912e38d2ab37764aaf4aa7700c078bErik * @return the index of "minutes" in the "values" list 718d69cd014d912e38d2ab37764aaf4aa7700c078bErik */ 72fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static int findMinutesInReminderList(ArrayList<Integer> values, int minutes) { 738d69cd014d912e38d2ab37764aaf4aa7700c078bErik int index = values.indexOf(minutes); 748d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (index == -1) { 758d69cd014d912e38d2ab37764aaf4aa7700c078bErik // This should never happen. 768d69cd014d912e38d2ab37764aaf4aa7700c078bErik Log.e("Cal", "Cannot find minutes (" + minutes + ") in list"); 778d69cd014d912e38d2ab37764aaf4aa7700c078bErik return 0; 788d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 798d69cd014d912e38d2ab37764aaf4aa7700c078bErik return index; 808d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 818d69cd014d912e38d2ab37764aaf4aa7700c078bErik 82fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static ArrayList<Integer> reminderItemsToMinutes(ArrayList<LinearLayout> reminderItems, 838d69cd014d912e38d2ab37764aaf4aa7700c078bErik ArrayList<Integer> reminderValues) { 848d69cd014d912e38d2ab37764aaf4aa7700c078bErik int len = reminderItems.size(); 858d69cd014d912e38d2ab37764aaf4aa7700c078bErik ArrayList<Integer> reminderMinutes = new ArrayList<Integer>(len); 868d69cd014d912e38d2ab37764aaf4aa7700c078bErik for (int index = 0; index < len; index++) { 878d69cd014d912e38d2ab37764aaf4aa7700c078bErik LinearLayout layout = reminderItems.get(index); 888d69cd014d912e38d2ab37764aaf4aa7700c078bErik Spinner spinner = (Spinner) layout.findViewById(R.id.reminder_value); 898d69cd014d912e38d2ab37764aaf4aa7700c078bErik int minutes = reminderValues.get(spinner.getSelectedItemPosition()); 908d69cd014d912e38d2ab37764aaf4aa7700c078bErik reminderMinutes.add(minutes); 918d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 928d69cd014d912e38d2ab37764aaf4aa7700c078bErik return reminderMinutes; 938d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 948d69cd014d912e38d2ab37764aaf4aa7700c078bErik 958d69cd014d912e38d2ab37764aaf4aa7700c078bErik // Checks our list of minute value-label pairs and adds any custom times 968d69cd014d912e38d2ab37764aaf4aa7700c078bErik // this event 978d69cd014d912e38d2ab37764aaf4aa7700c078bErik // might contain. 98fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static void addMinutesToList(Context context, ArrayList<Integer> values, 998d69cd014d912e38d2ab37764aaf4aa7700c078bErik ArrayList<String> labels, int minutes) { 1008d69cd014d912e38d2ab37764aaf4aa7700c078bErik int index = values.indexOf(minutes); 1018d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (index != -1) { 1028d69cd014d912e38d2ab37764aaf4aa7700c078bErik return; 1038d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1048d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1058d69cd014d912e38d2ab37764aaf4aa7700c078bErik // The requested "minutes" does not exist in the list, so insert it 1068d69cd014d912e38d2ab37764aaf4aa7700c078bErik // into the list. 1078d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1088d69cd014d912e38d2ab37764aaf4aa7700c078bErik String label = constructReminderLabel(context, minutes, false); 1098d69cd014d912e38d2ab37764aaf4aa7700c078bErik int len = values.size(); 1108d69cd014d912e38d2ab37764aaf4aa7700c078bErik for (int i = 0; i < len; i++) { 1118d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (minutes < values.get(i)) { 1128d69cd014d912e38d2ab37764aaf4aa7700c078bErik values.add(i, minutes); 1138d69cd014d912e38d2ab37764aaf4aa7700c078bErik labels.add(i, label); 1148d69cd014d912e38d2ab37764aaf4aa7700c078bErik return; 1158d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1168d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1178d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1188d69cd014d912e38d2ab37764aaf4aa7700c078bErik values.add(minutes); 1198d69cd014d912e38d2ab37764aaf4aa7700c078bErik labels.add(len, label); 1208d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1218d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1228d69cd014d912e38d2ab37764aaf4aa7700c078bErik // Adds a reminder to the displayed list of reminders. 1238d69cd014d912e38d2ab37764aaf4aa7700c078bErik // Returns true if successfully added reminder, false if no reminders can 1248d69cd014d912e38d2ab37764aaf4aa7700c078bErik // be added. 125fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static boolean addReminder(Activity activity, View view, View.OnClickListener listener, 1268d69cd014d912e38d2ab37764aaf4aa7700c078bErik ArrayList<LinearLayout> items, ArrayList<Integer> values, ArrayList<String> labels, 1278d69cd014d912e38d2ab37764aaf4aa7700c078bErik int minutes) { 1288d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1298d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (items.size() >= EditEventHelper.MAX_REMINDERS) { 1308d69cd014d912e38d2ab37764aaf4aa7700c078bErik return false; 1318d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1328d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1338d69cd014d912e38d2ab37764aaf4aa7700c078bErik LayoutInflater inflater = activity.getLayoutInflater(); 13479f228124de7d98146ca526d743436f6419e2365Erik LinearLayout parent = (LinearLayout) view.findViewById(R.id.reminder_items_container); 1358d69cd014d912e38d2ab37764aaf4aa7700c078bErik LinearLayout reminderItem = (LinearLayout) inflater.inflate(R.layout.edit_reminder_item, 1368d69cd014d912e38d2ab37764aaf4aa7700c078bErik null); 1378d69cd014d912e38d2ab37764aaf4aa7700c078bErik parent.addView(reminderItem); 1388d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1398d69cd014d912e38d2ab37764aaf4aa7700c078bErik Spinner spinner = (Spinner) reminderItem.findViewById(R.id.reminder_value); 1408d69cd014d912e38d2ab37764aaf4aa7700c078bErik Resources res = activity.getResources(); 1418d69cd014d912e38d2ab37764aaf4aa7700c078bErik spinner.setPrompt(res.getString(R.string.reminders_label)); 1428d69cd014d912e38d2ab37764aaf4aa7700c078bErik int resource = android.R.layout.simple_spinner_item; 1438d69cd014d912e38d2ab37764aaf4aa7700c078bErik ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, resource, labels); 1448d69cd014d912e38d2ab37764aaf4aa7700c078bErik adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 1458d69cd014d912e38d2ab37764aaf4aa7700c078bErik spinner.setAdapter(adapter); 1468d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1478d69cd014d912e38d2ab37764aaf4aa7700c078bErik ImageButton reminderRemoveButton; 1488d69cd014d912e38d2ab37764aaf4aa7700c078bErik reminderRemoveButton = (ImageButton) reminderItem.findViewById(R.id.reminder_remove); 1498d69cd014d912e38d2ab37764aaf4aa7700c078bErik reminderRemoveButton.setOnClickListener(listener); 1508d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1518d69cd014d912e38d2ab37764aaf4aa7700c078bErik int index = findMinutesInReminderList(values, minutes); 1528d69cd014d912e38d2ab37764aaf4aa7700c078bErik spinner.setSelection(index); 1538d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1548d69cd014d912e38d2ab37764aaf4aa7700c078bErik items.add(reminderItem); 1558d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1568d69cd014d912e38d2ab37764aaf4aa7700c078bErik return true; 1578d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1588d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1598d69cd014d912e38d2ab37764aaf4aa7700c078bErik} 160