/* * Copyright (C) 2009 The Rockchip Android MID Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.DeviceTest.helper; import java.util.Formatter; import java.util.List; import java.util.Locale; import android.content.AsyncQueryHandler; import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; import android.database.CharArrayBuffer; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.provider.MediaStore; import android.media.MediaMetadataRetriever; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AlphabetIndexer; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SectionIndexer; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import com.DeviceTest.R; import com.DeviceTest.RockVideoPlayer; class VideoItem { Drawable bitmap; Uri uri; int Totaltime; int Lasttime; int Currenttime; String videoname; String mimetype; String size; String videopath; } /* class Item implements Comparable{ private static final String TAG = "Item"; //private static final boolean DEBUG = true; private static final boolean DEBUG = false; public void LOG(String msg) { if(DEBUG) { Log.d(TAG,msg); } } public int compareTo(Item another) { // TODO Auto-generated method stub return 0; } } */ public class VideoListAdapter extends SimpleCursorAdapter implements SectionIndexer { int resource; //private final LayoutInflater mInflater; private static final String TAG = "VideoListAdapter"; private static final boolean DEBUG = true; //private static final boolean DEBUG = false; private RockVideoPlayer mActivity = null; /** @see AlphabetIndexer. */ private AlphabetIndexer mIndexer; /** ����Э��ʵ�ֶ� ContentResolver �첽�� query ������ helper ���ʵ��. */ private AsyncQueryHandler mQueryHandler; int nameIdx; Uri uriIdx; int idIdx; int mimetypeIdx; int bookmarkIdx; int durationIdx; int sizeIdx; int pahtIdx; private String mConstraint = null; private boolean mConstraintIsValid = false; public void LOG(String msg) { if(DEBUG) { Log.d(TAG,msg); } } public VideoListAdapter(Context context, RockVideoPlayer currentactivity, int layout, Cursor cursor, String[] from, int[] to) { super(context, layout, cursor, from, to); mActivity = currentactivity; getColumnIndices(cursor); mQueryHandler = new QueryHandler(context.getContentResolver()); /* ����ת��. */ LOG("Built mQueryHandler = " + mQueryHandler); } public void setActivity(RockVideoPlayer newactivity) { mActivity = newactivity; } class ViewHolder { // ��u21069 list item view �� ��u26469 ��u31034 ��u24212 data item(��u-28212 ��iju20010 ��u23450 ��u27468 ��u30340 ��u24687 ) ��column "TITLE" ��value ��TextView ��u24341 �� ImageView video_icon; TextView video_name; TextView video_time; TextView video_type; TextView video_size; TextView video_path; CharArrayBuffer buffer1; // ��u26469 ��u23384 "ARTIST" ��u20018 . char [] buffer2; } /** * ���Ƶ� AsyncQueryHandler ����. * @see AsyncQueryHandler. * */ class QueryHandler extends AsyncQueryHandler { /** Ctor. */ QueryHandler(ContentResolver res) { super(res); } @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { //LOG("@@@ query complete: " + cursor.getCount() + " "); /* ��ʼ�� ��ǰ activity. */ mActivity.initVideoCursor(cursor); } } public AsyncQueryHandler getQueryHandler() { return mQueryHandler; } /** * ��ȡָͬ�� Cursor ʵ����ص� �ض��� column �� index, �������� "this"(��ǰ����ʵ��) ��. * �������� �����и�. */ private void getColumnIndices(Cursor cur) { LOG("Enter getColumnIndices() and cur = " + cur); Uri uri = MediaStore.Video.Media.getContentUri("external"); if (cur!= null) { cur.moveToFirst(); nameIdx = cur.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME); LOG("nameIdx= " + nameIdx); uriIdx = ContentUris.withAppendedId(uri,cur.getColumnIndexOrThrow(MediaStore.Video.Media._ID)); LOG("uriIdx= " + uriIdx); idIdx = cur.getColumnIndexOrThrow(MediaStore.Video.Media._ID); mimetypeIdx = cur.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE); LOG("mimetypeIdx= " + mimetypeIdx); bookmarkIdx = cur.getColumnIndexOrThrow(MediaStore.Video.Media.BOOKMARK); LOG("bookmarkIdx= " + bookmarkIdx); durationIdx = cur.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION); LOG("durationIdx= " + durationIdx); sizeIdx = cur.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE); LOG("sizeIdx= " + sizeIdx); pahtIdx = cur.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); LOG("pahtIdx= " + pahtIdx); } } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { View v = super.newView(context, cursor, parent); ViewHolder vh = new ViewHolder(); vh.video_icon = (ImageView)v.findViewById(R.id.video_image); vh.video_name = (TextView)v.findViewById(R.id.video_name); vh.video_time = (TextView)v.findViewById(R.id.time_info); vh.video_type = (TextView)v.findViewById(R.id.type_info); vh.video_size = (TextView)v.findViewById(R.id.size_info); //vh.video_path = (TextView)v.findViewById(R.id.path_info); vh.buffer1 = new CharArrayBuffer(100); vh.buffer2 = new char[200]; v.setTag(vh); return v; } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder vh = (ViewHolder) view.getTag(); /* ����ض��� list item view, �������� newView() ֮�󱻵���. ����� ����ת�͵���ȷ��, "����" �ɳ���Ա��֤. */ cursor.copyStringToBuffer(nameIdx, vh.buffer1); vh.video_name.setText(vh.buffer1.data, 0, vh.buffer1.sizeCopied); mFormatBuilder = new StringBuilder(); mFormatter = new Formatter(mFormatBuilder, Locale.getDefault()); vh.video_time.setText(makeTimeString(cursor.getInt(bookmarkIdx),cursor.getInt(durationIdx))); vh.video_type.setText(cursor.getString(mimetypeIdx)); vh.video_size.setText(makeSizeString(cursor.getInt(sizeIdx))); //vh.video_path.setText(cursor.getString(pahtIdx)); ImageView iv = vh.video_icon; iv.setImageResource(R.drawable.video_icon); //iv.setImageBitmap(getVideoCover(cursor.getString(pahtIdx))); } @Override public void changeCursor(Cursor cursor) { //LOG("Enter changeCursor() get "+ cursor.getCount() + "and cursor = " + cursor); if(cursor != null) cursor.moveToFirst(); if (cursor != mActivity.mVideoCursor) { super.changeCursor(cursor); mActivity.mVideoCursor = cursor; getColumnIndices(cursor); /* ��Ϊ "cursor" ʵ��仯, �������е� column ID Ҳ���ܱ仯. �ʸ���֮. */ } } @Override public Cursor runQueryOnBackgroundThread(CharSequence constraint) { String s = constraint.toString(); if (mConstraintIsValid && ( (s == null && mConstraint == null) || (s != null && s.equals(mConstraint)))) { return getCursor(); } Cursor c = mActivity.getVideoCursor(null); mConstraint = s; mConstraintIsValid = true; return c; } StringBuilder mFormatBuilder; Formatter mFormatter; public String stringForTime(int timeMs) { int totalSeconds = timeMs / 1000; int seconds = totalSeconds % 60; int minutes = (totalSeconds / 60) % 60; int hours = totalSeconds / 3600; mFormatBuilder.setLength(0); if(hours > 0) return mFormatter.format("%02d:%02d:%02d", hours, minutes, seconds).toString(); else return mFormatter.format("%02d:%02d", minutes, seconds).toString(); } public String makeTimeString(int time1,int time2) { StringBuilder time = new StringBuilder(); time.append(stringForTime(time1)+'/'+stringForTime(time2)); return time.toString(); } public String makeSizeString(int size){ StringBuilder sizeBuilder = new StringBuilder(); if (size <= 0){ sizeBuilder.append("0 K"); return sizeBuilder.toString(); } int sizeK = size/1000; int sizeM = sizeK/1000; if(0 < sizeK && sizeK < 1024){ sizeBuilder.append(sizeK); sizeBuilder.append(" K"); return sizeBuilder.toString(); }else{ sizeBuilder.append(sizeM); sizeBuilder.append(" M"); return sizeBuilder.toString(); } } public int getSectionForPosition(int position) { return 0; } public int getPositionForSection(int section) { int pos = mIndexer.getPositionForSection(section); return pos; } public Object[] getSections() { if (mIndexer != null) { return mIndexer.getSections(); } else { return null; } } }