/**
* This mFileModel is part of FileSpace for Android, an app for managing your server (mFileModelList, talks...).
* <p/>
* Copyright (c) 2014-2015 FileSpace for Android contributors (http://mercandalli.com)
* <p/>
* LICENSE:
* <p/>
* FileSpace for Android is free software: you can redistribute it and/or modify it under the terms of the GNU General
* Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any
* later version.
* <p/>
* FileSpace for Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* @author Jonathan Mercandalli
* @license http://www.gnu.org/licenses/gpl.html
* @copyright 2014-2015 FileSpace for Android contributors (http://mercandalli.com)
*/
package com.mercandalli.android.apps.files.file.audio;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;
import com.mercandalli.android.apps.files.R;
import com.mercandalli.android.apps.files.common.view.PlayPauseView;
import com.mercandalli.android.apps.files.common.view.slider.Slider;
import com.mercandalli.android.apps.files.file.audio.cast.FileAudioCast;
import com.mercandalli.android.apps.files.shared.SharedAudioPlayerUtils;
import com.mercandalli.android.library.base.precondition.Preconditions;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* The {@link AppCompatActivity} to play/pause an audio file.
*/
public class FileAudioActivity extends AppCompatActivity implements
View.OnClickListener,
FileAudioPlayerManager.OnPlayerStatusChangeListener {
/* package */ static final String EXTRA_IS_ONLINE = "FileAudioActivity.Extra.EXTRA_IS_ONLINE";
/* package */ static final String EXTRA_FILE_CURRENT_POSITION = "FileAudioActivity.Extra.EXTRA_FILE_CURRENT_POSITION";
/* package */ static final String EXTRA_FILES_PATH = "FileAudioActivity.Extra.EXTRA_FILES_PATH";
private boolean mIsOnline;
private int mCurrentPosition;
@NonNull
private final List<FileAudioModel> mFileAudioModelList = new ArrayList<>();
private Slider mSliderNumber;
private TextView mTitleTextView;
private TextView mSizeTextView;
private PlayPauseView mPlayPauseView;
private FileAudioPlayerManager mFileAudioPlayerManager;
private boolean mFirstStart;
@NonNull
private final FileAudioCast mFileAudioCast = new FileAudioCast();
/**
* Start this {@link AppCompatActivity}.
*/
public static void start(
final Activity activity,
final int currentPosition,
final List<String> fileMusicPath,
final View animationView,
final boolean isOnline) {
Bundle args = new Bundle();
final Intent intent = new Intent(activity, FileAudioActivity.class);
intent.putExtra(EXTRA_IS_ONLINE, isOnline);
intent.putExtra(EXTRA_FILE_CURRENT_POSITION, currentPosition);
intent.putExtra(EXTRA_FILES_PATH, new ArrayList<>(fileMusicPath));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && animationView != null) {
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
activity, animationView, "transitionIcon");
args = options.toBundle();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
activity.startActivity(intent, args);
} else {
activity.startActivity(intent);
}
activity.overridePendingTransition(R.anim.left_in, R.anim.left_out);
}
public static void resume(final Context context) {
final Intent intent = new Intent(context, FileAudioActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initialize View, player and ChromeCast.
setContentView(R.layout.activity_file_audio);
mFileAudioPlayerManager = FileAudioPlayerManager.getInstance(this);
mFileAudioPlayerManager.addOnPlayerStatusChangeListener(this);
mFileAudioCast.onCreate(this);
if (savedInstanceState == null) {
mFirstStart = true;
}
final Toolbar toolbar = (Toolbar) findViewById(R.id.activity_file_audio_toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
toolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.actionbar_audio));
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle("FileSpace - Audio");
}
}
final Window window = getWindow();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(this, R.color.notifications_bar_audio));
}
mTitleTextView = (TextView) findViewById(R.id.title);
mSizeTextView = (TextView) findViewById(R.id.size);
mSliderNumber = (Slider) findViewById(R.id.sliderNumber);
mSliderNumber.setValueToDisplay(new Slider.ValueToDisplay() {
@Override
public String convert(int value) {
return getTimeStr(value);
}
});
mSliderNumber.setOnValueChangedListener(new Slider.OnValueChangedListener() {
@Override
public void onValueChanged(int value) {
}
@Override
public void onValueChangedUp(int value) {
mFileAudioPlayerManager.seekTo(value);
}
});
mPlayPauseView = (PlayPauseView) findViewById(R.id.activity_file_audio_play);
mPlayPauseView.setOnClickListener(this);
findViewById(R.id.activity_file_audio_next).setOnClickListener(this);
findViewById(R.id.activity_file_audio_previous).setOnClickListener(this);
final Bundle bundle = getIntent().getExtras();
if (bundle != null &&
bundle.containsKey(EXTRA_IS_ONLINE) &&
bundle.containsKey(EXTRA_FILE_CURRENT_POSITION) &&
bundle.containsKey(EXTRA_FILES_PATH)) {
// Get data
mIsOnline = bundle.getBoolean(EXTRA_IS_ONLINE);
mCurrentPosition = bundle.getInt(EXTRA_FILE_CURRENT_POSITION);
final List<String> absolutePathArray = bundle.getStringArrayList(EXTRA_FILES_PATH);
if (absolutePathArray != null) {
for (String absolutePath : absolutePathArray) {
if (mIsOnline) {
mFileAudioModelList.add(
((FileAudioModel.FileAudioModelBuilder) (
new FileAudioModel.FileAudioModelBuilder()
.isOnline(true)
.url(absolutePath)))
.build());
} else {
mFileAudioModelList.add(
new FileAudioModel.FileAudioModelBuilder()
.file(new File(absolutePath)).build());
}
}
}
if (mFileAudioModelList.isEmpty()) {
Toast.makeText(this, "Oops, I have an empty list :(", Toast.LENGTH_SHORT).show();
finish();
return;
}
if (mFirstStart) {
mFileAudioPlayerManager.startMusic(mCurrentPosition, mFileAudioModelList);
mFileAudioCast.startMusic(mCurrentPosition, mFileAudioModelList);
} else {
syncSongs(mFileAudioPlayerManager.getCurrentMusicIndex(), mFileAudioPlayerManager.getFileAudioModelList());
}
}
mFirstStart = false;
}
@Override
protected void onDestroy() {
mFileAudioPlayerManager.removeOnPreviewPlayerStatusChangeListener(this);
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mFileAudioCast.onResume();
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing()) {
mFileAudioCast.onPause();
}
}
@Override
public void onClick(final View v) {
final int idView = v.getId();
switch (idView) {
case R.id.activity_file_audio_play:
if (mFileAudioPlayerManager.isPlaying()) {
mFileAudioPlayerManager.pause();
} else {
mFileAudioPlayerManager.play();
}
break;
case R.id.activity_file_audio_next:
mFileAudioPlayerManager.next();
break;
case R.id.activity_file_audio_previous:
mFileAudioPlayerManager.previous();
break;
}
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_audio_activity, menu);
mFileAudioCast.onCreateOptionsMenu(menu.findItem(R.id.action_cast));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finishActivity();
return true;
case R.id.action_cast:
mFileAudioCast.onCreateOptionsMenu(item);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
finishActivity();
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onPlayerStatusChanged(@SharedAudioPlayerUtils.Status final int status) {
switch (status) {
case SharedAudioPlayerUtils.AUDIO_PLAYER_STATUS_PAUSED:
if (!mPlayPauseView.isPlay() && !mPlayPauseView.isAnimationPlaying()) {
mPlayPauseView.toggle();
}
break;
case SharedAudioPlayerUtils.AUDIO_PLAYER_STATUS_PLAYING:
if (mPlayPauseView.isPlay() && !mPlayPauseView.isAnimationPlaying()) {
mPlayPauseView.toggle();
}
break;
case SharedAudioPlayerUtils.AUDIO_PLAYER_STATUS_PREPARING:
break;
case SharedAudioPlayerUtils.AUDIO_PLAYER_STATUS_UNKNOWN:
break;
}
return false;
}
@Override
public boolean onPlayerProgressChanged(final int progress, final int duration) {
mSliderNumber.setProgress(progress);
mSliderNumber.setMax(duration);
mSizeTextView.setText(String.format("%s / %s", getTimeStr(progress), getTimeStr(duration)));
return false;
}
@Override
public boolean onAudioChanged(
final int musicPosition,
final List<FileAudioModel> musics,
@SharedAudioPlayerUtils.Action final int action) {
Preconditions.checkNotNull(musics);
syncSongs(musicPosition, musics);
return false;
}
public void finishActivity() {
supportFinishAfterTransition();
}
private String getTimeStr(final long milliseconds) {
final long minutes = milliseconds / 60_000;
final long seconds = (milliseconds / 1_000) % 60;
return minutes + ":" + (seconds < 10 ? "0" : "") + seconds;
}
private void syncSongs(final int musicPosition, final List<FileAudioModel> musics) {
Preconditions.checkNotNull(musics);
if (musics.isEmpty()) {
finish();
return;
}
mCurrentPosition = musicPosition;
mFileAudioModelList.clear();
mFileAudioModelList.addAll(musics);
mTitleTextView.setText(musics.get(musicPosition).getName());
}
}