Music Light
Download MaterialX 2.8
Get the Full Android Source Code for all the listed Layouts and more.
Buy Now for $25Layout Screenshot

package com.material.components.activity.player;
import android.content.res.AssetFileDescriptor;
import android.graphics.PorterDuff;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatSeekBar;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
import com.material.components.R;
import com.material.components.utils.MusicUtils;
import com.material.components.utils.Tools;
public class PlayerMusicLight extends AppCompatActivity {
private View parent_view;
private AppCompatSeekBar seek_song_progressbar;
private FloatingActionButton bt_play;
private TextView tv_song_current_duration, tv_song_total_duration;
// Media Player
private MediaPlayer mp;
// Handler to update UI timer, progress bar etc,.
private Handler mHandler = new Handler();
//private SongsManager songManager;
private MusicUtils utils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player_music_light);
initToolbar();
initComponent();
}
private void initToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
Tools.setSystemBarColor(this, R.color.grey_5);
Tools.setSystemBarLight(this);
}
private void initComponent() {
parent_view = findViewById(R.id.parent_view);
seek_song_progressbar = (AppCompatSeekBar) findViewById(R.id.seek_song_progressbar);
bt_play = (FloatingActionButton) findViewById(R.id.bt_play);
// set Progress bar values
seek_song_progressbar.setProgress(0);
seek_song_progressbar.setMax(MusicUtils.MAX_PROGRESS);
tv_song_current_duration = (TextView) findViewById(R.id.tv_song_current_duration);
tv_song_total_duration = (TextView) findViewById(R.id.tv_song_total_duration);
// Media Player
mp = new MediaPlayer();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// Changing button image to play button
bt_play.setImageResource(R.drawable.ic_play_arrow);
}
});
try {
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor afd = getAssets().openFd("short_music.mp3");
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
} catch (Exception e) {
Snackbar.make(parent_view, "Cannot load audio file", Snackbar.LENGTH_SHORT).show();
}
utils = new MusicUtils();
// Listeners
seek_song_progressbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// remove message Handler from updating progress bar
mHandler.removeCallbacks(mUpdateTimeTask);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(mUpdateTimeTask);
int totalDuration = mp.getDuration();
int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration);
// forward or backward to certain seconds
mp.seekTo(currentPosition);
// update timer progress again
mHandler.post(mUpdateTimeTask);
}
});
buttonPlayerAction();
updateTimerAndSeekbar();
}
/**
* Play button click event plays a song and changes button to pause image
* pauses a song and changes button to play image
*/
private void buttonPlayerAction() {
bt_play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// check for already playing
if (mp.isPlaying()) {
mp.pause();
// Changing button image to play button
bt_play.setImageResource(R.drawable.ic_play_arrow);
} else {
// Resume song
mp.start();
// Changing button image to pause button
bt_play.setImageResource(R.drawable.ic_pause);
// Updating progress bar
mHandler.post(mUpdateTimeTask);
}
}
});
}
public void controlClick(View v) {
int id = v.getId();
switch (id) {
case R.id.bt_repeat: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Repeat", Snackbar.LENGTH_SHORT).show();
break;
}
case R.id.bt_shuffle: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Shuffle", Snackbar.LENGTH_SHORT).show();
break;
}
case R.id.bt_prev: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Previous", Snackbar.LENGTH_SHORT).show();
break;
}
case R.id.bt_next: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Next", Snackbar.LENGTH_SHORT).show();
break;
}
}
}
private boolean toggleButtonColor(ImageButton bt) {
String selected = (String) bt.getTag(bt.getId());
if (selected != null) { // selected
bt.setColorFilter(getResources().getColor(R.color.red_500), PorterDuff.Mode.SRC_ATOP);
bt.setTag(bt.getId(), null);
return false;
} else {
bt.setTag(bt.getId(), "selected");
bt.setColorFilter(getResources().getColor(R.color.red_500), PorterDuff.Mode.SRC_ATOP);
return true;
}
}
/**
* Background Runnable thread
*/
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
updateTimerAndSeekbar();
// Running this thread after 10 milliseconds
if (mp.isPlaying()) {
mHandler.postDelayed(this, 100);
}
}
};
private void updateTimerAndSeekbar() {
long totalDuration = mp.getDuration();
long currentDuration = mp.getCurrentPosition();
// Displaying Total Duration time
tv_song_total_duration.setText(utils.milliSecondsToTimer(totalDuration));
// Displaying time completed playing
tv_song_current_duration.setText(utils.milliSecondsToTimer(currentDuration));
// Updating progress bar
int progress = (int) (utils.getProgressSeekBar(currentDuration, totalDuration));
seek_song_progressbar.setProgress(progress);
}
// stop player when destroy
@Override
public void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(mUpdateTimeTask);
mp.release();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_music_setting, menu);
Tools.changeMenuIconColor(menu, getResources().getColor(R.color.grey_60));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
} else {
Snackbar.make(parent_view, item.getTitle(), Snackbar.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}