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    }
2788d69cd014d912e38d2ab37764aaf4aa7700c078bErik}
279