From f5f2c110290c74b41f83e2638e26b03b1d6b6cba Mon Sep 17 00:00:00 2001 From: Sid Zi Date: Thu, 29 Dec 2016 20:23:01 +0530 Subject: [PATCH 01/20] fixed orientation and removed deprecated test class --- .../com/sidzi/circleofmusic/ApplicationTest.java | 13 ------------- app/src/main/AndroidManifest.xml | 2 ++ .../helpers/DatabaseSynchronization.java | 12 ++++++------ 3 files changed, 8 insertions(+), 19 deletions(-) delete mode 100644 app/src/androidTest/java/com/sidzi/circleofmusic/ApplicationTest.java diff --git a/app/src/androidTest/java/com/sidzi/circleofmusic/ApplicationTest.java b/app/src/androidTest/java/com/sidzi/circleofmusic/ApplicationTest.java deleted file mode 100644 index adcfbc6..0000000 --- a/app/src/androidTest/java/com/sidzi/circleofmusic/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sidzi.circleofmusic; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5b4a0e..22d6e39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,6 +25,7 @@ android:name=".ui.MainActivity" android:label="@string/title_activity_main" android:launchMode="singleTask" + android:screenOrientation="portrait" android:theme="@style/splashScreen" android:windowSoftInputMode="adjustPan"> @@ -51,6 +52,7 @@ diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java index 48db4e6..00e93fe 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java +++ b/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java @@ -22,14 +22,14 @@ public DatabaseSynchronization(Context mContext) { protected Void doInBackground(Void... voids) { ArrayList mTrackList = Utils.musicLoader(mContext); OrmHandler ormHandler = OpenHelperManager.getHelper(mContext, OrmHandler.class); - for (Track t : - mTrackList) { - try { - Dao dbTrack = ormHandler.getDao(Track.class); + try { + Dao dbTrack = ormHandler.getDao(Track.class); + for (Track t : + mTrackList) { dbTrack.createIfNotExists(t); - } catch (SQLException e) { - e.printStackTrace(); } + } catch (SQLException e) { + e.printStackTrace(); } OpenHelperManager.releaseHelper(); return null; From ec83d6a37e725e1b4be16cf821bbba246ebdae74 Mon Sep 17 00:00:00 2001 From: Sid Zi Date: Thu, 29 Dec 2016 21:49:49 +0530 Subject: [PATCH 02/20] fixed removed tracks issue --- .../main/java/com/sidzi/circleofmusic/entities/Track.java | 8 ++++++++ .../circleofmusic/helpers/DatabaseSynchronization.java | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java b/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java index bd5ceb8..1bd10fe 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java +++ b/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java @@ -28,6 +28,7 @@ public Track(String name, String path, String artist, String album, Boolean buck this.artist = artist; this.bucket = bucket; this.album = album; + this.play_count = 0; } public String getName() { @@ -65,4 +66,11 @@ public void setPlay_count(Integer play_count) { public String getAlbum() { return album; } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Track) + return ((Track) obj).getPath().contentEquals(this.path); + throw new UnsupportedOperationException(); + } } diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java index 00e93fe..1dc2a1c 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java +++ b/app/src/main/java/com/sidzi/circleofmusic/helpers/DatabaseSynchronization.java @@ -10,6 +10,7 @@ import java.sql.SQLException; import java.util.ArrayList; +import java.util.List; public class DatabaseSynchronization extends AsyncTask { private Context mContext; @@ -24,10 +25,13 @@ protected Void doInBackground(Void... voids) { OrmHandler ormHandler = OpenHelperManager.getHelper(mContext, OrmHandler.class); try { Dao dbTrack = ormHandler.getDao(Track.class); + List _temp = dbTrack.queryForAll(); + _temp.removeAll(mTrackList); for (Track t : mTrackList) { dbTrack.createIfNotExists(t); } + dbTrack.delete(_temp); } catch (SQLException e) { e.printStackTrace(); } From 23e09be0becae1b35fa123abdb97447a8efb01f2 Mon Sep 17 00:00:00 2001 From: Sid Zi Date: Mon, 2 Jan 2017 19:16:26 +0530 Subject: [PATCH 03/20] Music as a service commit --- app/src/main/AndroidManifest.xml | 7 +- .../circleofmusic/adapters/TracksAdapter.java | 9 +- .../sidzi/circleofmusic/entities/Track.java | 11 + .../circleofmusic/helpers/AlarmReciever.java | 12 + .../helpers/AudioEventHandler.java | 267 ------------------ .../helpers/MediaButtonHandler.java | 2 +- .../helpers/MusicPlayerService.java | 84 ++++++ .../helpers/MusicPlayerViewHandler.java | 105 +++++++ .../sidzi/circleofmusic/helpers/Utils.java | 4 +- .../sidzi/circleofmusic/ui/AlarmActivity.java | 57 ++++ .../sidzi/circleofmusic/ui/MainActivity.java | 42 ++- .../views/MusicPlaybackPanel.java | 103 +++++++ app/src/main/res/layout/activity_alarm.xml | 34 +++ app/src/main/res/layout/activity_main.xml | 93 +----- app/src/main/res/layout/playback_panel.xml | 92 ++++++ app/src/main/res/menu/menu_home.xml | 4 + 16 files changed, 542 insertions(+), 384 deletions(-) create mode 100644 app/src/main/java/com/sidzi/circleofmusic/helpers/AlarmReciever.java delete mode 100644 app/src/main/java/com/sidzi/circleofmusic/helpers/AudioEventHandler.java create mode 100644 app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerService.java create mode 100644 app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerViewHandler.java create mode 100644 app/src/main/java/com/sidzi/circleofmusic/ui/AlarmActivity.java create mode 100644 app/src/main/java/com/sidzi/circleofmusic/views/MusicPlaybackPanel.java create mode 100644 app/src/main/res/layout/activity_alarm.xml create mode 100644 app/src/main/res/layout/playback_panel.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5b4a0e..c3e9b13 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,7 +36,9 @@ - + @@ -52,6 +54,9 @@ android:name=".ui.SearchActivity" android:label="@string/title_activity_search" android:theme="@style/AppTheme.NoActionBar" /> + + + \ No newline at end of file diff --git a/app/src/main/java/com/sidzi/circleofmusic/adapters/TracksAdapter.java b/app/src/main/java/com/sidzi/circleofmusic/adapters/TracksAdapter.java index a01afc3..c183713 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/adapters/TracksAdapter.java +++ b/app/src/main/java/com/sidzi/circleofmusic/adapters/TracksAdapter.java @@ -1,7 +1,6 @@ package com.sidzi.circleofmusic.adapters; import android.content.Context; -import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.support.v7.widget.RecyclerView; @@ -17,6 +16,7 @@ import com.j256.ormlite.stmt.QueryBuilder; import com.sidzi.circleofmusic.R; import com.sidzi.circleofmusic.entities.Track; +import com.sidzi.circleofmusic.helpers.MusicPlayerService; import com.sidzi.circleofmusic.helpers.OrmHandler; import java.sql.SQLException; @@ -114,12 +114,7 @@ class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener @Override public void onClick(View v) { - Intent ready_track = new Intent("com.sidzi.circleofmusic.PLAY_TRACK"); - ready_track.putExtra("track_path", v.getTag(R.id.tag_track_path).toString()); - ready_track.putExtra("track_name", v.getTag(R.id.tag_track_name).toString()); - ready_track.putExtra("track_artist", v.getTag(R.id.tag_track_artist).toString()); - ready_track.putExtra("bucket", bucketBool); - mContext.sendBroadcast(ready_track); + MusicPlayerService.play(v.getTag(R.id.tag_track_path).toString(), mContext); } @Override diff --git a/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java b/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java index bd5ceb8..0aa1689 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java +++ b/app/src/main/java/com/sidzi/circleofmusic/entities/Track.java @@ -22,6 +22,10 @@ public class Track { public Track() { } + public Track(String path) { + this.path = path; + } + public Track(String name, String path, String artist, String album, Boolean bucket) { this.path = path; this.name = name; @@ -65,4 +69,11 @@ public void setPlay_count(Integer play_count) { public String getAlbum() { return album; } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Track) + return ((Track) obj).getPath().contentEquals(this.path); + throw new UnsupportedOperationException(); + } } diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/AlarmReciever.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/AlarmReciever.java new file mode 100644 index 0000000..20e1e74 --- /dev/null +++ b/app/src/main/java/com/sidzi/circleofmusic/helpers/AlarmReciever.java @@ -0,0 +1,12 @@ +package com.sidzi.circleofmusic.helpers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class AlarmReciever extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + } +} diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/AudioEventHandler.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/AudioEventHandler.java deleted file mode 100644 index e1bf9d8..0000000 --- a/app/src/main/java/com/sidzi/circleofmusic/helpers/AudioEventHandler.java +++ /dev/null @@ -1,267 +0,0 @@ -package com.sidzi.circleofmusic.helpers; - -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.graphics.BitmapFactory; -import android.graphics.PorterDuff; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.support.v4.app.NotificationCompat; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageButton; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.Toast; - -import com.j256.ormlite.android.apptools.OpenHelperManager; -import com.j256.ormlite.dao.Dao; -import com.j256.ormlite.stmt.PreparedQuery; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.SelectArg; -import com.sidzi.circleofmusic.R; -import com.sidzi.circleofmusic.entities.Track; -import com.sidzi.circleofmusic.ui.MainActivity; - -import java.io.IOException; -import java.sql.SQLException; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import static android.content.Context.NOTIFICATION_SERVICE; - -public class AudioEventHandler extends BroadcastReceiver { - static public MediaPlayer mMediaPlayer = null; - static public NotificationManager mNotificationManager = null; - static public TrackProgressObserver mTrackProgressObserver = null; - static public String mRunningTrackPath = null; - - static private List mTracksList = null; - static private int mPlayingPosition = 0; - NotificationCompat.Builder mBuilder = null; - int notifyId = 1; - private TextView tvPlayingTrackName = null; - private TextView tvPlayingArtistName = null; - private ImageButton ibPlay = null; - private ImageButton ibAddToBucket = null; - private ImageButton ibPlayNext = null; - private ProgressBar pbTrackPlay = null; - - public AudioEventHandler() { - super(); - if (mMediaPlayer == null) { - mMediaPlayer = new MediaPlayer(); - mTrackProgressObserver = new TrackProgressObserver(); - mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mediaPlayer) { - mediaPlayer.start(); - pbTrackPlay.setIndeterminate(false); - } - }); - } - } - - @Override - public void onReceive(final Context context, Intent intent) { - - FrameLayout flPlayer = (FrameLayout) ((MainActivity) context).findViewById(R.id.flPlayer); - - flPlayer.setVisibility(View.VISIBLE); - - tvPlayingTrackName = (TextView) ((MainActivity) context).findViewById(R.id.tvPlayingTrackName); - tvPlayingArtistName = (TextView) ((MainActivity) context).findViewById(R.id.tvPlayingTrackArtist); - ibPlay = (ImageButton) ((MainActivity) context).findViewById(R.id.ibPlayPause); - ibAddToBucket = (ImageButton) ((MainActivity) context).findViewById(R.id.ibAddToBucket); - ibPlayNext = (ImageButton) ((MainActivity) context).findViewById(R.id.ibPlayNext); - pbTrackPlay = (ProgressBar) ((MainActivity) context).findViewById(R.id.pbTrackPlay); - - pbTrackPlay.getProgressDrawable().setColorFilter(context.getResources().getColor(R.color.primaryInverted), PorterDuff.Mode.SRC_IN); - - final String track_path = intent.getStringExtra("track_path"); - final String track_name = intent.getStringExtra("track_name"); - final String track_artist = intent.getStringExtra("track_artist"); - final boolean bucketBoolean = intent.getBooleanExtra("bucket", false); - mRunningTrackPath = track_path; - - // Music Notification - - mNotificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); - PendingIntent mainActivity = PendingIntent.getActivity(context, 101, new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); - - mBuilder = new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_statusbar) - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setContentIntent(mainActivity) - .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher)) - .setPriority(NotificationCompat.PRIORITY_HIGH); - - final OrmHandler ormHandler = OpenHelperManager.getHelper(context, OrmHandler.class); - - - ibPlay.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(final View v) { - if (mMediaPlayer.isPlaying()) { - mMediaPlayer.pause(); - ((ImageButton) v).setImageResource(R.drawable.ic_track_play); - } else { - mMediaPlayer.start(); - ((ImageButton) v).setImageResource(R.drawable.ic_track_stop); - } - } - }); - ibAddToBucket.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mMediaPlayer != null) { - Utils.bucketOps(mRunningTrackPath, !(Boolean) ibAddToBucket.getTag(), context); - if (!(Boolean) ibAddToBucket.getTag()) { - ((ImageButton) v).setImageResource(R.drawable.ic_track_bucket_added); - Toast.makeText(context, "Added to bucket", Toast.LENGTH_SHORT).show(); - } else { - ((ImageButton) v).setImageResource(R.drawable.ic_track_bucket_add); - } - ibAddToBucket.setTag(!(Boolean) ibAddToBucket.getTag()); - } - } - }); - ibPlayNext.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - playNext(); - } - }); - boolean bucket = false; - try { - try { - Dao dbTrack = ormHandler.getDao(Track.class); - if (bucketBoolean) - mTracksList = dbTrack.queryForEq("bucket", true); - else - mTracksList = dbTrack.queryForAll(); - for (mPlayingPosition = 0; mPlayingPosition < mTracksList.size(); mPlayingPosition++) { - if (mTracksList.get(mPlayingPosition).getPath().equals(mRunningTrackPath)) { - break; - } - } - QueryBuilder queryBuilder = dbTrack.queryBuilder(); - SelectArg selectArg = new SelectArg(); - queryBuilder.where().eq("path", selectArg); - PreparedQuery preparedQuery = queryBuilder.prepare(); - selectArg.setValue(track_path); - Track temp_track = dbTrack.query(preparedQuery).get(0); - temp_track.setPlay_count(temp_track.getPlay_count() + 1); - try { - dbTrack.update(temp_track); - } catch (SQLException e1) { - e1.printStackTrace(); - } - bucket = !(temp_track.getBucket() == null || !temp_track.getBucket()); - } catch (IndexOutOfBoundsException e) { - ibAddToBucket.setVisibility(View.INVISIBLE); - } - } catch (SQLException e) { - e.printStackTrace(); - } - try { - playSong(track_path, track_name, track_artist, bucket); - } catch (IOException e) { - e.printStackTrace(); - } - } - - void playNext() { - try { - Track temp_track = mTracksList.get(mPlayingPosition + 1); - mPlayingPosition += 1; - if (temp_track.getBucket() == null) { - temp_track.setBucket(false); - } - playSong(temp_track.getPath(), temp_track.getName(), temp_track.getArtist(), temp_track.getBucket()); - } catch (IOException e) { - e.printStackTrace(); - } catch (IndexOutOfBoundsException e) { - mPlayingPosition = -1; - playNext(); - } - } - - void playSong(String track_path, String track_name, String track_artist, boolean bucket) throws IOException { - if (mMediaPlayer.isPlaying()) { - mMediaPlayer.stop(); - } - ibPlay.setImageResource(R.drawable.ic_track_stop); - tvPlayingTrackName.setText(track_name); - tvPlayingArtistName.setText(track_artist); - if (!bucket) { - ibAddToBucket.setImageResource(R.drawable.ic_track_bucket_add); - } else { - ibAddToBucket.setImageResource(R.drawable.ic_track_bucket_added); - } - ibAddToBucket.setTag(bucket); - mMediaPlayer.reset(); - mMediaPlayer.setDataSource(track_path); - mRunningTrackPath = track_path; - if (track_path.startsWith("https://")) { - mMediaPlayer.prepareAsync(); - pbTrackPlay.setIndeterminate(true); - } else { - mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { - @Override - public void onCompletion(MediaPlayer mediaPlayer) { - pbTrackPlay.setProgress(0); - mTrackProgressObserver.stop(); - playNext(); - } - }); - mMediaPlayer.prepare(); - mTrackProgressObserver.setup(); - new Thread(mTrackProgressObserver).start(); - } - mBuilder.setContentTitle(track_name) - .setContentText(track_artist); - mNotificationManager.notify(notifyId, mBuilder.build()); - } - - public class TrackProgressObserver implements Runnable { - private AtomicBoolean stop = new AtomicBoolean(false); - private int totalDuration; - - TrackProgressObserver() { - super(); - } - - void setup() { - totalDuration = mMediaPlayer.getDuration(); - if (totalDuration == -1) - pbTrackPlay.setIndeterminate(true); - else { - pbTrackPlay.setIndeterminate(false); - pbTrackPlay.setMax(totalDuration / 1000); - } - } - - public void stop() { - stop.set(true); - } - - @Override - public void run() { - while (!stop.get()) { - try { - pbTrackPlay.setProgress(mMediaPlayer.getCurrentPosition() / 1000); - Thread.sleep(1000); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } catch (IllegalStateException e) { - this.stop(); - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/MediaButtonHandler.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/MediaButtonHandler.java index fe15d4a..c4176b4 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/helpers/MediaButtonHandler.java +++ b/app/src/main/java/com/sidzi/circleofmusic/helpers/MediaButtonHandler.java @@ -7,6 +7,6 @@ public class MediaButtonHandler extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - Utils.bucketOps(AudioEventHandler.mRunningTrackPath, true, context); + Utils.bucketOps(MusicPlayerService.PLAYING_TRACK.getPath(), true, context); } } diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerService.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerService.java new file mode 100644 index 0000000..a0c84fc --- /dev/null +++ b/app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerService.java @@ -0,0 +1,84 @@ +package com.sidzi.circleofmusic.helpers; + + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.os.IBinder; +import android.support.annotation.Nullable; + +import com.sidzi.circleofmusic.entities.Track; + +import java.io.IOException; +import java.util.List; + +public class MusicPlayerService extends Service { + + final public static String ACTION_PLAY_TRACK = "com.sidzi.circleofmusic.PLAY_TRACK"; + final public static String ACTION_PAUSE_TRACK = "com.sidzi.circleofmusic.PAUSE_TRACK"; + final public static String ACTION_NEXT_TRACK = "com.sidzi.circleofmusic.NEXT_TRACK"; + static MediaPlayer mMediaPlayer = null; + static Track PLAYING_TRACK = null; + private static boolean READY = false; + private static List mTrackList = null; + private static int PLAYING_TRACK_POSITION = -1; + + public MusicPlayerService() { + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + mMediaPlayer = new MediaPlayer(); + mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mediaPlayer) { + mediaPlayer.start(); + } + }); + return super.onStartCommand(intent, flags, startId); + } + + public void play(String track_path, final Context mContext) { + if (mMediaPlayer.isPlaying()) { + mMediaPlayer.stop(); + } + mMediaPlayer.reset(); + try { + mMediaPlayer.setDataSource(track_path); + if (track_path.startsWith("https://")) { + mMediaPlayer.prepareAsync(); + } else { + mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mediaPlayer) { + next(mContext); + } + }); + mMediaPlayer.prepare(); + if (PLAYING_TRACK_POSITION == -1) { + PLAYING_TRACK_POSITION = mTrackList.indexOf(new Track(track_path)); + } + } + PLAYING_TRACK = mTrackList.get(PLAYING_TRACK_POSITION); + mContext.sendBroadcast(new Intent(MusicPlayerService.ACTION_PLAY_TRACK)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void next(Context mContext) { + play(mTrackList.get(++PLAYING_TRACK_POSITION).getPath(), mContext); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + +} + diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerViewHandler.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerViewHandler.java new file mode 100644 index 0000000..dc36817 --- /dev/null +++ b/app/src/main/java/com/sidzi/circleofmusic/helpers/MusicPlayerViewHandler.java @@ -0,0 +1,105 @@ +package com.sidzi.circleofmusic.helpers; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.graphics.PorterDuff; +import android.support.v4.app.NotificationCompat; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.sidzi.circleofmusic.R; +import com.sidzi.circleofmusic.ui.MainActivity; + +import static android.content.Context.NOTIFICATION_SERVICE; + +public class MusicPlayerViewHandler extends BroadcastReceiver { + + @Override + public void onReceive(final Context context, Intent intent) { + FrameLayout flPlayer = (FrameLayout) ((MainActivity) context).findViewById(R.id.flPlayer); + + flPlayer.setVisibility(View.VISIBLE); + + TextView tvPlayingTrackName = (TextView) ((MainActivity) context).findViewById(R.id.tvPlayingTrackName); + TextView tvPlayingArtistName = (TextView) ((MainActivity) context).findViewById(R.id.tvPlayingTrackArtist); + ImageButton ibPlay = (ImageButton) ((MainActivity) context).findViewById(R.id.ibPlayPause); + final ImageButton ibAddToBucket = (ImageButton) ((MainActivity) context).findViewById(R.id.ibAddToBucket); + ImageButton ibPlayNext = (ImageButton) ((MainActivity) context).findViewById(R.id.ibPlayNext); + ProgressBar pbTrackPlay = (ProgressBar) ((MainActivity) context).findViewById(R.id.pbTrackPlay); + + pbTrackPlay.getProgressDrawable().setColorFilter(context.getResources().getColor(R.color.primaryInverted), PorterDuff.Mode.SRC_IN); + + // Music Notification + + NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); + PendingIntent mainActivity = PendingIntent.getActivity(context, 101, new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + + NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_statusbar) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setContentIntent(mainActivity) + .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher)) + .setPriority(NotificationCompat.PRIORITY_HIGH); + + ibPlay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View v) { + if (MusicPlayerService.mMediaPlayer.isPlaying()) { + MusicPlayerService.mMediaPlayer.pause(); + } else { + MusicPlayerService.mMediaPlayer.start(); + } + } + }); + ibAddToBucket.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MusicPlayerService.mMediaPlayer != null) { + Utils.bucketOps(MusicPlayerService.PLAYING_TRACK.getPath(), !(Boolean) ibAddToBucket.getTag(), context); + if (MusicPlayerService.PLAYING_TRACK.getBucket()) { + ((ImageButton) v).setImageResource(R.drawable.ic_track_bucket_added); + Toast.makeText(context, "Added to bucket", Toast.LENGTH_SHORT).show(); + } else { + ((ImageButton) v).setImageResource(R.drawable.ic_track_bucket_add); + } + } + } + }); + ibPlayNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MusicPlayerService.next(context); + } + }); + switch (intent.getAction()) { + case MusicPlayerService.ACTION_PLAY_TRACK: + tvPlayingTrackName.setText(MusicPlayerService.PLAYING_TRACK.getName()); + tvPlayingArtistName.setText(MusicPlayerService.PLAYING_TRACK.getAlbum()); + if (!MusicPlayerService.PLAYING_TRACK.getBucket()) { + ibAddToBucket.setImageResource(R.drawable.ic_track_bucket_add); + } else { + ibAddToBucket.setImageResource(R.drawable.ic_track_bucket_added); + } + ibAddToBucket.setTag(MusicPlayerService.PLAYING_TRACK.getBucket()); + mBuilder.setContentTitle(MusicPlayerService.PLAYING_TRACK.getName()) + .setContentText(MusicPlayerService.PLAYING_TRACK.getAlbum()); + int notifyId = 1; + mNotificationManager.notify(notifyId, mBuilder.build()); + break; +// case MusicPlayerService.ACTION_PAUSE_TRACK: +// +// break; +// case MusicPlayerService.ACTION_NEXT_TRACK: +// break; + } + + } +} diff --git a/app/src/main/java/com/sidzi/circleofmusic/helpers/Utils.java b/app/src/main/java/com/sidzi/circleofmusic/helpers/Utils.java index ca008ae..78dbc9c 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/helpers/Utils.java +++ b/app/src/main/java/com/sidzi/circleofmusic/helpers/Utils.java @@ -15,10 +15,10 @@ import java.util.ArrayList; import java.util.List; -class Utils { +public class Utils { static boolean BUCKET_OPS = false; - static void bucketOps(String path, Boolean bucket, Context mContext) { + public static void bucketOps(String path, Boolean bucket, Context mContext) { final OrmHandler ormHandler = OpenHelperManager.getHelper(mContext, OrmHandler.class); try { Dao dbTrack = ormHandler.getDao(Track.class); diff --git a/app/src/main/java/com/sidzi/circleofmusic/ui/AlarmActivity.java b/app/src/main/java/com/sidzi/circleofmusic/ui/AlarmActivity.java new file mode 100644 index 0000000..b825f93 --- /dev/null +++ b/app/src/main/java/com/sidzi/circleofmusic/ui/AlarmActivity.java @@ -0,0 +1,57 @@ +package com.sidzi.circleofmusic.ui; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import com.sidzi.circleofmusic.R; + +import java.util.Calendar; + + +public class AlarmActivity extends AppCompatActivity { + EditText etTimePicker; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_alarm); + etTimePicker = (EditText) findViewById(R.id.etTimePicker); + etTimePicker.setHint("hhmm"); + Button bSetAlarm = (Button) findViewById(R.id.bSetAlarm); + bSetAlarm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + setAlarm(); + } + }); + } + + void setAlarm() { + + Intent intent = new Intent("com.sidzi.circleofmusic.PLAY_TRACK"); + + intent.putExtra("track_path", "https://circleofmusic-sidzi.rhcloud.com/streamrock"); + intent.putExtra("track_name", "Alarm"); + intent.putExtra("track_artist", "Wake up!"); + intent.putExtra("bucket", false); + + + AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); + Calendar calendar = Calendar.getInstance(); + + PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 445165, intent, PendingIntent.FLAG_UPDATE_CURRENT | Intent.FILL_IN_DATA); + + int hour = Integer.parseInt(etTimePicker.getText().subSequence(0, 2).toString()); + int minute = Integer.parseInt(etTimePicker.getText().subSequence(2, 4).toString()); + + calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), Calendar.DATE, hour, minute); + + alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); + } +} diff --git a/app/src/main/java/com/sidzi/circleofmusic/ui/MainActivity.java b/app/src/main/java/com/sidzi/circleofmusic/ui/MainActivity.java index 661a6e1..25c0e80 100644 --- a/app/src/main/java/com/sidzi/circleofmusic/ui/MainActivity.java +++ b/app/src/main/java/com/sidzi/circleofmusic/ui/MainActivity.java @@ -44,18 +44,20 @@ import com.sidzi.circleofmusic.adapters.TracksAdapter; import com.sidzi.circleofmusic.ai.Trebie; import com.sidzi.circleofmusic.config; -import com.sidzi.circleofmusic.helpers.AudioEventHandler; import com.sidzi.circleofmusic.helpers.BucketSaver; import com.sidzi.circleofmusic.helpers.DatabaseSynchronization; import com.sidzi.circleofmusic.helpers.LocalMusicLoader; import com.sidzi.circleofmusic.helpers.MediaButtonHandler; +import com.sidzi.circleofmusic.helpers.MusicPlayerService; +import com.sidzi.circleofmusic.helpers.MusicPlayerViewHandler; import com.sidzi.circleofmusic.helpers.VerticalSpaceDecorationHelper; import org.json.JSONException; import org.json.JSONObject; public class MainActivity extends AppCompatActivity { - private AudioEventHandler mAudioEventHandler; + static public MusicPlayerService mMusicPlayerService; + private MusicPlayerViewHandler mMusicPlayerViewHandler; /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a @@ -110,12 +112,20 @@ public void onErrorResponse(VolleyError error) { }); requestQueue.add(eosCheck); - mAudioEventHandler = new AudioEventHandler(); - registerReceiver(mAudioEventHandler, new IntentFilter("com.sidzi.circleofmusic.PLAY_TRACK")); + + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(MusicPlayerService.ACTION_PLAY_TRACK); + intentFilter.addAction(MusicPlayerService.ACTION_PAUSE_TRACK); + intentFilter.addAction(MusicPlayerService.ACTION_NEXT_TRACK); + + + mMusicPlayerViewHandler = new MusicPlayerViewHandler(); + registerReceiver(mMusicPlayerViewHandler, intentFilter); /* Handles headphone button click */ + AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); ComponentName componentName = new ComponentName(getPackageName(), MediaButtonHandler.class.getName()); audioManager.registerMediaButtonEventReceiver(componentName); @@ -177,6 +187,7 @@ public boolean onQueryTextChange(String newText) { return false; } }); + mMusicPlayerService = new MusicPlayerService(this); } } @@ -200,6 +211,10 @@ public boolean onOptionsItemSelected(MenuItem item) { tabLayout.setVisibility(View.INVISIBLE); } break; + case R.id.alarm: + Intent intent = new Intent(this, AlarmActivity.class); + startActivity(intent); + break; } return super.onOptionsItemSelected(item); } @@ -213,18 +228,17 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis @Override protected void onDestroy() { try { - unregisterReceiver(mAudioEventHandler); + unregisterReceiver(mMusicPlayerViewHandler); BucketSaver bucketSaver = new BucketSaver(this); bucketSaver.saveFile(); - if (AudioEventHandler.mMediaPlayer.isPlaying()) { -// Add background service here - AudioEventHandler.mMediaPlayer.stop(); - } - AudioEventHandler.mTrackProgressObserver.stop(); - AudioEventHandler.mMediaPlayer.reset(); - AudioEventHandler.mMediaPlayer.release(); - AudioEventHandler.mMediaPlayer = null; - AudioEventHandler.mNotificationManager.cancelAll(); +// if (MusicPlayerViewHandler.mMediaPlayer.isPlaying()) { +//// Add background service here +// MusicPlayerViewHandler.mMediaPlayer.stop(); +// } +//// MusicPlayerViewHandler.mTrackProgressObserver.stop(); +// MusicPlayerViewHandler.mMediaPlayer.reset(); +// MusicPlayerViewHandler.mMediaPlayer.release(); +// MusicPlayerViewHandler.mMediaPlayer = null; } catch (IllegalArgumentException | NullPointerException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/sidzi/circleofmusic/views/MusicPlaybackPanel.java b/app/src/main/java/com/sidzi/circleofmusic/views/MusicPlaybackPanel.java new file mode 100644 index 0000000..ee9a646 --- /dev/null +++ b/app/src/main/java/com/sidzi/circleofmusic/views/MusicPlaybackPanel.java @@ -0,0 +1,103 @@ +//package com.sidzi.circleofmusic.views; +// +// +//import android.content.Context; +//import android.util.AttributeSet; +//import android.view.MotionEvent; +//import android.view.View; +//import android.widget.FrameLayout; +//import android.widget.ImageButton; +//import android.widget.ProgressBar; +//import android.widget.TextView; +//import android.widget.Toast; +// +//import com.sidzi.circleofmusic.R; +//import com.sidzi.circleofmusic.helpers.MusicPlayerService; +//import com.sidzi.circleofmusic.helpers.Utils; +// +//import static com.sidzi.circleofmusic.helpers.MusicPlayerService.mMediaPlayer; +// +//public class MusicPlaybackPanel extends FrameLayout { +// +// private TextView tvPlayingTrackName = null; +// private TextView tvPlayingArtistName = null; +// private ImageButton ibPlay = null; +// private ImageButton ibAddToBucket = null; +// private ImageButton ibPlayNext = null; +// private ProgressBar pbTrackPlay = null; +// private Context mContext; +// +// public MusicPlaybackPanel(Context context) { +// super(context); +// mContext = context; +// inflate(context, R.layout.playback_panel, this); +// init(); +// } +// +// public MusicPlaybackPanel(Context context, AttributeSet attrs) { +// super(context, attrs); +// inflate(context, R.layout.playback_panel, this); +// init(); +// } +// +// +// void init() { +// tvPlayingTrackName = (TextView) findViewById(R.id.tvPlayingTrackName); +// tvPlayingArtistName = (TextView) findViewById(R.id.tvPlayingTrackArtist); +// ibPlay = (ImageButton) findViewById(R.id.ibPlayPause); +// ibAddToBucket = (ImageButton) findViewById(R.id.ibAddToBucket); +// ibPlayNext = (ImageButton) findViewById(R.id.ibPlayNext); +// pbTrackPlay = (ProgressBar) findViewById(R.id.pbTrackPlay); +// } +// +// @Override +// public boolean onTouchEvent(MotionEvent event) { +// return false; +// } +// +// void setup() { +// ibPlay.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(final View v) { +// if (mMediaPlayer.isPlaying()) { +// mMediaPlayer.pause(); +// } else { +// mMediaPlayer.start(); +// } +// } +// }); +// ibAddToBucket.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// if (mMediaPlayer != null) { +// Utils.bucketOps(MusicPlayerService.PLAYING_TRACK_PATH, !(Boolean) ibAddToBucket.getTag(), mContext); +// if (!(Boolean) ibAddToBucket.getTag()) { +// ((ImageButton) v).setImageResource(R.drawable.ic_track_bucket_added); +// Toast.makeText(mContext, "Added to bucket", Toast.LENGTH_SHORT).show(); +// } else { +// ((ImageButton) v).setImageResource(R.drawable.ic_track_bucket_add); +// } +// ibAddToBucket.setTag(!(Boolean) ibAddToBucket.getTag()); +// } +// } +// }); +// ibPlayNext.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// MusicPlayerService.next(); +// } +// }); +// } +// +// public void updateViews() { +// ibPlay.setImageResource(R.drawable.ic_track_stop); +// tvPlayingTrackName.setText(MusicPlayerService.PLAYING_TRACK.getName()); +// tvPlayingArtistName.setText(MusicPlayerService.PLAYING_TRACK.getAlbum()); +// if (!MusicPlayerService.PLAYING_TRACK.getBucket()) { +// ibAddToBucket.setImageResource(R.drawable.ic_track_bucket_add); +// } else { +// ibAddToBucket.setImageResource(R.drawable.ic_track_bucket_added); +// } +// ibAddToBucket.setTag(MusicPlayerService.PLAYING_TRACK.getBucket()); +// } +//} diff --git a/app/src/main/res/layout/activity_alarm.xml b/app/src/main/res/layout/activity_alarm.xml new file mode 100644 index 0000000..b5c8330 --- /dev/null +++ b/app/src/main/res/layout/activity_alarm.xml @@ -0,0 +1,34 @@ + + + + + + + +