diff options
author | Leon Scroggins III <scroggo@google.com> | 2010-09-27 12:32:40 -0400 |
---|---|---|
committer | Leon Scroggins III <scroggo@google.com> | 2010-09-27 17:46:59 -0400 |
commit | a682a3ccac02db69bd8708258aae263be4b22e72 (patch) | |
tree | e5ccd94da2e15d825d999e6f4ff0293e31c8bdbc /src | |
parent | cc14c8c4da26ff93a96078c7c9108682c23bd1af (diff) | |
download | packages_apps_Browser-a682a3ccac02db69bd8708258aae263be4b22e72.zip packages_apps_Browser-a682a3ccac02db69bd8708258aae263be4b22e72.tar.gz packages_apps_Browser-a682a3ccac02db69bd8708258aae263be4b22e72.tar.bz2 |
Use the system downloads UI, instead of browser specific 1.
Bug:3034564
Change-Id: Id850854da7db9c1a36500c9eee9debad64bdf97e
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/browser/BrowserActivity.java | 13 | ||||
-rw-r--r-- | src/com/android/browser/BrowserDownloadAdapter.java | 221 | ||||
-rw-r--r-- | src/com/android/browser/BrowserDownloadPage.java | 535 | ||||
-rw-r--r-- | src/com/android/browser/OpenDownloadReceiver.java | 42 |
4 files changed, 12 insertions, 799 deletions
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java index 72ed2ec..101157c 100644 --- a/src/com/android/browser/BrowserActivity.java +++ b/src/com/android/browser/BrowserActivity.java @@ -47,6 +47,7 @@ import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; +import android.net.DownloadManager; import android.net.NetworkInfo; import android.net.Uri; import android.net.WebAddress; @@ -1447,7 +1448,7 @@ public class BrowserActivity extends Activity break; case R.id.view_downloads_menu_id: - viewDownloads(null); + viewDownloads(); break; case R.id.window_one_menu_id: @@ -3566,12 +3567,9 @@ public class BrowserActivity extends Activity * menu to see the download window. It shows the download window on top of * the current window. */ - private void viewDownloads(Uri downloadRecord) { - Intent intent = new Intent(this, - BrowserDownloadPage.class); - intent.setData(downloadRecord); - startActivityForResult(intent, BrowserActivity.DOWNLOAD_PAGE); - + private void viewDownloads() { + Intent intent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS); + startActivity(intent); } /** @@ -3994,7 +3992,6 @@ public class BrowserActivity extends Activity // activity requestCode final static int COMBO_PAGE = 1; - final static int DOWNLOAD_PAGE = 2; final static int PREFERENCES_PAGE = 3; final static int FILE_SELECTED = 4; diff --git a/src/com/android/browser/BrowserDownloadAdapter.java b/src/com/android/browser/BrowserDownloadAdapter.java deleted file mode 100644 index 0f8f721..0000000 --- a/src/com/android/browser/BrowserDownloadAdapter.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2007 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.browser; - -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.Uri; -import android.provider.Downloads; -import android.text.format.Formatter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import java.text.DateFormat; -import java.util.Date; -import java.util.List; - -/** - * This class is used to represent the data for the download list box. The only - * real work done by this class is to construct a custom view for the line - * items. - */ -public class BrowserDownloadAdapter extends DateSortedExpandableListAdapter { - - private int mTitleColumnId; - private int mDescColumnId; - private int mStatusColumnId; - private int mTotalBytesColumnId; - private int mCurrentBytesColumnId; - private int mMimetypeColumnId; - private int mDateColumnId; - - public BrowserDownloadAdapter(Context context, Cursor c, int index) { - super(context, c, index); - mTitleColumnId = c.getColumnIndexOrThrow(Downloads.Impl.COLUMN_TITLE); - mDescColumnId = c.getColumnIndexOrThrow(Downloads.Impl.COLUMN_DESCRIPTION); - mStatusColumnId = c.getColumnIndexOrThrow(Downloads.Impl.COLUMN_STATUS); - mTotalBytesColumnId = c.getColumnIndexOrThrow(Downloads.Impl.COLUMN_TOTAL_BYTES); - mCurrentBytesColumnId = - c.getColumnIndexOrThrow(Downloads.Impl.COLUMN_CURRENT_BYTES); - mMimetypeColumnId = c.getColumnIndexOrThrow(Downloads.Impl.COLUMN_MIME_TYPE); - mDateColumnId = c.getColumnIndexOrThrow(Downloads.Impl.COLUMN_LAST_MODIFICATION); - } - - @Override - public View getChildView(int groupPosition, int childPosition, - boolean isLastChild, View convertView, ViewGroup parent) { - Context context = getContext(); - // The layout file uses a RelativeLayout, whereas the GroupViews use - // TextView. - if (null == convertView || !(convertView instanceof RelativeLayout)) { - convertView = LayoutInflater.from(context).inflate( - R.layout.browser_download_item, null); - } - - // Bail early if the Cursor is closed. - if (!moveCursorToChildPosition(groupPosition, childPosition)) { - return convertView; - } - - Resources r = context.getResources(); - - // Retrieve the icon for this download - String mimeType = getString(mMimetypeColumnId); - ImageView iv = (ImageView) convertView.findViewById(R.id.download_icon); - if (DrmRawContent.DRM_MIMETYPE_MESSAGE_STRING.equalsIgnoreCase(mimeType)) { - iv.setImageResource(R.drawable.ic_launcher_drm_file); - } else if (mimeType == null) { - iv.setVisibility(View.INVISIBLE); - } else { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(Uri.fromParts("file", "", null), mimeType); - PackageManager pm = context.getPackageManager(); - List<ResolveInfo> list = pm.queryIntentActivities(intent, - PackageManager.MATCH_DEFAULT_ONLY); - if (list.size() > 0) { - Drawable icon = list.get(0).activityInfo.loadIcon(pm); - iv.setImageDrawable(icon); - iv.setVisibility(View.VISIBLE); - } else { - iv.setVisibility(View.INVISIBLE); - } - } - - TextView tv = (TextView) convertView.findViewById(R.id.download_title); - String title = getString(mTitleColumnId); - if (title == null) { - title = r.getString(R.string.download_unknown_filename); - } - tv.setText(title); - - tv = (TextView) convertView.findViewById(R.id.domain); - tv.setText(getString(mDescColumnId)); - - long totalBytes = getLong(mTotalBytesColumnId); - - int status = getInt(mStatusColumnId); - if (Downloads.Impl.isStatusCompleted(status)) { // Download stopped - View v = convertView.findViewById(R.id.progress_text); - v.setVisibility(View.GONE); - - v = convertView.findViewById(R.id.download_progress); - v.setVisibility(View.GONE); - - tv = (TextView) convertView.findViewById(R.id.complete_text); - tv.setVisibility(View.VISIBLE); - if (Downloads.Impl.isStatusError(status)) { - tv.setText(getErrorText(status)); - } else { - tv.setText(r.getString(R.string.download_success, - Formatter.formatFileSize(context, totalBytes))); - } - - long time = getLong(mDateColumnId); - Date d = new Date(time); - DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); - tv = (TextView) convertView.findViewById(R.id.complete_date); - tv.setVisibility(View.VISIBLE); - tv.setText(df.format(d)); - - } else { // Download is still running - tv = (TextView) convertView.findViewById(R.id.progress_text); - tv.setVisibility(View.VISIBLE); - - View progress = convertView.findViewById(R.id.download_progress); - progress.setVisibility(View.VISIBLE); - - View v = convertView.findViewById(R.id.complete_date); - v.setVisibility(View.GONE); - - v = convertView.findViewById(R.id.complete_text); - v.setVisibility(View.GONE); - - if (status == Downloads.Impl.STATUS_PENDING) { - tv.setText(r.getText(R.string.download_pending)); - } else if (status == Downloads.Impl.STATUS_PENDING_PAUSED) { - tv.setText(r.getText(R.string.download_pending_network)); - } else { - ProgressBar pb = (ProgressBar) progress; - - StringBuilder sb = new StringBuilder(); - if (status == Downloads.Impl.STATUS_RUNNING) { - sb.append(r.getText(R.string.download_running)); - } else { - sb.append(r.getText(R.string.download_running_paused)); - } - if (totalBytes > 0) { - long currentBytes = getLong(mCurrentBytesColumnId); - int progressAmount = (int)(currentBytes * 100 / totalBytes); - sb.append(' '); - sb.append(progressAmount); - sb.append("% ("); - sb.append(Formatter.formatFileSize(context, currentBytes)); - sb.append("/"); - sb.append(Formatter.formatFileSize(context, totalBytes)); - sb.append(")"); - pb.setIndeterminate(false); - pb.setProgress(progressAmount); - } else { - pb.setIndeterminate(true); - } - tv.setText(sb.toString()); - } - } - return convertView; - } - - /** - * Provide the resource id for the error string. - * @param status status of the download item - * @return resource id for the error string. - */ - public static int getErrorText(int status) { - switch (status) { - case Downloads.Impl.STATUS_NOT_ACCEPTABLE: - return R.string.download_not_acceptable; - - case Downloads.Impl.STATUS_LENGTH_REQUIRED: - return R.string.download_length_required; - - case Downloads.Impl.STATUS_PRECONDITION_FAILED: - return R.string.download_precondition_failed; - - case Downloads.Impl.STATUS_CANCELED: - return R.string.download_canceled; - - case Downloads.Impl.STATUS_FILE_ERROR: - return R.string.download_file_error; - - case Downloads.Impl.STATUS_BAD_REQUEST: - case Downloads.Impl.STATUS_UNKNOWN_ERROR: - default: - return R.string.download_error; - } - } -} diff --git a/src/com/android/browser/BrowserDownloadPage.java b/src/com/android/browser/BrowserDownloadPage.java deleted file mode 100644 index 18faf8b..0000000 --- a/src/com/android/browser/BrowserDownloadPage.java +++ /dev/null @@ -1,535 +0,0 @@ -/* - * Copyright (C) 2007 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.browser; - -import android.app.AlertDialog; -import android.app.ExpandableListActivity; -import android.content.ActivityNotFoundException; -import android.content.ContentValues; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.ContentUris; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.database.ContentObserver; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.provider.Downloads; -import android.util.Log; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuInflater; -import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.widget.AdapterView; -import android.widget.ExpandableListView; - -import java.io.File; -import java.util.List; - -/** - * View showing the user's current browser downloads - */ -public class BrowserDownloadPage extends ExpandableListActivity { - private ExpandableListView mListView; - private Cursor mDownloadCursor; - private BrowserDownloadAdapter mDownloadAdapter; - private int mStatusColumnId; - private int mIdColumnId; - private int mTitleColumnId; - private long mContextMenuPosition; - // Used to update the ContextMenu if an item is being downloaded and the - // user opens the ContextMenu. - private ContentObserver mContentObserver; - // Only meaningful while a ContentObserver is registered. The ContextMenu - // will be reopened on this View. - private View mSelectedView; - - private final static String LOGTAG = "BrowserDownloadPage"; - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - setContentView(R.layout.browser_downloads_page); - - setTitle(getText(R.string.download_title)); - - mListView = (ExpandableListView) findViewById(android.R.id.list); - mListView.setEmptyView(findViewById(R.id.empty)); - mDownloadCursor = managedQuery(Downloads.Impl.CONTENT_URI, - new String [] {Downloads.Impl._ID, Downloads.Impl.COLUMN_TITLE, - Downloads.Impl.COLUMN_STATUS, Downloads.Impl.COLUMN_TOTAL_BYTES, - Downloads.Impl.COLUMN_CURRENT_BYTES, - Downloads.Impl.COLUMN_DESCRIPTION, - Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE, - Downloads.Impl.COLUMN_LAST_MODIFICATION, - Downloads.Impl.COLUMN_VISIBILITY, - Downloads.Impl._DATA, - Downloads.Impl.COLUMN_MIME_TYPE}, - null, Downloads.Impl.COLUMN_LAST_MODIFICATION + " DESC"); - - // only attach everything to the listbox if we can access - // the download database. Otherwise, just show it empty - if (mDownloadCursor != null) { - mStatusColumnId = - mDownloadCursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_STATUS); - mIdColumnId = - mDownloadCursor.getColumnIndexOrThrow(Downloads.Impl._ID); - mTitleColumnId = - mDownloadCursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_TITLE); - - // Create a list "controller" for the data - mDownloadAdapter = new BrowserDownloadAdapter(this, - mDownloadCursor, mDownloadCursor.getColumnIndexOrThrow( - Downloads.Impl.COLUMN_LAST_MODIFICATION)); - - setListAdapter(mDownloadAdapter); - mListView.setOnCreateContextMenuListener(this); - - Intent intent = getIntent(); - final int groupToShow = intent == null || intent.getData() == null - ? 0 : checkStatus(ContentUris.parseId(intent.getData())); - if (mDownloadAdapter.getGroupCount() > groupToShow) { - mListView.post(new Runnable() { - public void run() { - if (mDownloadAdapter.getGroupCount() > groupToShow) { - mListView.expandGroup(groupToShow); - } - } - }); - } - } - } - - @Override - protected void onResume() { - super.onResume(); - if (mDownloadCursor != null) { - String where = null; - for (mDownloadCursor.moveToFirst(); !mDownloadCursor.isAfterLast(); - mDownloadCursor.moveToNext()) { - if (!Downloads.Impl.isStatusCompleted( - mDownloadCursor.getInt(mStatusColumnId))) { - // Only want to check files that have completed. - continue; - } - int filenameColumnId = mDownloadCursor.getColumnIndexOrThrow( - Downloads.Impl._DATA); - String filename = mDownloadCursor.getString(filenameColumnId); - if (filename != null) { - File file = new File(filename); - if (!file.exists()) { - long id = mDownloadCursor.getLong(mIdColumnId); - if (where == null) { - where = Downloads.Impl._ID + " = '" + id + "'"; - } else { - where += " OR " + Downloads.Impl._ID + " = '" + id - + "'"; - } - } - } - } - if (where != null) { - getContentResolver().delete(Downloads.Impl.CONTENT_URI, where, - null); - } - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - if (mDownloadCursor != null) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.downloadhistory, menu); - } - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - boolean showCancel = getCancelableCount() > 0; - menu.findItem(R.id.download_menu_cancel_all).setEnabled(showCancel); - return super.onPrepareOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.download_menu_cancel_all: - promptCancelAll(); - return true; - } - return false; - } - - /** - * Remove the file from the list of downloads. - * @param id Unique ID of the download to remove. - */ - private void clearFromDownloads(long id) { - getContentResolver().delete(ContentUris.withAppendedId( - Downloads.Impl.CONTENT_URI, id), null, null); - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - if (!mDownloadAdapter.moveCursorToPackedChildPosition( - mContextMenuPosition)) { - return false; - } - switch (item.getItemId()) { - case R.id.download_menu_open: - hideCompletedDownload(); - openOrDeleteCurrentDownload(false); - return true; - - case R.id.download_menu_delete: - new AlertDialog.Builder(this) - .setTitle(R.string.download_delete_file) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(mDownloadCursor.getString(mTitleColumnId)) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int whichButton) { - openOrDeleteCurrentDownload(true); - } - }) - .show(); - break; - - case R.id.download_menu_clear: - case R.id.download_menu_cancel: - clearFromDownloads(mDownloadCursor.getLong(mIdColumnId)); - return true; - } - return false; - } - - @Override - protected void onPause() { - super.onPause(); - if (mContentObserver != null) { - getContentResolver().unregisterContentObserver(mContentObserver); - // Note that we do not need to undo this in onResume, because the - // ContextMenu does not get reinvoked when the Activity resumes. - } - } - - /* - * ContentObserver to update the ContextMenu if it is open when the - * corresponding download completes. - */ - private class ChangeObserver extends ContentObserver { - private final Uri mTrack; - public ChangeObserver(Uri track) { - super(new Handler()); - mTrack = track; - } - - @Override - public boolean deliverSelfNotifications() { - return false; - } - - @Override - public void onChange(boolean selfChange) { - Cursor cursor = null; - try { - cursor = getContentResolver().query(mTrack, - new String[] { Downloads.Impl.COLUMN_STATUS }, null, null, - null); - if (cursor.moveToFirst() && Downloads.Impl.isStatusSuccess( - cursor.getInt(0))) { - // Do this right away, so we get no more updates. - getContentResolver().unregisterContentObserver( - mContentObserver); - // Post a runnable in case this ContentObserver gets notified - // before the one that updates the ListView. - mListView.post(new Runnable() { - public void run() { - // Close the context menu, reopen with up to date data. - closeContextMenu(); - openContextMenu(mSelectedView); - } - }); - } - } catch (IllegalStateException e) { - Log.e(LOGTAG, "onChange", e); - } finally { - if (cursor != null) cursor.close(); - } - } - } - - @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenuInfo menuInfo) { - if (mDownloadCursor != null) { - ExpandableListView.ExpandableListContextMenuInfo info - = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; - long packedPosition = info.packedPosition; - // Only show a context menu for the child views - if (!mDownloadAdapter.moveCursorToPackedChildPosition( - packedPosition)) { - return; - } - mContextMenuPosition = packedPosition; - menu.setHeaderTitle(mDownloadCursor.getString(mTitleColumnId)); - - MenuInflater inflater = getMenuInflater(); - int status = mDownloadCursor.getInt(mStatusColumnId); - if (Downloads.Impl.isStatusSuccess(status)) { - inflater.inflate(R.menu.downloadhistorycontextfinished, menu); - } else if (Downloads.Impl.isStatusError(status)) { - inflater.inflate(R.menu.downloadhistorycontextfailed, menu); - } else { - // In this case, the download is in progress. Set a - // ContentObserver so that we can know when it completes, - // and if it does, we can then update the context menu - Uri track = ContentUris.withAppendedId( - Downloads.Impl.CONTENT_URI, - mDownloadCursor.getLong(mIdColumnId)); - if (mContentObserver != null) { - getContentResolver().unregisterContentObserver( - mContentObserver); - } - mContentObserver = new ChangeObserver(track); - mSelectedView = v; - getContentResolver().registerContentObserver(track, false, - mContentObserver); - inflater.inflate(R.menu.downloadhistorycontextrunning, menu); - } - } - super.onCreateContextMenu(menu, v, menuInfo); - } - - /** - * This function is called to check the status of the download and if it - * has an error show an error dialog. - * @param id Row id of the download to check - * @return Group which contains the download - */ - private int checkStatus(final long id) { - int groupToShow = mDownloadAdapter.groupFromChildId(id); - if (-1 == groupToShow) return 0; - int status = mDownloadCursor.getInt(mStatusColumnId); - if (!Downloads.Impl.isStatusError(status)) { - return groupToShow; - } - if (status == Downloads.Impl.STATUS_FILE_ERROR) { - String title = mDownloadCursor.getString(mTitleColumnId); - if (title == null || title.length() == 0) { - title = getString(R.string.download_unknown_filename); - } - String msg = getString(R.string.download_file_error_dlg_msg, title); - new AlertDialog.Builder(this) - .setTitle(R.string.download_file_error_dlg_title) - .setIcon(android.R.drawable.ic_popup_disk_full) - .setMessage(msg) - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.retry, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int whichButton) { - resumeDownload(id); - } - }) - .show(); - } else { - new AlertDialog.Builder(this) - .setTitle(R.string.download_failed_generic_dlg_title) - .setIcon(R.drawable.ssl_icon) - .setMessage(BrowserDownloadAdapter.getErrorText(status)) - .setPositiveButton(R.string.ok, null) - .show(); - } - return groupToShow; - } - - /** - * Resume a given download - * @param id Row id of the download to resume - */ - private void resumeDownload(final long id) { - // the relevant functionality doesn't exist in the download manager - } - - /** - * Return the number of items in the list that can be canceled. - * @return count - */ - private int getCancelableCount() { - // Count the number of items that will be canceled. - int count = 0; - if (mDownloadCursor != null) { - for (mDownloadCursor.moveToFirst(); !mDownloadCursor.isAfterLast(); - mDownloadCursor.moveToNext()) { - int status = mDownloadCursor.getInt(mStatusColumnId); - if (!Downloads.Impl.isStatusCompleted(status)) { - count++; - } - } - } - - return count; - } - - /** - * Prompt the user if they would like to clear the download history - */ - private void promptCancelAll() { - int count = getCancelableCount(); - - // If there is nothing to do, just return - if (count == 0) { - return; - } - - // Don't show the dialog if there is only one download - if (count == 1) { - cancelAllDownloads(); - return; - } - String msg = - getString(R.string.download_cancel_dlg_msg, count); - new AlertDialog.Builder(this) - .setTitle(R.string.download_cancel_dlg_title) - .setIcon(R.drawable.ssl_icon) - .setMessage(msg) - .setPositiveButton(R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int whichButton) { - cancelAllDownloads(); - } - }) - .setNegativeButton(R.string.cancel, null) - .show(); - } - - /** - * Cancel all downloads. As canceled downloads are not - * listed, we removed them from the db. Removing a download - * record, cancels the download. - */ - private void cancelAllDownloads() { - if (mDownloadCursor.moveToFirst()) { - StringBuilder where = new StringBuilder(); - boolean firstTime = true; - while (!mDownloadCursor.isAfterLast()) { - int status = mDownloadCursor.getInt(mStatusColumnId); - if (!Downloads.Impl.isStatusCompleted(status)) { - if (firstTime) { - firstTime = false; - } else { - where.append(" OR "); - } - where.append("( "); - where.append(Downloads.Impl._ID); - where.append(" = '"); - where.append(mDownloadCursor.getLong(mIdColumnId)); - where.append("' )"); - } - mDownloadCursor.moveToNext(); - } - if (!firstTime) { - getContentResolver().delete(Downloads.Impl.CONTENT_URI, - where.toString(), null); - } - } - } - - private int getClearableCount() { - int count = 0; - if (mDownloadCursor.moveToFirst()) { - while (!mDownloadCursor.isAfterLast()) { - int status = mDownloadCursor.getInt(mStatusColumnId); - if (Downloads.Impl.isStatusCompleted(status)) { - count++; - } - mDownloadCursor.moveToNext(); - } - } - return count; - } - - /** - * Open or delete content where the download db cursor currently is. Sends - * an Intent to perform the action. - * @param delete If true, delete the content. Otherwise open it. - */ - private void openOrDeleteCurrentDownload(boolean delete) { - int packageColumnId = mDownloadCursor.getColumnIndexOrThrow( - Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE); - String packageName = mDownloadCursor.getString(packageColumnId); - Intent intent = new Intent(delete ? Intent.ACTION_DELETE - : Downloads.Impl.ACTION_NOTIFICATION_CLICKED); - Uri contentUri = ContentUris.withAppendedId( - Downloads.Impl.CONTENT_URI, - mDownloadCursor.getLong(mIdColumnId)); - intent.setData(contentUri); - intent.setPackage(packageName); - sendBroadcast(intent); - } - - @Override - public boolean onChildClick(ExpandableListView parent, View v, - int groupPosition, int childPosition, long id) { - // Open the selected item - mDownloadAdapter.moveCursorToChildPosition(groupPosition, - childPosition); - - hideCompletedDownload(); - - int status = mDownloadCursor.getInt(mStatusColumnId); - if (Downloads.Impl.isStatusSuccess(status)) { - // Open it if it downloaded successfully - openOrDeleteCurrentDownload(false); - } else { - // Check to see if there is an error. - checkStatus(id); - } - return true; - } - - /** - * hides the notification for the download pointed by mDownloadCursor - * if the download has completed. - */ - private void hideCompletedDownload() { - int status = mDownloadCursor.getInt(mStatusColumnId); - - int visibilityColumn = mDownloadCursor.getColumnIndexOrThrow( - Downloads.Impl.COLUMN_VISIBILITY); - int visibility = mDownloadCursor.getInt(visibilityColumn); - - if (Downloads.Impl.isStatusCompleted(status) && - visibility == Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) { - ContentValues values = new ContentValues(); - values.put(Downloads.Impl.COLUMN_VISIBILITY, Downloads.Impl.VISIBILITY_VISIBLE); - getContentResolver().update( - ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, - mDownloadCursor.getLong(mIdColumnId)), values, null, null); - } - } -} diff --git a/src/com/android/browser/OpenDownloadReceiver.java b/src/com/android/browser/OpenDownloadReceiver.java index 814aa9c..26bf51e 100644 --- a/src/com/android/browser/OpenDownloadReceiver.java +++ b/src/com/android/browser/OpenDownloadReceiver.java @@ -22,17 +22,18 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; -import android.database.DatabaseUtils; +import android.net.DownloadManager; import android.net.Uri; import android.provider.Downloads; -import android.provider.MediaStore; import android.widget.Toast; import java.io.File; /** - * This {@link BroadcastReceiver} handles {@link Intent}s to open and delete - * files downloaded by the Browser. + * This {@link BroadcastReceiver} handles clicks to notifications that + * downloads from the browser are in progress/complete. Clicking on an + * in-progress or failed download will open the download manager. Clicking on + * a complete, successful download will open the file. */ public class OpenDownloadReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { @@ -69,44 +70,15 @@ public class OpenDownloadReceiver extends BroadcastReceiver { } } else { // Open the downloads page - Intent pageView = new Intent(context, - BrowserDownloadPage.class); - pageView.setData(data); + Intent pageView = new Intent( + DownloadManager.ACTION_VIEW_DOWNLOADS); pageView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(pageView); } - } else if (Intent.ACTION_DELETE.equals(action)) { - if (deleteFile(cr, filename, mimetype)) { - cr.delete(data, null, null); - } } } } finally { if (cursor != null) cursor.close(); } } - - /** - * Remove the file from the SD card - * @param cr ContentResolver used to delete the file. - * @param filename Name of the file to delete. - * @param mimetype Mimetype of the file to delete. - * @return boolean True on success, false on failure. - */ - private boolean deleteFile(ContentResolver cr, String filename, - String mimetype) { - Uri uri; - if (mimetype.startsWith("image")) { - uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - } else if (mimetype.startsWith("audio")) { - uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - } else if (mimetype.startsWith("video")) { - uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } else { - uri = null; - } - return (uri != null && cr.delete(uri, MediaStore.MediaColumns.DATA - + " = " + DatabaseUtils.sqlEscapeString(filename), null) > 0) - || new File(filename).delete(); - } } |