diff --git a/folioreader/build.gradle b/folioreader/build.gradle index 9f55be22d..76e5b239e 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -87,6 +87,7 @@ dependencies { implementation project(':webViewMarker') //noinspection GradleDependency + implementation 'com.android.support.constraint:constraint-layout:1.1.0' implementation "com.android.support:appcompat-v7:$ANDROID_LIB_VERSION" implementation "com.android.support:recyclerview-v7:$ANDROID_LIB_VERSION" implementation "com.android.support:support-v4:$ANDROID_LIB_VERSION" diff --git a/folioreader/res/drawable-hdpi/ic_format_font_black_24dp.png b/folioreader/res/drawable-hdpi/ic_format_font_black_24dp.png new file mode 100644 index 000000000..f09d60053 Binary files /dev/null and b/folioreader/res/drawable-hdpi/ic_format_font_black_24dp.png differ diff --git a/folioreader/res/drawable-hdpi/ic_format_font_black_36dp.png b/folioreader/res/drawable-hdpi/ic_format_font_black_36dp.png new file mode 100644 index 000000000..43039ac88 Binary files /dev/null and b/folioreader/res/drawable-hdpi/ic_format_font_black_36dp.png differ diff --git a/folioreader/res/drawable-mdpi/ic_format_font_black_24dp.png b/folioreader/res/drawable-mdpi/ic_format_font_black_24dp.png new file mode 100644 index 000000000..3aefc4f92 Binary files /dev/null and b/folioreader/res/drawable-mdpi/ic_format_font_black_24dp.png differ diff --git a/folioreader/res/drawable-mdpi/ic_format_font_black_36dp.png b/folioreader/res/drawable-mdpi/ic_format_font_black_36dp.png new file mode 100644 index 000000000..90aeb61ba Binary files /dev/null and b/folioreader/res/drawable-mdpi/ic_format_font_black_36dp.png differ diff --git a/folioreader/res/drawable-xhdpi/ic_format_font_black_24dp.png b/folioreader/res/drawable-xhdpi/ic_format_font_black_24dp.png new file mode 100644 index 000000000..df5019d8d Binary files /dev/null and b/folioreader/res/drawable-xhdpi/ic_format_font_black_24dp.png differ diff --git a/folioreader/res/drawable-xhdpi/ic_format_font_black_36dp.png b/folioreader/res/drawable-xhdpi/ic_format_font_black_36dp.png new file mode 100644 index 000000000..342531196 Binary files /dev/null and b/folioreader/res/drawable-xhdpi/ic_format_font_black_36dp.png differ diff --git a/folioreader/res/drawable-xhdpi/icon_font_big.png b/folioreader/res/drawable-xhdpi/icon_font_big.png deleted file mode 100644 index d630d811b..000000000 Binary files a/folioreader/res/drawable-xhdpi/icon_font_big.png and /dev/null differ diff --git a/folioreader/res/drawable-xhdpi/icon_font_small.png b/folioreader/res/drawable-xhdpi/icon_font_small.png deleted file mode 100644 index 7e54db620..000000000 Binary files a/folioreader/res/drawable-xhdpi/icon_font_small.png and /dev/null differ diff --git a/folioreader/res/drawable-xxhdpi/ic_format_font_black_24dp.png b/folioreader/res/drawable-xxhdpi/ic_format_font_black_24dp.png new file mode 100644 index 000000000..c9b7aed51 Binary files /dev/null and b/folioreader/res/drawable-xxhdpi/ic_format_font_black_24dp.png differ diff --git a/folioreader/res/drawable-xxhdpi/ic_format_font_black_36dp.png b/folioreader/res/drawable-xxhdpi/ic_format_font_black_36dp.png new file mode 100644 index 000000000..298937622 Binary files /dev/null and b/folioreader/res/drawable-xxhdpi/ic_format_font_black_36dp.png differ diff --git a/folioreader/res/drawable-xxxhdpi/ic_format_font_black_24dp.png b/folioreader/res/drawable-xxxhdpi/ic_format_font_black_24dp.png new file mode 100644 index 000000000..77719e156 Binary files /dev/null and b/folioreader/res/drawable-xxxhdpi/ic_format_font_black_24dp.png differ diff --git a/folioreader/res/drawable-xxxhdpi/ic_format_font_black_36dp.png b/folioreader/res/drawable-xxxhdpi/ic_format_font_black_36dp.png new file mode 100644 index 000000000..9bdb07597 Binary files /dev/null and b/folioreader/res/drawable-xxxhdpi/ic_format_font_black_36dp.png differ diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index d601eed67..be99caae4 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -12,94 +12,10 @@ android:layout_height="match_parent" app:direction="vertical" /> - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="?android:attr/actionBarSize" /> + + + + + + + + + + + + + + + + + + + + diff --git a/folioreader/res/layout/view_config.xml b/folioreader/res/layout/view_config.xml index fcc7ed791..d1dc8d8c9 100644 --- a/folioreader/res/layout/view_config.xml +++ b/folioreader/res/layout/view_config.xml @@ -1,151 +1,199 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index c9867a1bd..0ae3da5f8 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -91,4 +91,6 @@ Dictionary Wikipedia Cannot open epub it needs storage access ! + horizontal + vertical diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java b/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java index 12badb4a8..07d57f19d 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java @@ -16,23 +16,15 @@ package com.folioreader.ui.folio.activity; import android.Manifest; -import android.annotation.TargetApi; import android.content.Intent; import android.content.pm.PackageManager; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; -import android.view.View; -import android.view.animation.AccelerateInterpolator; -import android.view.animation.DecelerateInterpolator; -import android.widget.ImageView; -import android.widget.TextView; import android.widget.Toast; import com.folioreader.Config; @@ -50,9 +42,10 @@ import com.folioreader.ui.folio.presenter.MainPresenter; import com.folioreader.util.AppUtil; import com.folioreader.util.FileUtil; -import com.folioreader.util.UiUtil; import com.folioreader.view.ConfigBottomSheetDialogFragment; import com.folioreader.view.DirectionalViewpager; +import com.folioreader.view.FolioToolbar; +import com.folioreader.view.FolioToolbarCallback; import com.folioreader.view.MediaControllerCallback; import com.folioreader.view.MediaControllerView; import com.folioreader.view.ObservableWebView; @@ -80,7 +73,8 @@ public class FolioActivity ObservableWebView.ToolBarListener, ConfigBottomSheetDialogFragment.ConfigDialogCallback, MainMvpView, - MediaControllerCallback{ + MediaControllerCallback, + FolioToolbarCallback { private static final String TAG = "FolioActivity"; @@ -99,20 +93,16 @@ public enum EpubSourceType { private String bookFileName; private static final String HIGHLIGHT_ITEM = "highlight_item"; - public boolean mIsActionBarVisible; private DirectionalViewpager mFolioPageViewPager; - private Toolbar mToolbar; + private FolioToolbar toolbar; private int mChapterPosition; private FolioPageFragmentAdapter mFolioPageFragmentAdapter; private ReadPosition entryReadPosition; - private ConfigBottomSheetDialogFragment mConfigBottomSheetDialogFragment; - private TextView title; private List mSpineReferenceList = new ArrayList<>(); private EpubServer mEpubServer; - private boolean mIsNightMode; private Config mConfig; private String mBookId; private String mEpubFilePath; @@ -122,6 +112,7 @@ public enum EpubSourceType { @Override protected void onCreate(Bundle savedInstanceState) { + setConfig(); super.onCreate(savedInstanceState); setContentView(R.layout.folio_activity); @@ -134,52 +125,32 @@ protected void onCreate(Bundle savedInstanceState) { mEpubFilePath = getIntent().getExtras() .getString(FolioActivity.INTENT_EPUB_SOURCE_PATH); } - setConfig(); mediaControllerView = findViewById(R.id.media_controller_view); - mediaControllerView.onInit(); mediaControllerView.setListeners(this); - if (!mConfig.isShowTts()) { - findViewById(R.id.btn_speaker).setVisibility(View.GONE); - } - - title = (TextView) findViewById(R.id.lbl_center); - - initColors(); - if (ContextCompat.checkSelfPermission(FolioActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(FolioActivity.this, Constants.getWriteExternalStoragePerms(), Constants.WRITE_EXTERNAL_STORAGE_REQUEST); } else { setupBook(); } - mToolbar = (Toolbar) findViewById(R.id.toolbar); - - findViewById(R.id.btn_drawer).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(FolioActivity.this, ContentHighlightActivity.class); - intent.putExtra(CHAPTER_SELECTED, mSpineReferenceList.get(mChapterPosition).href); - intent.putExtra(FolioReader.INTENT_BOOK_ID, mBookId); - intent.putExtra(Constants.BOOK_TITLE, bookFileName); - startActivityForResult(intent, ACTION_CONTENT_HIGHLIGHT); - overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up); - } - }); + toolbar = findViewById(R.id.toolbar); + toolbar.setListeners(this); + } - findViewById(R.id.btn_speaker).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mediaControllerView.show(); - } - }); + @Override + public void showMediaController() { + mediaControllerView.show(); + } - mIsNightMode = mConfig.isNightMode(); - if (mIsNightMode) { - mToolbar.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.black)); - title.setTextColor(ContextCompat.getColor(FolioActivity.this, R.color.white)); - mediaControllerView.setNightMode(); - } + @Override + public void startContentHighlightActivity() { + Intent intent = new Intent(FolioActivity.this, ContentHighlightActivity.class); + intent.putExtra(CHAPTER_SELECTED, mSpineReferenceList.get(mChapterPosition).href); + intent.putExtra(FolioReader.INTENT_BOOK_ID, mBookId); + intent.putExtra(Constants.BOOK_TITLE, bookFileName); + startActivityForResult(intent, ACTION_CONTENT_HIGHLIGHT); + overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up); } private void initBook(String mEpubFileName, int mEpubRawId, String mEpubFilePath, EpubSourceType mEpubSourceType) { @@ -209,14 +180,8 @@ private void getEpubResource() { } @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - configDrawerLayoutButtons(); - } - - @Override - public void onOrientationChange(int orentation) { - if (orentation == 0) { + public void onOrientationChange(int orientation) { + if (orientation == 0) { mFolioPageViewPager.setDirection(DirectionalViewpager.Direction.VERTICAL); mFolioPageFragmentAdapter = new FolioPageFragmentAdapter(getSupportFragmentManager(), @@ -252,7 +217,7 @@ public void onPageSelected(int position) { @Override public void onPageScrollStateChanged(int state) { if (state == DirectionalViewpager.SCROLL_STATE_IDLE) { - title.setText(mSpineReferenceList.get(mChapterPosition).bookTitle); + toolbar.setTitle(mSpineReferenceList.get(mChapterPosition).bookTitle); } } }); @@ -271,11 +236,11 @@ public void onPageScrollStateChanged(int state) { * 1. id * 2. href * 3. index + * * @param readPosition Last read position * @return index of the chapter */ private int getChapterIndex(ReadPosition readPosition) { - if (readPosition == null) { return 0; @@ -294,7 +259,6 @@ private int getChapterIndex(ReadPosition readPosition) { } private int getChapterIndex(String caseString, String value) { - for (int i = 0; i < mSpineReferenceList.size(); i++) { switch (caseString) { case "id": @@ -308,37 +272,14 @@ private int getChapterIndex(String caseString, String value) { return 0; } - private void configDrawerLayoutButtons() { - findViewById(R.id.btn_close).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - - findViewById(R.id.btn_config).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mConfigBottomSheetDialogFragment = new ConfigBottomSheetDialogFragment(); - mConfigBottomSheetDialogFragment.show(getSupportFragmentManager(), mConfigBottomSheetDialogFragment.getTag()); - } - }); - } - @Override - public void hideOrshowToolBar() { - if (mIsActionBarVisible) { - toolbarAnimateHide(); - } else { - toolbarAnimateShow(); - } + public void showConfigBottomSheetDialogFragment() { + new ConfigBottomSheetDialogFragment().show(getSupportFragmentManager(), ConfigBottomSheetDialogFragment.class.getSimpleName()); } @Override - public void hideToolBarIfVisible() { - if (mIsActionBarVisible) { - toolbarAnimateHide(); - } + public void hideOrShowToolBar() { + toolbar.showOrHideIfVisible(); } @Override @@ -347,7 +288,6 @@ public void setPagerToPosition(String href) { @Override public ReadPosition getEntryReadPosition() { - if (entryReadPosition != null) { ReadPosition tempReadPosition = entryReadPosition; entryReadPosition = null; @@ -363,36 +303,12 @@ public void goToChapter(String href) { if (spine.href.contains(href)) { mChapterPosition = mSpineReferenceList.indexOf(spine); mFolioPageViewPager.setCurrentItem(mChapterPosition); - title.setText(spine.getChapterTitle()); + toolbar.setTitle(spine.getChapterTitle()); break; } } } - private void toolbarAnimateShow() { - if (!mIsActionBarVisible) { - mToolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); - mIsActionBarVisible = true; - } - } - - private void toolbarAnimateHide() { - mIsActionBarVisible = false; - mToolbar.animate().translationY(-mToolbar.getHeight()).setInterpolator(new AccelerateInterpolator(2)).start(); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private void toolbarSetElevation(float elevation) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mToolbar.setElevation(elevation); - } - } - - public HighlightImpl setCurrentPagerPostion(HighlightImpl highlightImpl) { -// highlight.setCurrentPagerPostion(mFolioPageViewPager.getCurrentItem()); - return highlightImpl; - } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ACTION_CONTENT_HIGHLIGHT && resultCode == RESULT_OK && data.hasExtra(TYPE)) { @@ -404,7 +320,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (selectedChapterHref.contains(spine.href)) { mChapterPosition = mSpineReferenceList.indexOf(spine); mFolioPageViewPager.setCurrentItem(mChapterPosition); - title.setText(data.getStringExtra(Constants.BOOK_TITLE)); + toolbar.setTitle(data.getStringExtra(Constants.BOOK_TITLE)); EventBus.getDefault().post(new AnchorIdEvent(selectedChapterHref)); break; } @@ -435,7 +351,7 @@ public int getChapterPosition() { public void onLoadPublication(EpubPublication publication) { mSpineReferenceList.addAll(publication.spines); if (publication.metadata.title != null) { - title.setText(publication.metadata.title); + toolbar.setTitle(publication.metadata.title); } if (mBookId == null) { @@ -478,14 +394,6 @@ public void pause() { public void onError() { } - - public void initColors() { - UiUtil.setColorToImage(this, mConfig.getThemeColor(), ((ImageView) findViewById(R.id.btn_close)).getDrawable()); - UiUtil.setColorToImage(this, mConfig.getThemeColor(), ((ImageView) findViewById(R.id.btn_drawer)).getDrawable()); - UiUtil.setColorToImage(this, mConfig.getThemeColor(), ((ImageView) findViewById(R.id.btn_config)).getDrawable()); - UiUtil.setColorToImage(this, mConfig.getThemeColor(), ((ImageView) findViewById(R.id.btn_speaker)).getDrawable()); - } - private void setupBook() { bookFileName = FileUtil.getEpubFilename(this, mEpubSourceType, mEpubFilePath, mEpubRawId); initBook(bookFileName, mEpubRawId, mEpubFilePath, mEpubSourceType); diff --git a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.java b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.java deleted file mode 100644 index 5d627ca38..000000000 --- a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.java +++ /dev/null @@ -1,350 +0,0 @@ -package com.folioreader.view; - -import android.animation.Animator; -import android.animation.ArgbEvaluator; -import android.animation.ValueAnimator; -import android.app.Activity; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.BottomSheetBehavior; -import android.support.design.widget.BottomSheetDialog; -import android.support.design.widget.BottomSheetDialogFragment; -import android.support.design.widget.CoordinatorLayout; -import android.support.v4.content.ContextCompat; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.SeekBar; -import android.widget.TextView; - -import com.folioreader.Config; -import com.folioreader.Constants; -import com.folioreader.R; -import com.folioreader.model.event.ReloadDataEvent; -import com.folioreader.util.AppUtil; -import com.folioreader.util.UiUtil; - -import org.greenrobot.eventbus.EventBus; - - -/** - * Created by mobisys2 on 11/16/2016. - */ - -public class ConfigBottomSheetDialogFragment extends BottomSheetDialogFragment implements View.OnClickListener { - - public static final int DAY_BUTTON = 30; - public static final int NIGHT_BUTTON = 31; - private static final int FADE_DAY_NIGHT_MODE = 500; - - private CoordinatorLayout.Behavior mBehavior; - private boolean mIsNightMode = false; - - - private RelativeLayout mContainer; - private ImageView mDayButton; - private ImageView mNightButton; - private SeekBar mFontSizeSeekBar; - private View mDialogView; - private ConfigDialogCallback mConfigDialogCallback; - private Config mConfig; - - public interface ConfigDialogCallback { - void onOrientationChange(int orentation); - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.view_config, container); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - BottomSheetDialog dialog = (BottomSheetDialog) getDialog(); - FrameLayout bottomSheet = (FrameLayout) - dialog.findViewById(android.support.design.R.id.design_bottom_sheet); - BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); - behavior.setState(BottomSheetBehavior.STATE_EXPANDED); - behavior.setPeekHeight(0); - } - }); - - mDialogView = view; - mConfig = AppUtil.getSavedConfig(getActivity()); - initViews(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - mDialogView.getViewTreeObserver().addOnGlobalLayoutListener(null); - } - - private void initViews() { - inflateView(); - configFonts(); - mFontSizeSeekBar.setProgress(mConfig.getFontSize()); - configSeekBar(); - selectFont(mConfig.getFont(), false); - mIsNightMode = mConfig.isNightMode(); - if (mIsNightMode) { - mContainer.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.night)); - } else { - mContainer.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.white)); - } - - if (mIsNightMode) { - mDayButton.setSelected(false); - mNightButton.setSelected(true); - UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mNightButton.getDrawable()); - UiUtil.setColorToImage(getActivity(), R.color.app_gray, mDayButton.getDrawable()); - } else { - mDayButton.setSelected(true); - mNightButton.setSelected(false); - UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mDayButton.getDrawable()); - UiUtil.setColorToImage(getActivity(), R.color.app_gray, mNightButton.getDrawable()); - } - - mConfigDialogCallback = (ConfigDialogCallback) getActivity(); - } - - private void inflateView() { - mContainer = (RelativeLayout) mDialogView.findViewById(R.id.container); - mFontSizeSeekBar = (SeekBar) mDialogView.findViewById(R.id.seekbar_font_size); - mDayButton = (ImageView) mDialogView.findViewById(R.id.day_button); - mNightButton = (ImageView) mDialogView.findViewById(R.id.night_button); - mDayButton.setTag(DAY_BUTTON); - mNightButton.setTag(NIGHT_BUTTON); - mDayButton.setOnClickListener(this); - mNightButton.setOnClickListener(this); - mDialogView.findViewById(R.id.btn_vertical_orentation).setSelected(true); - } - - - private void configFonts() { - ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_andada)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color)); - ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_lato)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color)); - ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_lora)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color)); - ((StyleableTextView) mDialogView.findViewById(R.id.btn_font_raleway)).setTextColor(UiUtil.getColorList(getActivity(), mConfig.getThemeColor(), R.color.grey_color)); - mDialogView.findViewById(R.id.btn_font_andada).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - selectFont(Constants.FONT_ANDADA, true); - } - }); - - mDialogView.findViewById(R.id.btn_font_lato).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - selectFont(Constants.FONT_LATO, true); - } - }); - - mDialogView.findViewById(R.id.btn_font_lora).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - selectFont(Constants.FONT_LORA, true); - } - }); - - mDialogView.findViewById(R.id.btn_font_raleway).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - selectFont(Constants.FONT_RALEWAY, true); - } - }); - - - mDialogView.findViewById(R.id.btn_horizontal_orentation).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mConfigDialogCallback.onOrientationChange(1); - mDialogView.findViewById(R.id.btn_horizontal_orentation).setSelected(true); - mDialogView.findViewById(R.id.btn_vertical_orentation).setSelected(false); - } - }); - - mDialogView.findViewById(R.id.btn_vertical_orentation).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mConfigDialogCallback.onOrientationChange(0); - mDialogView.findViewById(R.id.btn_horizontal_orentation).setSelected(false); - mDialogView.findViewById(R.id.btn_vertical_orentation).setSelected(true); - } - }); - } - - private void selectFont(int selectedFont, boolean isReloadNeeded) { - if (selectedFont == Constants.FONT_ANDADA) { - mDialogView.findViewById(R.id.btn_font_andada).setSelected(true); - mDialogView.findViewById(R.id.btn_font_lato).setSelected(false); - mDialogView.findViewById(R.id.btn_font_lora).setSelected(false); - mDialogView.findViewById(R.id.btn_font_raleway).setSelected(false); - } else if (selectedFont == Constants.FONT_LATO) { - mDialogView.findViewById(R.id.btn_font_andada).setSelected(false); - mDialogView.findViewById(R.id.btn_font_lato).setSelected(true); - mDialogView.findViewById(R.id.btn_font_lora).setSelected(false); - mDialogView.findViewById(R.id.btn_font_raleway).setSelected(false); - } else if (selectedFont == Constants.FONT_LORA) { - mDialogView.findViewById(R.id.btn_font_andada).setSelected(false); - mDialogView.findViewById(R.id.btn_font_lato).setSelected(false); - mDialogView.findViewById(R.id.btn_font_lora).setSelected(true); - mDialogView.findViewById(R.id.btn_font_raleway).setSelected(false); - } else if (selectedFont == Constants.FONT_RALEWAY) { - mDialogView.findViewById(R.id.btn_font_andada).setSelected(false); - mDialogView.findViewById(R.id.btn_font_lato).setSelected(false); - mDialogView.findViewById(R.id.btn_font_lora).setSelected(false); - mDialogView.findViewById(R.id.btn_font_raleway).setSelected(true); - } - - mConfig.setFont(selectedFont); - //if (mConfigDialogCallback != null) mConfigDialogCallback.onConfigChange(); - if (isAdded() && isReloadNeeded) { - AppUtil.saveConfig(getActivity(),mConfig); - EventBus.getDefault().post(new ReloadDataEvent()); - } - } - - private void toggleBlackTheme() { - - int day = getResources().getColor(R.color.white); - int night = getResources().getColor(R.color.night); - int darkNight = getResources().getColor(R.color.dark_night); - final int diffNightDark = night - darkNight; - - ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), - mIsNightMode ? night : day, mIsNightMode ? day : night); - colorAnimation.setDuration(FADE_DAY_NIGHT_MODE); - colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - - @Override - public void onAnimationUpdate(ValueAnimator animator) { - int value = (int) animator.getAnimatedValue(); - mContainer.setBackgroundColor(value); - } - }); - - colorAnimation.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animator) { - } - - @Override - public void onAnimationEnd(Animator animator) { - mIsNightMode = !mIsNightMode; - mConfig.setNightMode(mIsNightMode); - AppUtil.saveConfig(getActivity(),mConfig); - EventBus.getDefault().post(new ReloadDataEvent()); - } - - @Override - public void onAnimationCancel(Animator animator) { - } - - @Override - public void onAnimationRepeat(Animator animator) { - } - }); - - colorAnimation.setDuration(FADE_DAY_NIGHT_MODE); - colorAnimation.start(); - } - - private void configSeekBar() { - Drawable thumbDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.seekbar_thumb); - UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), (thumbDrawable)); - UiUtil.setColorToImage(getActivity(), R.color.grey_color, mFontSizeSeekBar.getProgressDrawable()); - mFontSizeSeekBar.setThumb(thumbDrawable); - - mFontSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - mConfig.setFontSize(progress); - AppUtil.saveConfig(getActivity(),mConfig); - EventBus.getDefault().post(new ReloadDataEvent()); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - } - - - @Override - public void onClick(View v) { - switch (((Integer) v.getTag())) { - case DAY_BUTTON: - if (mIsNightMode) { - mIsNightMode = true; - toggleBlackTheme(); - mDayButton.setSelected(true); - mNightButton.setSelected(false); - setToolBarColor(); - setAudioPlayerBackground(); - UiUtil.setColorToImage(getActivity(), R.color.app_gray, mNightButton.getDrawable()); - UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mDayButton.getDrawable()); - } - break; - case NIGHT_BUTTON: - if (!mIsNightMode) { - mIsNightMode = false; - toggleBlackTheme(); - mDayButton.setSelected(false); - mNightButton.setSelected(true); - UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mNightButton.getDrawable()); - UiUtil.setColorToImage(getActivity(), R.color.app_gray, mDayButton.getDrawable()); - setToolBarColor(); - setAudioPlayerBackground(); - } - break; - default: - break; - } - } - - private void setToolBarColor() { - if (mIsNightMode) { - ((Activity) getContext()). - findViewById(R.id.toolbar). - setBackgroundColor(getContext().getResources().getColor(R.color.white)); - ((TextView) ((Activity) getContext()). - findViewById(R.id.lbl_center)). - setTextColor(getResources().getColor(R.color.black)); - } else { - ((Activity) getContext()). - findViewById(R.id.toolbar). - setBackgroundColor(getContext().getResources().getColor(R.color.black)); - ((TextView) ((Activity) getContext()). - findViewById(R.id.lbl_center)). - setTextColor(getResources().getColor(R.color.white)); - } - - } - - private void setAudioPlayerBackground() { - if (mIsNightMode) { - ((Activity) getContext()). - findViewById(R.id.container). - setBackgroundColor(ContextCompat.getColor(getContext(), R.color.white)); - } else { - ((Activity) getContext()). - findViewById(R.id.container). - setBackgroundColor(ContextCompat.getColor(getContext(), R.color.night)); - } - } -} diff --git a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt new file mode 100644 index 000000000..f6623dc51 --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt @@ -0,0 +1,227 @@ +package com.folioreader.view + +import android.animation.Animator +import android.animation.ArgbEvaluator +import android.animation.ValueAnimator +import android.app.Activity +import android.os.Bundle +import android.support.design.widget.BottomSheetBehavior +import android.support.design.widget.BottomSheetDialog +import android.support.design.widget.BottomSheetDialogFragment +import android.support.v4.content.ContextCompat +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.SeekBar +import com.folioreader.Config +import com.folioreader.Constants +import com.folioreader.R +import com.folioreader.model.event.ReloadDataEvent +import com.folioreader.util.AppUtil +import com.folioreader.util.UiUtil +import kotlinx.android.synthetic.main.view_config.* +import org.greenrobot.eventbus.EventBus + +/** + * Created by mobisys2 on 11/16/2016. + */ +class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { + private lateinit var callback: ConfigDialogCallback + private lateinit var config: Config + private var isNightMode = false + + interface ConfigDialogCallback { + fun onOrientationChange(orientation: Int) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.view_config, container) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.viewTreeObserver.addOnGlobalLayoutListener { + val dialog = dialog as BottomSheetDialog + val bottomSheet = dialog.findViewById(android.support.design.R.id.design_bottom_sheet) as FrameLayout? + val behavior = BottomSheetBehavior.from(bottomSheet!!) + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.peekHeight = 0 + } + + config = AppUtil.getSavedConfig(activity) + initViews() + } + + override fun onDestroy() { + super.onDestroy() + view?.viewTreeObserver?.addOnGlobalLayoutListener(null) + } + + private fun initViews() { + inflateView() + configFonts() + view_config_font_size_seek_bar.progress = config.fontSize + configSeekBar() + selectFont(config.font, false) + isNightMode = config.isNightMode + if (isNightMode) { + container.setBackgroundColor(ContextCompat.getColor(context!!, R.color.night)) + } else { + container.setBackgroundColor(ContextCompat.getColor(context!!, R.color.white)) + } + + if (isNightMode) { + view_config_ib_day_mode.isSelected = false + view_config_ib_night_mode.isSelected = true + UiUtil.setColorToImage(activity, config.themeColor, view_config_ib_night_mode.drawable) + UiUtil.setColorToImage(activity, R.color.app_gray, view_config_ib_day_mode.drawable) + } else { + view_config_ib_day_mode.isSelected = true + view_config_ib_night_mode.isSelected = false + UiUtil.setColorToImage(activity, config.themeColor, view_config_ib_day_mode!!.drawable) + UiUtil.setColorToImage(activity, R.color.app_gray, view_config_ib_night_mode.drawable) + } + + callback = activity as ConfigDialogCallback + } + + private fun inflateView() { + view_config_ib_day_mode.setOnClickListener { + isNightMode = true + toggleBlackTheme() + view_config_ib_day_mode.isSelected = true + view_config_ib_night_mode.isSelected = false + setToolBarColor() + setAudioPlayerBackground() + UiUtil.setColorToImage(activity, R.color.app_gray, view_config_ib_night_mode.drawable) + UiUtil.setColorToImage(activity, config.themeColor, view_config_ib_day_mode.drawable) + } + view_config_ib_night_mode.setOnClickListener { + isNightMode = false + toggleBlackTheme() + view_config_ib_day_mode.isSelected = false + view_config_ib_night_mode.isSelected = true + UiUtil.setColorToImage(activity, config.themeColor, view_config_ib_day_mode.drawable) + UiUtil.setColorToImage(activity, R.color.app_gray, view_config_ib_night_mode.drawable) + setToolBarColor() + setAudioPlayerBackground() + } + view_config_btn_vertical_orientation.isSelected = true + } + + private fun configFonts() { + view_config_font_andada.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + view_config_font_lato.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + view_config_font_lora.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + view_config_font_raleway.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + view_config_btn_vertical_orientation.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + view_config_btn_horizontal_orientation.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + view_config_font_andada.setOnClickListener { selectFont(Constants.FONT_ANDADA, true) } + view_config_font_lato.setOnClickListener { selectFont(Constants.FONT_LATO, true) } + view_config_font_lora.setOnClickListener { selectFont(Constants.FONT_LORA, true) } + view_config_font_raleway.setOnClickListener { selectFont(Constants.FONT_RALEWAY, true) } + view_config_btn_vertical_orientation.setOnClickListener { + callback.onOrientationChange(1) + view_config_btn_horizontal_orientation.isSelected = false + view_config_btn_vertical_orientation.isSelected = true + } + + view_config_btn_horizontal_orientation.setOnClickListener { + callback.onOrientationChange(0) + view_config_btn_horizontal_orientation.isSelected = true + view_config_btn_vertical_orientation.isSelected = false + } + } + + private fun selectFont(selectedFont: Int, isReloadNeeded: Boolean) { + when (selectedFont) { + Constants.FONT_ANDADA -> setSelectedFont(true, false, false, false) + Constants.FONT_LATO -> setSelectedFont(false, true, false, false) + Constants.FONT_LORA -> setSelectedFont(false, false, true, false) + Constants.FONT_RALEWAY -> setSelectedFont(false, false, false, true) + } + config.font = selectedFont + if (isAdded && isReloadNeeded) { + AppUtil.saveConfig(activity, config) + EventBus.getDefault().post(ReloadDataEvent()) + } + } + + private fun setSelectedFont(andada: Boolean, lato: Boolean, lora: Boolean, raleway: Boolean) { + view_config_font_andada.isSelected = andada + view_config_font_lato.isSelected = lato + view_config_font_lora.isSelected = lora + view_config_font_raleway.isSelected = raleway + } + + private fun toggleBlackTheme() { + val day = ContextCompat.getColor(context!!, R.color.white) + val night = ContextCompat.getColor(context!!, R.color.night) + val colorAnimation = ValueAnimator.ofObject(ArgbEvaluator(), + if (isNightMode) night else day, if (isNightMode) day else night) + colorAnimation.duration = FADE_DAY_NIGHT_MODE.toLong() + colorAnimation.addUpdateListener { animator -> + val value = animator.animatedValue as Int + container.setBackgroundColor(value) + } + + colorAnimation.addListener(object : Animator.AnimatorListener { + override fun onAnimationStart(animator: Animator) {} + + override fun onAnimationEnd(animator: Animator) { + isNightMode = !isNightMode + config.isNightMode = isNightMode + AppUtil.saveConfig(activity, config) + EventBus.getDefault().post(ReloadDataEvent()) + } + + override fun onAnimationCancel(animator: Animator) {} + + override fun onAnimationRepeat(animator: Animator) {} + }) + + colorAnimation.duration = FADE_DAY_NIGHT_MODE.toLong() + colorAnimation.start() + } + + private fun configSeekBar() { + val thumbDrawable = ContextCompat.getDrawable(activity!!, R.drawable.seekbar_thumb) + UiUtil.setColorToImage(activity, config.themeColor, thumbDrawable) + UiUtil.setColorToImage(activity, R.color.grey_color, view_config_font_size_seek_bar.progressDrawable) + view_config_font_size_seek_bar.thumb = thumbDrawable + + view_config_font_size_seek_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + config.fontSize = progress + AppUtil.saveConfig(activity, config) + EventBus.getDefault().post(ReloadDataEvent()) + } + + override fun onStartTrackingTouch(seekBar: SeekBar) {} + + override fun onStopTrackingTouch(seekBar: SeekBar) {} + }) + } + + private fun setToolBarColor() { + if (isNightMode) { + ((context as Activity).findViewById(R.id.toolbar) as FolioToolbar).setDayMode() + } else { + ((context as Activity).findViewById(R.id.toolbar) as FolioToolbar).setNightMode() + } + + } + + private fun setAudioPlayerBackground() { + if (isNightMode) { + (context as Activity).findViewById(R.id.container).setBackgroundColor(ContextCompat.getColor(context!!, R.color.white)) + } else { + (context as Activity).findViewById(R.id.container).setBackgroundColor(ContextCompat.getColor(context!!, R.color.night)) + } + } + + companion object { + const val FADE_DAY_NIGHT_MODE = 500 + } +} diff --git a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt new file mode 100644 index 000000000..1e2f0217e --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt @@ -0,0 +1,104 @@ +package com.folioreader.view + +import android.app.Activity +import android.content.Context +import android.support.v4.content.ContextCompat +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.animation.AccelerateInterpolator +import android.view.animation.DecelerateInterpolator +import android.widget.RelativeLayout +import com.folioreader.Config +import com.folioreader.R +import com.folioreader.util.AppUtil +import com.folioreader.util.UiUtil +import kotlinx.android.synthetic.main.folio_toolbar.view.* + +/** + * Created by gautam on 15/5/18. + */ +class FolioToolbar : RelativeLayout { + private lateinit var config: Config + private var visible: Boolean = false + lateinit var callback: FolioToolbarCallback + + constructor(context: Context) : this(context, null, 0) + constructor(context: Context, attributes: AttributeSet?) : this(context, attributes, 0) + constructor(context: Context, attributes: AttributeSet?, defStyle: Int) : super(context, attributes, defStyle) { + LayoutInflater.from(context).inflate(R.layout.folio_toolbar, this) + init() + } + + private fun init() { + config = AppUtil.getSavedConfig(context) + if (config.isNightMode) setNightMode() + if (!config.isShowTts) btn_speaker.visibility = View.GONE + initColors() + initListeners() + } + + private fun initColors() { + UiUtil.setColorToImage(context, config.themeColor, btn_close.drawable) + UiUtil.setColorToImage(context, config.themeColor, btn_drawer.drawable) + UiUtil.setColorToImage(context, config.themeColor, btn_config.drawable) + UiUtil.setColorToImage(context, config.themeColor, btn_speaker.drawable) + } + + private fun initListeners() { + btn_drawer.setOnClickListener { + callback.startContentHighlightActivity() + } + btn_close.setOnClickListener { + (context as Activity).finish() + } + btn_config.setOnClickListener { + callback.showConfigBottomSheetDialogFragment() + } + btn_speaker.setOnClickListener { + callback.showMediaController() + } + } + + fun setListeners(callback: FolioToolbarCallback) { + this.callback = callback + } + + fun setTitle(title: String?) { + title?.let { + label_center?.text = title + } + } + + fun showOrHideIfVisible() { + if (visible) { + hide() + } else { + show() + } + visible = !visible + } + + private fun show() { + this.animate().translationY(0f) + .setInterpolator(DecelerateInterpolator(2f)) + .start() + } + + fun setNightMode() { + toolbar_container.setBackgroundColor(ContextCompat.getColor(context, R.color.black)) + label_center.setTextColor(ContextCompat.getColor(context, R.color.white)) + } + + fun setDayMode() { + toolbar_container.setBackgroundColor(ContextCompat.getColor(context, R.color.white)) + label_center.setTextColor(ContextCompat.getColor(context, R.color.black)) + } + + private fun hide() { + this.animate().translationY((-this.height) + .toFloat()) + .setInterpolator(AccelerateInterpolator(2f)) + .start() + } +} diff --git a/folioreader/src/main/java/com/folioreader/view/FolioToolbarCallback.kt b/folioreader/src/main/java/com/folioreader/view/FolioToolbarCallback.kt new file mode 100644 index 000000000..14b90ff05 --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/view/FolioToolbarCallback.kt @@ -0,0 +1,7 @@ +package com.folioreader.view + +interface FolioToolbarCallback { + fun startContentHighlightActivity() + fun showConfigBottomSheetDialogFragment() + fun showMediaController() +} \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt b/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt index 4e528135b..7a9f14f86 100644 --- a/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt +++ b/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt @@ -31,9 +31,10 @@ class MediaControllerView : RelativeLayout { constructor(context: Context, attributes: AttributeSet?) : this(context, attributes, 0) constructor(context: Context, attributes: AttributeSet?, defStyle: Int) : super(context, attributes, defStyle) { LayoutInflater.from(context).inflate(R.layout.view_audio_player, this) + init() } - fun onInit() { + private fun init() { config = AppUtil.getSavedConfig(context) btn_one_and_half_speed.text = Html.fromHtml(context.getString(R.string.one_and_half_speed)) btn_half_speed.text = Html.fromHtml(context.getString(R.string.half_speed_text)) @@ -42,6 +43,7 @@ class MediaControllerView : RelativeLayout { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { playback_speed_Layout.visibility = View.GONE } + if (config.isNightMode) setNightMode() initColors() initListeners() } @@ -132,7 +134,7 @@ class MediaControllerView : RelativeLayout { play_button.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.play_icon)) } - fun setNightMode() { + private fun setNightMode() { container.setBackgroundColor(ContextCompat.getColor(context, R.color.night)) } diff --git a/folioreader/src/main/java/com/folioreader/view/ObservableWebView.java b/folioreader/src/main/java/com/folioreader/view/ObservableWebView.java index afae6c378..d472a31d3 100644 --- a/folioreader/src/main/java/com/folioreader/view/ObservableWebView.java +++ b/folioreader/src/main/java/com/folioreader/view/ObservableWebView.java @@ -28,8 +28,7 @@ public interface SeekBarListener { } public interface ToolBarListener { - void hideOrshowToolBar(); - void hideToolBarIfVisible(); + void hideOrShowToolBar(); } private ScrollListener mScrollListener; @@ -81,7 +80,7 @@ public boolean onTouchEvent(MotionEvent event) { if (mToolBarListener != null && (Math.abs(event.getX() - mDownPosX) < MOVE_THRESHOLD_DP || Math.abs(event.getY() - mDownPosY) < MOVE_THRESHOLD_DP)) { - mToolBarListener.hideOrshowToolBar(); + mToolBarListener.hideOrShowToolBar(); } break; } @@ -90,7 +89,7 @@ public boolean onTouchEvent(MotionEvent event) { @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { - if (mToolBarListener != null) mToolBarListener.hideToolBarIfVisible(); + if (mToolBarListener != null) mToolBarListener.hideOrShowToolBar(); if (mScrollListener != null) mScrollListener.onScrollChange(t); super.onScrollChanged(l, t, oldl, oldt); } diff --git a/sample/build.gradle b/sample/build.gradle index 3819aebd4..1e6d345a6 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -57,5 +57,6 @@ android { dependencies { implementation project(':folioreader') + implementation 'com.android.support.constraint:constraint-layout:1.1.0' implementation 'com.android.support:appcompat-v7:27.1.1' }