package com.marverenic.music.dialog; import android.app.Dialog; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.design.widget.TextInputLayout; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; import android.support.v4.content.res.ResourcesCompat; import android.support.v7.app.AlertDialog; import android.support.v7.widget.AppCompatEditText; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; import android.view.View; import android.widget.Button; import com.marverenic.music.JockeyApplication; import com.marverenic.music.R; import com.marverenic.music.data.store.PlaylistStore; import com.marverenic.music.data.store.ThemeStore; import com.marverenic.music.model.Playlist; import com.marverenic.music.model.Song; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; public class CreatePlaylistDialogFragment extends DialogFragment implements TextWatcher { private static final String KEY_TITLE = "CreatePlaylistDialogFragment.Name"; private static final String KEY_SNACKBAR_VIEW = "CreatePlaylistDialogFragment.Snackbar"; private static final String KEY_SONGS = "CreatePlaylistDialogFragment.Songs"; @Inject PlaylistStore mPlaylistStore; @Inject ThemeStore mThemeStore; private AlertDialog mDialog; private TextInputLayout mInputLayout; private AppCompatEditText mEditText; private List<Song> mSongs; @IdRes private int mSnackbarView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); JockeyApplication.getComponent(this).inject(this); } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mSnackbarView = getArguments().getInt(KEY_SNACKBAR_VIEW); mSongs = getArguments().getParcelableArrayList(KEY_SONGS); onCreateDialogLayout(getArguments().getString(KEY_TITLE)); mDialog = new AlertDialog.Builder(getContext()) .setTitle(R.string.header_create_playlist) .setView(mInputLayout) .setPositiveButton(R.string.action_create, (dialog, which) -> {createPlaylist();}) .setNegativeButton(R.string.action_cancel, null) .show(); updateDialogButtons(true); int padding = (int) getResources().getDimension(R.dimen.alert_padding); ((View) mInputLayout.getParent()).setPadding( padding - mInputLayout.getPaddingLeft(), padding, padding - mInputLayout.getPaddingRight(), mInputLayout.getPaddingBottom()); return mDialog; } private void onCreateDialogLayout(@Nullable String restoredName) { mInputLayout = new TextInputLayout(getContext()); mEditText = new AppCompatEditText(getContext()); mEditText.setInputType(InputType.TYPE_CLASS_TEXT); mEditText.setHint(R.string.hint_playlist_name); mEditText.setText(restoredName); mInputLayout.addView(mEditText); mInputLayout.setErrorEnabled(true); mEditText.addTextChangedListener(this); } private void createPlaylist() { String name = mEditText.getText().toString(); Playlist created = mPlaylistStore.makePlaylist(name, mSongs); showSnackbar(created); } private void showSnackbar(Playlist created) { View container = getActivity().findViewById(mSnackbarView); if (container != null) { String name = created.getPlaylistName(); String message = getString(R.string.message_created_playlist, name); Snackbar.make(container, message, Snackbar.LENGTH_LONG) .setAction(R.string.action_undo, view -> { mPlaylistStore.removePlaylist(created); }) .show(); } } private void updateDialogButtons(boolean error) { Button button = mDialog.getButton(AlertDialog.BUTTON_POSITIVE); button.setEnabled(!error); if (error) { button.setTextColor(ResourcesCompat.getColor(getResources(), R.color.secondary_text_disabled, getActivity().getTheme())); } else { button.setTextColor(mThemeStore.getAccentColor()); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String error = mPlaylistStore.verifyPlaylistName(s.toString()); mInputLayout.setError(error); mDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(error == null && s.length() > 0); updateDialogButtons(error != null || s.length() == 0); } @Override public void afterTextChanged(Editable s) { } public static class Builder { private FragmentManager mFragmentManager; private Bundle mArgs; public Builder(FragmentManager fragmentManager) { mFragmentManager = fragmentManager; mArgs = new Bundle(); } public Builder setTitle(String title) { mArgs.putString(KEY_TITLE, title); return this; } public Builder setSongs(Song song) { return setSongs(Collections.singletonList(song)); } public Builder setSongs(List<Song> songs) { mArgs.putParcelableArrayList(KEY_SONGS, copyLocalSongs(songs)); return this; } private ArrayList<Song> copyLocalSongs(List<Song> from) { ArrayList<Song> copy = new ArrayList<>(); for (Song song : from) { if (song.isInLibrary()) copy.add(song); } return copy; } public Builder showSnackbarIn(@IdRes int snackbarContainerId) { mArgs.putInt(KEY_SNACKBAR_VIEW, snackbarContainerId); return this; } public void show(String tag) { CreatePlaylistDialogFragment dialogFragment = new CreatePlaylistDialogFragment(); dialogFragment.setArguments(mArgs); dialogFragment.show(mFragmentManager, tag); } } }