package com.marverenic.music.fragments;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.PreferenceGroupAdapter;
import android.support.v7.preference.PreferenceScreen;
import android.support.v7.preference.PreferenceViewHolder;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.marverenic.music.JockeyApplication;
import com.marverenic.music.R;
import com.marverenic.music.data.store.PreferenceStore;
import com.marverenic.music.data.store.ThemeStore;
import com.marverenic.music.player.PlayerController;
import com.marverenic.music.utils.Util;
import com.marverenic.music.view.BackgroundDecoration;
import com.marverenic.music.view.DividerDecoration;
import javax.inject.Inject;
public class PreferenceFragment extends PreferenceFragmentCompat
implements View.OnLongClickListener, SharedPreferences.OnSharedPreferenceChangeListener {
private static final String DIRECTORY_FRAGMENT =
"com.marverenic.music.fragments.DirectoryListFragment";
private static final String EQUALIZER_FRAGMENT =
"com.marverenic.music.fragments.EqualizerFragment";
@Inject PreferenceStore mPrefStore;
@Inject ThemeStore mThemeStore;
@Inject PlayerController mPlayerController;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
JockeyApplication.getComponent(this).inject(this);
}
@Override
public void onCreatePreferences(Bundle bundle, String rootKey) {
addPreferencesFromResource(R.xml.prefs);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
setDivider(null);
setDividerHeight(0);
return view;
}
@Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
RecyclerView view = super.onCreateRecyclerView(inflater, parent, savedInstanceState);
view.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.background));
int padding = (int) getResources().getDimension(R.dimen.global_padding);
view.setPadding(padding, 0, padding, 0);
view.addItemDecoration(new BackgroundDecoration(android.R.id.title));
view.addItemDecoration(new DividerDecoration(getContext(), android.R.id.title));
return view;
}
@Override
protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
return new PreferenceGroupAdapter(preferenceScreen) {
@Override
public void onBindViewHolder(PreferenceViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
// Override Equalizer preference attachment to add a long click listener
// and to change the detail text at runtime
String fragment = getItem(position).getFragment();
if ("com.marverenic.music.fragments.EqualizerFragment".equals(fragment)) {
ViewGroup itemView = (ViewGroup) holder.itemView;
TextView title = (TextView) itemView.findViewById(android.R.id.title);
TextView detail = (TextView) itemView.findViewById(android.R.id.summary);
boolean hasSystemEq = Util.getSystemEqIntent(getContext()) != null;
if (hasSystemEq && Util.hasEqualizer()) {
// If we have Jockey's Equalizer and another Equalizer
itemView.setOnLongClickListener(PreferenceFragment.this);
detail.setText(R.string.equalizer_more_options_detail);
detail.setVisibility(View.VISIBLE);
} else if (hasSystemEq && !Util.hasEqualizer()) {
// If we don't have any equalizers
detail.setText(R.string.equalizerUnsupported);
detail.setVisibility(View.VISIBLE);
itemView.setEnabled(false);
title.setEnabled(false);
detail.setEnabled(false);
}
}
}
};
}
@Override
public void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
if (toolbar != null) {
toolbar.setTitle(R.string.header_settings);
}
}
@Override
public void onPause() {
super.onPause();
getPreferenceManager().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
if (EQUALIZER_FRAGMENT.equals(preference.getFragment())) {
Intent eqIntent = Util.getSystemEqIntent(getActivity());
if (eqIntent != null && !mPrefStore.getEqualizerEnabled()) {
// If the system has an equalizer implementation already in place, use it
// to avoid weird problems and conflicts that can cause unexpected behavior
// for example, on Motorola devices, attaching an Equalizer can cause the
// MediaPlayer's volume to briefly become very loud -- even when the phone
// is muted
startActivity(eqIntent);
} else if (Util.hasEqualizer()) {
// If there isn't a global equalizer or the user has already enabled our
// equalizer, navigate to the built-in implementation
showEqualizerFragment();
} else {
Toast.makeText(getActivity(), R.string.equalizerUnsupported, Toast.LENGTH_LONG)
.show();
}
return true;
} else if (DIRECTORY_FRAGMENT.equals(preference.getFragment())) {
String prefKey = preference.getKey();
boolean exclude = getString(R.string.pref_key_excluded_dirs).equals(prefKey);
showDirectoryInclusionExclusionFragment(exclude);
return true;
} else if (getString(R.string.pref_key_create_launcher_icon).equals(preference.getKey())) {
if (mPrefStore.getIconColor() != mPrefStore.getPrimaryColor()) {
showNewShortcutDialog();
} else {
View root = getView();
Snackbar.make(root, R.string.add_shortcut_already_matched, Snackbar.LENGTH_LONG)
.show();
}
return true;
} else if (getString(R.string.pref_key_resume_with_headphones).equals(preference.getKey())) {
mPlayerController.updatePlayerPreferences(mPrefStore);
}
return super.onPreferenceTreeClick(preference);
}
private void showNewShortcutDialog() {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.add_shortcut)
.setMessage(R.string.add_shortcut_description)
.setPositiveButton(R.string.action_add,
(dialog, which) -> {
mThemeStore.createThemedLauncherIcon();
})
.setNegativeButton(R.string.action_cancel, null)
.show();
}
private void replaceFragment(Fragment next) {
getFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left,
R.anim.slide_in_left, R.anim.slide_out_right)
.replace(R.id.pref_fragment_container, next)
.addToBackStack(null)
.commit();
}
private void showEqualizerFragment() {
replaceFragment(new EqualizerFragment());
}
private void showDirectoryInclusionExclusionFragment(boolean exclude) {
replaceFragment(DirectoryListFragment.newInstance(exclude));
}
@Override
public boolean onLongClick(View v) {
if (Util.hasEqualizer()) {
showEqualizerFragment();
} else {
Toast
.makeText(
getActivity(),
R.string.equalizerUnsupported,
Toast.LENGTH_LONG)
.show();
}
return true;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (getString(R.string.pref_key_color_base).equals(key)
|| getString(R.string.pref_key_color_accent).equals(key)
|| getString(R.string.pref_key_color_primary).equals(key)) {
getActivity().recreate();
}
}
}