44caaf7 7 years ago
1 contributor
598 lines | 22.474kb
package com.yc.rss.radio;

import android.app.Activity;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.ArrayAdapter;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Spinner;
import android.graphics.drawable.Drawable;
import android.widget.Toast;

import org.xmlpull.v1.XmlPullParserException;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private ImageView mImageView;
    private ImageView mCoverView;
    private TextView mTextView;
    private TextView mTextViewArtist;
    private TextView mTextViewTitle;
    public static String articles;
    private Spinner spinArticle;
    private List<Entry> entries = null;
    public List<EntryTag> entries_tag = null;
    private int entries_sz = -1;
    public int entries_tag_sz = -1;
    private ProgressDialog pDialog;
    private DownloadFileFromURL mDownloadTags = null;
    private DownloadCoverFromURL mDownloadCover = null;
    private MediaPlayer mediaPlayer = null;
    private int current_pos = -1;
    private boolean initialState = true;
    private boolean initialNoTag = true;
    private static final int RADIO_NOTIFICATION=9999;
    public static final String ACTION_1 = "action_1";
    public static final String ACTION_2 = "action_2";
    public static final String ACTION_3 = "action_3";
    public static final String ACTION_4 = "action_4";

    private String old_title="";
    private String old_artist="";
    final Intent intentClick = null;

    public List<EntryTag> getTags() {
        return entries_tag;
    }

    private Handler iSender = new Handler() {
        @Override
        public void handleMessage(final Message msg) {
            System.out.println("iSender");
            mDownloadTags = (DownloadFileFromURL) new DownloadFileFromURL().execute(getString(R.string.tags_url));
            iSender.sendEmptyMessageDelayed(0, 30*1000);
        }
    };

    class DownloadFileFromURL extends AsyncTask<String, String, String> {
        private String page_content;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            System.out.println("Starting download");
            /*
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Loading... Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
            */
        }

        @Override
        protected String doInBackground(String... f_url) {
            int count;
            try {
                URL url = new URL(f_url[0]);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.connect();
                InputStream stream = conn.getInputStream();
                StringBuilder page_content_builder = new StringBuilder();
                byte data[] = new byte[65536];
                while ((count = stream.read(data)) != -1) {
                    String str = new String(data, "UTF-8");
                    page_content_builder.append(str);
                }
                page_content = page_content_builder.toString();
            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(String file_url) {
            System.out.println("Downloaded");
            //pDialog.dismiss();
            try {
                TagsXmlParser tagsXmlParser = new TagsXmlParser();
                InputStream stream = new ByteArrayInputStream(page_content.getBytes(StandardCharsets.UTF_8));
                entries_tag = tagsXmlParser.parse(stream);
                entries_tag_sz = entries_tag.size();
            } catch (IOException ignored) {
                entries_tag = null;
                entries_tag_sz = -1;
            } catch (XmlPullParserException ignored) {
                entries_tag = null;
                entries_tag_sz = -1;
            }
            if(true == initialNoTag ) {
                initialNoTag = false;
                ToastThis(getString(R.string.tags_downloaded));
            }
            ExtUpdate();
        }
    }

    class DownloadCoverFromURL extends AsyncTask<String, String, String> {
        private String page_content;
        private int pos;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            System.out.println("Starting Cover download");
        }

        @Override
        protected String doInBackground(String... f_url) {
            int count;
            try {
                pos = Integer.parseInt(f_url[0]);
                URL url = new URL(f_url[1]);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.connect();
                InputStream stream = conn.getInputStream();
                StringBuilder page_content_builder = new StringBuilder();
                byte data[] = new byte[65536];
                while ((count = stream.read(data)) != -1) {
                    String str = new String(data, "UTF-8");
                    page_content_builder.append(str);
                }
                page_content = page_content_builder.toString();
            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(String file_url) {
            System.out.println("Cover Downloaded");
            List<EntryTag> entries_tag = getTags();
            EntryTag entry_tag = entries_tag.get(pos);
            entry_tag.cover = page_content;
            //ExtUpdate();
            InputStream stream = new ByteArrayInputStream(page_content.getBytes(StandardCharsets.UTF_8));
            //Bitmap bitmap = BitmapFactory.decodeStream(stream);
            //mCoverView.setImageBitmap(bitmap);
            Drawable d = Drawable.createFromStream(stream, null);
            mImageView.setImageDrawable(d);

        }
    }

    class Player extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog progress;

        @Override
        protected Boolean doInBackground(String... params) {
            // TODO Auto-generated method stub
            Boolean prepared;
            try {

                mediaPlayer.setDataSource(params[0]);

                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
//                        playPause=false;
//                        btn.setBackgroundResource(R.drawable.button_play);
                        mediaPlayer.stop();
                        mediaPlayer.reset();
                    }
                });
                mediaPlayer.prepare();
                prepared = true;
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                Log.d("IllegarArgument", e.getMessage());
                prepared = false;
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            }
            return prepared;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if (progress.isShowing()) {
                progress.cancel();
            }
            Log.d("Prepared", "//" + result);
            mediaPlayer.start();
        }

        public Player() {
            progress = new ProgressDialog(MainActivity.this);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            this.progress.setMessage("Buffering...");
            this.progress.show();

        }
    }

    public void ToastThis(String message) {
        Toast.makeText(this,
                message,
                Toast.LENGTH_SHORT).show();
    }

    public static Bitmap drawableToBitmap (Drawable drawable) {
        Bitmap bitmap = null;

        if (drawable instanceof BitmapDrawable) {
            BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
            if(bitmapDrawable.getBitmap() != null) {
                return bitmapDrawable.getBitmap();
            }
        }

        if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
            bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
        } else {
            bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);
        return bitmap;
    }

    public void Notify(String shortname, String notificationTitle, String notificationMessage){
        /*AssetManager am = getAssets();
        try {
            InputStream ims = am.open(shortname + ".jpg");
            Drawable d = Drawable.createFromStream(ims, null);
            mNotifBuilder.setLargeIcon(drawableToBitmap(d));
        } catch (IOException e) {
            mNotifBuilder.setSmallIcon(R.drawable.ic_notification);
        }
        */

        //mNotifBuilder.setSmallIcon(this.getResources().getIdentifier(shortname, "drawable", this.getPackageName()));

        /*
        Notification.Builder mBuilder =
                new Notification.Builder(this)
                        .setSmallIcon(this.getResources().getIdentifier(shortname, "drawable", this.getPackageName()))
                        .setContentTitle("CoderoMusicPlayer")
                        .setContentText("PLayer0!");
        */
        Notification.Builder mBuilder = new Notification.Builder(this);
        mBuilder.setSmallIcon(this.getResources().getIdentifier(shortname, "drawable", this.getPackageName()));
        if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
            mBuilder.setContentTitle(notificationTitle);
            mBuilder.setContentText(notificationMessage);
        } else {
            mBuilder.setContentTitle(notificationTitle);
            mBuilder.setContentText(notificationMessage + "\n" + notificationTitle);
            mBuilder.setColor(this.getResources().getColor(android.R.color.white));
        }

        mBuilder.setOngoing(true);

        Intent resultIntent = new Intent(this, MainActivity.class);
        resultIntent.setAction(Intent.ACTION_MAIN);
        resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                resultIntent, 0);

        mBuilder.setContentIntent(pendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        mNotificationManager.notify(9999, mBuilder.build());
    }

    public void NotifyClear(){
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.cancel(RADIO_NOTIFICATION);
    }

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

        iSender.sendEmptyMessage(0);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }
        }).start();

        setContentView(R.layout.activity_main);
        mImageView = (ImageView)findViewById(R.id.imageView);
        mCoverView = (ImageView)findViewById(R.id.imageViewTrack);
        mTextView = (TextView) findViewById(R.id.textView);
        mTextViewArtist = (TextView) findViewById(R.id.textViewArtist);
        mTextViewTitle = (TextView) findViewById(R.id.textViewTitle);
        spinArticle = (Spinner) findViewById(R.id.spinner_article);
        addListenerOnSpinnerItemSelection();
    }

    public void ExtUpdate() {
        int pos = spinArticle.getSelectedItemPosition();
        if( current_pos != pos ) {
            NotifyClear();
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
            }
        }

        try {
            if( -1 == entries_sz ) {
                FeedParser();
            }
            AssetManager am = getAssets();
            String resourcefilename=entries.get(pos).shortname;
            //InputStream ims = am.open(resourcefilename+".jpg");
            InputStream ims = am.open(resourcefilename+".png");
            Drawable d = Drawable.createFromStream(ims, null);
            mImageView.setImageDrawable(d);
            if(null== entries_tag) {
                mTextView.setText(entries.get(pos).title);
                mCoverView.setImageDrawable(d);
            } else {
                mTextView.setText(entries_tag.get(pos).title);
                //mTextViewTitle.setText(entries_tag.get(pos).track_title);
                if(! entries_tag.get(pos).track_title.equals("An Error Occured")) {
                    mTextViewTitle.setText(entries_tag.get(pos).track_title);
                } else {
                    mTextViewTitle.setText("");
                }
                //mTextViewArtist.setText(entries_tag.get(pos).track_artist);
                if(! entries_tag.get(pos).track_artist.equals("An Error Occured")) {
                    mTextViewArtist.setText(entries_tag.get(pos).track_artist);
                } else {
                    mTextViewArtist.setText("");
                }
                if( (!old_artist.equals(mTextViewArtist.getText().toString())) ||
                        (!old_title.equals(mTextViewTitle.getText().toString())) ) {
                    Notify(entries.get(pos).shortname,
                            mTextViewArtist.getText().toString(),
                            mTextViewTitle.getText().toString());
                    old_artist = mTextViewArtist.getText().toString();
                    old_title = mTextViewTitle.getText().toString();
                }
                /*
                if(! entries_tag.get(pos).track_url.equals("")) {
                    System.out.println(entries_tag.get(pos).track_url);
                    if (null != entries_tag.get(pos).cover) {
                        InputStream stream = new ByteArrayInputStream(entries_tag.get(pos).cover.getBytes(StandardCharsets.UTF_8));
                        d = Drawable.createFromStream(stream, null);
                        mCoverView.setImageDrawable(d);
                    } else {
                        mDownloadCover = (DownloadCoverFromURL) new DownloadCoverFromURL().execute(Integer.toString(pos),entries_tag.get(pos).track_url);
                    }
                } else {
                    mCoverView.setImageDrawable(d);
                }*/
                mCoverView.setImageDrawable(d);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        Log.d("ExtUpdate DEBUG:", "Start Playing");
        if( current_pos != pos ) {
            current_pos = pos;
            mediaPlayer = new MediaPlayer();
            new Player().execute(entries.get(pos).mp3);
            if( entries_tag != null ) {
                if (entries_tag.get(pos) != null) {
                    if ((null != entries_tag.get(pos).track_artist) &&
                            (null != entries_tag.get(pos).track_artist)) {
                        Notify(entries.get(pos).shortname, entries_tag.get(pos).track_artist, entries_tag.get(pos).track_title);
                    } else {
                        Notify(entries.get(pos).shortname, entries.get(pos).title, getString(R.string.tags_not_found));
                    }
                } else {
                    Notify(entries.get(pos).shortname, entries.get(pos).title, getString(R.string.tags_not_found));
                }
            } else {
                Notify(entries.get(pos).shortname, entries.get(pos).title, getString(R.string.tags_not_dl));
            }
        }
    }

    public void addListenerOnSpinnerItemSelection(){
        spinArticle.setOnItemSelectedListener(new SpinnerActivity());
    }

    @Override
    public boolean onSupportNavigateUp(){
        finish();
        return true;
    }

    public boolean updateListView() {
        boolean ret = false;
        String [] items1 = null;
        ArrayList al = new ArrayList<String>();
        try {
            items1 = doDropDown();
        } catch( Exception e ) {
            return ret;
        }

        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, items1);
        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinArticle.setAdapter(adapter1);
        adapter1.notifyDataSetChanged();
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        MenuItem menuItemDateRefresh = menu.findItem(R.id.last_refresh_date);
        menuItemDateRefresh.setTitle(getString(R.string.version));
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_exit) {
            NotifyClear();
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
            }
            finish();
            System.exit(0);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void FeedParser() {
        RadioXmlParser radioXmlParser = new RadioXmlParser();
        InputStream stream = null;
        AssetManager am = getAssets();
        try {
            stream = am.open("radio.xml");
            try {
                entries = radioXmlParser.parse(stream);
                entries_sz = entries.size();
                updateListView();
                invalidateOptionsMenu();
                if( initialState == true ) {
                    initialState = false;
                    spinArticle.setSelection(0, true);
                }
            } catch (IOException ignored) {
                entries = null;
                entries_sz = -1;
            } catch (XmlPullParserException ignored) {
                entries = null;
                entries_sz = -1;
            }
            if (null != stream) {
                try {
                    stream.close();
                } catch (IOException e) {
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
            entries = null;
            entries_sz = -1;
        }
    }

    /** Feed 2 Article list for Spinner */
    private String[] doDropDown() throws IOException {
        String[] strings;
        if( -1 == entries_sz ) {
            FeedParser();
        }

        HashSet<String> hs = new HashSet<String>();
        List<String> mStrings = new ArrayList<String>();
        int i = 0;
        for( i = 0; i < entries_sz; i ++ )
        {
            Entry temp = entries.get(i);
            mStrings.add(i,temp.title);
        }
        mStrings.addAll(hs);
        strings = new String[mStrings.size()];
        strings = mStrings.toArray(strings);
        return strings;
    }
}