1 /* 2 * Copyright (C) 2013 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 17 package com.android.photos; 18 19 import android.app.Activity; 20 import android.content.Intent; 21 import android.net.Uri; 22 import android.nfc.NfcAdapter; 23 import android.nfc.NfcAdapter.CreateBeamUrisCallback; 24 import android.nfc.NfcEvent; 25 import android.provider.MediaStore.Files.FileColumns; 26 import android.widget.ShareActionProvider; 27 28 import com.android.gallery3d.common.ApiHelper; 29 import com.android.gallery3d.data.MediaObject; 30 import com.android.gallery3d.util.GalleryUtils; 31 32 import java.util.ArrayList; 33 34 public class SelectionManager { 35 private Activity mActivity; 36 private NfcAdapter mNfcAdapter; 37 private SelectedUriSource mUriSource; 38 private Intent mShareIntent = new Intent(); 39 40 public interface SelectedUriSource { getSelectedShareableUris()41 public ArrayList<Uri> getSelectedShareableUris(); 42 } 43 SelectionManager(Activity activity)44 public SelectionManager(Activity activity) { 45 mActivity = activity; 46 if (ApiHelper.AT_LEAST_16) { 47 mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity); 48 mNfcAdapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() { 49 @Override 50 public Uri[] createBeamUris(NfcEvent arg0) { 51 // This will have been preceded by a call to onItemSelectedStateChange 52 if (mCachedShareableUris == null) return null; 53 return mCachedShareableUris.toArray( 54 new Uri[mCachedShareableUris.size()]); 55 } 56 }, mActivity); 57 } 58 } 59 setSelectedUriSource(SelectedUriSource source)60 public void setSelectedUriSource(SelectedUriSource source) { 61 mUriSource = source; 62 } 63 64 private int mSelectedTotalCount = 0; 65 private int mSelectedShareableCount = 0; 66 private int mSelectedShareableImageCount = 0; 67 private int mSelectedShareableVideoCount = 0; 68 private int mSelectedDeletableCount = 0; 69 private int mSelectedEditableCount = 0; 70 private int mSelectedCroppableCount = 0; 71 private int mSelectedSetableCount = 0; 72 private int mSelectedTrimmableCount = 0; 73 private int mSelectedMuteableCount = 0; 74 75 private ArrayList<Uri> mCachedShareableUris = null; 76 onItemSelectedStateChanged(ShareActionProvider share, int itemType, int itemSupportedOperations, boolean selected)77 public void onItemSelectedStateChanged(ShareActionProvider share, 78 int itemType, int itemSupportedOperations, boolean selected) { 79 int increment = selected ? 1 : -1; 80 81 mSelectedTotalCount += increment; 82 mCachedShareableUris = null; 83 84 if ((itemSupportedOperations & MediaObject.SUPPORT_DELETE) > 0) { 85 mSelectedDeletableCount += increment; 86 } 87 if ((itemSupportedOperations & MediaObject.SUPPORT_EDIT) > 0) { 88 mSelectedEditableCount += increment; 89 } 90 if ((itemSupportedOperations & MediaObject.SUPPORT_CROP) > 0) { 91 mSelectedCroppableCount += increment; 92 } 93 if ((itemSupportedOperations & MediaObject.SUPPORT_SETAS) > 0) { 94 mSelectedSetableCount += increment; 95 } 96 if ((itemSupportedOperations & MediaObject.SUPPORT_TRIM) > 0) { 97 mSelectedTrimmableCount += increment; 98 } 99 if ((itemSupportedOperations & MediaObject.SUPPORT_MUTE) > 0) { 100 mSelectedMuteableCount += increment; 101 } 102 if ((itemSupportedOperations & MediaObject.SUPPORT_SHARE) > 0) { 103 mSelectedShareableCount += increment; 104 if (itemType == FileColumns.MEDIA_TYPE_IMAGE) { 105 mSelectedShareableImageCount += increment; 106 } else if (itemType == FileColumns.MEDIA_TYPE_VIDEO) { 107 mSelectedShareableVideoCount += increment; 108 } 109 } 110 111 mShareIntent.removeExtra(Intent.EXTRA_STREAM); 112 if (mSelectedShareableCount == 0) { 113 mShareIntent.setAction(null).setType(null); 114 } else if (mSelectedShareableCount >= 1) { 115 mCachedShareableUris = mUriSource.getSelectedShareableUris(); 116 if (mCachedShareableUris.size() == 0) { 117 mShareIntent.setAction(null).setType(null); 118 } else { 119 if (mSelectedShareableImageCount == mSelectedShareableCount) { 120 mShareIntent.setType(GalleryUtils.MIME_TYPE_IMAGE); 121 } else if (mSelectedShareableVideoCount == mSelectedShareableCount) { 122 mShareIntent.setType(GalleryUtils.MIME_TYPE_VIDEO); 123 } else { 124 mShareIntent.setType(GalleryUtils.MIME_TYPE_ALL); 125 } 126 if (mCachedShareableUris.size() == 1) { 127 mShareIntent.setAction(Intent.ACTION_SEND); 128 mShareIntent.putExtra(Intent.EXTRA_STREAM, mCachedShareableUris.get(0)); 129 } else { 130 mShareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); 131 mShareIntent.putExtra(Intent.EXTRA_STREAM, mCachedShareableUris); 132 } 133 } 134 } 135 share.setShareIntent(mShareIntent); 136 } 137 getSupportedOperations()138 public int getSupportedOperations() { 139 if (mSelectedTotalCount == 0) { 140 return 0; 141 } 142 int supported = 0; 143 if (mSelectedTotalCount == 1) { 144 if (mSelectedCroppableCount == 1) { 145 supported |= MediaObject.SUPPORT_CROP; 146 } 147 if (mSelectedEditableCount == 1) { 148 supported |= MediaObject.SUPPORT_EDIT; 149 } 150 if (mSelectedSetableCount == 1) { 151 supported |= MediaObject.SUPPORT_SETAS; 152 } 153 if (mSelectedTrimmableCount == 1) { 154 supported |= MediaObject.SUPPORT_TRIM; 155 } 156 if (mSelectedMuteableCount == 1) { 157 supported |= MediaObject.SUPPORT_MUTE; 158 } 159 } 160 if (mSelectedDeletableCount == mSelectedTotalCount) { 161 supported |= MediaObject.SUPPORT_DELETE; 162 } 163 if (mSelectedShareableCount > 0) { 164 supported |= MediaObject.SUPPORT_SHARE; 165 } 166 return supported; 167 } 168 onClearSelection()169 public void onClearSelection() { 170 mSelectedTotalCount = 0; 171 mSelectedShareableCount = 0; 172 mSelectedShareableImageCount = 0; 173 mSelectedShareableVideoCount = 0; 174 mSelectedDeletableCount = 0; 175 mSelectedEditableCount = 0; 176 mSelectedCroppableCount = 0; 177 mSelectedSetableCount = 0; 178 mSelectedTrimmableCount = 0; 179 mSelectedMuteableCount = 0; 180 mCachedShareableUris = null; 181 mShareIntent.removeExtra(Intent.EXTRA_STREAM); 182 mShareIntent.setAction(null).setType(null); 183 } 184 } 185