Added Android code
[wl-app.git] / Android / folioreader / src / main / java / com / folioreader / view / ConfigBottomSheetDialogFragment.java
1 package com.folioreader.view;
2
3 import android.animation.Animator;
4 import android.animation.ArgbEvaluator;
5 import android.animation.ValueAnimator;
6 import android.app.Activity;
7 import android.graphics.drawable.Drawable;
8 import android.os.Bundle;
9 import android.support.annotation.Nullable;
10 import android.support.design.widget.BottomSheetBehavior;
11 import android.support.design.widget.BottomSheetDialog;
12 import android.support.design.widget.BottomSheetDialogFragment;
13 import android.support.design.widget.CoordinatorLayout;
14 import android.support.v4.content.ContextCompat;
15 import android.support.v7.widget.Toolbar;
16 import android.view.LayoutInflater;
17 import android.view.View;
18 import android.view.ViewGroup;
19 import android.view.ViewTreeObserver;
20 import android.widget.FrameLayout;
21 import android.widget.ImageView;
22 import android.widget.RelativeLayout;
23 import android.widget.SeekBar;
24
25 import com.folioreader.Config;
26 import com.folioreader.Constants;
27 import com.folioreader.R;
28 import com.folioreader.model.event.BusOwner;
29 import com.folioreader.model.event.ReloadDataEvent;
30 import com.folioreader.ui.folio.activity.ToolbarUtils;
31 import com.folioreader.util.AppUtil;
32 import com.folioreader.util.UiUtil;
33
34
35 /**
36  * Created by mobisys2 on 11/16/2016.
37  */
38
39 public class ConfigBottomSheetDialogFragment extends BottomSheetDialogFragment implements View.OnClickListener {
40
41     public static final int DAY_BUTTON = 30;
42     public static final int NIGHT_BUTTON = 31;
43     private static final int FADE_DAY_NIGHT_MODE = 500;
44
45     private CoordinatorLayout.Behavior mBehavior;
46     private boolean mIsNightMode = false;
47
48
49     private RelativeLayout mContainer;
50     private ImageView mDayButton;
51     private ImageView mNightButton;
52     private SeekBar mFontSizeSeekBar;
53     private SeekBar mMarginSizeSeekBar;
54     private SeekBar mInterlineSizeSeekBar;
55     private View mDialogView;
56     private ConfigDialogCallback mConfigDialogCallback;
57     private Config mConfig;
58
59     public interface ConfigDialogCallback {
60         void onOrientationChange(int orentation);
61     }
62
63     @Nullable
64     @Override
65     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
66         return inflater.inflate(R.layout.view_config, container);
67     }
68
69     @Override
70     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
71         super.onViewCreated(view, savedInstanceState);
72         view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
73             @Override
74             public void onGlobalLayout() {
75                 BottomSheetDialog dialog = (BottomSheetDialog) getDialog();
76                 FrameLayout bottomSheet = (FrameLayout)
77                         dialog.findViewById(android.support.design.R.id.design_bottom_sheet);
78                 BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
79                 behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
80                 behavior.setPeekHeight(0);
81             }
82         });
83
84         mDialogView = view;
85         mConfig = AppUtil.getSavedConfig(getActivity());
86         initViews();
87     }
88
89     @Override
90     public void onDestroy() {
91         super.onDestroy();
92         mDialogView.getViewTreeObserver().addOnGlobalLayoutListener(null);
93     }
94
95     private void initViews() {
96         inflateView();
97         configFonts();
98         mFontSizeSeekBar.setProgress(mConfig.getFontSize());
99         mMarginSizeSeekBar.setProgress(mConfig.getMarginSize());
100         mInterlineSizeSeekBar.setProgress(mConfig.getInterlineSize());
101         configSeekBars();
102         selectFont(mConfig.getFont(), false);
103         mIsNightMode = mConfig.isNightMode();
104
105         if (mIsNightMode) {
106             mContainer.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.night));
107             mDayButton.setSelected(false);
108             mNightButton.setSelected(true);
109             UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mNightButton.getDrawable());
110             UiUtil.setColorToImage(getActivity(), R.color.app_gray, mDayButton.getDrawable());
111         } else {
112             mContainer.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.white));
113             mDayButton.setSelected(true);
114             mNightButton.setSelected(false);
115             UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mDayButton.getDrawable());
116             UiUtil.setColorToImage(getActivity(), R.color.app_gray, mNightButton.getDrawable());
117         }
118
119         mConfigDialogCallback = (ConfigDialogCallback) getActivity();
120     }
121
122     private void inflateView() {
123         mContainer = (RelativeLayout) mDialogView.findViewById(R.id.container);
124         mFontSizeSeekBar = (SeekBar) mDialogView.findViewById(R.id.seekbar_font_size);
125             mMarginSizeSeekBar = mDialogView.findViewById(R.id.seekbar_margin_size);
126             mInterlineSizeSeekBar = mDialogView.findViewById(R.id.seekbar_interline_size);
127             mDayButton = (ImageView) mDialogView.findViewById(R.id.day_button);
128         mNightButton = (ImageView) mDialogView.findViewById(R.id.night_button);
129         mDayButton.setTag(DAY_BUTTON);
130         mNightButton.setTag(NIGHT_BUTTON);
131         mDayButton.setOnClickListener(this);
132         mNightButton.setOnClickListener(this);
133     }
134
135
136     private void configFonts() {
137         ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_ebgaramond)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color));
138         ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_lato)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color));
139         ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_lora)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color));
140         ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_raleway)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color));
141         mDialogView.findViewById(R.id.btn_font_ebgaramond).setOnClickListener(new View.OnClickListener() {
142             @Override
143             public void onClick(View v) {
144                 selectFont(Constants.FONT_EBGARAMOND, true);
145             }
146         });
147
148         mDialogView.findViewById(R.id.btn_font_lato).setOnClickListener(new View.OnClickListener() {
149             @Override
150             public void onClick(View v) {
151                 selectFont(Constants.FONT_LATO, true);
152             }
153         });
154
155         mDialogView.findViewById(R.id.btn_font_lora).setOnClickListener(new View.OnClickListener() {
156             @Override
157             public void onClick(View v) {
158                 selectFont(Constants.FONT_LORA, true);
159             }
160         });
161
162         mDialogView.findViewById(R.id.btn_font_raleway).setOnClickListener(new View.OnClickListener() {
163             @Override
164             public void onClick(View v) {
165                 selectFont(Constants.FONT_RALEWAY, true);
166             }
167         });
168     }
169
170     private void selectFont(int selectedFont, boolean isReloadNeeded) {
171         if (selectedFont == Constants.FONT_EBGARAMOND) {
172             mDialogView.findViewById(R.id.btn_font_ebgaramond).setSelected(true);
173             mDialogView.findViewById(R.id.btn_font_lato).setSelected(false);
174             mDialogView.findViewById(R.id.btn_font_lora).setSelected(false);
175             mDialogView.findViewById(R.id.btn_font_raleway).setSelected(false);
176         } else if (selectedFont == Constants.FONT_LATO) {
177             mDialogView.findViewById(R.id.btn_font_ebgaramond).setSelected(false);
178             mDialogView.findViewById(R.id.btn_font_lato).setSelected(true);
179             mDialogView.findViewById(R.id.btn_font_lora).setSelected(false);
180             mDialogView.findViewById(R.id.btn_font_raleway).setSelected(false);
181         } else if (selectedFont == Constants.FONT_LORA) {
182             mDialogView.findViewById(R.id.btn_font_ebgaramond).setSelected(false);
183             mDialogView.findViewById(R.id.btn_font_lato).setSelected(false);
184             mDialogView.findViewById(R.id.btn_font_lora).setSelected(true);
185             mDialogView.findViewById(R.id.btn_font_raleway).setSelected(false);
186         } else if (selectedFont == Constants.FONT_RALEWAY) {
187             mDialogView.findViewById(R.id.btn_font_ebgaramond).setSelected(false);
188             mDialogView.findViewById(R.id.btn_font_lato).setSelected(false);
189             mDialogView.findViewById(R.id.btn_font_lora).setSelected(false);
190             mDialogView.findViewById(R.id.btn_font_raleway).setSelected(true);
191         }
192
193         mConfig.setFont(selectedFont);
194         //if (mConfigDialogCallback != null) mConfigDialogCallback.onConfigChange();
195         if (isAdded() && isReloadNeeded) {
196             AppUtil.saveConfig(getActivity(),mConfig);
197
198             Activity activity = getActivity();
199             if (activity instanceof BusOwner)
200                 ((BusOwner) activity).getBus().post(new ReloadDataEvent());
201         }
202     }
203
204     private void toggleBlackTheme() {
205
206         int day = getResources().getColor(R.color.white);
207         int night = getResources().getColor(R.color.night);
208         int darkNight = getResources().getColor(R.color.dark_night);
209         final int diffNightDark = night - darkNight;
210
211         ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(),
212                 mIsNightMode ? day : night, mIsNightMode ? night : day);
213         colorAnimation.setDuration(FADE_DAY_NIGHT_MODE);
214         colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
215
216             @Override
217             public void onAnimationUpdate(ValueAnimator animator) {
218                 int value = (int) animator.getAnimatedValue();
219                 mContainer.setBackgroundColor(value);
220             }
221         });
222
223         colorAnimation.addListener(new Animator.AnimatorListener() {
224             @Override
225             public void onAnimationStart(Animator animator) {
226             }
227
228             @Override
229             public void onAnimationEnd(Animator animator) {
230                // mIsNightMode = !mIsNightMode;
231                 mConfig.setNightMode(mIsNightMode);
232                 AppUtil.saveConfig(getActivity(),mConfig);
233
234                 Activity activity = getActivity();
235                 if (activity instanceof BusOwner)
236                     ((BusOwner) activity).getBus().post(new ReloadDataEvent());
237
238                 ///mConfigDialogCallback.onConfigChange();
239             }
240
241             @Override
242             public void onAnimationCancel(Animator animator) {
243             }
244
245             @Override
246             public void onAnimationRepeat(Animator animator) {
247             }
248         });
249
250         colorAnimation.setDuration(FADE_DAY_NIGHT_MODE);
251         colorAnimation.start();
252     }
253
254     private void configSeekBars() {
255             setupSeekBarThumb(mFontSizeSeekBar);
256             setupSeekBarThumb(mMarginSizeSeekBar);
257             setupSeekBarThumb(mInterlineSizeSeekBar);
258
259         mFontSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
260             @Override
261             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
262                 mConfig.setFontSize(progress);
263                 saveConfigAndNotifyBusOwner();
264             }
265
266             @Override
267             public void onStartTrackingTouch(SeekBar seekBar) {
268             }
269
270             @Override
271             public void onStopTrackingTouch(SeekBar seekBar) {
272             }
273         });
274         mMarginSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
275                 @Override
276                 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
277                         mConfig.setMarginSize(progress);
278                         saveConfigAndNotifyBusOwner();
279                 }
280
281                 @Override
282                 public void onStartTrackingTouch(SeekBar seekBar) {
283                 }
284
285                 @Override
286                 public void onStopTrackingTouch(SeekBar seekBar) {
287                 }
288         });
289         mInterlineSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
290                 @Override
291                 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
292                         mConfig.setInterlineSize(progress);
293                         saveConfigAndNotifyBusOwner();
294                 }
295
296                 @Override
297                 public void onStartTrackingTouch(SeekBar seekBar) {
298                 }
299
300                 @Override
301                 public void onStopTrackingTouch(SeekBar seekBar) {
302                 }
303         });
304     }
305
306         private void setupSeekBarThumb(SeekBar seekBar) {
307                 Drawable thumbDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.seekbar_thumb);
308                 UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), (thumbDrawable));
309                 UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), seekBar.getProgressDrawable());
310                 seekBar.setThumb(thumbDrawable);
311         }
312
313         private void saveConfigAndNotifyBusOwner() {
314             AppUtil.saveConfig(getActivity(),mConfig);
315             Activity activity = getActivity();
316             if (activity instanceof BusOwner) {
317                     ((BusOwner) activity).getBus().post(new ReloadDataEvent());
318             }
319     }
320
321
322     @Override
323     public void onClick(View v) {
324         switch (((Integer) v.getTag())) {
325             case DAY_BUTTON:
326                 mIsNightMode = false;
327                 toggleBlackTheme();
328                 mDayButton.setSelected(true);
329                 mNightButton.setSelected(false);
330                 setToolBarColor();
331                 setAudioPlayerBackground();
332                 UiUtil.setColorToImage(getActivity(), R.color.app_gray, mNightButton.getDrawable());
333                 UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mDayButton.getDrawable());
334                 break;
335             case NIGHT_BUTTON:
336                 mIsNightMode = true;
337                 toggleBlackTheme();
338                 mDayButton.setSelected(false);
339                 mNightButton.setSelected(true);
340                 UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mNightButton.getDrawable());
341                 UiUtil.setColorToImage(getActivity(), R.color.app_gray, mDayButton.getDrawable());
342                 setToolBarColor();
343                 setAudioPlayerBackground();
344                 break;
345             default:
346                 break;
347         }
348     }
349
350     private void setToolBarColor() {
351         Toolbar toolbar = ((Activity) getContext()).findViewById(R.id.toolbar);
352         ToolbarUtils.updateToolbarColors(getContext(), toolbar, mConfig, mIsNightMode);
353     }
354
355     private void setAudioPlayerBackground() {
356         if (mIsNightMode) {
357             ((Activity) getContext()).
358                     findViewById(R.id.container).
359                     setBackgroundColor(ContextCompat.getColor(getContext(), R.color.night));
360         } else {
361             ((Activity) getContext()).
362                     findViewById(R.id.container).
363                     setBackgroundColor(ContextCompat.getColor(getContext(), R.color.white));
364         }
365     }
366 }