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

Commit c4ff053b authored by Josh Guilfoyle's avatar Josh Guilfoyle
Browse files

Reworked RingtoneManager support for theme ringtones.

This is necessary as the ThemesProvider design has changed somewhat,
specifically affecting the structure of uris.

CR: Ed Carrigan
parent 87d9a709
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -53,12 +53,6 @@ public class Ringtone {
        DrmStore.Audio.TITLE
    };
    
    private static final String[] THEME_COLUMNS = new String[] {
        MediaStore.Audio.Media._ID,
        "asset_path" /* {@link PackageResources.RingtoneColumns.ASSET_PATH} */,
        MediaStore.Audio.Media.TITLE
    };

    private MediaPlayer mAudio;

    private Uri mUri;
@@ -115,6 +109,19 @@ public class Ringtone {
        return mTitle = getTitle(context, mUri, true);
    }
    
    private static String stringForQuery(Cursor cursor) {
        if (cursor != null) {
            try {
                if (cursor.moveToFirst()) {
                    return cursor.getString(0);
                }
            } finally {
                cursor.close();
            }
        }
        return null;
    }

    private static String getTitle(Context context, Uri uri, boolean followSettingsUri) {
        Cursor cursor = null;
        ContentResolver res = context.getContentResolver();
@@ -133,14 +140,19 @@ public class Ringtone {
                            .getString(com.android.internal.R.string.ringtone_default_with_actual,
                                    actualTitle);
                }
            } else if (RingtoneManager.THEME_AUTHORITY.equals(authority)) {
                Uri themes = Uri.parse("content://com.tmobile.thememanager.themes/themes");
                title = stringForQuery(res.query(themes, new String[] { "ringtone_name" },
                    "ringtone_uri = ?", new String[] { uri.toString() }, null));
                if (title == null) {
                    title = stringForQuery(res.query(themes, new String[] { "notif_ringtone_name" },
                            "notif_ringtone_uri = ?", new String[] { uri.toString() }, null));
                }
            } else {
                
                if (DrmStore.AUTHORITY.equals(authority)) {
                    cursor = res.query(uri, DRM_COLUMNS, null, null, null);
                } else if (MediaStore.AUTHORITY.equals(authority)) {
                    cursor = res.query(uri, MEDIA_COLUMNS, null, null, null);
                } else if (RingtoneManager.THEME_AUTHORITY.equals(authority)) {
                    cursor = res.query(uri, THEME_COLUMNS, null, null, null);
                }

                if (cursor != null && cursor.getCount() == 1) {
+50 −53
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import com.android.internal.database.SortCursor;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
@@ -196,25 +195,19 @@ public class RingtoneManager {
    private static final String[] INTERNAL_COLUMNS = new String[] {
        MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
        "\"" + MediaStore.Audio.Media.INTERNAL_CONTENT_URI + "\"",
        "null"
        "\"" + MediaStore.Audio.Media.INTERNAL_CONTENT_URI + "/\" || " + MediaStore.Audio.Media._ID
    };

    private static final String[] DRM_COLUMNS = new String[] {
        DrmStore.Audio._ID, DrmStore.Audio.TITLE,
        "\"" + DrmStore.Audio.CONTENT_URI + "\"",
        "null"
        "\"" + DrmStore.Audio.CONTENT_URI + "/\" || " + DrmStore.Audio._ID
    };

    private static final String[] MEDIA_COLUMNS = new String[] {
        MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
        "\"" + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "\"",
        "null"
    };

    private static final String[] THEME_COLUMNS = new String[] {
        MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
        "\"" + Uri.parse("content://" + THEME_AUTHORITY + "/ringtone") + "\"",
        "package"
        "\"" + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "/\" || " + MediaStore.Audio.Media._ID
    };

    /**
@@ -236,10 +229,12 @@ public class RingtoneManager {
    public static final int URI_COLUMN_INDEX = 2;

    /**
     * Optional part to append to the final URI.
     * Full uri, rather than just the root stem of the Uri prior to
     * concatenation of the id.
     * 
     * @hide
     */
    public static final int URI_PART_COLUMN_INDEX = 3;
    public static final int URI_FULL_COLUMN_INDEX = 3;

    private Activity mActivity;
    private Context mContext;
@@ -393,9 +388,10 @@ public class RingtoneManager {
        final Cursor internalCursor = getInternalRingtones();
        final Cursor drmCursor = mIncludeDrm ? getDrmRingtones() : null;
        final Cursor mediaCursor = getMediaRingtones();
        final Cursor themeCursor = getThemeManagerRingtones();
        final Cursor[] themeCursor = getThemeManagerRingtones();

        return mCursor = new SortCursor(new Cursor[] { internalCursor, drmCursor, mediaCursor, themeCursor },
        return mCursor = new SortCursor(new Cursor[] { internalCursor, drmCursor, mediaCursor,
                themeCursor[0], themeCursor[1] },
                MediaStore.MediaColumns.TITLE);
    }

@@ -431,21 +427,8 @@ public class RingtoneManager {
        return getUriFromCursor(cursor);
    }

    private static Uri getUriFromCursor(Uri baseUri, Cursor cursor) {
        Uri.Builder builder = baseUri.buildUpon();

        String uriPartString = cursor.getString(URI_PART_COLUMN_INDEX);
        if (uriPartString != null) {
            builder.appendPath(uriPartString);
        }

        builder.appendEncodedPath(String.valueOf(cursor.getLong(ID_COLUMN_INDEX)));

        return builder.build();
    }

    private static Uri getUriFromCursor(Cursor cursor) {
        return getUriFromCursor(Uri.parse(cursor.getString(URI_COLUMN_INDEX)), cursor);
        return Uri.parse(cursor.getString(URI_FULL_COLUMN_INDEX));
    }

    /**
@@ -465,22 +448,12 @@ public class RingtoneManager {
            return -1;
        }
        
        // Only create Uri objects when the actual URI changes
        Uri currentUri = null;
        String previousUriString = null;
        for (int i = 0; i < cursorCount; i++) {
            String uriString = cursor.getString(URI_COLUMN_INDEX);
            if (currentUri == null || !uriString.equals(previousUriString)) {
                currentUri = Uri.parse(uriString);
            }

            if (ringtoneUri.equals(getUriFromCursor(currentUri, cursor))) {
            if (ringtoneUri.equals(getUriFromCursor(cursor))) {
                return i;
            }
            
            cursor.move(1);
            
            previousUriString = uriString;
        }
        
        return -1;
@@ -507,7 +480,15 @@ public class RingtoneManager {
        }
        
        if (uri == null) {
            uri = getValidRingtoneUriFromCursorAndClose(context, rm.getThemeManagerRingtones());
            Cursor[] cursors = rm.getThemeManagerRingtones();
            if (cursors != null) {
                for (Cursor cursor: cursors) {
                    uri = getValidRingtoneUriFromCursorAndClose(context, cursor);
                    if (uri != null) {
                        break;
                    }
                }
            }
        }

        return uri;
@@ -555,15 +536,31 @@ public class RingtoneManager {
                : null;
    }

    private Cursor getThemeManagerRingtones() {
        String clause = constructBooleanTrueWhereClause(mFilterColumns);
        if (!mIncludeDrm) {
            // filter out DRM-protected resources
            clause = clause + " and is_drm=0";
    private String getThemeWhereClause(String uriColumn) {
        String clause = uriColumn + " IS NOT NULL";
        if (mIncludeDrm) {
            return clause;
        } else {
            return clause + " AND " + uriColumn + " NOT LIKE '%/assets/%locked%'";
        }
        return query(
                Uri.parse("content://" + THEME_AUTHORITY + "/ringtones"), THEME_COLUMNS,
                clause, null, null);
    }

    private Cursor[] getThemeManagerRingtones() {
        Cursor[] cursors = new Cursor[2];

        if ((mType & TYPE_RINGTONE) != 0) {
            cursors[0] = query(Uri.parse("content://com.tmobile.thememanager.themes/themes"),
                    new String[] { "_id", "ringtone_name AS title", "null", "ringtone_uri" }, 
                    getThemeWhereClause("ringtone_uri"), null, "title");
        }

        if ((mType & TYPE_NOTIFICATION) != 0) {
            cursors[1] = query(Uri.parse("content://com.tmobile.thememanager.themes/themes"),
                    new String[] { "_id", "notif_ringtone_name AS title", "null", "notif_ringtone_name" },
                    getThemeWhereClause("notif_ringtone_uri"), null, "title");
        }

        return cursors;
    }

    private void setFilterColumnsList(int type) {