org.prx.prp.view.StationInformationView.java Source code

Java tutorial

Introduction

Here is the source code for org.prx.prp.view.StationInformationView.java

Source

//  Copyright (c) 2010 Mahesh Sharma,Matt MacDonald
//
//  Permission is hereby granted, free of charge, to any person obtaining a copy
//  of this software and associated documentation files (the "Software"), to deal
//  in the Software without restriction, including without limitation the rights
//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//  copies of the Software, and to permit persons to whom the Software is
//  furnished to do so, subject to the following conditions:
//
//  The above copyright notice and this permission notice shall be included in
//  all copies or substantial portions of the Software.
//
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//  THE SOFTWARE.

package org.prx.prp.view;

import java.io.IOException;
import java.util.ArrayList;

import org.json.JSONException;
import org.prx.prp.IRockOnNextGenService;
import org.prx.prp.R;
import org.prx.prp.BackgroundPlaybackService;
import org.prx.prp.controller.ImageCacheManager;
import org.prx.prp.controller.SchedulingManager;
import org.prx.prp.controller.StreamManager;
import org.prx.prp.model.Scheduling;
import org.prx.prp.model.Stream;
import org.prx.prp.utility.DateParser;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class StationInformationView extends PRXCustomActivity {
    protected static final int SYNC_SUCC = 0;
    protected static final int SYNC_FAILED = 1;

    private boolean mServiceIsConnected = false;
    Stream stream;
    String programName;
    ListView listView;
    private Context mContext;
    ArrayList<Scheduling> scheduling;

    private Handler h = new Handler() {
        public void handleMessage(Message g) {
            switch (g.what) {
            case SYNC_SUCC:
                intent = new Intent(mContext, BackgroundPlaybackService.class);
                bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
                ImageView streamLogoImage = (ImageView) findViewById(R.id.stream_logo);
                if (scheduling.size() > 0) {
                    programName = scheduling.get(0).getProgramTitle();
                    adapter = new SchedulingListAdapter(mContext, scheduling, SchedulingListAdapter.SUMMARY);
                    listView.setAdapter(adapter);
                } else {
                    Toast msg = Toast.makeText(mContext, "Schedule not available", Toast.LENGTH_LONG);
                    msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
                    msg.show();
                }

                if (imageBitmap == null)
                    streamLogoImage.setImageResource(R.drawable.icon);
                else
                    streamLogoImage.setImageBitmap(imageBitmap);

                final Intent intent = new Intent(mContext, StreamScheduleView.class);
                Bundle b23 = new Bundle();
                b23.putInt("STREAM_ID", stream.getStreamId());
                b23.putString("STREAM_DISPLAY_NAME", stream.getDisplayName());
                intent.putExtras(b23);
                listView.setOnItemClickListener(new OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
                        // TODO Auto-generated method stub

                        if (position == scheduling.size()) {
                            startActivity(intent);
                        }
                    }
                });
                break;
            case SYNC_FAILED:
                Toast msg = Toast.makeText(mContext, "Connection error", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
                msg.show();
                break;
            }
        }
    };
    private Intent intent;
    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast msg = Toast.makeText(mContext, "Error in connecting to stream", Toast.LENGTH_LONG);
            msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
            msg.show();
        }
    };

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        private IRockOnNextGenService mService;

        public void onServiceConnected(ComponentName classname, IBinder obj) {
            mServiceIsConnected = true;
            mService = IRockOnNextGenService.Stub.asInterface(obj);
            final ImageButton playButton = (ImageButton) findViewById(R.id.station_play_button);
            playButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg) {
                    if (stream.getStreamUrls().size() > 0) {
                        try {

                            mService.openFile(programName != null ? programName : "", stream.getDisplayName(),
                                    stream.getStreamUrls().get(0).getURL(), (int) stream.getStreamId());

                            mService.play();
                            Toast msg = Toast.makeText(mContext, "Starting buffering...", Toast.LENGTH_LONG);
                            msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
                            msg.show();
                        } catch (RemoteException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            });
        }

        public void onServiceDisconnected(ComponentName classname) {
        }

    };

    private SchedulingListAdapter adapter;

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mServiceIsConnected) {
            unbindService(mServiceConnection);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.streaminfoview);

        final int streamID = this.getIntent().getExtras().getInt("STREAM_ID");

        mContext = this;
        IntentFilter f = new IntentFilter();
        f.addAction("org.prx.errorInStream");
        this.registerReceiver(mIntentReceiver, new IntentFilter(f));
        final ImageButton favoriteImageButton = (ImageButton) findViewById(R.id.station_favorite_button);
        if (StreamManager.isFavorite(streamID))
            favoriteImageButton.setImageResource(R.drawable.tab_favorites);
        else
            favoriteImageButton.setImageResource(R.drawable.tab_no_favorite);
        favoriteImageButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if (StreamManager.isFavorite(streamID)) {
                    StreamManager.removeFavorite(streamID);
                    favoriteImageButton.setImageResource(R.drawable.tab_no_favorite);
                } else {
                    StreamManager.addFavorite(streamID);
                    favoriteImageButton.setImageResource(R.drawable.tab_favorites);
                }
            }
        });
        stream = StreamManager.findById(streamID);
        TextView streamNameView = (TextView) findViewById(R.id.stream_name_1);
        TextView StreamNameViewSecondary = (TextView) findViewById(R.id.stream_name_2);
        streamNameView.setText(stream.getDisplayName());
        StreamNameViewSecondary.setText(stream.getDisplayName());
        TextView streamStateView = (TextView) findViewById(R.id.stream_state);
        streamStateView.setText(stream.getSource().getStatePrimary());
        listView = (ListView) findViewById(R.id.stream_schedule_list_2);
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                doUpdate();
            }
        });
        t1.start();
        Toast msg = Toast.makeText(mContext, "Getting stream schedule...", Toast.LENGTH_LONG);
        msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
        msg.show();
    }

    Bitmap imageBitmap;

    private void doUpdate() {
        try {
            imageBitmap = ImageCacheManager.getInstance().getBitmapFromURL(stream.getLogoUrl(), 0);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            imageBitmap = null;
        }
        try {
            scheduling = SchedulingManager.getInstance().findAllByStream(stream.getStreamId(), 2);
        } catch (JSONException e) {
            h.sendEmptyMessage(SYNC_FAILED);
            return;
        }
        h.sendEmptyMessage(SYNC_SUCC);
    }
}

