package com.marverenic.music.activity.instance;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import com.marverenic.adapter.HeterogeneousAdapter;
import com.marverenic.music.JockeyApplication;
import com.marverenic.music.R;
import com.marverenic.music.activity.BaseActivity;
import com.marverenic.music.adapter.RuleHeaderSingleton;
import com.marverenic.music.adapter.RuleSection;
import com.marverenic.music.data.store.PlaylistStore;
import com.marverenic.music.model.AutoPlaylist;
import com.marverenic.music.model.playlistrules.AutoPlaylistRule;
import com.marverenic.music.view.BackgroundDecoration;
import com.marverenic.music.view.DividerDecoration;
import javax.inject.Inject;
public class AutoPlaylistEditActivity extends BaseActivity {
private static final String PLAYLIST_EXTRA = "AutoPlaylistEditActivity.PLAYLIST";
private static final String SAVED_BUILDER = "AutoPlaylistEditActivity.PLAYLIST_BUILDER";
@Inject PlaylistStore mPlaylistStore;
private AutoPlaylist mOriginalPlaylist;
private AutoPlaylist.Builder mBuilder;
private HeterogeneousAdapter mAdapter;
public static Intent newIntent(Context context) {
return newIntent(context, null);
}
public static Intent newIntent(Context context, AutoPlaylist target) {
Intent intent = new Intent(context, AutoPlaylistEditActivity.class);
intent.putExtra(PLAYLIST_EXTRA, target);
return intent;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_instance);
JockeyApplication.getComponent(this).inject(this);
mOriginalPlaylist = getIntent().getParcelableExtra(PLAYLIST_EXTRA);
if (mOriginalPlaylist == null) {
mOriginalPlaylist = emptyPlaylist();
}
if (savedInstanceState != null) {
mBuilder = savedInstanceState.getParcelable(SAVED_BUILDER);
}
if (mBuilder == null) {
mBuilder = new AutoPlaylist.Builder(mOriginalPlaylist);
}
if (getSupportActionBar() != null) {
if (mOriginalPlaylist == null) {
getSupportActionBar().setTitle(R.string.playlist_auto_new);
} else {
getSupportActionBar().setTitle(mOriginalPlaylist.getPlaylistName());
}
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_done_24dp);
}
mAdapter = new HeterogeneousAdapter()
.addSection(new RuleHeaderSingleton(mOriginalPlaylist, mBuilder))
.addSection(new RuleSection(mBuilder.getRules()));
mAdapter.setHasStableIds(true);
RecyclerView list = (RecyclerView) findViewById(R.id.list);
list.setAdapter(mAdapter);
list.setLayoutManager(new LinearLayoutManager(this));
list.addItemDecoration(new BackgroundDecoration());
list.addItemDecoration(new DividerDecoration(this));
}
private static AutoPlaylist emptyPlaylist() {
return new AutoPlaylist.Builder()
.setName("")
.setId(AutoPlaylist.Builder.NO_ID)
.setMatchAllRules(true)
.setMaximumEntries(-25)
.setSortMethod(AutoPlaylistRule.ID)
.setTruncateMethod(AutoPlaylistRule.ID)
.setTruncateAscending(true)
.setRules(emptyRule())
.build();
}
private static AutoPlaylistRule emptyRule() {
return new AutoPlaylistRule.Factory()
.setType(AutoPlaylistRule.SONG)
.setField(AutoPlaylistRule.NAME)
.setMatch(AutoPlaylistRule.CONTAINS)
.setValue("")
.build();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_auto_playlist_editor, menu);
return true;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(SAVED_BUILDER, mBuilder);
}
public void saveChanges() {
if (mOriginalPlaylist.getPlaylistId() == AutoPlaylist.Builder.NO_ID) {
mPlaylistStore.makePlaylist(mBuilder.build());
} else {
mPlaylistStore.editPlaylist(mBuilder.build());
}
}
private boolean rulesChanged() {
if (mBuilder.getRules().size() != mOriginalPlaylist.getRules().size()) {
return true;
}
for (int i = 0; i < mBuilder.getRules().size(); i++) {
if (!mOriginalPlaylist.getRules().get(i).equals(mBuilder.getRules().get(i))) {
return true;
}
}
return false;
}
private boolean validateName() {
String originalName = mOriginalPlaylist.getPlaylistName().trim();
String editedName = mBuilder.getName().trim();
boolean equal = !mOriginalPlaylist.getPlaylistName().trim().isEmpty()
&& originalName.equalsIgnoreCase(editedName);
boolean valid = equal || mPlaylistStore.verifyPlaylistName(editedName) == null;
if (!valid) {
RecyclerView list = (RecyclerView) findViewById(R.id.list);
list.scrollToPosition(0);
}
return valid;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_auto_playlist_edit_add:
mBuilder.getRules().add(emptyRule());
mAdapter.notifyItemInserted(mBuilder.getRules().size());
return true;
case R.id.menu_auto_playlist_discard:
if (rulesChanged()) {
new AlertDialog.Builder(this)
.setMessage("Discard changes?")
.setPositiveButton("Discard", (dialog, which) -> {finish();})
.setNegativeButton(R.string.action_cancel, null)
.show();
} else {
finish();
}
return true;
case android.R.id.home:
if (validateName()) {
if (!mBuilder.isEqual(mOriginalPlaylist) || rulesChanged()) {
saveChanges();
}
} else {
return true;
}
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (!mBuilder.isEqual(mOriginalPlaylist) || rulesChanged()) {
new AlertDialog.Builder(this)
.setMessage("Save changes?")
.setPositiveButton("Save", (dialog, which) -> {
if (validateName()) {
saveChanges();
super.onBackPressed();
}
})
.setNegativeButton("Discard", (dialog, which) -> {
super.onBackPressed();
})
.setNeutralButton("Cancel", null)
.show();
} else {
super.onBackPressed();
}
}
}