/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.service; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.util.JsonReader; import android.util.Log; import com.galaxy.meetup.client.android.Intents; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.network.http.DefaultHttpRequestConfiguration; import com.galaxy.meetup.client.android.network.http.HttpOperation; import com.galaxy.meetup.client.android.network.http.HttpOperation.OperationListener; import com.galaxy.meetup.client.android.service.ServiceThread.IntentProcessor; import com.galaxy.meetup.client.util.EsLog; /** * * @author sihai * */ public class SkyjamPlaybackService extends Service implements OnBufferingUpdateListener, OnCompletionListener, OnErrorListener, OnPreparedListener, OperationListener, IntentProcessor { private static EsAccount sAccount; private static String sActivityId; private static int sCurrentTime; private static List sListeners = new ArrayList(); private static String sMusicUrl; private static String sSongName; private static String sStatus; private static int sTotalPlayableTime; private Handler mHandler; private MediaPlayer mMediaPlayer; private NotificationManager mNotificationManager; private ServiceThread mServiceThread; private final Runnable mUpdateTimeRunnable = new Runnable() { public final void run() { if(mMediaPlayer != null && mMediaPlayer.isPlaying() && mMediaPlayer.getCurrentPosition() < SkyjamPlaybackService.sTotalPlayableTime) { SkyjamPlaybackService.sCurrentTime = mMediaPlayer.getCurrentPosition(); SkyjamPlaybackService skyjamplaybackservice = SkyjamPlaybackService.this; int i = R.string.skyjam_status_playing; Object aobj[] = new Object[2]; aobj[0] = getTimeString(SkyjamPlaybackService.sCurrentTime); aobj[1] = getTimeString(SkyjamPlaybackService.sTotalPlayableTime); SkyjamPlaybackService.sStatus = skyjamplaybackservice.getString(i, aobj); } else { SkyjamPlaybackService.sStatus = getString(R.string.skyjam_status_stopped); } dispatchStatusUpdate(); mHandler.postDelayed(this, 1000L); } }; public SkyjamPlaybackService() { } private void dispatchStatusUpdate() { final String musicUrl = sMusicUrl; final boolean playing; final String status; if(musicUrl != null && mMediaPlayer != null) playing = true; else playing = false; status = sStatus; mHandler.post(new Runnable() { public final void run() { for(Iterator iterator = SkyjamPlaybackService.sListeners.iterator(); iterator.hasNext(); ((SkyjamPlaybackListener)iterator.next()).onPlaybackStatusUpdate(musicUrl, playing, status)); } }); } public static String getPlaybackStatus(Context context, String s) { String s1; if(sMusicUrl != null && sMusicUrl.equals(s) && sStatus != null) s1 = sStatus; else s1 = context.getString(R.string.skyjam_status_stopped); return s1; } private String getTimeString(int i) { int j = i / 1000; int k = j / 60; int l = j % 60; int i1 = R.string.skyjam_time_formatting; Object aobj[] = new Object[2]; aobj[0] = Integer.valueOf(k); aobj[1] = Integer.valueOf(l); return getString(i1, aobj); } public static boolean isPlaying(String s) { boolean flag; if(sMusicUrl != null && sMusicUrl.equals(s)) flag = true; else flag = false; return flag; } public static void logOut(Context context) { if(sMusicUrl != null) { Intent intent = new Intent(context, SkyjamPlaybackService.class); intent.setAction("com.google.android.apps.plus.service.SkyjamPlaybackService.STOP"); intent.putExtra("music_account", sAccount); intent.putExtra("music_url", sMusicUrl); intent.putExtra("song", sSongName); intent.putExtra("activity_id", sActivityId); context.startService(intent); } } public static void registerListener(SkyjamPlaybackListener skyjamplaybacklistener) { sListeners.add(skyjamplaybacklistener); } private void stop() { mHandler.removeCallbacks(mUpdateTimeRunnable); if(mMediaPlayer != null) { if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", "stop"); if(mMediaPlayer.isPlaying()) mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } sStatus = getString(R.string.skyjam_status_stopped); dispatchStatusUpdate(); sMusicUrl = null; sSongName = null; sAccount = null; sActivityId = null; sCurrentTime = 0; sTotalPlayableTime = 0; mNotificationManager.cancel(27312); } public static void unregisterListener(SkyjamPlaybackListener skyjamplaybacklistener) { sListeners.remove(skyjamplaybacklistener); } public IBinder onBind(Intent intent) { return null; } public void onBufferingUpdate(MediaPlayer mediaplayer, int i) { if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", (new StringBuilder("buffering: ")).append(i).append("%").toString()); } public void onCompletion(MediaPlayer mediaplayer) { if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", "completion"); stop(); stopSelf(); } public void onCreate() { super.onCreate(); mNotificationManager = (NotificationManager)getSystemService("notification"); sStatus = getString(R.string.skyjam_status_stopped); mHandler = new Handler(Looper.getMainLooper()); mServiceThread = new ServiceThread(mHandler, "SkyjamServiceThread", this); mServiceThread.start(); } public void onDestroy() { super.onDestroy(); if(mServiceThread != null) { mServiceThread.quit(); mServiceThread = null; } } public boolean onError(MediaPlayer mediaplayer, int i, int j) { if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", (new StringBuilder("error: what=")).append(i).append(", extra=").append(j).toString()); stop(); stopSelf(); return true; } public final void onOperationComplete(HttpOperation httpoperation) { int i; String s; String s1; if(httpoperation.hasError() || mMediaPlayer == null) { return; } i = 0; s = null; s1 = null; String s2 = httpoperation.getOutputStream().toString(); if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", (new StringBuilder("Received server response: ")).append(s2).toString()); try { JsonReader jsonreader = new JsonReader(new StringReader(s2)); jsonreader.beginObject(); while(jsonreader.hasNext()) { String s3 = jsonreader.nextName(); if(s3.equals("durationMillis")) i = jsonreader.nextInt(); else if(s3.equals("playType")) s = jsonreader.nextString().toLowerCase(); else if(s3.equals("url")) s1 = jsonreader.nextString(); else jsonreader.skipValue(); } jsonreader.endObject(); sTotalPlayableTime = i; if(s != null && !s.equals("full") && s.endsWith("sp")) { sTotalPlayableTime = 1000 * Integer.parseInt(s.substring(0, -2 + s.length())); } if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", (new StringBuilder("Total playable time set to ")).append(sTotalPlayableTime).append(" ms").toString()); try { if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", "play"); mMediaPlayer.setAudioStreamType(3); mMediaPlayer.setLooping(false); mMediaPlayer.setDataSource(s1); mMediaPlayer.prepareAsync(); sStatus = getString(R.string.skyjam_status_buffering); dispatchStatusUpdate(); } catch(IOException ioexception1) { } stop(); } catch (IOException e) { // TODO } } public void onPrepared(MediaPlayer mediaplayer) { if(EsLog.isLoggable("SkyjamPlaybackService", 3)) Log.d("SkyjamPlaybackService", "prepared"); if(mediaplayer == mMediaPlayer) { mMediaPlayer.start(); int i = R.string.skyjam_status_playing; Object aobj[] = new Object[2]; aobj[0] = getTimeString(sCurrentTime); aobj[1] = getTimeString(sTotalPlayableTime); sStatus = getString(i, aobj); dispatchStatusUpdate(); mHandler.postDelayed(mUpdateTimeRunnable, 1000L); int j = R.string.skyjam_notification_playing_song; Object aobj1[] = new Object[1]; aobj1[0] = sSongName; String s = getString(j, aobj1); String s1 = getString(R.string.skyjam_notification_playing_song_title); int k = R.string.skyjam_notification_playing_song_subtitle; Object aobj2[] = new Object[1]; aobj2[0] = sSongName; String s2 = getString(k, aobj2); Notification notification = new Notification(R.mipmap.icon, s, System.currentTimeMillis()); notification.setLatestEventInfo(this, s1, s2, PendingIntent.getActivity(this, 0, Intents.getPostCommentsActivityIntent(this, sAccount, sActivityId), 0x8000000)); notification.flags = 2 | notification.flags; mNotificationManager.notify(27312, notification); } } public final void onServiceThreadEnd() { stop(); } public int onStartCommand(Intent intent, int i, int j) { if(intent != null) mServiceThread.put(intent); return 1; } public final void processIntent(Intent intent) { String s = intent.getAction(); if(null == s) { return; } if(s.equals("com.google.android.apps.plus.service.SkyjamPlaybackService.PLAY")) { String s2 = intent.getStringExtra("music_url"); if(s2 != null && !s2.equals(sMusicUrl)) { if(sMusicUrl != null) stop(); sAccount = (EsAccount)intent.getParcelableExtra("music_account"); sMusicUrl = intent.getStringExtra("music_url"); sSongName = intent.getStringExtra("song"); sActivityId = intent.getStringExtra("activity_id"); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.setOnPreparedListener(this); sStatus = getString(R.string.skyjam_status_connecting); dispatchStatusUpdate(); (new HttpOperation(this, "GET", sMusicUrl, new DefaultHttpRequestConfiguration(this, sAccount, "sj"), sAccount, new ByteArrayOutputStream(2048), null, this)).startThreaded(); } } else if(s.equals("com.google.android.apps.plus.service.SkyjamPlaybackService.STOP")) { String s1 = intent.getStringExtra("music_url"); if(s1 != null && s1.equals(sMusicUrl)) { stop(); stopSelf(); } } } public static interface SkyjamPlaybackListener { void onPlaybackStatusUpdate(String s, boolean flag, String s1); } }