add OI File Manager and AndroidSupportV2 used by it
[android_pandora.git] / apps / oi-filemanager / FileManager / src / org / openintents / filemanager / IconifiedTextListAdapter.java
diff --git a/apps/oi-filemanager/FileManager/src/org/openintents/filemanager/IconifiedTextListAdapter.java b/apps/oi-filemanager/FileManager/src/org/openintents/filemanager/IconifiedTextListAdapter.java
new file mode 100644 (file)
index 0000000..4749c6a
--- /dev/null
@@ -0,0 +1,218 @@
+package org.openintents.filemanager;\r
+\r
+/* $Id: BulletedTextListAdapter.java 57 2007-11-21 18:31:52Z steven $ \r
+ * \r
+ * Copyright 2007 Steven Osborn \r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License"); \r
+ * you may not use this file except in compliance with the License. \r
+ * You may obtain a copy of the License at \r
+ * \r
+ *      http://www.apache.org/licenses/LICENSE-2.0 \r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r
+ * See the License for the specific language governing permissions and \r
+ * limitations under the License. \r
+ */ \r
+\r
+import java.io.File;\r
+import java.util.ArrayList; \r
+import java.util.List; \r
+\r
+import org.openintents.filemanager.util.FileUtils;\r
+import org.openintents.filemanager.util.MimeTypes;\r
+\r
+import android.content.Context; \r
+import android.graphics.Bitmap;\r
+import android.graphics.BitmapFactory;\r
+import android.graphics.drawable.Drawable;\r
+import android.view.View; \r
+import android.view.ViewGroup; \r
+import android.widget.BaseAdapter; \r
+import android.widget.Filter;\r
+import android.widget.Filterable;\r
+\r
+/** @author Steven Osborn - http://steven.bitsetters.com */ \r
+public class IconifiedTextListAdapter extends BaseAdapter implements Filterable { \r
+\r
+     /** Remember our context so we can use it when constructing views. */ \r
+     private Context mContext; \r
+     \r
+     private static String lastFilter;\r
+     \r
+     class IconifiedFilter extends Filter {\r
+               @Override\r
+               protected FilterResults performFiltering(CharSequence arg0) {\r
+       \r
+                       lastFilter = (arg0 != null) ? arg0.toString() : null;\r
+                       \r
+                       Filter.FilterResults results = new Filter.FilterResults();\r
+\r
+                       // No results yet?\r
+                       if (mOriginalItems == null) {\r
+                               results.count = 0;\r
+                               results.values = null;\r
+                               return results;\r
+                       }\r
+                       \r
+                       int count = mOriginalItems.size();\r
+\r
+                       if (arg0 == null || arg0.length() == 0) {\r
+                               results.count = count;\r
+                               results.values = mOriginalItems;\r
+                               return results;\r
+                       }\r
+                       \r
+                       \r
+                       List<IconifiedText> filteredItems = new ArrayList<IconifiedText>(count);\r
+                       \r
+                       int outCount = 0;\r
+                       CharSequence lowerCs = arg0.toString().toLowerCase();\r
+                       \r
+                       \r
+                       for (int x=0; x<count; x++) {\r
+                               IconifiedText text = mOriginalItems.get(x);\r
+                               \r
+                               if (text.getText().toLowerCase().contains(lowerCs)) {\r
+                                       // This one matches.\r
+                                       filteredItems.add(text);\r
+                                       outCount++;\r
+                               }\r
+                       }\r
+                       \r
+                       results.count = outCount;\r
+                       results.values = filteredItems;\r
+                       return results;\r
+               }\r
+\r
+               @Override\r
+               protected void publishResults(CharSequence arg0, FilterResults arg1) {\r
+                       mItems = (List<IconifiedText>) arg1.values;\r
+                       notifyDataSetChanged();\r
+               }\r
+       \r
+               List<IconifiedText> synchronousFilter(CharSequence filter) {\r
+                       FilterResults results = performFiltering(filter);\r
+                       return (List<IconifiedText>) (results.values);\r
+               }\r
+     }\r
+     \r
+     private IconifiedFilter mFilter = new IconifiedFilter();\r
+\r
+     private List<IconifiedText> mItems = new ArrayList<IconifiedText>(); \r
+     private List<IconifiedText> mOriginalItems = new ArrayList<IconifiedText>();\r
+     \r
+     private Drawable mIconChecked;\r
+     private Drawable mIconUnchecked;\r
+     \r
+     public ThumbnailLoader mThumbnailLoader;\r
+     \r
+     private File parentFile;\r
+     \r
+     private MimeTypes mMimeTypes;\r
+     \r
+     private boolean scrolling = false;\r
+     \r
+     public IconifiedTextListAdapter(Context context) { \r
+          mContext = context; \r
+          \r
+          mThumbnailLoader = new ThumbnailLoader(context);\r
+          \r
+          // Cache the checked and unchecked icons so we're not decoding them everytime getView is called.\r
+          mIconChecked = context.getResources().getDrawable(R.drawable.ic_button_checked);\r
+          mIconUnchecked = context.getResources().getDrawable(R.drawable.ic_button_unchecked);\r
+     } \r
+\r
+     public void addItem(IconifiedText it) { mItems.add(it); } \r
+\r
+     public void setListItems(List<IconifiedText> lit, boolean filter, File parentFile, MimeTypes mimeTypes) {\r
+        mOriginalItems = lit;\r
+        this.parentFile = parentFile;\r
+        mMimeTypes = mimeTypes;\r
+        \r
+        if (filter) {\r
+                mItems = mFilter.synchronousFilter(lastFilter);\r
+        } else {\r
+                mItems = lit;\r
+        }\r
+     } \r
+\r
+     /** @return The number of items in the */ \r
+     public int getCount() { return mItems.size(); } \r
+\r
+     public Object getItem(int position) { return mItems.get(position); } \r
+\r
+     public boolean areAllItemsSelectable() { return false; } \r
+/*\r
+     public boolean isSelectable(int position) { \r
+          try{ \r
+               return mItems.get(position).isSelectable(); \r
+          }catch (IndexOutOfBoundsException aioobe){ \r
+               return super.isSelectable(position); \r
+          } \r
+     } \r
+     */\r
+\r
+     /** Use the array index as a unique id. */ \r
+     public long getItemId(int position) { \r
+          return position; \r
+     } \r
+     \r
+     public ThumbnailLoader getThumbnailLoader(){\r
+        return mThumbnailLoader;\r
+     }\r
+\r
+     public void toggleScrolling(boolean isScrolling){\r
+        scrolling = isScrolling;\r
+     }\r
+     \r
+     /** @param convertView The old view to overwrite, if one is passed \r
+      * @returns a IconifiedTextView that holds wraps around an IconifiedText */ \r
+     public View getView(int position, View convertView, ViewGroup parent) { \r
+          IconifiedText curItem = mItems.get(position);\r
+          IconifiedTextView btv; \r
+          if (convertView == null) { \r
+               btv = new IconifiedTextView(mContext, curItem); \r
+          } else { // Reuse/Overwrite the View passed \r
+               // We are assuming(!) that it is castable! \r
+               btv = (IconifiedTextView) convertView; \r
+          } \r
+          btv.setText(curItem.getText()); \r
+          btv.setInfo(curItem.getInfo()); \r
+          if(curItem.isCheckIconVisible()){\r
+                 btv.setCheckVisible(true);\r
+                 if(curItem.isSelected()){\r
+                         btv.setCheckDrawable(mIconChecked);\r
+                 } else {\r
+                         btv.setCheckDrawable(mIconUnchecked);\r
+                 }\r
+          } else {\r
+                 btv.setCheckVisible(false);\r
+          }\r
+          \r
+          Object icon = curItem.getIconBitmap();\r
+          if(icon instanceof Bitmap){\r
+                 btv.setIcon((Bitmap) icon);\r
+          } else {\r
+                 btv.setIcon((Drawable) icon);\r
+          }\r
+          \r
+          if(!scrolling && FileUtils.getFile(parentFile, curItem.getText()).isFile() && !"video/mpeg".equals(mMimeTypes.getMimeType(curItem.getText()))){\r
+                 if(mThumbnailLoader != null) {\r
+                         mThumbnailLoader.loadImage(parentFile.getPath(), curItem, btv.getImageView());\r
+                 }\r
+          }\r
+          \r
+          return btv; \r
+     }\r
+\r
+       public Filter getFilter() {\r
+               return mFilter;\r
+       } \r
+       \r
+       public void cancelLoader(){\r
+               mThumbnailLoader.cancel();\r
+       }\r
+}
\ No newline at end of file