[Galaxy Note II Themes and Apps] DanMc85:
Spotify - Bluetooth Metadata Mod - 0.7.1.399

I modded the newest 0.7.1.399 version of Spotify released October 11, 2013... it is working great with my Pioneer AVH-P8400BT Headunit in my car.

Since it isn't signed with Spotify's encryption keys and it is using a generic android testkey it will not let you login with facebook. If you currently can only use Facebook to sign in, go to this Spotify page and get yourself a real username and password to use for login: https://www.spotify.com/us/account/set-device-password/

Let me know if there are any issues with the modded apk, it is attached at the bottom of this post. Make sure you have your android device set to allow application installations from Unknown Sources enabled, otherwise it will not install.

I recommend to clear Spotify data and uninstall any previous Spotify version before installing this one to make sure there are no lurking issues.

This mod will NOT give you Bluetooth Metadata Info if you are running CyanogenMod or any other AOSP version of android as AVRCP is not supported on these versions at this time. However, it should work if you have a device with the new android 4.3 even if it is AOSP.... I have been told about issues, including discovering myself, that this mod currently is not working on the Samsung Galaxy Note III.

______

For those interested:

Here is the complete de-compiled and modded ...\smali\com\spotify\mobile\android\service\ag.smali file with the changes to support Bluetooth Metadata:

.class public final Lcom/spotify/mobile/android/service/ag;
.super Ljava/lang/Object;
.source "SourceFile"

# interfaces
.implements Lcom/spotify/mobile/android/util/bf;

# instance fields
.field private a:Landroid/app/Service;

.field private b:Lcom/spotify/mobile/android/util/bb;

# direct methods
.method public constructor <init>(Landroid/app/Service;Lcom/spotify/mobile/android/util/bb;)V
.locals 0
.parameter
.parameter

.prologue
.line 20
invoke-direct {p0}, Ljava/lang/Object;-><init>()V

.line 21
iput-object p1, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;

.line 22
iput-object p2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

.line 23
return-void
.end method

# virtual methods
.method public final a()V
.locals 1

.prologue
.line 26
iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v0, p0}, Lcom/spotify/mobile/android/util/bb;->a(Lcom/spotify/mobile/android/util/bf;)V

.line 27
return-void
.end method

.method public final a(I)V
.locals 0
.parameter

.prologue
.line 35
invoke-virtual {p0}, Lcom/spotify/mobile/android/service/ag;->c()V

.line 36
return-void
.end method

.method public final b()V
.locals 6

.prologue
const/4 v5, 0x0

const/4 v4, 0x0

.line 30
iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v0, p0}, Lcom/spotify/mobile/android/util/bb;->b(Lcom/spotify/mobile/android/util/bf;)V

.line 31
new-instance v0, Landroid/content/Intent;

const-string v1, "android.appwidget.action.APPWIDGET_UPDATE"

invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

new-instance v1, Landroid/content/ComponentName;

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;

const-class v3, Lcom/spotify/mobile/android/ui/widget/SpotifyWidget;

invoke-direct {v1, v2, v3}, Landroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

invoke-virtual {v0, v1}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;

const-string v1, "track_uri"

invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v1, "track_name"

invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v1, "artist_name"

invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v1, "album_name"

invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v1, "paused"

const/4 v2, 0x1

