diff options
Diffstat (limited to 'ui/src/com/android/providers/downloads/ui/DownloadList.java')
-rw-r--r-- | ui/src/com/android/providers/downloads/ui/DownloadList.java | 765 |
1 files changed, 0 insertions, 765 deletions
diff --git a/ui/src/com/android/providers/downloads/ui/DownloadList.java b/ui/src/com/android/providers/downloads/ui/DownloadList.java index 107940c0..044bd4eb 100644 --- a/ui/src/com/android/providers/downloads/ui/DownloadList.java +++ b/ui/src/com/android/providers/downloads/ui/DownloadList.java @@ -17,134 +17,13 @@ package com.android.providers.downloads.ui; import android.app.Activity; -import android.app.AlertDialog; -import android.app.DownloadManager; -import android.content.ContentUris; -import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; -import android.database.ContentObserver; -import android.database.Cursor; -import android.database.DataSetObserver; -import android.net.Uri; import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.Parcelable; -import android.provider.BaseColumns; import android.provider.DocumentsContract; -import android.provider.Downloads; -import android.util.Log; -import android.util.SparseBooleanArray; -import android.view.ActionMode; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AbsListView.MultiChoiceModeListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.Button; -import android.widget.ExpandableListView; -import android.widget.ExpandableListView.OnChildClickListener; -import android.widget.ListView; -import android.widget.Toast; import com.android.providers.downloads.Constants; -import com.android.providers.downloads.OpenHelper; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -/** - * View showing a list of all downloads the Download Manager knows about. - */ public class DownloadList extends Activity { - static final String LOG_TAG = "DownloadList"; - - private ExpandableListView mDateOrderedListView; - private ListView mSizeOrderedListView; - private View mEmptyView; - - private DownloadManager mDownloadManager; - private Cursor mDateSortedCursor; - private DateSortedDownloadAdapter mDateSortedAdapter; - private Cursor mSizeSortedCursor; - private DownloadAdapter mSizeSortedAdapter; - private ActionMode mActionMode; - private MyContentObserver mContentObserver = new MyContentObserver(); - private MyDataSetObserver mDataSetObserver = new MyDataSetObserver(); - - private int mStatusColumnId; - private int mIdColumnId; - private int mLocalUriColumnId; - private int mMediaTypeColumnId; - private int mReasonColumndId; - - // TODO this shouldn't be necessary - private final Map<Long, SelectionObjAttrs> mSelectedIds = - new HashMap<Long, SelectionObjAttrs>(); - private static class SelectionObjAttrs { - private String mFileName; - private String mMimeType; - SelectionObjAttrs(String fileName, String mimeType) { - mFileName = fileName; - mMimeType = mimeType; - } - String getFileName() { - return mFileName; - } - String getMimeType() { - return mMimeType; - } - } - private ListView mCurrentView; - private Cursor mCurrentCursor; - private boolean mCurrentViewIsExpandableListView = false; - private boolean mIsSortedBySize = false; - - /** - * We keep track of when a dialog is being displayed for a pending download, because if that - * download starts running, we want to immediately hide the dialog. - */ - private Long mQueuedDownloadId = null; - private AlertDialog mQueuedDialog; - String mSelectedCountFormat; - - private Button mSortOption; - - private class MyContentObserver extends ContentObserver { - public MyContentObserver() { - super(new Handler()); - } - - @Override - public void onChange(boolean selfChange) { - handleDownloadsChanged(); - } - } - - private class MyDataSetObserver extends DataSetObserver { - @Override - public void onChanged() { - // ignore change notification if there are selections - if (mSelectedIds.size() > 0) { - return; - } - // may need to switch to or from the empty view - chooseListToShow(); - ensureSomeGroupIsExpanded(); - } - } - @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -156,648 +35,4 @@ public class DownloadList extends Activity { startActivity(intent); finish(); } - - public void onCreateLegacy(Bundle icicle) { - super.onCreate(icicle); - setFinishOnTouchOutside(true); - setupViews(); - - mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); - mDownloadManager.setAccessAllDownloads(true); - DownloadManager.Query baseQuery = new DownloadManager.Query() - .setOnlyIncludeVisibleInDownloadsUi(true); - //TODO don't do both queries - do them as needed - mDateSortedCursor = mDownloadManager.query(baseQuery); - mSizeSortedCursor = mDownloadManager.query(baseQuery - .orderBy(DownloadManager.COLUMN_TOTAL_SIZE_BYTES, - DownloadManager.Query.ORDER_DESCENDING)); - - // only attach everything to the listbox if we can access the download database. Otherwise, - // just show it empty - if (haveCursors()) { - startManagingCursor(mDateSortedCursor); - startManagingCursor(mSizeSortedCursor); - - mStatusColumnId = - mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS); - mIdColumnId = - mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_ID); - mLocalUriColumnId = - mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI); - mMediaTypeColumnId = - mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_MEDIA_TYPE); - mReasonColumndId = - mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON); - - mDateSortedAdapter = new DateSortedDownloadAdapter(this, mDateSortedCursor); - mDateOrderedListView.setAdapter(mDateSortedAdapter); - mSizeSortedAdapter = new DownloadAdapter(this, mSizeSortedCursor); - mSizeOrderedListView.setAdapter(mSizeSortedAdapter); - - ensureSomeGroupIsExpanded(); - } - - // did the caller want to display the data sorted by size? - Bundle extras = getIntent().getExtras(); - if (extras != null && - extras.getBoolean(DownloadManager.INTENT_EXTRAS_SORT_BY_SIZE, false)) { - mIsSortedBySize = true; - } - mSortOption = (Button) findViewById(R.id.sort_button); - mSortOption.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - // flip the view - mIsSortedBySize = !mIsSortedBySize; - // clear all selections - mSelectedIds.clear(); - chooseListToShow(); - } - }); - - chooseListToShow(); - mSelectedCountFormat = getString(R.string.selected_count); - } - - /** - * If no group is expanded in the date-sorted list, expand the first one. - */ - private void ensureSomeGroupIsExpanded() { - mDateOrderedListView.post(new Runnable() { - public void run() { - if (mDateSortedAdapter.getGroupCount() == 0) { - return; - } - for (int group = 0; group < mDateSortedAdapter.getGroupCount(); group++) { - if (mDateOrderedListView.isGroupExpanded(group)) { - return; - } - } - mDateOrderedListView.expandGroup(0); - } - }); - } - - private void setupViews() { - setContentView(R.layout.download_list); - ModeCallback modeCallback = new ModeCallback(this); - - //TODO don't create both views. create only the one needed. - mDateOrderedListView = (ExpandableListView) findViewById(R.id.date_ordered_list); - mDateOrderedListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); - mDateOrderedListView.setMultiChoiceModeListener(modeCallback); - mDateOrderedListView.setOnChildClickListener(new OnChildClickListener() { - // called when a child is clicked on (this is NOT the checkbox click) - @Override - public boolean onChildClick(ExpandableListView parent, View v, - int groupPosition, int childPosition, long id) { - if (!(v instanceof DownloadItem)) { - // can this even happen? - return false; - } - if (mSelectedIds.size() > 0) { - ((DownloadItem)v).setChecked(true); - } else { - mDateSortedAdapter.moveCursorToChildPosition(groupPosition, childPosition); - handleItemClick(mDateSortedCursor); - } - return true; - } - }); - mSizeOrderedListView = (ListView) findViewById(R.id.size_ordered_list); - mSizeOrderedListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); - mSizeOrderedListView.setMultiChoiceModeListener(modeCallback); - mSizeOrderedListView.setOnItemClickListener(new OnItemClickListener() { - // handle a click from the size-sorted list. (this is NOT the checkbox click) - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - mSizeSortedCursor.moveToPosition(position); - handleItemClick(mSizeSortedCursor); - } - }); - mEmptyView = findViewById(R.id.empty); - } - - private static class ModeCallback implements MultiChoiceModeListener { - private final DownloadList mDownloadList; - - public ModeCallback(DownloadList downloadList) { - mDownloadList = downloadList; - } - - @Override public void onDestroyActionMode(ActionMode mode) { - mDownloadList.mSelectedIds.clear(); - mDownloadList.mActionMode = null; - } - - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - return true; - } - - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - if (mDownloadList.haveCursors()) { - final MenuInflater inflater = mDownloadList.getMenuInflater(); - inflater.inflate(R.menu.download_menu, menu); - } - mDownloadList.mActionMode = mode; - return true; - } - - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (mDownloadList.mSelectedIds.size() == 0) { - // nothing selected. - return true; - } - switch (item.getItemId()) { - case R.id.delete_download: - for (Long downloadId : mDownloadList.mSelectedIds.keySet()) { - mDownloadList.deleteDownload(downloadId); - } - // uncheck all checked items - ListView lv = mDownloadList.getCurrentView(); - SparseBooleanArray checkedPositionList = lv.getCheckedItemPositions(); - int checkedPositionListSize = checkedPositionList.size(); - ArrayList<DownloadItem> sharedFiles = null; - for (int i = 0; i < checkedPositionListSize; i++) { - int position = checkedPositionList.keyAt(i); - if (checkedPositionList.get(position, false)) { - lv.setItemChecked(position, false); - onItemCheckedStateChanged(mode, position, 0, false); - } - } - mDownloadList.mSelectedIds.clear(); - // update the subtitle - onItemCheckedStateChanged(mode, 1, 0, false); - break; - case R.id.share_download: - mDownloadList.shareDownloadedFiles(); - break; - } - return true; - } - - @Override - public void onItemCheckedStateChanged(ActionMode mode, int position, long id, - boolean checked) { - // ignore long clicks on groups - if (mDownloadList.isCurrentViewExpandableListView()) { - ExpandableListView ev = mDownloadList.getExpandableListView(); - long pos = ev.getExpandableListPosition(position); - if (checked && (ExpandableListView.getPackedPositionType(pos) == - ExpandableListView.PACKED_POSITION_TYPE_GROUP)) { - // ignore this click - ev.setItemChecked(position, false); - return; - } - } - mDownloadList.setActionModeTitle(mode); - } - } - - void setActionModeTitle(ActionMode mode) { - int numSelected = mSelectedIds.size(); - if (numSelected > 0) { - mode.setTitle(String.format(mSelectedCountFormat, numSelected, - mCurrentCursor.getCount())); - } else { - mode.setTitle(""); - } - } - - private boolean haveCursors() { - return mDateSortedCursor != null && mSizeSortedCursor != null; - } - - @Override - protected void onResume() { - super.onResume(); - if (haveCursors()) { - mDateSortedCursor.registerContentObserver(mContentObserver); - mDateSortedCursor.registerDataSetObserver(mDataSetObserver); - refresh(); - } - } - - @Override - protected void onPause() { - super.onPause(); - if (haveCursors()) { - mDateSortedCursor.unregisterContentObserver(mContentObserver); - mDateSortedCursor.unregisterDataSetObserver(mDataSetObserver); - } - } - - private static final String BUNDLE_SAVED_DOWNLOAD_IDS = "download_ids"; - private static final String BUNDLE_SAVED_FILENAMES = "filenames"; - private static final String BUNDLE_SAVED_MIMETYPES = "mimetypes"; - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean("isSortedBySize", mIsSortedBySize); - int len = mSelectedIds.size(); - if (len == 0) { - return; - } - long[] selectedIds = new long[len]; - String[] fileNames = new String[len]; - String[] mimeTypes = new String[len]; - int i = 0; - for (long id : mSelectedIds.keySet()) { - selectedIds[i] = id; - SelectionObjAttrs obj = mSelectedIds.get(id); - fileNames[i] = obj.getFileName(); - mimeTypes[i] = obj.getMimeType(); - i++; - } - outState.putLongArray(BUNDLE_SAVED_DOWNLOAD_IDS, selectedIds); - outState.putStringArray(BUNDLE_SAVED_FILENAMES, fileNames); - outState.putStringArray(BUNDLE_SAVED_MIMETYPES, mimeTypes); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - mIsSortedBySize = savedInstanceState.getBoolean("isSortedBySize"); - mSelectedIds.clear(); - long[] selectedIds = savedInstanceState.getLongArray(BUNDLE_SAVED_DOWNLOAD_IDS); - String[] fileNames = savedInstanceState.getStringArray(BUNDLE_SAVED_FILENAMES); - String[] mimeTypes = savedInstanceState.getStringArray(BUNDLE_SAVED_MIMETYPES); - if (selectedIds != null && selectedIds.length > 0) { - for (int i = 0; i < selectedIds.length; i++) { - mSelectedIds.put(selectedIds[i], new SelectionObjAttrs(fileNames[i], mimeTypes[i])); - } - } - chooseListToShow(); - } - - /** - * Show the correct ListView and hide the other, or hide both and show the empty view. - */ - private void chooseListToShow() { - mDateOrderedListView.setVisibility(View.GONE); - mSizeOrderedListView.setVisibility(View.GONE); - - if (mDateSortedCursor == null || mDateSortedCursor.getCount() == 0) { - mEmptyView.setVisibility(View.VISIBLE); - mSortOption.setVisibility(View.GONE); - } else { - mEmptyView.setVisibility(View.GONE); - mSortOption.setVisibility(View.VISIBLE); - ListView lv = activeListView(); - lv.setVisibility(View.VISIBLE); - lv.invalidateViews(); // ensure checkboxes get updated - } - // restore the ActionMode title if there are selections - if (mActionMode != null) { - setActionModeTitle(mActionMode); - } - } - - ListView getCurrentView() { - return mCurrentView; - } - - ExpandableListView getExpandableListView() { - return mDateOrderedListView; - } - - boolean isCurrentViewExpandableListView() { - return mCurrentViewIsExpandableListView; - } - - private ListView activeListView() { - if (mIsSortedBySize) { - mCurrentCursor = mSizeSortedCursor; - mCurrentView = mSizeOrderedListView; - setTitle(R.string.download_title_sorted_by_size); - mSortOption.setText(R.string.button_sort_by_date); - mCurrentViewIsExpandableListView = false; - } else { - mCurrentCursor = mDateSortedCursor; - mCurrentView = mDateOrderedListView; - setTitle(R.string.download_title_sorted_by_date); - mSortOption.setText(R.string.button_sort_by_size); - mCurrentViewIsExpandableListView = true; - } - if (mActionMode != null) { - mActionMode.finish(); - } - return mCurrentView; - } - - /** - * @return an OnClickListener to delete the given downloadId from the Download Manager - */ - private DialogInterface.OnClickListener getDeleteClickHandler(final long downloadId) { - return new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - deleteDownload(downloadId); - } - }; - } - - /** - * @return an OnClickListener to restart the given downloadId in the Download Manager - */ - private DialogInterface.OnClickListener getRestartClickHandler(final long downloadId) { - return new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - mDownloadManager.restartDownload(downloadId); - } - }; - } - - /** - * Send an Intent to open the download currently pointed to by the given cursor. - */ - private void openCurrentDownload(Cursor cursor) { - final Uri localUri = Uri.parse(cursor.getString(mLocalUriColumnId)); - try { - getContentResolver().openFileDescriptor(localUri, "r").close(); - } catch (FileNotFoundException exc) { - Log.d(LOG_TAG, "Failed to open download " + cursor.getLong(mIdColumnId), exc); - showFailedDialog(cursor.getLong(mIdColumnId), - getString(R.string.dialog_file_missing_body)); - return; - } catch (IOException exc) { - // close() failed, not a problem - } - - final long id = cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); - if (!OpenHelper.startViewIntent(this, id, 0)) { - Toast.makeText(this, R.string.download_no_application_title, Toast.LENGTH_SHORT).show(); - } - } - - private void handleItemClick(Cursor cursor) { - long id = cursor.getInt(mIdColumnId); - switch (cursor.getInt(mStatusColumnId)) { - case DownloadManager.STATUS_PENDING: - case DownloadManager.STATUS_RUNNING: - sendRunningDownloadClickedBroadcast(id); - break; - - case DownloadManager.STATUS_PAUSED: - if (isPausedForWifi(cursor)) { - mQueuedDownloadId = id; - mQueuedDialog = new AlertDialog.Builder(this) - .setTitle(R.string.dialog_title_queued_body) - .setMessage(R.string.dialog_queued_body) - .setPositiveButton(R.string.keep_queued_download, null) - .setNegativeButton(R.string.remove_download, getDeleteClickHandler(id)) - .setOnCancelListener(new DialogInterface.OnCancelListener() { - /** - * Called when a dialog for a pending download is canceled. - */ - @Override - public void onCancel(DialogInterface dialog) { - mQueuedDownloadId = null; - mQueuedDialog = null; - } - }) - .show(); - } else { - sendRunningDownloadClickedBroadcast(id); - } - break; - - case DownloadManager.STATUS_SUCCESSFUL: - openCurrentDownload(cursor); - break; - - case DownloadManager.STATUS_FAILED: - showFailedDialog(id, getErrorMessage(cursor)); - break; - } - } - - /** - * @return the appropriate error message for the failed download pointed to by cursor - */ - private String getErrorMessage(Cursor cursor) { - switch (cursor.getInt(mReasonColumndId)) { - case DownloadManager.ERROR_FILE_ALREADY_EXISTS: - if (isOnExternalStorage(cursor)) { - return getString(R.string.dialog_file_already_exists); - } else { - // the download manager should always find a free filename for cache downloads, - // so this indicates a strange internal error - return getUnknownErrorMessage(); - } - - case DownloadManager.ERROR_INSUFFICIENT_SPACE: - if (isOnExternalStorage(cursor)) { - return getString(R.string.dialog_insufficient_space_on_external); - } else { - return getString(R.string.dialog_insufficient_space_on_cache); - } - - case DownloadManager.ERROR_DEVICE_NOT_FOUND: - return getString(R.string.dialog_media_not_found); - - case DownloadManager.ERROR_CANNOT_RESUME: - return getString(R.string.dialog_cannot_resume); - - default: - return getUnknownErrorMessage(); - } - } - - private boolean isOnExternalStorage(Cursor cursor) { - String localUriString = cursor.getString(mLocalUriColumnId); - if (localUriString == null) { - return false; - } - Uri localUri = Uri.parse(localUriString); - if (!localUri.getScheme().equals("file")) { - return false; - } - String path = localUri.getPath(); - String externalRoot = Environment.getExternalStorageDirectory().getPath(); - return path.startsWith(externalRoot); - } - - private String getUnknownErrorMessage() { - return getString(R.string.dialog_failed_body); - } - - private void showFailedDialog(long downloadId, String dialogBody) { - new AlertDialog.Builder(this) - .setTitle(R.string.dialog_title_not_available) - .setMessage(dialogBody) - .setNegativeButton(R.string.delete_download, getDeleteClickHandler(downloadId)) - .setPositiveButton(R.string.retry_download, getRestartClickHandler(downloadId)) - .show(); - } - - private void sendRunningDownloadClickedBroadcast(long id) { - final Intent intent = new Intent(Constants.ACTION_LIST); - intent.setPackage(Constants.PROVIDER_PACKAGE_NAME); - intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, - new long[] { id }); - sendBroadcast(intent); - } - - // handle a click on one of the download item checkboxes - public void onDownloadSelectionChanged(long downloadId, boolean isSelected, - String fileName, String mimeType) { - if (isSelected) { - mSelectedIds.put(downloadId, new SelectionObjAttrs(fileName, mimeType)); - } else { - mSelectedIds.remove(downloadId); - } - } - - /** - * Requery the database and update the UI. - */ - private void refresh() { - mDateSortedCursor.requery(); - mSizeSortedCursor.requery(); - // Adapters get notification of changes and update automatically - } - - /** - * Delete a download from the Download Manager. - */ - private void deleteDownload(long downloadId) { - // let DownloadService do the job of cleaning up the downloads db, mediaprovider db, - // and removal of file from sdcard - // TODO do the following in asynctask - not on main thread. - mDownloadManager.markRowDeleted(downloadId); - } - - public boolean isDownloadSelected(long id) { - return mSelectedIds.containsKey(id); - } - - /** - * Called when there's a change to the downloads database. - */ - void handleDownloadsChanged() { - checkSelectionForDeletedEntries(); - - if (mQueuedDownloadId != null && moveToDownload(mQueuedDownloadId)) { - if (mDateSortedCursor.getInt(mStatusColumnId) != DownloadManager.STATUS_PAUSED - || !isPausedForWifi(mDateSortedCursor)) { - mQueuedDialog.cancel(); - } - } - } - - private boolean isPausedForWifi(Cursor cursor) { - return cursor.getInt(mReasonColumndId) == DownloadManager.PAUSED_QUEUED_FOR_WIFI; - } - - /** - * Check if any of the selected downloads have been deleted from the downloads database, and - * remove such downloads from the selection. - */ - private void checkSelectionForDeletedEntries() { - // gather all existing IDs... - Set<Long> allIds = new HashSet<Long>(); - for (mDateSortedCursor.moveToFirst(); !mDateSortedCursor.isAfterLast(); - mDateSortedCursor.moveToNext()) { - allIds.add(mDateSortedCursor.getLong(mIdColumnId)); - } - - // ...and check if any selected IDs are now missing - for (Iterator<Long> iterator = mSelectedIds.keySet().iterator(); iterator.hasNext(); ) { - if (!allIds.contains(iterator.next())) { - iterator.remove(); - } - } - } - - /** - * Move {@link #mDateSortedCursor} to the download with the given ID. - * @return true if the specified download ID was found; false otherwise - */ - private boolean moveToDownload(long downloadId) { - for (mDateSortedCursor.moveToFirst(); !mDateSortedCursor.isAfterLast(); - mDateSortedCursor.moveToNext()) { - if (mDateSortedCursor.getLong(mIdColumnId) == downloadId) { - return true; - } - } - return false; - } - - /** - * handle share menu button click when one more files are selected for sharing - */ - public boolean shareDownloadedFiles() { - Intent intent = new Intent(); - if (mSelectedIds.size() > 1) { - intent.setAction(Intent.ACTION_SEND_MULTIPLE); - ArrayList<Parcelable> attachments = new ArrayList<Parcelable>(); - ArrayList<String> mimeTypes = new ArrayList<String>(); - for (Map.Entry<Long, SelectionObjAttrs> item : mSelectedIds.entrySet()) { - final Uri uri = ContentUris.withAppendedId( - Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, item.getKey()); - final String mimeType = item.getValue().getMimeType(); - attachments.add(uri); - if (mimeType != null) { - mimeTypes.add(mimeType); - } - } - intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachments); - intent.setType(findCommonMimeType(mimeTypes)); - } else { - // get the entry - // since there is ONLY one entry in this, we can do the following - for (Map.Entry<Long, SelectionObjAttrs> item : mSelectedIds.entrySet()) { - final Uri uri = ContentUris.withAppendedId( - Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, item.getKey()); - final String mimeType = item.getValue().getMimeType(); - intent.setAction(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_STREAM, uri); - intent.setType(mimeType); - } - } - intent = Intent.createChooser(intent, getText(R.string.download_share_dialog)); - startActivity(intent); - return true; - } - - private String findCommonMimeType(ArrayList<String> mimeTypes) { - // are all mimeypes the same? - String str = findCommonString(mimeTypes); - if (str != null) { - return str; - } - - // are all prefixes of the given mimetypes the same? - ArrayList<String> mimeTypePrefixes = new ArrayList<String>(); - for (String s : mimeTypes) { - if (s != null) { - mimeTypePrefixes.add(s.substring(0, s.indexOf('/'))); - } - } - str = findCommonString(mimeTypePrefixes); - if (str != null) { - return str + "/*"; - } - - // return generic mimetype - return "*/*"; - } - private String findCommonString(Collection<String> set) { - String str = null; - boolean found = true; - for (String s : set) { - if (str == null) { - str = s; - } else if (!str.equals(s)) { - found = false; - break; - } - } - return (found) ? str : null; - } } |