19442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann/*
29442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * Copyright (C) 2010 The Android Open Source Project
39442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann *
49442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * Licensed under the Apache License, Version 2.0 (the "License");
59442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * you may not use this file except in compliance with the License.
69442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * You may obtain a copy of the License at
79442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann *
89442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann *      http://www.apache.org/licenses/LICENSE-2.0
99442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann *
109442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * Unless required by applicable law or agreed to in writing, software
119442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * distributed under the License is distributed on an "AS IS" BASIS,
129442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * See the License for the specific language governing permissions and
149442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * limitations under the License
159442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann */
169442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
1718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovpackage com.android.contacts.editor;
189442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
199442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport com.android.contacts.R;
209442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
219442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport android.content.Context;
229442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport android.view.View;
239442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport android.widget.AdapterView;
249442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport android.widget.AdapterView.OnItemClickListener;
259442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport android.widget.ArrayAdapter;
269442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport android.widget.ListAdapter;
279442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport android.widget.ListPopupWindow;
289442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
299442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannimport java.util.ArrayList;
309442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
319442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann/**
329442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann * Shows a popup asking the user what to do for a photo. The result is pased back to the Listener
339442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann */
349442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmannpublic class PhotoActionPopup {
359442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    public static final String TAG = "PhotoActionPopup";
369442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
379442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    public static final int MODE_NO_PHOTO = 0;
389442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    public static final int MODE_READ_ONLY_ALLOW_PRIMARY = 1;
399442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    public static final int MODE_PHOTO_DISALLOW_PRIMARY = 2;
409442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    public static final int MODE_PHOTO_ALLOW_PRIMARY = 3;
419442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
429442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    public static ListPopupWindow createPopupMenu(Context context, View anchorView,
439442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            final Listener listener, int mode) {
449442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        // Build choices, depending on the current mode. We assume this Dialog is never called
459442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        // if there are NO choices (e.g. a read-only picture is already super-primary)
469442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        final ArrayList<ChoiceListItem> choices = new ArrayList<ChoiceListItem>(4);
479442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        // Use as Primary
489442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        if (mode == MODE_PHOTO_ALLOW_PRIMARY || mode == MODE_READ_ONLY_ALLOW_PRIMARY) {
499442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            choices.add(new ChoiceListItem(ChoiceListItem.ID_USE_AS_PRIMARY,
509442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    context.getString(R.string.use_photo_as_primary)));
519442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        }
529442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        // Remove
539442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        if (mode == MODE_PHOTO_DISALLOW_PRIMARY || mode == MODE_PHOTO_ALLOW_PRIMARY) {
549442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            choices.add(new ChoiceListItem(ChoiceListItem.ID_REMOVE,
559442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    context.getString(R.string.removePhoto)));
569442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        }
579442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        // Take photo (if there is already a photo, it says "Take new photo")
589442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        if (mode == MODE_NO_PHOTO || mode == MODE_PHOTO_ALLOW_PRIMARY
599442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                || mode == MODE_PHOTO_DISALLOW_PRIMARY) {
609442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            final int resId = mode == MODE_NO_PHOTO ? R.string.take_photo :R.string.take_new_photo;
619442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            choices.add(new ChoiceListItem(ChoiceListItem.ID_TAKE_PHOTO,
629442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    context.getString(resId)));
639442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        }
649442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        // Select from Gallery (or "Select new from Gallery")
659442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        if (mode == MODE_NO_PHOTO || mode == MODE_PHOTO_ALLOW_PRIMARY
669442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                || mode == MODE_PHOTO_DISALLOW_PRIMARY) {
679442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            final int resId = mode == MODE_NO_PHOTO ? R.string.pick_photo :R.string.pick_new_photo;
689442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            choices.add(new ChoiceListItem(ChoiceListItem.ID_PICK_PHOTO,
699442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    context.getString(resId)));
709442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        }
719442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        final ListAdapter adapter = new ArrayAdapter<ChoiceListItem>(context,
72507d85177886bece6ac38870d0e4b6c4655abc55Katherine Kuan                R.layout.select_dialog_item, choices);
739442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
749442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        final ListPopupWindow listPopupWindow = new ListPopupWindow(context);
759442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        final OnItemClickListener clickListener = new OnItemClickListener() {
769442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            @Override
779442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
789442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                final ChoiceListItem choice = choices.get(position);
799442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                listPopupWindow.dismiss();
809442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
819442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                switch (choice.getId()) {
829442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    case ChoiceListItem.ID_USE_AS_PRIMARY:
839442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                        listener.onUseAsPrimaryChosen();
849442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                        break;
859442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    case ChoiceListItem.ID_REMOVE:
862293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan                        listener.onRemovePictureChosen();
879442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                        break;
889442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    case ChoiceListItem.ID_TAKE_PHOTO:
899442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                        listener.onTakePhotoChosen();
909442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                        break;
919442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                    case ChoiceListItem.ID_PICK_PHOTO:
929442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                        listener.onPickFromGalleryChosen();
939442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                        break;
949442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                }
959442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            }
969442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        };
979442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
989442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        listPopupWindow.setAnchorView(anchorView);
999442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        listPopupWindow.setAdapter(adapter);
1009442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        listPopupWindow.setOnItemClickListener(clickListener);
1019442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        listPopupWindow.setWidth(context.getResources().getDimensionPixelSize(
1029442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann                R.dimen.photo_action_popup_width));
1039442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        listPopupWindow.setModal(true);
104832dc0e2d0f91a28166ea51a068ebaf339e09e0dDmitri Plotnikov        listPopupWindow.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
1059442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        return listPopupWindow;
1069442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    }
1079442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
1089442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    private static final class ChoiceListItem {
1099442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        private final int mId;
1109442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        private final String mCaption;
1119442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
1129442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        public static final int ID_USE_AS_PRIMARY = 0;
1139442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        public static final int ID_TAKE_PHOTO = 1;
1149442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        public static final int ID_PICK_PHOTO = 2;
1159442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        public static final int ID_REMOVE = 3;
1169442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
1179442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        public ChoiceListItem(int id, String caption) {
1189442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            mId = id;
1199442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            mCaption = caption;
1209442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        }
1219442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
1229442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        @Override
1239442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        public String toString() {
1249442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            return mCaption;
1259442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        }
1269442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
1279442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        public int getId() {
1289442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann            return mId;
1299442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        }
1309442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    }
1319442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann
1329442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    public interface Listener {
1339442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        void onUseAsPrimaryChosen();
1342293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        void onRemovePictureChosen();
1359442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        void onTakePhotoChosen();
1369442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann        void onPickFromGalleryChosen();
1379442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann    }
1389442ef4d2667eab16f65535b63757a7ffe4ccf69Daniel Lehmann}
139