/* * Copyright (C) 2010 The Android Open Source 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.android.providers.downloads.ui; import android.app.DownloadManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.database.Cursor; import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.format.Formatter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.ImageView; import android.widget.TextView; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; /** * List adapter for Cursors returned by {@link DownloadManager}. */ public class DownloadAdapter extends CursorAdapter { private final DownloadList mDownloadList; private Cursor mCursor; private Resources mResources; private DateFormat mDateFormat; private DateFormat mTimeFormat; private final int mTitleColumnId; private final int mDescriptionColumnId; private final int mStatusColumnId; private final int mReasonColumnId; private final int mTotalBytesColumnId; private final int mMediaTypeColumnId; private final int mDateColumnId; private final int mIdColumnId; private final int mFileNameColumnId; public DownloadAdapter(DownloadList downloadList, Cursor cursor) { super(downloadList, cursor); mDownloadList = downloadList; mCursor = cursor; mResources = mDownloadList.getResources(); mDateFormat = DateFormat.getDateInstance(DateFormat.SHORT); mTimeFormat = DateFormat.getTimeInstance(DateFormat.SHORT); mIdColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_ID); mTitleColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TITLE); mDescriptionColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_DESCRIPTION); mStatusColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS); mReasonColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON); mTotalBytesColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES); mMediaTypeColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_MEDIA_TYPE); mDateColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP); mFileNameColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_FILENAME); } public View newView() { final DownloadItem view = (DownloadItem) LayoutInflater.from(mDownloadList) .inflate(R.layout.download_list_item, null); view.setDownloadListObj(mDownloadList); return view; } public void bindView(View convertView, int position) { if (!(convertView instanceof DownloadItem)) { return; } long downloadId = mCursor.getLong(mIdColumnId); ((DownloadItem) convertView).setData(downloadId, position, mCursor.getString(mFileNameColumnId), mCursor.getString(mMediaTypeColumnId)); // Retrieve the icon for this download retrieveAndSetIcon(convertView); String title = mCursor.getString(mTitleColumnId); if (title.isEmpty()) { title = mResources.getString(R.string.missing_title); } setTextForView(convertView, R.id.download_title, title); setTextForView(convertView, R.id.domain, mCursor.getString(mDescriptionColumnId)); setTextForView(convertView, R.id.size_text, getSizeText()); final int status = mCursor.getInt(mStatusColumnId); final CharSequence statusText; if (status == DownloadManager.STATUS_SUCCESSFUL) { statusText = getDateString(); } else { statusText = mResources.getString(getStatusStringId(status)); } setTextForView(convertView, R.id.status_text, statusText); ((DownloadItem) convertView).getCheckBox() .setChecked(mDownloadList.isDownloadSelected(downloadId)); } private String getDateString() { Date date = new Date(mCursor.getLong(mDateColumnId)); if (date.before(getStartOfToday())) { return mDateFormat.format(date); } else { return mTimeFormat.format(date); } } private Date getStartOfToday() { Calendar today = new GregorianCalendar(); today.set(Calendar.HOUR_OF_DAY, 0); today.set(Calendar.MINUTE, 0); today.set(Calendar.SECOND, 0); today.set(Calendar.MILLISECOND, 0); return today.getTime(); } private String getSizeText() { long totalBytes = mCursor.getLong(mTotalBytesColumnId); String sizeText = ""; if (totalBytes >= 0) { sizeText = Formatter.formatFileSize(mContext, totalBytes); } return sizeText; } private int getStatusStringId(int status) { switch (status) { case DownloadManager.STATUS_FAILED: return R.string.download_error; case DownloadManager.STATUS_SUCCESSFUL: return R.string.download_success; case DownloadManager.STATUS_PENDING: case DownloadManager.STATUS_RUNNING: return R.string.download_running; case DownloadManager.STATUS_PAUSED: final int reason = mCursor.getInt(mReasonColumnId); switch (reason) { case DownloadManager.PAUSED_QUEUED_FOR_WIFI: return R.string.download_queued; default: return R.string.download_running; } } throw new IllegalStateException("Unknown status: " + mCursor.getInt(mStatusColumnId)); } private void retrieveAndSetIcon(View convertView) { String mediaType = mCursor.getString(mMediaTypeColumnId); ImageView iconView = (ImageView) convertView.findViewById(R.id.download_icon); iconView.setVisibility(View.INVISIBLE); if (mediaType == null) { return; } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromParts("file", "", null), mediaType); PackageManager pm = mContext.getPackageManager(); List list = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); if (list.size() == 0) { // no icon found for this mediatype. use "unknown" icon iconView.setImageResource(R.drawable.ic_download_misc_file_type); } else { Drawable icon = list.get(0).activityInfo.loadIcon(pm); iconView.setImageDrawable(icon); } iconView.setVisibility(View.VISIBLE); } private void setTextForView(View parent, int textViewId, CharSequence text) { TextView view = (TextView) parent.findViewById(textViewId); view.setText(text); } // CursorAdapter overrides @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return newView(); } @Override public void bindView(View view, Context context, Cursor cursor) { bindView(view, cursor.getPosition()); } }