package com.xiecc.seeWeather.modules.setting.ui; import android.app.Notification; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.provider.Settings; import android.support.design.widget.Snackbar; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.SeekBar; import android.widget.TextView; import com.hugo.watcher.Watcher; import com.xiecc.seeWeather.R; import com.xiecc.seeWeather.base.BaseApplication; import com.xiecc.seeWeather.common.C; import com.xiecc.seeWeather.common.utils.FileSizeUtil; import com.xiecc.seeWeather.common.utils.FileUtil; import com.xiecc.seeWeather.common.utils.RxUtil; import com.xiecc.seeWeather.common.utils.SharedPreferenceUtil; import com.xiecc.seeWeather.component.ImageLoader; import com.xiecc.seeWeather.component.RxBus; import com.xiecc.seeWeather.modules.main.domain.ChangeCityEvent; import com.xiecc.seeWeather.modules.main.ui.MainActivity; import com.xiecc.seeWeather.modules.service.AutoUpdateService; import io.reactivex.Observable; import java.io.File; import java.util.Locale; public class SettingFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener { private static String TAG = SettingFragment.class.getSimpleName(); private SharedPreferenceUtil mSharedPreferenceUtil; private Preference mChangeIcons; private Preference mChangeUpdate; private Preference mClearCache; private CheckBoxPreference mNotificationType; private CheckBoxPreference mAnimationOnOff; private CheckBoxPreference mWatcherSwitch; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.setting); mSharedPreferenceUtil = SharedPreferenceUtil.getInstance(); mChangeIcons = findPreference(SharedPreferenceUtil.CHANGE_ICONS); mChangeUpdate = findPreference(SharedPreferenceUtil.AUTO_UPDATE); mClearCache = findPreference(SharedPreferenceUtil.CLEAR_CACHE); mAnimationOnOff = (CheckBoxPreference) findPreference(SharedPreferenceUtil.ANIM_START); mNotificationType = (CheckBoxPreference) findPreference(SharedPreferenceUtil.NOTIFICATION_MODEL); mWatcherSwitch = (CheckBoxPreference) findPreference(SharedPreferenceUtil.WATCHER); mNotificationType.setChecked( SharedPreferenceUtil.getInstance().getNotificationModel() == Notification.FLAG_ONGOING_EVENT); mAnimationOnOff.setChecked(SharedPreferenceUtil.getInstance().getMainAnim()); mWatcherSwitch.setChecked(SharedPreferenceUtil.getInstance().getWatcherSwitch()); if (Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(getContext())) { mWatcherSwitch.setEnabled(false); } mChangeIcons.setSummary(getResources().getStringArray(R.array.icons)[mSharedPreferenceUtil.getIconType()]); mChangeUpdate.setSummary( mSharedPreferenceUtil.getAutoUpdate() == 0 ? "禁止刷新" : "每" + mSharedPreferenceUtil.getAutoUpdate() + "小时更新"); mClearCache.setSummary(FileSizeUtil.getAutoFileOrFilesSize(C.NET_CACHE)); mChangeIcons.setOnPreferenceClickListener(this); mChangeUpdate.setOnPreferenceClickListener(this); mClearCache.setOnPreferenceClickListener(this); mNotificationType.setOnPreferenceChangeListener(this); mAnimationOnOff.setOnPreferenceChangeListener(this); mWatcherSwitch.setOnPreferenceChangeListener(this); } @Override public boolean onPreferenceClick(Preference preference) { if (mChangeIcons == preference) { showIconDialog(); } else if (mClearCache == preference) { ImageLoader.clear(getActivity()); Observable.just(FileUtil.delete(new File(C.NET_CACHE))) .filter(aBoolean -> aBoolean) .compose(RxUtil.io()) .doOnNext(aBoolean -> { mClearCache.setSummary(FileSizeUtil.getAutoFileOrFilesSize(C.NET_CACHE)); Snackbar.make(getView(), "缓存已清除", Snackbar.LENGTH_SHORT).show(); }) .subscribe(); } else if (mChangeUpdate == preference) { showUpdateDialog(); } else if (mWatcherSwitch == preference) { if (mWatcherSwitch.isChecked()) { Watcher.getInstance().start(BaseApplication.getAppContext()); } } return true; } private void showIconDialog() { LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View dialogLayout = inflater.inflate(R.layout.icon_dialog, (ViewGroup) getActivity().findViewById(R.id.dialog_root)); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setView(dialogLayout); final AlertDialog alertDialog = builder.create(); LinearLayout layoutTypeOne = (LinearLayout) dialogLayout.findViewById(R.id.layout_one); layoutTypeOne.setClickable(true); RadioButton radioTypeOne = (RadioButton) dialogLayout.findViewById(R.id.radio_one); LinearLayout layoutTypeTwo = (LinearLayout) dialogLayout.findViewById(R.id.layout_two); layoutTypeTwo.setClickable(true); RadioButton radioTypeTwo = (RadioButton) dialogLayout.findViewById(R.id.radio_two); TextView done = (TextView) dialogLayout.findViewById(R.id.done); radioTypeOne.setClickable(false); radioTypeTwo.setClickable(false); alertDialog.show(); switch (mSharedPreferenceUtil.getIconType()) { case 0: radioTypeOne.setChecked(true); radioTypeTwo.setChecked(false); break; case 1: radioTypeOne.setChecked(false); radioTypeTwo.setChecked(true); break; } layoutTypeOne.setOnClickListener(v -> { radioTypeOne.setChecked(true); radioTypeTwo.setChecked(false); }); layoutTypeTwo.setOnClickListener(v -> { radioTypeOne.setChecked(false); radioTypeTwo.setChecked(true); }); done.setOnClickListener(v -> { mSharedPreferenceUtil.setIconType(radioTypeOne.isChecked() ? 0 : 1); String[] iconsText = getResources().getStringArray(R.array.icons); mChangeIcons.setSummary(radioTypeOne.isChecked() ? iconsText[0] : iconsText[1]); alertDialog.dismiss(); Snackbar.make(getView(), "切换成功,重启应用生效", Snackbar.LENGTH_INDEFINITE).setAction("重启", v1 -> { Intent intent = new Intent(getActivity(), MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); getActivity().startActivity(intent); getActivity().finish(); RxBus.getDefault().post(new ChangeCityEvent()); }).show(); }); } private void showUpdateDialog() { //将 SeekBar 放入 Dialog 的方案 http://stackoverflow.com/questions/7184104/how-do-i-put-a-seek-bar-in-an-alert-dialog LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View dialogLayout = inflater.inflate(R.layout.update_dialog, (ViewGroup) getActivity().findViewById( R.id.dialog_root)); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) .setView(dialogLayout); final AlertDialog alertDialog = builder.create(); final SeekBar mSeekBar = (SeekBar) dialogLayout.findViewById(R.id.time_seekbar); final TextView tvShowHour = (TextView) dialogLayout.findViewById(R.id.tv_showhour); TextView tvDone = (TextView) dialogLayout.findViewById(R.id.done); mSeekBar.setMax(24); mSeekBar.setProgress(mSharedPreferenceUtil.getAutoUpdate()); tvShowHour.setText(String.format("每%s小时", mSeekBar.getProgress())); alertDialog.show(); mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { tvShowHour.setText(String.format("每%s小时", mSeekBar.getProgress())); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); tvDone.setOnClickListener(v -> { mSharedPreferenceUtil.setAutoUpdate(mSeekBar.getProgress()); mChangeUpdate.setSummary( mSharedPreferenceUtil.getAutoUpdate() == 0 ? "禁止刷新" : String.format(Locale.CHINA, "每%d小时更新", mSharedPreferenceUtil.getAutoUpdate())); getActivity().startService(new Intent(getActivity(), AutoUpdateService.class)); alertDialog.dismiss(); }); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference == mAnimationOnOff) { SharedPreferenceUtil.getInstance().setMainAnim((Boolean) newValue); } else if (mNotificationType == preference) { SharedPreferenceUtil.getInstance().setNotificationModel( (boolean) newValue ? Notification.FLAG_ONGOING_EVENT : Notification.FLAG_AUTO_CANCEL); } return true; } }