invoke-virtual {v0, v1, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

const-string v1, "cover"

invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;

const-string v1, "is_prev_enabled"

invoke-virtual {v0, v1, v5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

const-string v1, "is_next_enabled"

invoke-virtual {v0, v1, v5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

const-string v1, "is_ad_playing"

invoke-virtual {v0, v1, v5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

iget-object v1, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;

invoke-virtual {v1, v0}, Landroid/app/Service;->sendBroadcast(Landroid/content/Intent;)V

.line 32
return-void
.end method

.method public final c()V
.locals 7

.prologue
.line 39
new-instance v1, Landroid/content/Intent;

new-instance v4, Landroid/content/Intent;

const-string v5, "com.android.music.metachanged"

invoke-direct {v4, v5}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

const-string v5, "id"

const/4 v6, 0x1

invoke-virtual {v4, v5, v6}, Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;

const-string v0, "android.appwidget.action.APPWIDGET_UPDATE"

invoke-direct {v1, v0}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

.line 40
new-instance v0, Landroid/content/ComponentName;

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;

const-class v3, Lcom/spotify/mobile/android/ui/widget/SpotifyWidget;

invoke-direct {v0, v2, v3}, Landroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

invoke-virtual {v1, v0}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;

.line 42
const-string v0, "track_uri"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->c()Ljava/lang/String;

move-result-object v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

.line 43
const-string v0, "track_name"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->d()Ljava/lang/String;

move-result-object v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

.line 44
const-string v5, "track"

invoke-virtual {v4, v5, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v0, "artist_name"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->f()Ljava/lang/String;

move-result-object v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v5, "artist"

invoke-virtual {v4, v5, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

.line 45
const-string v0, "album_name"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->e()Ljava/lang/String;

move-result-object v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v5, "album"

invoke-virtual {v4, v5, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

const-string v5, "playing"

const-string v6, "JustPlaying"

invoke-virtual {v4, v5, v6}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

iget-object v5, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;

invoke-virtual {v5, v4}, Landroid/content/Context;->sendBroadcast(Landroid/content/Intent;)V

.line 46

const-string v0, "paused"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->j()Z

move-result v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

.line 48
iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v0}, Lcom/spotify/mobile/android/util/bb;->g()Landroid/graphics/Bitmap;

move-result-object v0

.line 49
if-eqz v0, :cond_0

.line 50
iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;

invoke-virtual {v2}, Landroid/app/Service;->getResources()Landroid/content/res/Resources;

move-result-object v2

const v3, 0x7f09002c

invoke-virtual {v2, v3}, Landroid/content/res/Resources;->getDimensionPixelSize(I)I

move-result v2

.line 52
invoke-virtual {v0}, Landroid/graphics/Bitmap;->isRecycled()Z

move-result v3

if-eqz v3, :cond_1

.line 53
invoke-static {}, Lcom/spotify/mobile/android/ui/SpotifyImageLoader;->a()Lcom/spotify/mobile/android/ui/SpotifyImageLoader;

invoke-static {}, Lcom/spotify/mobile/android/ui/SpotifyImageLoader;->b()V

.line 54
sget-object v0, Landroid/graphics/Bitmap$Config;->RGB_565:Landroid/graphics/Bitmap$Config;

invoke-static {v2, v2, v0}, Landroid/graphics/Bitmap;->createBitmap(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;

move-result-object v0

.line 60
:cond_0
:goto_0
const-string v2, "cover"

invoke-virtual {v1, v2, v0}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;

.line 61
const-string v0, "is_prev_enabled"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->k()Z

move-result v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

.line 62
const-string v0, "is_next_enabled"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->l()Z

move-result v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

.line 63
const-string v0, "is_ad_playing"

iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;

invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->m()Z

move-result v2

invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;

.line 64
iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;

invoke-virtual {v0, v1}, Landroid/app/Service;->sendBroadcast(Landroid/content/Intent;)V

.line 65
return-void

.line 56
:cond_1
const/4 v3, 0x1

invoke-static {v0, v2, v2, v3}, Landroid/graphics/Bitmap;->createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;

move-result-object v0

goto :goto_0
.end method

_______________

The modded recompiled apk is signed with the android testkey.

This modded version is not tied to the Google Play Store, thus it will not auto-update when a new Spotify version is released, you either have to switch back to the regular newest version manually or check back here for an updated modded version upon release.

Borrowed and Slightly Modified Original Source Code: https://github.com/loganakamatsu/SpotifyAVRCP

Disclaimer: I'm sure Spotify doesn't like us messing around with their APK's. It is probably against their TOS, so consider this for educational purposes only and don't try to redistribute or sell it.

If it works for you don't forget to click thanks! and feel free to make a donation if interested, link below.