Merge "Add ability to rename a downloaded file." into nyc-dev
This commit is contained in:
@@ -16,12 +16,14 @@
|
|||||||
|
|
||||||
package android.app;
|
package android.app;
|
||||||
|
|
||||||
|
import android.annotation.Nullable;
|
||||||
import android.annotation.SdkConstant;
|
import android.annotation.SdkConstant;
|
||||||
import android.annotation.SdkConstant.SdkConstantType;
|
import android.annotation.SdkConstant.SdkConstantType;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.ContentUris;
|
import android.content.ContentUris;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.CursorWrapper;
|
import android.database.CursorWrapper;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
@@ -29,9 +31,11 @@ import android.net.NetworkPolicyManager;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
import android.os.FileUtils;
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.provider.Downloads;
|
import android.provider.Downloads;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
import android.provider.MediaStore.Images;
|
||||||
import android.provider.Settings.SettingNotFoundException;
|
import android.provider.Settings.SettingNotFoundException;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
@@ -1185,6 +1189,84 @@ public class DownloadManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename the given download if the download has completed
|
||||||
|
*
|
||||||
|
* @param context the {@link Context} to use in case need to update MediaProvider
|
||||||
|
* @param id the downloaded id
|
||||||
|
* @param displayName the new name to rename to
|
||||||
|
* @return true if rename was successful, false otherwise
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public boolean rename(Context context, long id, String displayName) {
|
||||||
|
if (!FileUtils.isValidFatFilename(displayName)) {
|
||||||
|
throw new SecurityException(displayName + " is not a valid filename");
|
||||||
|
}
|
||||||
|
|
||||||
|
Query query = new Query().setFilterById(id);
|
||||||
|
Cursor cursor = null;
|
||||||
|
String oldDisplayName = null;
|
||||||
|
String mimeType = null;
|
||||||
|
try {
|
||||||
|
cursor = query(query);
|
||||||
|
if (cursor == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (cursor.moveToFirst()) {
|
||||||
|
int status = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_STATUS));
|
||||||
|
if (DownloadManager.STATUS_SUCCESSFUL != status) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
oldDisplayName = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TITLE));
|
||||||
|
mimeType = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_MEDIA_TYPE));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (cursor != null) {
|
||||||
|
cursor.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oldDisplayName == null || mimeType == null) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"Document with id " + id + " does not exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
final File parent = Environment.getExternalStoragePublicDirectory(
|
||||||
|
Environment.DIRECTORY_DOWNLOADS);
|
||||||
|
|
||||||
|
final File before = new File(parent, oldDisplayName);
|
||||||
|
final File after = new File(parent, displayName);
|
||||||
|
|
||||||
|
if (after.exists()) {
|
||||||
|
throw new IllegalStateException("Already exists " + after);
|
||||||
|
}
|
||||||
|
if (!before.renameTo(after)) {
|
||||||
|
throw new IllegalStateException("Failed to rename to " + after);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update MediaProvider if necessary
|
||||||
|
if (mimeType.startsWith("image/")) {
|
||||||
|
context.getContentResolver().delete(Images.Media.EXTERNAL_CONTENT_URI,
|
||||||
|
Images.Media.DATA + "=?",
|
||||||
|
new String[] {
|
||||||
|
before.getAbsolutePath()
|
||||||
|
});
|
||||||
|
|
||||||
|
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
|
||||||
|
intent.setData(Uri.fromFile(after));
|
||||||
|
context.sendBroadcast(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(Downloads.Impl.COLUMN_TITLE, displayName);
|
||||||
|
values.put(Downloads.Impl._DATA, after.toString());
|
||||||
|
values.putNull(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI);
|
||||||
|
long[] ids = {id};
|
||||||
|
|
||||||
|
return (mResolver.update(mBaseUri, values, getWhereClauseForIds(ids),
|
||||||
|
getWhereArgsForIds(ids)) == 1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns recommended maximum size, in bytes, of downloads that may go over a mobile
|
* Returns recommended maximum size, in bytes, of downloads that may go over a mobile
|
||||||
* connection; or null if there's no recommended limit. The user will have the option to bypass
|
* connection; or null if there's no recommended limit. The user will have the option to bypass
|
||||||
|
|||||||
Reference in New Issue
Block a user