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 18fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFaddenimport com.android.calendar.CalendarEventModel.ReminderEntry; 19fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.R; 208d69cd014d912e38d2ab37764aaf4aa7700c078bErik 218d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.app.Activity; 228d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.content.Context; 238d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.content.res.Resources; 248d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.util.Log; 258d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.view.LayoutInflater; 268d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.view.View; 278b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErikimport android.widget.AdapterView.OnItemSelectedListener; 288d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.ArrayAdapter; 298d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.ImageButton; 308d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.LinearLayout; 318d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport android.widget.Spinner; 328d69cd014d912e38d2ab37764aaf4aa7700c078bErik 338d69cd014d912e38d2ab37764aaf4aa7700c078bErikimport java.util.ArrayList; 348d69cd014d912e38d2ab37764aaf4aa7700c078bErik 358d69cd014d912e38d2ab37764aaf4aa7700c078bErikpublic class EventViewUtils { 369645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden private static final String TAG = "EventViewUtils"; 378d69cd014d912e38d2ab37764aaf4aa7700c078bErik 388d69cd014d912e38d2ab37764aaf4aa7700c078bErik private EventViewUtils() { 398d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 408d69cd014d912e38d2ab37764aaf4aa7700c078bErik 418d69cd014d912e38d2ab37764aaf4aa7700c078bErik // Constructs a label given an arbitrary number of minutes. For example, 428d69cd014d912e38d2ab37764aaf4aa7700c078bErik // if the given minutes is 63, then this returns the string "63 minutes". 438d69cd014d912e38d2ab37764aaf4aa7700c078bErik // As another example, if the given minutes is 120, then this returns 448d69cd014d912e38d2ab37764aaf4aa7700c078bErik // "2 hours". 45fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static String constructReminderLabel(Context context, int minutes, boolean abbrev) { 468d69cd014d912e38d2ab37764aaf4aa7700c078bErik Resources resources = context.getResources(); 478d69cd014d912e38d2ab37764aaf4aa7700c078bErik int value, resId; 488d69cd014d912e38d2ab37764aaf4aa7700c078bErik 498d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (minutes % 60 != 0) { 508d69cd014d912e38d2ab37764aaf4aa7700c078bErik value = minutes; 518d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (abbrev) { 528d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Nmins; 538d69cd014d912e38d2ab37764aaf4aa7700c078bErik } else { 548d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Nminutes; 558d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 568d69cd014d912e38d2ab37764aaf4aa7700c078bErik } else if (minutes % (24 * 60) != 0) { 578d69cd014d912e38d2ab37764aaf4aa7700c078bErik value = minutes / 60; 588d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Nhours; 598d69cd014d912e38d2ab37764aaf4aa7700c078bErik } else { 608d69cd014d912e38d2ab37764aaf4aa7700c078bErik value = minutes / (24 * 60); 618d69cd014d912e38d2ab37764aaf4aa7700c078bErik resId = R.plurals.Ndays; 628d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 638d69cd014d912e38d2ab37764aaf4aa7700c078bErik 648d69cd014d912e38d2ab37764aaf4aa7700c078bErik String format = resources.getQuantityString(resId, value); 658d69cd014d912e38d2ab37764aaf4aa7700c078bErik return String.format(format, value); 668d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 678d69cd014d912e38d2ab37764aaf4aa7700c078bErik 688d69cd014d912e38d2ab37764aaf4aa7700c078bErik /** 698d69cd014d912e38d2ab37764aaf4aa7700c078bErik * Finds the index of the given "minutes" in the "values" list. 708d69cd014d912e38d2ab37764aaf4aa7700c078bErik * 718d69cd014d912e38d2ab37764aaf4aa7700c078bErik * @param values the list of minutes corresponding to the spinner choices 728d69cd014d912e38d2ab37764aaf4aa7700c078bErik * @param minutes the minutes to search for in the values list 738d69cd014d912e38d2ab37764aaf4aa7700c078bErik * @return the index of "minutes" in the "values" list 748d69cd014d912e38d2ab37764aaf4aa7700c078bErik */ 75fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static int findMinutesInReminderList(ArrayList<Integer> values, int minutes) { 768d69cd014d912e38d2ab37764aaf4aa7700c078bErik int index = values.indexOf(minutes); 778d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (index == -1) { 788d69cd014d912e38d2ab37764aaf4aa7700c078bErik // This should never happen. 799645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Log.e(TAG, "Cannot find minutes (" + minutes + ") in list"); 808d69cd014d912e38d2ab37764aaf4aa7700c078bErik return 0; 818d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 828d69cd014d912e38d2ab37764aaf4aa7700c078bErik return index; 838d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 848d69cd014d912e38d2ab37764aaf4aa7700c078bErik 85fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden /** 869645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * Finds the index of the given method in the "methods" list. If the method isn't present 879645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * (perhaps because we don't think it's allowed for this calendar), we return zero (the 889645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * first item in the list). 899645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * <p> 909645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * With the current definitions, this effectively converts DEFAULT and unsupported method 919645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * types to ALERT. 929645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * 939645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param values the list of minutes corresponding to the spinner choices 949645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param method the method to search for in the values list 959645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @return the index of the method in the "values" list 969645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden */ 979645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden public static int findMethodInReminderList(ArrayList<Integer> values, int method) { 989645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden int index = values.indexOf(method); 999645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden if (index == -1) { 1009645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden // If not allowed, or undefined, just use the first entry in the list. 1019645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden //Log.d(TAG, "Cannot find method (" + method + ") in allowed list"); 1029645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden index = 0; 1039645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1049645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden return index; 1059645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1069645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 1079645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden /** 108fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden * Extracts reminder minutes info from UI elements. 109fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden * 1109645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param reminderItems UI elements (layouts with spinners) that hold array indices. 1119645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param reminderMinuteValues Maps array index to time in minutes. 1129645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param reminderMethodValues Maps array index to alert method constant. 113fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden * @return Array with reminder data. 114fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden */ 1159645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden public static ArrayList<ReminderEntry> reminderItemsToReminders( 1169645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden ArrayList<LinearLayout> reminderItems, ArrayList<Integer> reminderMinuteValues, 1179645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden ArrayList<Integer> reminderMethodValues) { 1188d69cd014d912e38d2ab37764aaf4aa7700c078bErik int len = reminderItems.size(); 1199645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden ArrayList<ReminderEntry> reminders = new ArrayList<ReminderEntry>(len); 1208d69cd014d912e38d2ab37764aaf4aa7700c078bErik for (int index = 0; index < len; index++) { 1218d69cd014d912e38d2ab37764aaf4aa7700c078bErik LinearLayout layout = reminderItems.get(index); 1229645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Spinner minuteSpinner = (Spinner) layout.findViewById(R.id.reminder_minutes_value); 1239645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Spinner methodSpinner = (Spinner) layout.findViewById(R.id.reminder_method_value); 1249645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden int minutes = reminderMinuteValues.get(minuteSpinner.getSelectedItemPosition()); 1259645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden int method = reminderMethodValues.get(methodSpinner.getSelectedItemPosition()); 1269645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden reminders.add(ReminderEntry.valueOf(minutes, method)); 1278d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1289645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden return reminders; 1298d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1308d69cd014d912e38d2ab37764aaf4aa7700c078bErik 131ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden /** 132fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden * If "minutes" is not currently present in "values", we add an appropriate new entry 133fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden * to values and labels. 134ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden */ 135fbce65e53c7a111955f638db5bf8bee35381e5b7Erik public static void addMinutesToList(Context context, ArrayList<Integer> values, 1368d69cd014d912e38d2ab37764aaf4aa7700c078bErik ArrayList<String> labels, int minutes) { 1378d69cd014d912e38d2ab37764aaf4aa7700c078bErik int index = values.indexOf(minutes); 1388d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (index != -1) { 1398d69cd014d912e38d2ab37764aaf4aa7700c078bErik return; 1408d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1418d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1428d69cd014d912e38d2ab37764aaf4aa7700c078bErik // The requested "minutes" does not exist in the list, so insert it 1438d69cd014d912e38d2ab37764aaf4aa7700c078bErik // into the list. 1448d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1458d69cd014d912e38d2ab37764aaf4aa7700c078bErik String label = constructReminderLabel(context, minutes, false); 1468d69cd014d912e38d2ab37764aaf4aa7700c078bErik int len = values.size(); 1478d69cd014d912e38d2ab37764aaf4aa7700c078bErik for (int i = 0; i < len; i++) { 1488d69cd014d912e38d2ab37764aaf4aa7700c078bErik if (minutes < values.get(i)) { 1498d69cd014d912e38d2ab37764aaf4aa7700c078bErik values.add(i, minutes); 1508d69cd014d912e38d2ab37764aaf4aa7700c078bErik labels.add(i, label); 1518d69cd014d912e38d2ab37764aaf4aa7700c078bErik return; 1528d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1538d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1548d69cd014d912e38d2ab37764aaf4aa7700c078bErik 1558d69cd014d912e38d2ab37764aaf4aa7700c078bErik values.add(minutes); 1568d69cd014d912e38d2ab37764aaf4aa7700c078bErik labels.add(len, label); 1578d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 1588d69cd014d912e38d2ab37764aaf4aa7700c078bErik 159ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden /** 1609645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * Remove entries from the method list that aren't allowed for this calendar. 1619645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * 1629645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param values List of known method values. 1639645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param labels List of known method labels. 1649645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * @param allowedMethods Has the form "0,1,3", indicating method constants from Reminders. 1659645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden */ 1669645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden public static void reduceMethodList(ArrayList<Integer> values, ArrayList<String> labels, 1679645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden String allowedMethods) 1689645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden { 1699645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden // Parse "allowedMethods". 1709645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden String[] allowedStrings = allowedMethods.split(","); 1719645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden int[] allowedValues = new int[allowedStrings.length]; 1729645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 1739645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden for (int i = 0; i < allowedValues.length; i++) { 1749645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden try { 1759645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden allowedValues[i] = Integer.parseInt(allowedStrings[i], 10); 1769645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } catch (NumberFormatException nfe) { 1779645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Log.w(TAG, "Bad allowed-strings list: '" + allowedStrings[i] + 1789645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden "' in '" + allowedMethods + "'"); 1799645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden return; 1809645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1819645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1829645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 1839645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden // Walk through the method list, removing entries that aren't in the allowed list. 1849645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden for (int i = values.size() - 1; i >= 0; i--) { 1859645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden int val = values.get(i); 1869645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden int j; 1879645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 1889645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden for (j = allowedValues.length - 1; j >= 0; j--) { 1899645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden if (val == allowedValues[j]) { 1909645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden break; 1919645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1929645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1939645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden if (j < 0) { 1949645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden values.remove(i); 1959645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden labels.remove(i); 1969645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1979645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1989645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 1999645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 2009645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden /** 2019645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * Set the list of labels on a reminder spinner. 2029645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden */ 2039645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden private static void setReminderSpinnerLabels(Activity activity, Spinner spinner, 2049645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden ArrayList<String> labels) { 2059645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Resources res = activity.getResources(); 2069645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden spinner.setPrompt(res.getString(R.string.reminders_label)); 2079645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden int resource = android.R.layout.simple_spinner_item; 2089645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, resource, labels); 2099645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 2109645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden spinner.setAdapter(adapter); 2119645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden } 2129645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 2139645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden /** 2148b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * Adds a reminder to the displayed list of reminders. The values/labels 2158b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * arrays must not change after calling here, or the spinners we created 2168b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * might index into the wrong entry. Returns true if successfully added 2178b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * reminder, false if no reminders can be added. 21899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * 2198b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * onItemSelected allows a listener to be set for any changes to the 2208b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * spinners in the reminder. If a listener is set it will store the 2218b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * initial position of the spinner into the spinner's tag for comparison 2228b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik * with any new position setting. 223ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden */ 2248b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik public static boolean addReminder(Activity activity, View view, View.OnClickListener listener, 2258b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik ArrayList<LinearLayout> items, ArrayList<Integer> minuteValues, 2268b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik ArrayList<String> minuteLabels, ArrayList<Integer> methodValues, 2278b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik ArrayList<String> methodLabels, ReminderEntry newReminder, int maxReminders, 2288b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik OnItemSelectedListener onItemSelected) { 2298d69cd014d912e38d2ab37764aaf4aa7700c078bErik 2309645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden if (items.size() >= maxReminders) { 2318d69cd014d912e38d2ab37764aaf4aa7700c078bErik return false; 2328d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 2338d69cd014d912e38d2ab37764aaf4aa7700c078bErik 2348d69cd014d912e38d2ab37764aaf4aa7700c078bErik LayoutInflater inflater = activity.getLayoutInflater(); 23579f228124de7d98146ca526d743436f6419e2365Erik LinearLayout parent = (LinearLayout) view.findViewById(R.id.reminder_items_container); 2368d69cd014d912e38d2ab37764aaf4aa7700c078bErik LinearLayout reminderItem = (LinearLayout) inflater.inflate(R.layout.edit_reminder_item, 2378d69cd014d912e38d2ab37764aaf4aa7700c078bErik null); 2388d69cd014d912e38d2ab37764aaf4aa7700c078bErik parent.addView(reminderItem); 2398d69cd014d912e38d2ab37764aaf4aa7700c078bErik 2408d69cd014d912e38d2ab37764aaf4aa7700c078bErik ImageButton reminderRemoveButton; 2418d69cd014d912e38d2ab37764aaf4aa7700c078bErik reminderRemoveButton = (ImageButton) reminderItem.findViewById(R.id.reminder_remove); 2428d69cd014d912e38d2ab37764aaf4aa7700c078bErik reminderRemoveButton.setOnClickListener(listener); 2438d69cd014d912e38d2ab37764aaf4aa7700c078bErik 2449645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden /* 2459645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * The spinner has the default set of labels from the string resource file, but we 2469645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * want to drop in our custom set of labels because it may have additional entries. 2479645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden */ 2489645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Spinner spinner = (Spinner) reminderItem.findViewById(R.id.reminder_minutes_value); 2499645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden setReminderSpinnerLabels(activity, spinner, minuteLabels); 2509645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 251fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden int index = findMinutesInReminderList(minuteValues, newReminder.getMinutes()); 2528d69cd014d912e38d2ab37764aaf4aa7700c078bErik spinner.setSelection(index); 2538d69cd014d912e38d2ab37764aaf4aa7700c078bErik 2548b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik if (onItemSelected != null) { 2558b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik spinner.setTag(index); 2568b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik spinner.setOnItemSelectedListener(onItemSelected); 2578b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik } 2588b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik 2599645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden /* 2609645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * Configure the alert-method spinner. Methods not supported by the current Calendar 2619645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden * will not be shown. 2629645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden */ 2639645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden spinner = (Spinner) reminderItem.findViewById(R.id.reminder_method_value); 2649645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden setReminderSpinnerLabels(activity, spinner, methodLabels); 2659645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 2669645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden index = findMethodInReminderList(methodValues, newReminder.getMethod()); 2679645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden spinner.setSelection(index); 2689645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 2698b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik if (onItemSelected != null) { 2708b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik spinner.setTag(index); 2718b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik spinner.setOnItemSelectedListener(onItemSelected); 2728b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik } 2738b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik 2748d69cd014d912e38d2ab37764aaf4aa7700c078bErik items.add(reminderItem); 2758d69cd014d912e38d2ab37764aaf4aa7700c078bErik 2768d69cd014d912e38d2ab37764aaf4aa7700c078bErik return true; 2778d69cd014d912e38d2ab37764aaf4aa7700c078bErik } 27806f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting 27906f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting /** 28006f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting * Enables/disables the 'add reminder' button depending on the current number of 28106f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting * reminders. 28206f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting */ 28306f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting public static void updateAddReminderButton(View view, ArrayList<LinearLayout> reminders, 28406f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting int maxReminders) { 28506f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting View reminderAddButton = view.findViewById(R.id.reminder_add); 28606f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting if (reminderAddButton != null) { 28706f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting if (reminders.size() >= maxReminders) { 28806f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting reminderAddButton.setEnabled(false); 28906f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting reminderAddButton.setVisibility(View.GONE); 29006f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting } else { 29106f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting reminderAddButton.setEnabled(true); 29206f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting reminderAddButton.setVisibility(View.VISIBLE); 29306f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting } 29406f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting } 29506f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting } 2968d69cd014d912e38d2ab37764aaf4aa7700c078bErik} 297