package com.ideabag.playtunes.service;
import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.MediaMetadataRetriever;
import android.media.RemoteControlClient;
import android.provider.MediaStore;
import com.ideabag.playtunes.R;
import com.ideabag.playtunes.database.MediaQuery;
import com.ideabag.playtunes.media.MusicIntentReceiver;
import com.ideabag.playtunes.media.RemoteControlClientCompat;
import com.ideabag.playtunes.media.RemoteControlClientCompat.MetadataEditorCompat;
import com.ideabag.playtunes.media.RemoteControlHelper;
public class LockscreenManager {
public static final String TAG = "LockscreenManager";
private Context mContext;
private String mAlbumArtUri = null;
private String media_id = null;
private boolean isPlaying = false;
// our RemoteControlClient object, which will use remote control APIs available in
// SDK level >= 14, if they're available.
RemoteControlClientCompat mRemoteControlClientCompat = null;
// The component name of MusicIntentReceiver, for use with media button and remote control
// APIs
ComponentName mMediaButtonReceiverComponent;
private AudioManager mAudioManager;
public LockscreenManager( Context context ) {
if ( android.os.Build.VERSION.SDK_INT >= 14 ) {
if ( mRemoteControlClientCompat == null ) {
mContext = context;
mAudioManager = ( AudioManager ) mContext.getSystemService( Context.AUDIO_SERVICE );
mMediaButtonReceiverComponent = new ComponentName( mContext, MusicIntentReceiver.class );
//MediaButtonHelper.registerMediaButtonEventReceiverCompat( mAudioManager, mMediaButtonReceiverComponent );
Intent intent = new Intent( Intent.ACTION_MEDIA_BUTTON );
intent.setComponent( mMediaButtonReceiverComponent );
//intent.setAction( );
mRemoteControlClientCompat = new RemoteControlClientCompat(
PendingIntent.getBroadcast(mContext /*context*/,
0 /*requestCode, ignored*/, intent /*intent*/, 0 /*flags*/));
RemoteControlHelper.registerRemoteControlClient( mAudioManager, mRemoteControlClientCompat );
}
}
}
@SuppressLint("InlinedApi")
public void play() {
if ( null != mRemoteControlClientCompat ) {
mRemoteControlClientCompat.setPlaybackState( RemoteControlClient.PLAYSTATE_PLAYING );
}
isPlaying = true;
}
@SuppressLint("InlinedApi")
public void pause() {
if ( null != mRemoteControlClientCompat ) {
mRemoteControlClientCompat.setPlaybackState( RemoteControlClient.PLAYSTATE_PAUSED );
}
isPlaying = false;
}
public void remove() {
if ( null != mRemoteControlClientCompat ) {
RemoteControlHelper.unregisterRemoteControlClient( mAudioManager, mRemoteControlClientCompat );
//MediaButtonHelper.unregisterMediaButtonEventReceiverCompat( mAudioManager, mMediaButtonReceiverComponent );
mRemoteControlClientCompat = null;
}
}
public boolean ready() {
return ( null != mRemoteControlClientCompat );
}
@SuppressLint("InlinedApi")
public void setMediaID( String id, boolean prev, boolean next ) {
if ( null != mRemoteControlClientCompat && id != null && !id.equals( media_id ) ) {
media_id = id;
MediaQuery mSongQuery = new MediaQuery(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] {
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ALBUM_ID,
},
MediaStore.Audio.Media._ID + "=?",
new String[] {
media_id
},
null
);
MediaQuery.executeAsync( mContext, mSongQuery, mCurrentSongQueryListener );
int mFlags = RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE;
if ( next ) {
mFlags |= RemoteControlClient.FLAG_KEY_MEDIA_NEXT;
}
if ( prev ) {
mFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS;
}
mRemoteControlClientCompat.setTransportControlFlags( mFlags );
// Update the remote controls
}
}
MediaQuery.OnQueryCompletedListener mCurrentSongQueryListener = new MediaQuery.OnQueryCompletedListener() {
@SuppressLint("InlinedApi")
@Override public void onQueryCompleted( MediaQuery mQuery, Cursor mResult ) {
mResult.moveToFirst();
String mSongTitle = mResult.getString( mResult.getColumnIndex(MediaStore.Audio.Media.TITLE ) );
String mSongAlbum = mResult.getString( mResult.getColumnIndex(MediaStore.Audio.Media.ALBUM ) );
String mSongArtist = mResult.getString( mResult.getColumnIndex(MediaStore.Audio.Media.ARTIST ) );
String album_id = mResult.getString( mResult.getColumnIndexOrThrow( MediaStore.Audio.Media.ALBUM_ID ) );
mResult.close();
MetadataEditorCompat mMetadataEditor;
mMetadataEditor = mRemoteControlClientCompat.editMetadata( true );
mMetadataEditor.putString( MediaMetadataRetriever.METADATA_KEY_ARTIST, mSongArtist );
mMetadataEditor.putString( MediaMetadataRetriever.METADATA_KEY_ALBUM, mSongAlbum );
mMetadataEditor.putString( MediaMetadataRetriever.METADATA_KEY_TITLE, mSongTitle );
mMetadataEditor.apply();
//
// Don't judge me!
//
//
mMetadataEditor = mRemoteControlClientCompat.editMetadata( true );
mMetadataEditor.putString( MediaMetadataRetriever.METADATA_KEY_ARTIST, mSongArtist );
mMetadataEditor.putString( MediaMetadataRetriever.METADATA_KEY_ALBUM, mSongAlbum );
mMetadataEditor.putString( MediaMetadataRetriever.METADATA_KEY_TITLE, mSongTitle );
mMetadataEditor.apply();
MediaQuery mAlbumArtQuery = new MediaQuery(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[] {
MediaStore.Audio.Albums.ALBUM_ART,
MediaStore.Audio.Albums._ID
},
MediaStore.Audio.Albums._ID + "=?",
new String[] {
album_id
},
null
);
MediaQuery.executeAsync( mContext, mAlbumArtQuery, new MediaQuery.OnQueryCompletedListener() {
@Override public void onQueryCompleted( MediaQuery mQuery, Cursor mResult ) {
mResult.moveToFirst();
String newAlbumUri = mResult.getString( mResult.getColumnIndexOrThrow( MediaStore.Audio.Albums.ALBUM_ART ) );
mResult.close();
MetadataEditorCompat mMetadataEditor = mRemoteControlClientCompat.editMetadata( false );
try {
Bitmap mAlbumArtBitmap = null;
if ( null == newAlbumUri ) {
mAlbumArtBitmap = BitmapFactory.decodeResource( mContext.getResources(), R.drawable.no_album_art_full );
mMetadataEditor.putBitmap( RemoteControlClientCompat.MetadataEditorCompat.METADATA_KEY_ARTWORK, mAlbumArtBitmap );
} else if ( !newAlbumUri.equals( mAlbumArtUri ) ) {
mAlbumArtBitmap = BitmapFactory.decodeFile( newAlbumUri );
mMetadataEditor.putBitmap( RemoteControlClientCompat.MetadataEditorCompat.METADATA_KEY_ARTWORK, mAlbumArtBitmap );
}
mMetadataEditor.apply();
} catch (Exception e) {
e.printStackTrace();
}
}
});
if ( isPlaying ) {
mRemoteControlClientCompat.setPlaybackState( RemoteControlClient.PLAYSTATE_PLAYING );
} else {
mRemoteControlClientCompat.setPlaybackState( RemoteControlClient.PLAYSTATE_PAUSED );
}
}
};
}