PhotoActionPopup.java revision 2d4632c2eb7d2dc3bb94bf64c14c471aafa67b0f
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.contacts.editor;
18
19import com.android.contacts.R;
20
21import android.content.Context;
22import android.view.View;
23import android.widget.AdapterView;
24import android.widget.AdapterView.OnItemClickListener;
25import android.widget.ArrayAdapter;
26import android.widget.ListAdapter;
27import android.widget.ListPopupWindow;
28
29import java.util.ArrayList;
30
31/**
32 * Shows a popup asking the user what to do for a photo. The result is passed back to the Listener
33 */
34public class PhotoActionPopup {
35    public static final String TAG = "PhotoActionPopup";
36
37    /**
38     * Bitmask flags to specify which actions should be presented to the user.
39     */
40    public static final class Flags {
41        /** If set, show choice to use as primary photo. */
42        public static final int ALLOW_PRIMARY = 1;
43        /** If set, show choice to remove photo. */
44        public static final int REMOVE_PHOTO = 2;
45        /** If set, show choices to take a picture with the camera, or pick one from the gallery. */
46        public static final int TAKE_OR_PICK_PHOTO = 4;
47        /**
48         *  If set, modifies the wording in the choices for TAKE_OR_PICK_PHOTO
49         *  to emphasize that the existing photo will be replaced.
50         */
51        public static final int TAKE_OR_PICK_PHOTO_REPLACE_WORDING = 8;
52    }
53
54    /**
55     * Convenient combinations of commonly-used flags (see {@link Flags}).
56     */
57    public static final class Modes {
58        public static final int NO_PHOTO =
59                Flags.TAKE_OR_PICK_PHOTO;
60        public static final int READ_ONLY_ALLOW_PRIMARY =
61                Flags.ALLOW_PRIMARY;
62        public static final int PHOTO_DISALLOW_PRIMARY =
63                Flags.REMOVE_PHOTO |
64                Flags.TAKE_OR_PICK_PHOTO |
65                Flags.TAKE_OR_PICK_PHOTO_REPLACE_WORDING;
66        public static final int PHOTO_ALLOW_PRIMARY =
67                Flags.ALLOW_PRIMARY |
68                Flags.REMOVE_PHOTO |
69                Flags.TAKE_OR_PICK_PHOTO |
70                Flags.TAKE_OR_PICK_PHOTO_REPLACE_WORDING;
71    }
72
73    public static ListPopupWindow createPopupMenu(Context context, View anchorView,
74            final Listener listener, int mode) {
75        // Build choices, depending on the current mode. We assume this Dialog is never called
76        // if there are NO choices (e.g. a read-only picture is already super-primary)
77        final ArrayList<ChoiceListItem> choices = new ArrayList<ChoiceListItem>(4);
78        // Use as Primary
79        if ((mode & Flags.ALLOW_PRIMARY) > 0) {
80            choices.add(new ChoiceListItem(ChoiceListItem.ID_USE_AS_PRIMARY,
81                    context.getString(R.string.use_photo_as_primary)));
82        }
83        // Remove
84        if ((mode & Flags.REMOVE_PHOTO) > 0) {
85            choices.add(new ChoiceListItem(ChoiceListItem.ID_REMOVE,
86                    context.getString(R.string.removePhoto)));
87        }
88        // Take photo or pick one from the gallery.  Wording differs if there is already a photo.
89        if ((mode & Flags.TAKE_OR_PICK_PHOTO) > 0) {
90            boolean replace = (mode & Flags.TAKE_OR_PICK_PHOTO_REPLACE_WORDING) > 0;
91            final int takePhotoResId = replace ? R.string.take_new_photo : R.string.take_photo;
92            final String takePhotoString = context.getString(takePhotoResId);
93            final int pickPhotoResId = replace ? R.string.pick_new_photo : R.string.pick_photo;
94            final String pickPhotoString = context.getString(pickPhotoResId);
95            choices.add(new ChoiceListItem(ChoiceListItem.ID_TAKE_PHOTO, takePhotoString));
96            choices.add(new ChoiceListItem(ChoiceListItem.ID_PICK_PHOTO, pickPhotoString));
97        }
98
99        final ListAdapter adapter = new ArrayAdapter<ChoiceListItem>(context,
100                R.layout.select_dialog_item, choices);
101
102        final ListPopupWindow listPopupWindow = new ListPopupWindow(context);
103        final OnItemClickListener clickListener = new OnItemClickListener() {
104            @Override
105            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
106                final ChoiceListItem choice = choices.get(position);
107                switch (choice.getId()) {
108                    case ChoiceListItem.ID_USE_AS_PRIMARY:
109                        listener.onUseAsPrimaryChosen();
110                        break;
111                    case ChoiceListItem.ID_REMOVE:
112                        listener.onRemovePictureChosen();
113                        break;
114                    case ChoiceListItem.ID_TAKE_PHOTO:
115                        listener.onTakePhotoChosen();
116                        break;
117                    case ChoiceListItem.ID_PICK_PHOTO:
118                        listener.onPickFromGalleryChosen();
119                        break;
120                }
121
122                listPopupWindow.dismiss();
123            }
124        };
125
126        listPopupWindow.setAnchorView(anchorView);
127        listPopupWindow.setAdapter(adapter);
128        listPopupWindow.setOnItemClickListener(clickListener);
129        listPopupWindow.setModal(true);
130        listPopupWindow.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
131        final int minWidth = context.getResources().getDimensionPixelSize(
132                R.dimen.photo_action_popup_min_width);
133        if (anchorView.getWidth() < minWidth) {
134            listPopupWindow.setWidth(minWidth);
135        }
136        return listPopupWindow;
137    }
138
139    private static final class ChoiceListItem {
140        private final int mId;
141        private final String mCaption;
142
143        public static final int ID_USE_AS_PRIMARY = 0;
144        public static final int ID_TAKE_PHOTO = 1;
145        public static final int ID_PICK_PHOTO = 2;
146        public static final int ID_REMOVE = 3;
147
148        public ChoiceListItem(int id, String caption) {
149            mId = id;
150            mCaption = caption;
151        }
152
153        @Override
154        public String toString() {
155            return mCaption;
156        }
157
158        public int getId() {
159            return mId;
160        }
161    }
162
163    public interface Listener {
164        void onUseAsPrimaryChosen();
165        void onRemovePictureChosen();
166        void onTakePhotoChosen();
167        void onPickFromGalleryChosen();
168    }
169}
170