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