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