diff options
Diffstat (limited to 'ui/src/com/android/providers/downloads/ui/DownloadAdapter.java')
-rw-r--r-- | ui/src/com/android/providers/downloads/ui/DownloadAdapter.java | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/ui/src/com/android/providers/downloads/ui/DownloadAdapter.java b/ui/src/com/android/providers/downloads/ui/DownloadAdapter.java new file mode 100644 index 00000000..a79122a4 --- /dev/null +++ b/ui/src/com/android/providers/downloads/ui/DownloadAdapter.java @@ -0,0 +1,185 @@ +/* + * 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.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.drm.mobile1.DrmRawContent; +import android.graphics.drawable.Drawable; +import android.net.DownloadManager; +import android.net.Uri; +import android.text.format.Formatter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CursorAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.providers.downloads.ui.DownloadItem.DownloadSelectListener; + +import java.text.DateFormat; +import java.util.Date; +import java.util.List; + +/** + * List adapter for Cursors returned by {@link DownloadManager}. + */ +public class DownloadAdapter extends CursorAdapter { + private Context mContext; + private Cursor mCursor; + private DownloadSelectListener mDownloadSelectionListener; + private Resources mResources; + private DateFormat mDateFormat; + + private int mTitleColumnId; + private int mDescriptionColumnId; + private int mStatusColumnId; + private int mTotalBytesColumnId; + private int mMediaTypeColumnId; + private int mDateColumnId; + private int mIdColumnId; + + public DownloadAdapter(Context context, Cursor cursor, + DownloadSelectListener selectionListener) { + super(context, cursor); + mContext = context; + mCursor = cursor; + mResources = mContext.getResources(); + mDownloadSelectionListener = selectionListener; + mDateFormat = DateFormat.getDateInstance(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); + mTotalBytesColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES); + mMediaTypeColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_MEDIA_TYPE); + mDateColumnId = + cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP); + } + + public View newView() { + DownloadItem view = (DownloadItem) LayoutInflater.from(mContext) + .inflate(R.layout.download_list_item, null); + view.setSelectListener(mDownloadSelectionListener); + return view; + } + + public void bindView(View convertView) { + if (!(convertView instanceof DownloadItem)) { + return; + } + + long downloadId = mCursor.getLong(mIdColumnId); + ((DownloadItem) convertView).setDownloadId(downloadId); + + // Retrieve the icon for this download + retrieveAndSetIcon(convertView); + + // TODO: default text for null title? + setTextForView(convertView, R.id.download_title, mCursor.getString(mTitleColumnId)); + setTextForView(convertView, R.id.domain, mCursor.getString(mDescriptionColumnId)); + setTextForView(convertView, R.id.size_text, getSizeText()); + setTextForView(convertView, R.id.status_text, mResources.getString(getStatusStringId())); + setTextForView(convertView, R.id.last_modified_date, getDateString()); + + CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.download_checkbox); + checkBox.setChecked(mDownloadSelectionListener.isDownloadSelected(downloadId)); + } + + private String getDateString() { + Date date = new Date(mCursor.getLong(mDateColumnId)); + return mDateFormat.format(date); + } + + private String getSizeText() { + long totalBytes = mCursor.getLong(mTotalBytesColumnId); + String sizeText = ""; + if (totalBytes >= 0) { + sizeText = Formatter.formatFileSize(mContext, totalBytes); + } + return sizeText; + } + + private int getStatusStringId() { + switch (mCursor.getInt(mStatusColumnId)) { + case DownloadManager.STATUS_FAILED: + return R.string.download_error; + + case DownloadManager.STATUS_SUCCESSFUL: + return R.string.download_success; + + case DownloadManager.STATUS_PENDING: + return R.string.download_pending; + + case DownloadManager.STATUS_RUNNING: + case DownloadManager.STATUS_PAUSED: + 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; + } + + if (DrmRawContent.DRM_MIMETYPE_MESSAGE_STRING.equalsIgnoreCase(mediaType)) { + iconView.setImageResource(R.drawable.ic_launcher_drm_file); + } else { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.fromParts("file", "", null), mediaType); + PackageManager pm = mContext.getPackageManager(); + List<ResolveInfo> list = pm.queryIntentActivities(intent, + PackageManager.MATCH_DEFAULT_ONLY); + if (list.size() == 0) { + return; + } + Drawable icon = list.get(0).activityInfo.loadIcon(pm); + iconView.setImageDrawable(icon); + } + + iconView.setVisibility(View.VISIBLE); + } + + private void setTextForView(View parent, int textViewId, String 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); + } +} |