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.gallery3d.ingest.adapter; 18 19 import android.app.Activity; 20 import android.content.Context; 21 import android.mtp.MtpObjectInfo; 22 import android.view.LayoutInflater; 23 import android.view.View; 24 import android.view.ViewGroup; 25 import android.widget.BaseAdapter; 26 import android.widget.SectionIndexer; 27 28 import com.android.gallery3d.R; 29 import com.android.gallery3d.ingest.MtpDeviceIndex; 30 import com.android.gallery3d.ingest.MtpDeviceIndex.SortOrder; 31 import com.android.gallery3d.ingest.SimpleDate; 32 import com.android.gallery3d.ingest.ui.DateTileView; 33 import com.android.gallery3d.ingest.ui.MtpThumbnailTileView; 34 35 public class MtpAdapter extends BaseAdapter implements SectionIndexer { 36 public static final int ITEM_TYPE_MEDIA = 0; 37 public static final int ITEM_TYPE_BUCKET = 1; 38 39 private Context mContext; 40 private MtpDeviceIndex mModel; 41 private SortOrder mSortOrder = SortOrder.Descending; 42 private LayoutInflater mInflater; 43 private int mGeneration = 0; 44 MtpAdapter(Activity context)45 public MtpAdapter(Activity context) { 46 super(); 47 mContext = context; 48 mInflater = LayoutInflater.from(context); 49 } 50 setMtpDeviceIndex(MtpDeviceIndex index)51 public void setMtpDeviceIndex(MtpDeviceIndex index) { 52 mModel = index; 53 notifyDataSetChanged(); 54 } 55 getMtpDeviceIndex()56 public MtpDeviceIndex getMtpDeviceIndex() { 57 return mModel; 58 } 59 60 @Override notifyDataSetChanged()61 public void notifyDataSetChanged() { 62 mGeneration++; 63 super.notifyDataSetChanged(); 64 } 65 66 @Override notifyDataSetInvalidated()67 public void notifyDataSetInvalidated() { 68 mGeneration++; 69 super.notifyDataSetInvalidated(); 70 } 71 deviceConnected()72 public boolean deviceConnected() { 73 return (mModel != null) && (mModel.getDevice() != null); 74 } 75 indexReady()76 public boolean indexReady() { 77 return (mModel != null) && mModel.indexReady(); 78 } 79 80 @Override getCount()81 public int getCount() { 82 return mModel != null ? mModel.size() : 0; 83 } 84 85 @Override getItem(int position)86 public Object getItem(int position) { 87 return mModel.get(position, mSortOrder); 88 } 89 90 @Override areAllItemsEnabled()91 public boolean areAllItemsEnabled() { 92 return true; 93 } 94 95 @Override isEnabled(int position)96 public boolean isEnabled(int position) { 97 return true; 98 } 99 100 @Override getItemId(int position)101 public long getItemId(int position) { 102 return position; 103 } 104 105 @Override getViewTypeCount()106 public int getViewTypeCount() { 107 return 2; 108 } 109 110 @Override getItemViewType(int position)111 public int getItemViewType(int position) { 112 // If the position is the first in its section, then it corresponds to 113 // a title tile, if not it's a media tile 114 if (position == getPositionForSection(getSectionForPosition(position))) { 115 return ITEM_TYPE_BUCKET; 116 } else { 117 return ITEM_TYPE_MEDIA; 118 } 119 } 120 itemAtPositionIsBucket(int position)121 public boolean itemAtPositionIsBucket(int position) { 122 return getItemViewType(position) == ITEM_TYPE_BUCKET; 123 } 124 itemAtPositionIsMedia(int position)125 public boolean itemAtPositionIsMedia(int position) { 126 return getItemViewType(position) == ITEM_TYPE_MEDIA; 127 } 128 129 @Override getView(int position, View convertView, ViewGroup parent)130 public View getView(int position, View convertView, ViewGroup parent) { 131 int type = getItemViewType(position); 132 if (type == ITEM_TYPE_MEDIA) { 133 MtpThumbnailTileView imageView; 134 if (convertView == null) { 135 imageView = (MtpThumbnailTileView) mInflater.inflate( 136 R.layout.ingest_thumbnail, parent, false); 137 } else { 138 imageView = (MtpThumbnailTileView) convertView; 139 } 140 imageView.setMtpDeviceAndObjectInfo(mModel.getDevice(), (MtpObjectInfo)getItem(position), mGeneration); 141 return imageView; 142 } else { 143 DateTileView dateTile; 144 if (convertView == null) { 145 dateTile = (DateTileView) mInflater.inflate( 146 R.layout.ingest_date_tile, parent, false); 147 } else { 148 dateTile = (DateTileView) convertView; 149 } 150 dateTile.setDate((SimpleDate)getItem(position)); 151 return dateTile; 152 } 153 } 154 155 @Override getPositionForSection(int section)156 public int getPositionForSection(int section) { 157 if (getCount() == 0) { 158 return 0; 159 } 160 int numSections = getSections().length; 161 if (section >= numSections) { 162 section = numSections - 1; 163 } 164 return mModel.getFirstPositionForBucketNumber(section, mSortOrder); 165 } 166 167 @Override getSectionForPosition(int position)168 public int getSectionForPosition(int position) { 169 int count = getCount(); 170 if (count == 0) { 171 return 0; 172 } 173 if (position >= count) { 174 position = count - 1; 175 } 176 return mModel.getBucketNumberForPosition(position, mSortOrder); 177 } 178 179 @Override getSections()180 public Object[] getSections() { 181 return getCount() > 0 ? mModel.getBuckets(mSortOrder) : null; 182 } 183 getSortOrder()184 public SortOrder getSortOrder() { 185 return mSortOrder; 186 } 187 translatePositionWithoutLabels(int position)188 public int translatePositionWithoutLabels(int position) { 189 if (mModel == null) return -1; 190 return mModel.getPositionFromPositionWithoutLabels(position, mSortOrder); 191 } 192 } 193