Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b67ae42a authored by Marco Nelissen's avatar Marco Nelissen Committed by android-build-merger
Browse files

Merge "Fix race condition when setting default ringtones" into mnc-dr-dev am:...

Merge "Fix race condition when setting default ringtones" into mnc-dr-dev am: 83702ec3 am: 02bf433f
am: 8fb0121c

* commit '8fb0121c':
  Fix race condition when setting default ringtones
parents 7907271a 8fb0121c
Loading
Loading
Loading
Loading
+61 −28
Original line number Diff line number Diff line
@@ -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,21 +926,9 @@ public class MediaScanner
            }
            Uri result = null;
            boolean needToSetSettings = false;
            if (rowId == 0) {
                if (mMtpObjectHandle != 0) {
                    values.put(MediaStore.MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, mMtpObjectHandle);
                }
                if (tableUri == mFilesUri) {
                    int format = entry.mFormat;
                    if (format == 0) {
                        format = MediaFile.getFormatCode(entry.mPath, mMimeType);
                    }
                    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)) {
@@ -945,8 +945,18 @@ public class MediaScanner
                    needToSetSettings = true;
                }
            }
                }

            if (rowId == 0) {
                if (mMtpObjectHandle != 0) {
                    values.put(MediaStore.MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, mMtpObjectHandle);
                }
                if (tableUri == mFilesUri) {
                    int format = entry.mFormat;
                    if (format == 0) {
                        format = MediaFile.getFormatCode(entry.mPath, mMimeType);
                    }
                    values.put(Files.FileColumns.FORMAT, format);
                }
                // 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) {