eu.codebits.plasmas.services.PlayerService.java Source code

Java tutorial

Introduction

Here is the source code for eu.codebits.plasmas.services.PlayerService.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package eu.codebits.plasmas.services;

import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.util.Base64;
import android.util.Log;
import eu.codebits.plasmas.FullScreenWebViewActivity;
import eu.codebits.plasmas.R;
import eu.codebits.plasmas.receivers.PlayerReceiver;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author rcarmo
 */
public class PlayerService extends IntentService {

    private static final String TAG = "PlayerService";

    public static final String PARAM_PLAYLIST_INDEX = "eu.codebits.plasmas.services.playlistIndex";

    // these need to persist across instantiations
    public static String playlistGUID = "";
    public static JSONArray playlist = null;
    public static JSONArray alerts = null;
    private static int playlistIndex = 0;
    private static int alertsIndex = 0;
    private Intent originalIntent;

    public PlayerService() {
        super("PlayerService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        originalIntent = intent;
        //Log.d(TAG, "Starting player service");

        if (alerts != null) {
            new PlayerTask().execute(intent.getIntExtra(PARAM_PLAYLIST_INDEX, alertsIndex));
        } else {
            new PlayerTask().execute(intent.getIntExtra(PARAM_PLAYLIST_INDEX, playlistIndex));
        }
    }

    private class PlayerTask extends AsyncTask<Integer, Void, String> {

        private static final String TAG = "PlayerTask";
        private Exception exception;
        private int duration;

        private void displayItem(String url) {
            Intent intent = new Intent(getApplicationContext(), FullScreenWebViewActivity.class);
            intent.setData(Uri.parse(url));
            intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES | Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY
                    | Intent.FLAG_ACTIVITY_NO_ANIMATION);
            startActivity(intent);
        }

        private JSONObject getNextItem() {
            JSONObject result = null;
            try {
                //Log.d(TAG, String.valueOf(playlistIndex));
                // check for alerts first
                if (alerts == null) {
                    alertsIndex = 0;
                } else {
                    if (alertsIndex >= alerts.length()) {
                        alertsIndex = 0;
                        alerts = null;
                    }
                    if (alerts != null) {
                        result = alerts.getJSONObject(alertsIndex);
                        alertsIndex = alertsIndex + 1;
                        return result;
                    }
                }
                // now check for regular items
                if (playlist != null) {
                    //Log.d(TAG, String.valueOf(playlist.length()));
                    if (playlistIndex >= playlist.length()) {
                        playlistIndex = 0;
                    }
                    result = playlist.getJSONObject(playlistIndex);
                    playlistIndex = playlistIndex + 1;
                }
                return result;
            } catch (JSONException e) {
                //Log.e(TAG, e.toString());
            }
            return null;
        }

        @Override
        protected String doInBackground(Integer[] params) {

            Log.w(TAG, "Starting");
            // cancel any outstanding alarms while we're running
            Context context = getApplicationContext();
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent service = new Intent(context, PlayerService.class);
            PendingIntent pendingService = PendingIntent.getService(context, 0, service, 0);
            am.cancel(pendingService);

            try {
                if (alerts != null) {
                    alertsIndex = params[0];
                } else {
                    playlistIndex = params[0];
                }
                JSONObject item = getNextItem();
                if (item != null) {
                    //Log.i(TAG, item.toString());
                    String kind = item.getString("type").toLowerCase();
                    duration = item.getInt("duration_secs");
                    if (kind.equals("video") || kind.equals("meokanal")) {
                        displayItem("data:text/html;base64," + Base64.encodeToString(
                                getString(R.string.video_template).replace("%s", item.getString("uri")).getBytes(),
                                Base64.NO_WRAP));
                        duration += context.getResources().getInteger(R.integer.video_buffering_padding);
                        //Log.d(TAG, item.getString("uri"));
                    } else if (kind.equals("web") || kind.equals("alert")) {
                        //Log.d(TAG, item.getString("uri"));
                        displayItem(item.getString("uri"));
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, e.toString());
                displayItem(Base64.encodeToString(getString(R.string.blank_page).getBytes(), Base64.NO_WRAP));
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            //Log.i(TAG, "Setting alarm for " + duration);

            Context context = getApplicationContext();
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent service = new Intent(context, PlayerService.class);
            if (alerts != null) {
                service.putExtra(PARAM_PLAYLIST_INDEX, alertsIndex);
            } else {
                service.putExtra(PARAM_PLAYLIST_INDEX, playlistIndex);
            }
            PendingIntent pendingService = PendingIntent.getService(context, 0, service,
                    PendingIntent.FLAG_CANCEL_CURRENT);
            am.cancel(pendingService);
            am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + duration * 1000,
                    pendingService);

            // let our receiver know we're done
            PlayerReceiver.completeWakefulIntent(originalIntent);
        }
    }

}