soul-browser/sources/java/android/support/v4/media/MediaDescriptionCompat.java
KaKi87 550ddb0413
Decompile and recreate Soul Browser v1.4.85 with APK CI builds (#1)
* Decompile and recreate Soul Browser v1.4.85 with APK CI builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix CI build: include bundled google.jks and remove PR trigger

The apktool build failed in CI because app/unknown/.../google.jks was
excluded by the *.jks gitignore rule. Whitelist app-bundled JKS files
and commit the missing resource.

Also remove the redundant pull_request workflow trigger.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Change package ID to com.github.kaki87.soulbrowser

Rename the application ID so the rebuilt APK can be installed
alongside the original Soul Browser from Google Play.

- Update AndroidManifest package, permissions, providers, and actions
- Update R class references in smali (com/github/kaki87/soulbrowser/R)
- Update shortcuts.xml targetPackage
- Rename app label to "Soul Rebuild" for easy identification

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install compatibility: remove split APK metadata and bundle native libs

The rebuilt APK still declared requiredSplitTypes and Play Store split
metadata, causing Android to reject standalone installs as incompatible.

- Remove requiredSplitTypes and split-related manifest meta-data
- Merge native libs from all ABI splits with uncompressed storage
- Page-align before signing for extractNativeLibs=false
- Add .so to apktool doNotCompress list

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install failure: use apksigner v2/v3 and bundle arm64 native libs

Target SDK 36 requires APK Signature Scheme v2+, but jarsigner only
produces v1 signatures, causing Android to reject the install.

- Sign with apksigner (v1+v2+v3) instead of jarsigner
- Add arm64-v8a native libraries from universal Soul Browser 1.4.79
- Set extractNativeLibs=true for reliable sideload installs
- Commit stable debug keystore for consistent signatures across builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Add committed debug keystore for consistent APK signatures

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix startup crash: use original classes2.dex desugar libraries

Apktool recompiles smali_classes2 into a broken classes2.dex, causing
ClassNotFoundException for j$.com.android.tools.r8.a at ML Kit init.

Inject the original classes2.dex (Java 8+ desugar libs) after apktool
build instead of using the recompiled version.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix missing drawable resources from density split APKs

The base APK is an app bundle module; density-specific drawables like
seek_thumb_nor_b live in config.xhdpi.apk and were missing after rebuild,
causing Resources$NotFoundException at runtime.

- Merge non-9-patch resources from split APKs before apktool build
- Sync public.xml IDs from R smali only when backing files exist
- Add 713 density-specific resource IDs to public.xml

Co-authored-by: KaKi87 <KaKi87@pm.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-10 16:07:14 +02:00

392 lines
14 KiB
Java

package android.support.v4.media;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.media.MediaDescription;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import androidx.annotation.DoNotInline;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
@SuppressLint({"BanParcelableUsage"})
/* loaded from: classes.dex */
public final class MediaDescriptionCompat implements Parcelable {
public static final long BT_FOLDER_TYPE_ALBUMS = 2;
public static final long BT_FOLDER_TYPE_ARTISTS = 3;
public static final long BT_FOLDER_TYPE_GENRES = 4;
public static final long BT_FOLDER_TYPE_MIXED = 0;
public static final long BT_FOLDER_TYPE_PLAYLISTS = 5;
public static final long BT_FOLDER_TYPE_TITLES = 1;
public static final long BT_FOLDER_TYPE_YEARS = 6;
public static final Parcelable.Creator<MediaDescriptionCompat> CREATOR = new Parcelable.Creator<MediaDescriptionCompat>() { // from class: android.support.v4.media.MediaDescriptionCompat.1
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public MediaDescriptionCompat createFromParcel(Parcel parcel) {
return MediaDescriptionCompat.fromMediaDescription(MediaDescription.CREATOR.createFromParcel(parcel));
}
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public MediaDescriptionCompat[] newArray(int i) {
return new MediaDescriptionCompat[i];
}
};
@RestrictTo
public static final String DESCRIPTION_KEY_MEDIA_URI = "android.support.v4.media.description.MEDIA_URI";
@RestrictTo
public static final String DESCRIPTION_KEY_NULL_BUNDLE_FLAG = "android.support.v4.media.description.NULL_BUNDLE_FLAG";
public static final String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
public static final String EXTRA_DOWNLOAD_STATUS = "android.media.extra.DOWNLOAD_STATUS";
public static final long STATUS_DOWNLOADED = 2;
public static final long STATUS_DOWNLOADING = 1;
public static final long STATUS_NOT_DOWNLOADED = 0;
private static final String TAG = "MediaDescriptionCompat";
private final CharSequence mDescription;
private MediaDescription mDescriptionFwk;
private final Bundle mExtras;
private final Bitmap mIcon;
private final Uri mIconUri;
private final String mMediaId;
private final Uri mMediaUri;
private final CharSequence mSubtitle;
private final CharSequence mTitle;
@RequiresApi
/* loaded from: classes.dex */
public static class Api21Impl {
private Api21Impl() {
}
@DoNotInline
public static MediaDescription build(MediaDescription.Builder builder) {
return builder.build();
}
@DoNotInline
public static MediaDescription.Builder createBuilder() {
return new MediaDescription.Builder();
}
@Nullable
@DoNotInline
public static CharSequence getDescription(MediaDescription mediaDescription) {
return mediaDescription.getDescription();
}
@Nullable
@DoNotInline
public static Bundle getExtras(MediaDescription mediaDescription) {
return mediaDescription.getExtras();
}
@Nullable
@DoNotInline
public static Bitmap getIconBitmap(MediaDescription mediaDescription) {
return mediaDescription.getIconBitmap();
}
@Nullable
@DoNotInline
public static Uri getIconUri(MediaDescription mediaDescription) {
return mediaDescription.getIconUri();
}
@Nullable
@DoNotInline
public static String getMediaId(MediaDescription mediaDescription) {
return mediaDescription.getMediaId();
}
@Nullable
@DoNotInline
public static CharSequence getSubtitle(MediaDescription mediaDescription) {
return mediaDescription.getSubtitle();
}
@Nullable
@DoNotInline
public static CharSequence getTitle(MediaDescription mediaDescription) {
return mediaDescription.getTitle();
}
@DoNotInline
public static void setDescription(MediaDescription.Builder builder, @Nullable CharSequence charSequence) {
builder.setDescription(charSequence);
}
@DoNotInline
public static void setExtras(MediaDescription.Builder builder, @Nullable Bundle bundle) {
builder.setExtras(bundle);
}
@DoNotInline
public static void setIconBitmap(MediaDescription.Builder builder, @Nullable Bitmap bitmap) {
builder.setIconBitmap(bitmap);
}
@DoNotInline
public static void setIconUri(MediaDescription.Builder builder, @Nullable Uri uri) {
builder.setIconUri(uri);
}
@DoNotInline
public static void setMediaId(MediaDescription.Builder builder, @Nullable String str) {
builder.setMediaId(str);
}
@DoNotInline
public static void setSubtitle(MediaDescription.Builder builder, @Nullable CharSequence charSequence) {
builder.setSubtitle(charSequence);
}
@DoNotInline
public static void setTitle(MediaDescription.Builder builder, @Nullable CharSequence charSequence) {
builder.setTitle(charSequence);
}
}
@RequiresApi
/* loaded from: classes.dex */
public static class Api23Impl {
private Api23Impl() {
}
@Nullable
@DoNotInline
public static Uri getMediaUri(MediaDescription mediaDescription) {
return mediaDescription.getMediaUri();
}
@DoNotInline
public static void setMediaUri(MediaDescription.Builder builder, @Nullable Uri uri) {
builder.setMediaUri(uri);
}
}
/* loaded from: classes.dex */
public static final class Builder {
private CharSequence mDescription;
private Bundle mExtras;
private Bitmap mIcon;
private Uri mIconUri;
private String mMediaId;
private Uri mMediaUri;
private CharSequence mSubtitle;
private CharSequence mTitle;
public MediaDescriptionCompat build() {
return new MediaDescriptionCompat(this.mMediaId, this.mTitle, this.mSubtitle, this.mDescription, this.mIcon, this.mIconUri, this.mExtras, this.mMediaUri);
}
public Builder setDescription(@Nullable CharSequence charSequence) {
this.mDescription = charSequence;
return this;
}
public Builder setExtras(@Nullable Bundle bundle) {
this.mExtras = bundle;
return this;
}
public Builder setIconBitmap(@Nullable Bitmap bitmap) {
this.mIcon = bitmap;
return this;
}
public Builder setIconUri(@Nullable Uri uri) {
this.mIconUri = uri;
return this;
}
public Builder setMediaId(@Nullable String str) {
this.mMediaId = str;
return this;
}
public Builder setMediaUri(@Nullable Uri uri) {
this.mMediaUri = uri;
return this;
}
public Builder setSubtitle(@Nullable CharSequence charSequence) {
this.mSubtitle = charSequence;
return this;
}
public Builder setTitle(@Nullable CharSequence charSequence) {
this.mTitle = charSequence;
return this;
}
}
public MediaDescriptionCompat(String str, CharSequence charSequence, CharSequence charSequence2, CharSequence charSequence3, Bitmap bitmap, Uri uri, Bundle bundle, Uri uri2) {
this.mMediaId = str;
this.mTitle = charSequence;
this.mSubtitle = charSequence2;
this.mDescription = charSequence3;
this.mIcon = bitmap;
this.mIconUri = uri;
this.mExtras = bundle;
this.mMediaUri = uri2;
}
/* JADX WARN: Removed duplicated region for block: B:16:0x0068 */
/* JADX WARN: Removed duplicated region for block: B:20:0x006c */
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object r8) {
/*
r0 = 0
if (r8 == 0) goto L79
android.support.v4.media.MediaDescriptionCompat$Builder r1 = new android.support.v4.media.MediaDescriptionCompat$Builder
r1.<init>()
android.media.MediaDescription r8 = (android.media.MediaDescription) r8
java.lang.String r2 = android.support.v4.media.MediaDescriptionCompat.Api21Impl.getMediaId(r8)
r1.setMediaId(r2)
java.lang.CharSequence r2 = android.support.v4.media.MediaDescriptionCompat.Api21Impl.getTitle(r8)
r1.setTitle(r2)
java.lang.CharSequence r2 = android.support.v4.media.MediaDescriptionCompat.Api21Impl.getSubtitle(r8)
r1.setSubtitle(r2)
java.lang.CharSequence r2 = android.support.v4.media.MediaDescriptionCompat.Api21Impl.getDescription(r8)
r1.setDescription(r2)
android.graphics.Bitmap r2 = android.support.v4.media.MediaDescriptionCompat.Api21Impl.getIconBitmap(r8)
r1.setIconBitmap(r2)
android.net.Uri r2 = android.support.v4.media.MediaDescriptionCompat.Api21Impl.getIconUri(r8)
r1.setIconUri(r2)
android.os.Bundle r2 = android.support.v4.media.MediaDescriptionCompat.Api21Impl.getExtras(r8)
if (r2 == 0) goto L3e
android.os.Bundle r2 = android.support.v4.media.session.MediaSessionCompat.unparcelWithClassLoader(r2)
L3e:
java.lang.String r3 = "android.support.v4.media.description.MEDIA_URI"
if (r2 == 0) goto L49
android.os.Parcelable r4 = r2.getParcelable(r3)
android.net.Uri r4 = (android.net.Uri) r4
goto L4a
L49:
r4 = r0
L4a:
if (r4 == 0) goto L62
java.lang.String r5 = "android.support.v4.media.description.NULL_BUNDLE_FLAG"
boolean r6 = r2.containsKey(r5)
if (r6 == 0) goto L5c
int r6 = r2.size()
r7 = 2
if (r6 != r7) goto L5c
goto L63
L5c:
r2.remove(r3)
r2.remove(r5)
L62:
r0 = r2
L63:
r1.setExtras(r0)
if (r4 == 0) goto L6c
r1.setMediaUri(r4)
goto L73
L6c:
android.net.Uri r0 = android.support.v4.media.MediaDescriptionCompat.Api23Impl.getMediaUri(r8)
r1.setMediaUri(r0)
L73:
android.support.v4.media.MediaDescriptionCompat r0 = r1.build()
r0.mDescriptionFwk = r8
L79:
return r0
*/
throw new UnsupportedOperationException("Method not decompiled: android.support.v4.media.MediaDescriptionCompat.fromMediaDescription(java.lang.Object):android.support.v4.media.MediaDescriptionCompat");
}
@Override // android.os.Parcelable
public int describeContents() {
return 0;
}
@Nullable
public CharSequence getDescription() {
return this.mDescription;
}
@Nullable
public Bundle getExtras() {
return this.mExtras;
}
@Nullable
public Bitmap getIconBitmap() {
return this.mIcon;
}
@Nullable
public Uri getIconUri() {
return this.mIconUri;
}
public Object getMediaDescription() {
MediaDescription mediaDescription = this.mDescriptionFwk;
if (mediaDescription == null) {
MediaDescription.Builder createBuilder = Api21Impl.createBuilder();
Api21Impl.setMediaId(createBuilder, this.mMediaId);
Api21Impl.setTitle(createBuilder, this.mTitle);
Api21Impl.setSubtitle(createBuilder, this.mSubtitle);
Api21Impl.setDescription(createBuilder, this.mDescription);
Api21Impl.setIconBitmap(createBuilder, this.mIcon);
Api21Impl.setIconUri(createBuilder, this.mIconUri);
Api21Impl.setExtras(createBuilder, this.mExtras);
Api23Impl.setMediaUri(createBuilder, this.mMediaUri);
MediaDescription build = Api21Impl.build(createBuilder);
this.mDescriptionFwk = build;
return build;
}
return mediaDescription;
}
@Nullable
public String getMediaId() {
return this.mMediaId;
}
@Nullable
public Uri getMediaUri() {
return this.mMediaUri;
}
@Nullable
public CharSequence getSubtitle() {
return this.mSubtitle;
}
@Nullable
public CharSequence getTitle() {
return this.mTitle;
}
public String toString() {
return ((Object) this.mTitle) + ", " + ((Object) this.mSubtitle) + ", " + ((Object) this.mDescription);
}
@Override // android.os.Parcelable
public void writeToParcel(Parcel parcel, int i) {
((MediaDescription) getMediaDescription()).writeToParcel(parcel, i);
}
public MediaDescriptionCompat(Parcel parcel) {
this.mMediaId = parcel.readString();
Parcelable.Creator creator = TextUtils.CHAR_SEQUENCE_CREATOR;
this.mTitle = (CharSequence) creator.createFromParcel(parcel);
this.mSubtitle = (CharSequence) creator.createFromParcel(parcel);
this.mDescription = (CharSequence) creator.createFromParcel(parcel);
ClassLoader classLoader = MediaDescriptionCompat.class.getClassLoader();
this.mIcon = (Bitmap) parcel.readParcelable(classLoader);
this.mIconUri = (Uri) parcel.readParcelable(classLoader);
this.mExtras = parcel.readBundle(classLoader);
this.mMediaUri = (Uri) parcel.readParcelable(classLoader);
}
}