Merge "Fix race condition when setting default ringtones" into mnc-dr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
83702ec3ed
@ -20,6 +20,7 @@ import org.xml.sax.Attributes;
|
||||
import org.xml.sax.ContentHandler;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentUris;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
@ -41,6 +42,7 @@ import android.provider.MediaStore.Files.FileColumns;
|
||||
import android.provider.MediaStore.Images;
|
||||
import android.provider.MediaStore.Video;
|
||||
import android.provider.Settings;
|
||||
import android.provider.Settings.SettingNotFoundException;
|
||||
import android.sax.Element;
|
||||
import android.sax.ElementListener;
|
||||
import android.sax.RootElement;
|
||||
@ -324,8 +326,6 @@ public class MediaScanner
|
||||
// used when scanning the image database so we know whether we have to prune
|
||||
// old thumbnail files
|
||||
private int mOriginalCount;
|
||||
/** Whether the database had any entries in it before the scan started */
|
||||
private boolean mWasEmptyPriorToScan = false;
|
||||
/** Whether the scanner has set a default sound for the ringer ringtone. */
|
||||
private boolean mDefaultRingtoneSet;
|
||||
/** Whether the scanner has set a default sound for the notification ringtone. */
|
||||
@ -535,6 +535,18 @@ public class MediaScanner
|
||||
if (mMtpObjectHandle != 0) {
|
||||
entry.mRowId = 0;
|
||||
}
|
||||
|
||||
if ((!mDefaultNotificationSet &&
|
||||
doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename))
|
||||
|| (!mDefaultRingtoneSet &&
|
||||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename))
|
||||
|| (!mDefaultAlarmSet &&
|
||||
doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename))) {
|
||||
Log.w(TAG, "forcing rescan of " + entry.mPath +
|
||||
"since ringtone setting didn't finish");
|
||||
scanAlways = true;
|
||||
}
|
||||
|
||||
// rescan for metadata if file was modified since last scan
|
||||
if (entry != null && (entry.mLastModifiedChanged || scanAlways)) {
|
||||
if (noMedia) {
|
||||
@ -914,6 +926,26 @@ public class MediaScanner
|
||||
}
|
||||
Uri result = null;
|
||||
boolean needToSetSettings = false;
|
||||
// Setting a flag in order not to use bulk insert for the file related with
|
||||
// notifications, ringtones, and alarms, because the rowId of the inserted file is
|
||||
// needed.
|
||||
if (notifications && !mDefaultNotificationSet) {
|
||||
if (TextUtils.isEmpty(mDefaultNotificationFilename) ||
|
||||
doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename)) {
|
||||
needToSetSettings = true;
|
||||
}
|
||||
} else if (ringtones && !mDefaultRingtoneSet) {
|
||||
if (TextUtils.isEmpty(mDefaultRingtoneFilename) ||
|
||||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) {
|
||||
needToSetSettings = true;
|
||||
}
|
||||
} else if (alarms && !mDefaultAlarmSet) {
|
||||
if (TextUtils.isEmpty(mDefaultAlarmAlertFilename) ||
|
||||
doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)) {
|
||||
needToSetSettings = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (rowId == 0) {
|
||||
if (mMtpObjectHandle != 0) {
|
||||
values.put(MediaStore.MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, mMtpObjectHandle);
|
||||
@ -925,28 +957,6 @@ public class MediaScanner
|
||||
}
|
||||
values.put(Files.FileColumns.FORMAT, format);
|
||||
}
|
||||
// Setting a flag in order not to use bulk insert for the file related with
|
||||
// notifications, ringtones, and alarms, because the rowId of the inserted file is
|
||||
// needed.
|
||||
if (mWasEmptyPriorToScan) {
|
||||
if (notifications && !mDefaultNotificationSet) {
|
||||
if (TextUtils.isEmpty(mDefaultNotificationFilename) ||
|
||||
doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename)) {
|
||||
needToSetSettings = true;
|
||||
}
|
||||
} else if (ringtones && !mDefaultRingtoneSet) {
|
||||
if (TextUtils.isEmpty(mDefaultRingtoneFilename) ||
|
||||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) {
|
||||
needToSetSettings = true;
|
||||
}
|
||||
} else if (alarms && !mDefaultAlarmSet) {
|
||||
if (TextUtils.isEmpty(mDefaultAlarmAlertFilename) ||
|
||||
doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)) {
|
||||
needToSetSettings = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// New file, insert it.
|
||||
// Directories need to be inserted before the files they contain, so they
|
||||
// get priority when bulk inserting.
|
||||
@ -1016,13 +1026,20 @@ public class MediaScanner
|
||||
|
||||
private void setSettingIfNotSet(String settingName, Uri uri, long rowId) {
|
||||
|
||||
if(wasSettingAlreadySet(settingName)) {
|
||||
return;
|
||||
}
|
||||
|
||||
String existingSettingValue = Settings.System.getString(mContext.getContentResolver(),
|
||||
settingName);
|
||||
|
||||
if (TextUtils.isEmpty(existingSettingValue)) {
|
||||
// Set the setting to the given URI
|
||||
Settings.System.putString(mContext.getContentResolver(), settingName,
|
||||
|
||||
ContentResolver cr = mContext.getContentResolver();
|
||||
Settings.System.putString(cr, settingName,
|
||||
ContentUris.withAppendedId(uri, rowId).toString());
|
||||
Settings.System.putInt(cr, settingSetIndicatorName(settingName), 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1050,6 +1067,20 @@ public class MediaScanner
|
||||
|
||||
}; // end of anonymous MediaScannerClient instance
|
||||
|
||||
private String settingSetIndicatorName(String base) {
|
||||
return base + "_set";
|
||||
}
|
||||
|
||||
private boolean wasSettingAlreadySet(String name) {
|
||||
ContentResolver cr = mContext.getContentResolver();
|
||||
String indicatorName = settingSetIndicatorName(name);
|
||||
try {
|
||||
return Settings.System.getInt(cr, indicatorName) != 0;
|
||||
} catch (SettingNotFoundException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void prescan(String filePath, boolean prescanFiles) throws RemoteException {
|
||||
Cursor c = null;
|
||||
String where = null;
|
||||
@ -1071,6 +1102,10 @@ public class MediaScanner
|
||||
selectionArgs = new String[] { "" };
|
||||
}
|
||||
|
||||
mDefaultRingtoneSet = wasSettingAlreadySet(Settings.System.RINGTONE);
|
||||
mDefaultNotificationSet = wasSettingAlreadySet(Settings.System.NOTIFICATION_SOUND);
|
||||
mDefaultAlarmSet = wasSettingAlreadySet(Settings.System.ALARM_ALERT);
|
||||
|
||||
// Tell the provider to not delete the file.
|
||||
// If the file is truly gone the delete is unnecessary, and we want to avoid
|
||||
// accidentally deleting files that are really there (this may happen if the
|
||||
@ -1089,7 +1124,6 @@ public class MediaScanner
|
||||
// with CursorWindow positioning.
|
||||
long lastId = Long.MIN_VALUE;
|
||||
Uri limitUri = mFilesUri.buildUpon().appendQueryParameter("limit", "1000").build();
|
||||
mWasEmptyPriorToScan = true;
|
||||
|
||||
while (true) {
|
||||
selectionArgs[0] = "" + lastId;
|
||||
@ -1108,7 +1142,6 @@ public class MediaScanner
|
||||
if (num == 0) {
|
||||
break;
|
||||
}
|
||||
mWasEmptyPriorToScan = false;
|
||||
while (c.moveToNext()) {
|
||||
long rowId = c.getLong(FILES_PRESCAN_ID_COLUMN_INDEX);
|
||||
String path = c.getString(FILES_PRESCAN_PATH_COLUMN_INDEX);
|
||||
@ -1260,7 +1293,7 @@ public class MediaScanner
|
||||
}
|
||||
}
|
||||
|
||||
private void postscan(String[] directories) throws RemoteException {
|
||||
private void postscan(final String[] directories) throws RemoteException {
|
||||
|
||||
// handle playlists last, after we know what media files are on the storage.
|
||||
if (mProcessPlaylists) {
|
||||
|
Reference in New Issue
Block a user