package com.marverenic.music.viewmodel;
import android.content.Context;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CompoundButton;
import com.marverenic.music.BR;
import com.marverenic.music.JockeyApplication;
import com.marverenic.music.data.store.PlaylistStore;
import com.marverenic.music.model.AutoPlaylist;
import com.marverenic.music.model.playlistrules.AutoPlaylistRule;
import javax.inject.Inject;
public class RuleHeaderViewModel extends BaseObservable {
private static final int[] TRUNCATE_CHOICES = new int[] {
AutoPlaylistRule.ID,
AutoPlaylistRule.NAME,
AutoPlaylistRule.PLAY_COUNT,
AutoPlaylistRule.PLAY_COUNT,
AutoPlaylistRule.SKIP_COUNT,
AutoPlaylistRule.SKIP_COUNT,
AutoPlaylistRule.DATE_ADDED,
AutoPlaylistRule.DATE_ADDED,
AutoPlaylistRule.DATE_PLAYED,
AutoPlaylistRule.DATE_PLAYED
};
private static final boolean[] TRUNCATE_ORDER_ASCENDING = new boolean[] {
true,
true,
false,
true,
false,
true,
false,
true,
false,
true
};
@Inject PlaylistStore mPlaylistStore;
private AutoPlaylist mOriginalReference;
private AutoPlaylist.Builder mBuilder;
private boolean mIgnoreFirstNameError;
public RuleHeaderViewModel(Context context) {
JockeyApplication.getComponent(context).inject(this);
}
public void setOriginalReference(AutoPlaylist playlist) {
mOriginalReference = playlist;
mIgnoreFirstNameError = true;
notifyPropertyChanged(BR.playlistNameError);
}
public void setBuilder(AutoPlaylist.Builder builder) {
mBuilder = builder;
notifyPropertyChanged(BR.playlistName);
notifyPropertyChanged(BR.playlistNameError);
notifyPropertyChanged(BR.matchAllRules);
notifyPropertyChanged(BR.matchAllRules);
notifyPropertyChanged(BR.songCountCapped);
notifyPropertyChanged(BR.chosenBySelection);
notifyPropertyChanged(BR.songCap);
}
@Bindable
public String getPlaylistName() {
return mBuilder.getName();
}
public TextWatcher onPlaylistNameChanged() {
return new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mBuilder.setName(charSequence.toString());
notifyPropertyChanged(BR.playlistName);
notifyPropertyChanged(BR.playlistNameError);
}
@Override
public void afterTextChanged(Editable editable) {}
};
}
@Bindable
public String getPlaylistNameError() {
if (mIgnoreFirstNameError) {
// Don't show initial errors
mIgnoreFirstNameError = false;
return null;
}
String initialName = mOriginalReference.getPlaylistName().trim();
String currentName = mBuilder.getName().trim();
if (!initialName.isEmpty() && initialName.equalsIgnoreCase(currentName)) {
// Don't show errors if the playlist name wasn't changed (unless the initial name was
// blank)
return null;
} else {
return mPlaylistStore.verifyPlaylistName(getPlaylistName());
}
}
@Bindable
public boolean isMatchAllRules() {
return mBuilder.isMatchAllRules();
}
public View.OnClickListener onMatchAllContainerClick() {
return v -> {
mBuilder.setMatchAllRules(!isMatchAllRules());
notifyPropertyChanged(BR.matchAllRules);
};
}
public CompoundButton.OnCheckedChangeListener onMatchAllToggle() {
return (checkBox, enabled) -> mBuilder.setMatchAllRules(enabled);
}
@Bindable
public boolean isSongCountCapped() {
return mBuilder.getMaximumEntries() >= 0;
}
public View.OnClickListener onSongCapContainerClick() {
return v -> {
mBuilder.setMaximumEntries(-1 * mBuilder.getMaximumEntries());
notifyPropertyChanged(BR.songCountCapped);
};
}
@Bindable
public String getSongCap() {
return Integer.toString(Math.abs(mBuilder.getMaximumEntries()));
}
public TextWatcher onSongCapChanged() {
return new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (!isSongCountCapped()) {
return;
}
String value = charSequence.toString();
if (value.isEmpty()) {
mBuilder.setMaximumEntries(0);
} else {
try {
mBuilder.setMaximumEntries(Integer.parseInt(charSequence.toString()));
} catch (NumberFormatException ignored) {
}
}
}
@Override
public void afterTextChanged(Editable editable) {}
};
}
@Bindable
public int getChosenBySelection() {
int i = 0;
while (TRUNCATE_CHOICES[i] != mBuilder.getTruncateMethod()) {
i++;
}
while (TRUNCATE_ORDER_ASCENDING[i] != mBuilder.isTruncateAscending()) {
i++;
}
return i;
}
public AdapterView.OnItemSelectedListener onTruncateMethodSelected() {
return new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
mBuilder.setTruncateMethod(TRUNCATE_CHOICES[pos]);
mBuilder.setTruncateAscending(TRUNCATE_ORDER_ASCENDING[pos]);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
};
}
public CompoundButton.OnCheckedChangeListener onTruncateToggle() {
return (checkBox, enabled) -> {
if (enabled) {
mBuilder.setMaximumEntries(Math.abs(mBuilder.getMaximumEntries()));
} else {
mBuilder.setMaximumEntries(-1 * Math.abs(mBuilder.getMaximumEntries()));
}
notifyPropertyChanged(BR.songCountCapped);
};
}
}