class SchedulingListAdapter extends BaseAdapter {
    final static int SUMMARY = 1;
    final static int ALL = 0;
    ArrayList<Scheduling> scheduling;
    private LayoutInflater mInflater;
    Context mContext;
    int type;
    Intent t;

    public SchedulingListAdapter(Context context, ArrayList<Scheduling> scheduling, int type) {
        this.mContext = context;
        this.scheduling = scheduling;
        mInflater = LayoutInflater.from(context);
        this.type = type;
    }

    public int getCount() {
        return scheduling.size() + type;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View test = null;
        if (position < scheduling.size()) {
            final Scheduling s = scheduling.get(position);
            test = mInflater.inflate(R.layout.stream_schedule_item, null);
            TextView programNameTextView = (TextView) test.findViewById(R.id.program_name);
            programNameTextView.setText(s.getProgramTitle());
            TextView startTimeTextView = (TextView) test.findViewById(R.id.start_time);
            startTimeTextView.setText(DateParser.getTime(s.getStartTime()));
            TextView endTimeTextView = (TextView) test.findViewById(R.id.end_time);
            endTimeTextView.setText(DateParser.getTime(s.getEndTime()));
            TextView showProgram = (TextView) test.findViewById(R.id.show_program);
            if (s.programHasEpisodes()) {
                showProgram.setVisibility(ImageButton.VISIBLE);
                test.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View arg0) {
                        Bundle b1 = new Bundle();
                        b1.putInt("PROGRAM_ID", s.getProgramID());
                        Intent i = new Intent(mContext, ProgramInfoView.class);
                        i.putExtras(b1);
                        mContext.startActivity(i);
                    }
                });
            } else
                showProgram.setVisibility(ImageButton.INVISIBLE);
        } else if (type == SUMMARY)
            test = mInflater.inflate(R.layout.today_schedule, null);
        return test;
    }
}