1 package org.openintents.filemanager;
\r
3 /* $Id: BulletedTextListAdapter.java 57 2007-11-21 18:31:52Z steven $
\r
5 * Copyright 2007 Steven Osborn
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
20 import java.io.File;
\r
21 import java.util.ArrayList;
\r
22 import java.util.List;
\r
24 import org.openintents.filemanager.util.FileUtils;
\r
25 import org.openintents.filemanager.util.MimeTypes;
\r
27 import android.content.Context;
\r
28 import android.graphics.Bitmap;
\r
29 import android.graphics.BitmapFactory;
\r
30 import android.graphics.drawable.Drawable;
\r
31 import android.view.View;
\r
32 import android.view.ViewGroup;
\r
33 import android.widget.BaseAdapter;
\r
34 import android.widget.Filter;
\r
35 import android.widget.Filterable;
\r
37 /** @author Steven Osborn - http://steven.bitsetters.com */
\r
38 public class IconifiedTextListAdapter extends BaseAdapter implements Filterable {
\r
40 /** Remember our context so we can use it when constructing views. */
\r
41 private Context mContext;
\r
43 private static String lastFilter;
\r
45 class IconifiedFilter extends Filter {
\r
47 protected FilterResults performFiltering(CharSequence arg0) {
\r
49 lastFilter = (arg0 != null) ? arg0.toString() : null;
\r
51 Filter.FilterResults results = new Filter.FilterResults();
\r
54 if (mOriginalItems == null) {
\r
56 results.values = null;
\r
60 int count = mOriginalItems.size();
\r
62 if (arg0 == null || arg0.length() == 0) {
\r
63 results.count = count;
\r
64 results.values = mOriginalItems;
\r
69 List<IconifiedText> filteredItems = new ArrayList<IconifiedText>(count);
\r
72 CharSequence lowerCs = arg0.toString().toLowerCase();
\r
75 for (int x=0; x<count; x++) {
\r
76 IconifiedText text = mOriginalItems.get(x);
\r
78 if (text.getText().toLowerCase().contains(lowerCs)) {
\r
79 // This one matches.
\r
80 filteredItems.add(text);
\r
85 results.count = outCount;
\r
86 results.values = filteredItems;
\r
91 protected void publishResults(CharSequence arg0, FilterResults arg1) {
\r
92 mItems = (List<IconifiedText>) arg1.values;
\r
93 notifyDataSetChanged();
\r
96 List<IconifiedText> synchronousFilter(CharSequence filter) {
\r
97 FilterResults results = performFiltering(filter);
\r
98 return (List<IconifiedText>) (results.values);
\r
102 private IconifiedFilter mFilter = new IconifiedFilter();
\r
104 private List<IconifiedText> mItems = new ArrayList<IconifiedText>();
\r
105 private List<IconifiedText> mOriginalItems = new ArrayList<IconifiedText>();
\r
107 private Drawable mIconChecked;
\r
108 private Drawable mIconUnchecked;
\r
110 public ThumbnailLoader mThumbnailLoader;
\r
112 private File parentFile;
\r
114 private MimeTypes mMimeTypes;
\r
116 private boolean scrolling = false;
\r
118 public IconifiedTextListAdapter(Context context) {
\r
119 mContext = context;
\r
121 mThumbnailLoader = new ThumbnailLoader(context);
\r
123 // Cache the checked and unchecked icons so we're not decoding them everytime getView is called.
\r
124 mIconChecked = context.getResources().getDrawable(R.drawable.ic_button_checked);
\r
125 mIconUnchecked = context.getResources().getDrawable(R.drawable.ic_button_unchecked);
\r
128 public void addItem(IconifiedText it) { mItems.add(it); }
\r
130 public void setListItems(List<IconifiedText> lit, boolean filter, File parentFile, MimeTypes mimeTypes) {
\r
131 mOriginalItems = lit;
\r
132 this.parentFile = parentFile;
\r
133 mMimeTypes = mimeTypes;
\r
136 mItems = mFilter.synchronousFilter(lastFilter);
\r
142 /** @return The number of items in the */
\r
143 public int getCount() { return mItems.size(); }
\r
145 public Object getItem(int position) { return mItems.get(position); }
\r
147 public boolean areAllItemsSelectable() { return false; }
\r
149 public boolean isSelectable(int position) {
\r
151 return mItems.get(position).isSelectable();
\r
152 }catch (IndexOutOfBoundsException aioobe){
\r
153 return super.isSelectable(position);
\r
158 /** Use the array index as a unique id. */
\r
159 public long getItemId(int position) {
\r
163 public ThumbnailLoader getThumbnailLoader(){
\r
164 return mThumbnailLoader;
\r
167 public void toggleScrolling(boolean isScrolling){
\r
168 scrolling = isScrolling;
\r
171 /** @param convertView The old view to overwrite, if one is passed
\r
172 * @returns a IconifiedTextView that holds wraps around an IconifiedText */
\r
173 public View getView(int position, View convertView, ViewGroup parent) {
\r
174 IconifiedText curItem = mItems.get(position);
\r
175 IconifiedTextView btv;
\r
176 if (convertView == null) {
\r
177 btv = new IconifiedTextView(mContext, curItem);
\r
178 } else { // Reuse/Overwrite the View passed
\r
179 // We are assuming(!) that it is castable!
\r
180 btv = (IconifiedTextView) convertView;
\r
182 btv.setText(curItem.getText());
\r
183 btv.setInfo(curItem.getInfo());
\r
184 if(curItem.isCheckIconVisible()){
\r
185 btv.setCheckVisible(true);
\r
186 if(curItem.isSelected()){
\r
187 btv.setCheckDrawable(mIconChecked);
\r
189 btv.setCheckDrawable(mIconUnchecked);
\r
192 btv.setCheckVisible(false);
\r
195 Object icon = curItem.getIconBitmap();
\r
196 if(icon instanceof Bitmap){
\r
197 btv.setIcon((Bitmap) icon);
\r
199 btv.setIcon((Drawable) icon);
\r
202 if(!scrolling && FileUtils.getFile(parentFile, curItem.getText()).isFile() && !"video/mpeg".equals(mMimeTypes.getMimeType(curItem.getText()))){
\r
203 if(mThumbnailLoader != null) {
\r
204 mThumbnailLoader.loadImage(parentFile.getPath(), curItem, btv.getImageView());
\r
211 public Filter getFilter() {
\r
215 public void cancelLoader(){
\r
216 mThumbnailLoader.cancel();
\r