package com.wangdaye.mysplash.common.ui.fragment; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.view.NestedScrollingChild; import android.support.v4.view.NestedScrollingChildHelper; import android.support.v4.view.ViewCompat; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.widget.ListView; import com.wangdaye.mysplash.Mysplash; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.common.data.api.PhotoApi; import com.wangdaye.mysplash.common.ui.activity.SettingsActivity; import com.wangdaye.mysplash.common.ui.widget.SwipeBackCoordinatorLayout; import com.wangdaye.mysplash.common.ui.widget.preference.MysplashListPreference; import com.wangdaye.mysplash.common.ui.widget.preference.MysplashSwitchPreference; import com.wangdaye.mysplash.common.utils.DisplayUtils; import com.wangdaye.mysplash.common.utils.helper.NotificationHelper; import com.wangdaye.mysplash.common.utils.ValueUtils; import com.wangdaye.mysplash.common.utils.helper.IntentHelper; import com.wangdaye.mysplash.common.utils.manager.SettingsOptionManager; import com.wangdaye.mysplash.main.view.activity.MainActivity; import butterknife.ButterKnife; /** * Settings fragment. * * This fragment is used to show setting options. * * */ public class SettingsFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, NestedScrollingChild { private NestedScrollingChildHelper nestedScrollingChildHelper; // used to dispatch scroll action. private ListView listView; // preference list in preference fragment. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.perference); initView(); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); listView = ButterKnife.findById(view, android.R.id.list); if (listView != null) { listView.setOnTouchListener(new ScrollListener(getActivity())); nestedScrollingChildHelper = new NestedScrollingChildHelper(listView); nestedScrollingChildHelper.setNestedScrollingEnabled(true); } } private void initView() { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); initBasicPart(sharedPreferences); initFilterPart(sharedPreferences); initDownloadPart(sharedPreferences); initDisplayPart(sharedPreferences); } private void initBasicPart(SharedPreferences sharedPreferences) { // back to top. MysplashListPreference backToTop = (MysplashListPreference) findPreference(getString(R.string.key_back_to_top)); String backToTopValue = sharedPreferences.getString(getString(R.string.key_back_to_top), "all"); String backToTopName = ValueUtils.getBackToTopName(getActivity(), backToTopValue); backToTop.setSummary(getString(R.string.now) + " : " + backToTopName); backToTop.setOnPreferenceChangeListener(this); // language. MysplashListPreference language = (MysplashListPreference) findPreference(getString(R.string.key_language)); String languageValue = sharedPreferences.getString(getString(R.string.key_language), "follow_system"); String languageName = ValueUtils.getLanguageName(getActivity(), languageValue); language.setSummary(getString(R.string.now) + " : " + languageName); language.setOnPreferenceChangeListener(this); } private void initFilterPart(SharedPreferences sharedPreferences) { // default order. MysplashListPreference defaultOrder = (MysplashListPreference) findPreference(getString(R.string.key_default_photo_order)); String orderValue = sharedPreferences.getString(getString(R.string.key_default_photo_order), PhotoApi.ORDER_BY_LATEST); String orderName = ValueUtils.getOrderName(getActivity(), orderValue); defaultOrder.setSummary(getString(R.string.now) + " : " + orderName); defaultOrder.setOnPreferenceChangeListener(this); // collection type. MysplashListPreference collectionType = (MysplashListPreference) findPreference(getString(R.string.key_default_collection_type)); String typeValue = sharedPreferences.getString(getString(R.string.key_default_collection_type), "featured"); String valueName = ValueUtils.getCollectionName(getActivity(), typeValue); collectionType.setSummary(getString(R.string.now) + " : " + valueName); collectionType.setOnPreferenceChangeListener(this); } private void initDownloadPart(SharedPreferences sharedPreferences) { // download scale. MysplashListPreference downloadScale = (MysplashListPreference) findPreference(getString(R.string.key_download_scale)); String scaleValue = sharedPreferences.getString(getString(R.string.key_download_scale), "compact"); String scaleName = ValueUtils.getScaleName(getActivity(), scaleValue); downloadScale.setSummary(getString(R.string.now) + " : " + scaleName); downloadScale.setOnPreferenceChangeListener(this); } private void initDisplayPart(SharedPreferences sharedPreferences) { // saturation animation duration. MysplashListPreference duration = (MysplashListPreference) findPreference(getString(R.string.key_saturation_animation_duration)); String durationValue = sharedPreferences.getString(getString(R.string.key_saturation_animation_duration), "2000"); String durationName = ValueUtils.getSaturationAnimationDurationName(getActivity(), durationValue); duration.setSummary(getString(R.string.now) + " : " + durationName); duration.setOnPreferenceChangeListener(this); // grid list in port. MysplashSwitchPreference gridPort = (MysplashSwitchPreference) findPreference(getString(R.string.key_grid_list_in_port)); gridPort.setOnPreferenceChangeListener(this); if (!DisplayUtils.isTabletDevice(getActivity())) { PreferenceCategory display = (PreferenceCategory) findPreference("display"); display.removePreference(gridPort); } // grid list in land. MysplashSwitchPreference gridLand = (MysplashSwitchPreference) findPreference(getString(R.string.key_grid_list_in_land)); gridLand.setOnPreferenceChangeListener(this); } private void showRebootSnackbar() { NotificationHelper.showActionSnackbar( getString(R.string.feedback_notify_restart), getString(R.string.restart), Snackbar.LENGTH_SHORT, rebootListener); } @Nullable public ListView getScrolledView() { if (listView != null) { return listView; } else { return null; } } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference.getKey().equals(getString(R.string.key_custom_api_key))) { IntentHelper.startCustomApiActivity((SettingsActivity) getActivity()); } return true; } // interface. // on preference_widget changed listener. @Override public boolean onPreferenceChange(Preference preference, Object o) { if (preference.getKey().equals(getString(R.string.key_back_to_top))) { // back to top. SettingsOptionManager.getInstance(getActivity()).setBackToTopType((String) o); String backType = ValueUtils.getBackToTopName(getActivity(), (String) o); preference.setSummary(getString(R.string.now) + " : " + backType); } else if (preference.getKey().equals(getString(R.string.key_language))) { // language. SettingsOptionManager.getInstance(getActivity()).setLanguage((String) o); String language = ValueUtils.getLanguageName(getActivity(), (String) o); preference.setSummary(getString(R.string.now) + " : " + language); showRebootSnackbar(); } else if (preference.getKey().equals(getString(R.string.key_default_photo_order))) { // default order. SettingsOptionManager.getInstance(getActivity()).setDefaultPhotoOrder((String) o); String order = ValueUtils.getOrderName(getActivity(), (String) o); preference.setSummary(getString(R.string.now) + " : " + order); showRebootSnackbar(); } else if (preference.getKey().equals(getString(R.string.key_default_collection_type))) { // collection type. SettingsOptionManager.getInstance(getActivity()).setDefaultCollectionType((String) o); String type = ValueUtils.getCollectionName(getActivity(), (String) o); preference.setSummary(getString(R.string.now) + " : " + type); showRebootSnackbar(); } else if (preference.getKey().equals(getString(R.string.key_download_scale))) { // download scale. SettingsOptionManager.getInstance(getActivity()).setDownloadScale((String) o); String scale = ValueUtils.getScaleName(getActivity(), (String) o); preference.setSummary(getString(R.string.now) + " : " + scale); } else if (preference.getKey().equals(getString(R.string.key_saturation_animation_duration))) { // saturation animation duration. SettingsOptionManager.getInstance(getActivity()).setSaturationAnimationDuration((String) o); String duration = ValueUtils.getSaturationAnimationDurationName(getActivity(), (String) o); preference.setSummary(getString(R.string.now) + " : " + duration); } else if (preference.getKey().equals(getString(R.string.key_grid_list_in_port)) || preference.getKey().equals(getString(R.string.key_grid_list_in_land))) { // grid. showRebootSnackbar(); } return true; } // on action click listener. private View.OnClickListener rebootListener = new View.OnClickListener() { @Override public void onClick(View v) { ((SettingsActivity) getActivity()).finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR); MainActivity a = Mysplash.getInstance().getMainActivity(); if (a != null) { a.reboot(); } } }; // on touch listener. private class ScrollListener implements View.OnTouchListener { private float oldY; private boolean isBeingDragged; private float touchSlop; ScrollListener(Context context) { this.touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } // interface. @Override public boolean onTouch(View v, MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); oldY = ev.getY(); isBeingDragged = false; break; case MotionEvent.ACTION_MOVE: if (!isBeingDragged) { if (Math.abs(ev.getY() - oldY) > touchSlop) { isBeingDragged = true; } } if (isBeingDragged) { int[] total = new int[] {0, (int) (oldY - ev.getY())}; int[] consumed = new int[] {0, 0}; dispatchNestedPreScroll( total[0], total[1], consumed, null); dispatchNestedScroll( consumed[0], consumed[1], total[0] - consumed[0], total[1] - consumed[1], null); } oldY = ev.getY(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: stopNestedScroll(); if (isBeingDragged) { isBeingDragged = false; } break; } return false; } } // nested scrolling child. @Override public void setNestedScrollingEnabled(boolean enabled) { nestedScrollingChildHelper.setNestedScrollingEnabled(enabled); } @Override public boolean isNestedScrollingEnabled() { return nestedScrollingChildHelper.isNestedScrollingEnabled(); } @Override public boolean startNestedScroll(int axes) { return nestedScrollingChildHelper.startNestedScroll(axes); } @Override public void stopNestedScroll() { nestedScrollingChildHelper.stopNestedScroll(); } @Override public boolean hasNestedScrollingParent() { return nestedScrollingChildHelper.hasNestedScrollingParent(); } @Override public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { return nestedScrollingChildHelper.dispatchNestedScroll( dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { return nestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); } @Override public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { return nestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); } @Override public boolean dispatchNestedPreFling(float velocityX, float velocityY) { return nestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY); } }