/* * Copyright (C) 2013 by Alexander Leontev * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.woodblockwithoutco.remotemetadataprovider.internal; import java.util.ArrayList; import java.util.List; import com.woodblockwithoutco.remotemetadataprovider.media.RemoteMetadataProvider; import com.woodblockwithoutco.remotemetadataprovider.media.enums.PlayState; import com.woodblockwithoutco.remotemetadataprovider.media.enums.RemoteControlFeature; import android.app.PendingIntent; import android.graphics.Bitmap; import android.media.MediaMetadataRetriever; import android.media.RemoteControlClient; import android.os.Bundle; import android.os.Handler; import android.os.Message; /** * Implementation of Handler.Callback interface to transfer necessary data to * RemoteMetadataProvider. Shouldn't be used explicitly by user. */ public class MetadataUpdaterCallback implements Handler.Callback { /* * Information about current client. */ private int mGenerationId; private Bitmap mPrevBitmap = null; private List<RemoteControlFeature> mFeatureList = null; private RemoteMetadataProvider mMetadataProvider; public MetadataUpdaterCallback(RemoteMetadataProvider metadataProvider) { mMetadataProvider = metadataProvider; mFeatureList = new ArrayList<RemoteControlFeature>(); } /** * @param bundle * @param key * @return Will return null if we request duration. */ private String getMetadataString(Bundle bundle, int key) { if (key != MediaMetadataRetriever.METADATA_KEY_DURATION) { return bundle.getString(String.valueOf(key)); } else { return null; } } private long getDuration(Bundle bundle) { return bundle.getLong(String.valueOf(MediaMetadataRetriever.METADATA_KEY_DURATION)); } @Override public boolean handleMessage(Message msg) { switch (msg.what) { case RemoteControlDisplay.MSG_SET_GENERATION_ID: mGenerationId = msg.arg1; mMetadataProvider.setCurrentClientPendingIntent((PendingIntent) msg.obj); return true; case RemoteControlDisplay.MSG_SET_METADATA: if (mGenerationId == msg.arg1) { if (mMetadataProvider.getOnMetadataChangeListener() != null) { Bundle metadata = (Bundle) msg.obj; mMetadataProvider.getOnMetadataChangeListener().onMetadataChanged(getMetadataString(metadata, MediaMetadataRetriever.METADATA_KEY_ARTIST), getMetadataString(metadata, MediaMetadataRetriever.METADATA_KEY_TITLE), getMetadataString(metadata, MediaMetadataRetriever.METADATA_KEY_ALBUM), getMetadataString(metadata, MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST), getDuration(metadata)); } } return true; case RemoteControlDisplay.MSG_SET_TRANSPORT_CONTROLS: if (mGenerationId == msg.arg1) { if (mMetadataProvider.getOnRemoteControlFlagsChangeListener() != null) { int flags = msg.arg2; mFeatureList.clear(); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD) == flags) mFeatureList.add(RemoteControlFeature.USES_FAST_FORWARD); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_NEXT) == flags) mFeatureList.add(RemoteControlFeature.USES_NEXT); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_PAUSE) == flags) mFeatureList.add(RemoteControlFeature.USES_PAUSE); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_PLAY) == flags) mFeatureList.add(RemoteControlFeature.USES_PLAY); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE) == flags) mFeatureList.add(RemoteControlFeature.USES_PLAY_PAUSE); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS) == flags) mFeatureList.add(RemoteControlFeature.USES_PREVIOUS); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_REWIND) == flags) mFeatureList.add(RemoteControlFeature.USES_REWIND); if ((flags | RemoteControlClient.FLAG_KEY_MEDIA_STOP) == flags) mFeatureList.add(RemoteControlFeature.USES_STOP); mMetadataProvider.getOnRemoteControlFlagsChangeListener().onFeaturesChanged(mFeatureList); } } return true; case RemoteControlDisplay.MSG_SET_ARTWORK: if (mGenerationId == msg.arg1) { if (mMetadataProvider.getOnArtworkChangeListener() != null) { if (mPrevBitmap != null) { mPrevBitmap.recycle(); } mPrevBitmap = (Bitmap) msg.obj; mMetadataProvider.getOnArtworkChangeListener().onArtworkChanged(mPrevBitmap); } } return true; case RemoteControlDisplay.MSG_UPDATE_STATE: if (mGenerationId == msg.arg1) { if (mMetadataProvider.getOnPlaybackStateChangeListener() != null) { switch (msg.arg2) { case RemoteControlClient.PLAYSTATE_BUFFERING: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.BUFFERING); break; case RemoteControlClient.PLAYSTATE_ERROR: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.ERROR); break; case RemoteControlClient.PLAYSTATE_FAST_FORWARDING: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.FAST_FORWARDING); break; case RemoteControlClient.PLAYSTATE_PAUSED: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.PAUSED); break; case RemoteControlClient.PLAYSTATE_PLAYING: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.PLAYING); break; case RemoteControlClient.PLAYSTATE_REWINDING: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.REWINDING); break; case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.SKIPPING_BACKWARDS); break; case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.SKIPPING_FORWARDS); break; case RemoteControlClient.PLAYSTATE_STOPPED: mMetadataProvider.getOnPlaybackStateChangeListener().onPlaybackStateChanged(PlayState.STOPPED); break; } } } return true; } return false; } }