From 20d5ec251d67f6750b6dc4cd64ca4f69dcf71b9d Mon Sep 17 00:00:00 2001 From: epostadeveloper Date: Fri, 20 Apr 2018 12:33:22 +0300 Subject: [PATCH 001/139] first approach --- folioreader/res/layout/folio_activity.xml | 7 +- folioreader/res/values/strings.xml | 2 + .../com/folioreader/model/HighlightImpl.java | 3 + .../ui/folio/activity/FolioActivity.java | 60 +++++++++++++++ .../ui/folio/fragment/FolioPageFragment.java | 76 ++++++++++++++----- 5 files changed, 129 insertions(+), 19 deletions(-) diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index 1b04b270e..5b9c3ed7e 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -45,7 +45,12 @@ android:layout_height="wrap_content" android:layout_margin="16dp" android:src="@drawable/ic_close_green_24dp" /> - + please enter a note Contents + + \'%s\'"); console.log(document.body.innerHTML);})()]]> Hello blank fragment Starting drag! diff --git a/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java b/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java index 4792a7970..ff9f8e889 100644 --- a/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java +++ b/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java @@ -2,6 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; import java.util.Date; @@ -120,6 +121,8 @@ public HighlightImpl(int id, String bookId, String content, Date date, String ty this.rangy = rangy; this.note = note; this.uuid = uuid; + + Log.d("gözde456",this.toString()); } public HighlightImpl() { 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 605148002..db70a7717 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 @@ -20,6 +20,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; @@ -40,6 +41,8 @@ import android.widget.TextView; import android.widget.Toast; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import com.folioreader.Config; import com.folioreader.Constants; import com.folioreader.R; @@ -48,6 +51,7 @@ import com.folioreader.model.event.MediaOverlayHighlightStyleEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; import com.folioreader.model.event.MediaOverlaySpeedEvent; +import com.folioreader.model.event.SearchEvent; import com.folioreader.model.event.WebViewPosition; import com.folioreader.ui.folio.adapter.FolioPageFragmentAdapter; import com.folioreader.ui.folio.fragment.FolioPageFragment; @@ -67,10 +71,16 @@ import org.readium.r2_streamer.model.container.EpubContainer; import org.readium.r2_streamer.model.publication.EpubPublication; import org.readium.r2_streamer.model.publication.link.Link; +import org.readium.r2_streamer.model.searcher.SearchQueryResults; import org.readium.r2_streamer.server.EpubServer; import org.readium.r2_streamer.server.EpubServerSingleton; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.ArrayList; import java.util.List; @@ -193,6 +203,16 @@ public void onClick(View v) { } }); + // search + findViewById(R.id.btn_search).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(FolioActivity.this, "Salih says hi", Toast.LENGTH_SHORT).show(); + String urlString = Constants.LOCALHOST + bookFileName + "/search?query=" + "Copyright"; + new SearchListTask().execute(urlString); + } + }); + mIsNightMode = mConfig.isNightMode(); if (mIsNightMode) { mToolbar.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.black)); @@ -200,6 +220,46 @@ public void onClick(View v) { audioContainer.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.night)); } } + class SearchListTask extends AsyncTask { + + @Override + protected SearchQueryResults doInBackground(String... urls) { + String strUrl = urls[0]; + try { + URL url = new URL(strUrl); + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setRequestMethod("GET"); + + InputStream inputStream = urlConnection.getInputStream(); + + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,AppUtil.charsetNameForURLConnection(urlConnection))); + StringBuilder stringBuilder = new StringBuilder(); + String line; + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line); + Log.d("deneme",line); + } + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return objectMapper.readValue(stringBuilder.toString(), SearchQueryResults.class); + } catch (IOException e) { + Log.e(TAG, "SearchListTask IOException " + e.toString()); + } + return null; + } + + @Override + protected void onPostExecute(SearchQueryResults results) { + for (int i = 0;i * Function triggered when highlight is deleted and page is needed to * be updated. * @@ -305,8 +312,8 @@ public void reload(ReloadDataEvent reloadDataEvent) { */ @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) - public void updateHighlight(UpdateHighlightEvent event){ - if(isAdded()) { + public void updateHighlight(UpdateHighlightEvent event) { + if (isAdded()) { this.rangy = HighlightUtil.generateRangyString(getPageName()); loadRangy(mWebview, this.rangy); } @@ -322,7 +329,8 @@ public void updateHighlight(UpdateHighlightEvent event){ public void jumpToAnchorPoint(AnchorIdEvent event) { if (isAdded() && event != null && event.getHref() != null) { String href = event.getHref(); - if (href != null && href.indexOf('#') != -1 && spineItem.href.equals(href.substring(0, href.lastIndexOf('#')))) { + if (href != null && href.indexOf('#') != -1 && spineItem.href.equals(href.substring(0, href.lastIndexOf + ('#')))) { mAnchorId = href.substring(href.lastIndexOf('#') + 1); if (mWebview.getContentHeight() > 0 && mAnchorId != null) { mWebview.loadUrl("javascript:document.getElementById(\"" + mAnchorId + "\").scrollIntoView()"); @@ -352,7 +360,8 @@ private void setHtml(boolean reloaded) { String ref = spineItem.href; if (!reloaded && spineItem.properties.contains("media-overlay")) { mediaController.setSMILItems(SMILParser.parseSMIL(mHtmlString)); - mediaController.setUpMediaPlayer(spineItem.mediaOverlay, spineItem.mediaOverlay.getAudioPath(spineItem.href), mBookTitle); + mediaController.setUpMediaPlayer(spineItem.mediaOverlay, spineItem.mediaOverlay.getAudioPath + (spineItem.href), mBookTitle); } mConfig = AppUtil.getSavedConfig(getActivity()); String path = ref.substring(0, ref.lastIndexOf('/')); @@ -488,7 +497,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { // prevent favicon.ico to be loaded automatically @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { - if(url.toLowerCase().contains("/favicon.ico")) { + if (url.toLowerCase().contains("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, null); } catch (Exception e) { @@ -502,7 +511,7 @@ public WebResourceResponse shouldInterceptRequest(WebView view, String url) { @Override @SuppressLint("NewApi") public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - if(!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico")) { + if (!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, null); } catch (Exception e) { @@ -528,6 +537,13 @@ public void run() { } } + @Override + public boolean onConsoleMessage(ConsoleMessage consoleMessage) { + android.util.Log.d("WebView", consoleMessage.message()); + return true; + } + + @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { if (FolioPageFragment.this.isVisible()) { @@ -567,8 +583,10 @@ public boolean onJsAlert(WebView view, String url, String message, JsResult resu getActivity()))); } else { // to handle TTS playback when highlight is deleted. - Pattern p = Pattern.compile("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"); - if (!p.matcher(message).matches() && (!message.equals("undefined")) && isCurrentFragment()) { + Pattern p = Pattern.compile + ("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"); + if (!p.matcher(message).matches() && (!message.equals("undefined")) && isCurrentFragment + ()) { mediaController.speakAudio(message); } } @@ -607,7 +625,8 @@ public void endSelection() { } private void loadRangy(WebView view, String rangy) { - view.loadUrl(String.format("javascript:if(typeof ssReader !== \"undefined\"){ssReader.setHighlights('%s');}", rangy)); + view.loadUrl(String.format("javascript:if(typeof ssReader !== \"undefined\"){ssReader.setHighlights('%s');}", + rangy)); } private void setupScrollBar() { @@ -740,9 +759,11 @@ public void onSaveInstanceState(Bundle outState) { public void highlight(HighlightImpl.HighlightStyle style, boolean isCreated) { if (isCreated) { - mWebview.loadUrl(String.format("javascript:if(typeof ssReader !== \"undefined\"){ssReader.highlightSelection('%s');}", HighlightImpl.HighlightStyle.classForStyle(style))); + mWebview.loadUrl(String.format("javascript:if(typeof ssReader !== \"undefined\"){ssReader" + + ".highlightSelection('%s');}", HighlightImpl.HighlightStyle.classForStyle(style))); } else { - mWebview.loadUrl(String.format("javascript:setHighlightStyle('%s')", "highlight_" + HighlightImpl.HighlightStyle.classForStyle(style))); + mWebview.loadUrl(String.format("javascript:setHighlightStyle('%s')", "highlight_" + HighlightImpl + .HighlightStyle.classForStyle(style))); } } @@ -948,6 +969,14 @@ public void setWebView(final WebViewPosition position) { } } + @SuppressWarnings("unused") + @Subscribe(threadMode = ThreadMode.MAIN) + public void setWebView(SearchEvent searchEvent) { + if (mWebview.getContentHeight() > 0) { + scrollAndHighlight(searchEvent.getWord()); + } + } + public void setWebViewPosition(final int position) { mWebview.post(new Runnable() { @Override @@ -1010,4 +1039,15 @@ public void onError() { private void scrollToHighlightId() { mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } + + private void scrollAndHighlight(String word) { + mWebview.addJavascriptInterface(this, "Android"); + String js = String.format("javascript:(function() { console.log(document.body.innerHTML); document.body.innerHTML = " + + "document.body.innerHTML.replace( \'%s\',\" %s \"); console.log(document.body" + + ".innerHTML);})()",word,word); + Log.d("jssss",js); + mWebview.loadUrl(js); + } } From d39abf3e8262802032c1805dbf732a75d7a0da5e Mon Sep 17 00:00:00 2001 From: epostadeveloper Date: Fri, 20 Apr 2018 23:02:43 +0300 Subject: [PATCH 002/139] proof of work,bug fixing,first design attempt --- .../res/drawable/ic_search_white_24px.xml | 9 ++ folioreader/res/layout/folio_activity.xml | 73 +++++++--- .../ui/base/SearchListCallBack.java | 7 + .../folioreader/ui/base/SearchListTask.java | 67 +++++++++ .../ui/folio/activity/FolioActivity.java | 130 ++++++++++++------ .../ui/folio/fragment/FolioPageFragment.java | 9 +- .../ui/folio/presenter/MainMvpView.java | 2 + .../ui/folio/presenter/MainPresenter.java | 17 +++ 8 files changed, 252 insertions(+), 62 deletions(-) create mode 100644 folioreader/res/drawable/ic_search_white_24px.xml create mode 100644 folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java create mode 100644 folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java diff --git a/folioreader/res/drawable/ic_search_white_24px.xml b/folioreader/res/drawable/ic_search_white_24px.xml new file mode 100644 index 000000000..978c5867c --- /dev/null +++ b/folioreader/res/drawable/ic_search_white_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index 5b9c3ed7e..4b288711b 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -1,16 +1,16 @@ - + + app:direction="vertical"/> + android:layout_height="wrap_content"> + android:src="@drawable/ic_close_green_24dp"/> + + android:layout_marginBottom="16dp" + android:layout_marginRight="16dp" + android:layout_marginTop="16dp" + android:src="@drawable/ic_search_white_24px"/> + + android:src="@drawable/ic_drawer_green_24dp"/> + android:textStyle="bold"/> + android:src="@drawable/icon_font"/> + android:src="@drawable/man_speech_icon"/> + android:background="@android:color/black"/> + + + + + + + + + + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="#99000000" + android:visibility="gone"> - + \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java b/folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java new file mode 100644 index 000000000..73a61f07e --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java @@ -0,0 +1,7 @@ +package com.folioreader.ui.base; + +import org.readium.r2_streamer.model.searcher.SearchQueryResults; + +public interface SearchListCallBack extends BaseMvpView { + void onReceiveSearchList(SearchQueryResults searchQueryResults); +} diff --git a/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java new file mode 100644 index 000000000..54daa2f30 --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java @@ -0,0 +1,67 @@ +package com.folioreader.ui.base; + +import android.os.AsyncTask; +import android.util.Log; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.folioreader.util.AppUtil; + +import org.readium.r2_streamer.model.searcher.SearchQueryResults; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class SearchListTask extends AsyncTask { + + private static final String TAG = "SearchListTask"; + + private SearchListCallBack callBack; + String strUrl; + + public SearchListTask(SearchListCallBack callBack) { + this.callBack = callBack; + } + + @Override + protected SearchQueryResults doInBackground(String... urls) { + strUrl = urls[0]; + try { + URL url = new URL(strUrl); + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setRequestMethod("GET"); + + InputStream inputStream = urlConnection.getInputStream(); + + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, AppUtil + .charsetNameForURLConnection(urlConnection))); + StringBuilder stringBuilder = new StringBuilder(); + String line; + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line); + } + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return objectMapper.readValue(stringBuilder.toString(), SearchQueryResults.class); + } catch (IOException e) { + Log.e(TAG, "SearchListTask IOException " + e.toString()); + } + return null; + } + + @Override + protected void onPostExecute(SearchQueryResults results) { + + if (results != null) { + callBack.onReceiveSearchList(results); + }else{ + callBack.onError(); + } + cancel(true); + } +} 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 db70a7717..9efa91476 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 @@ -1,18 +1,18 @@ /* -* Copyright (C) 2016 Pedro Paulo de Amorim -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright (C) 2016 Pedro Paulo de Amorim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.folioreader.ui.folio.activity; import android.Manifest; @@ -165,8 +165,10 @@ protected void onCreate(Bundle savedInstanceState) { 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); + 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(); } @@ -208,11 +210,11 @@ public void onClick(View v) { @Override public void onClick(View view) { Toast.makeText(FolioActivity.this, "Salih says hi", Toast.LENGTH_SHORT).show(); - String urlString = Constants.LOCALHOST + bookFileName + "/search?query=" + "Copyright"; + String urlString = Constants.LOCALHOST + bookFileName + "/search?query=" + "ButBibles"; new SearchListTask().execute(urlString); } }); - + mIsNightMode = mConfig.isNightMode(); if (mIsNightMode) { mToolbar.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.black)); @@ -220,11 +222,13 @@ public void onClick(View view) { audioContainer.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.night)); } } + class SearchListTask extends AsyncTask { + String strUrl; @Override protected SearchQueryResults doInBackground(String... urls) { - String strUrl = urls[0]; + strUrl = urls[0]; try { URL url = new URL(strUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); @@ -232,12 +236,13 @@ protected SearchQueryResults doInBackground(String... urls) { InputStream inputStream = urlConnection.getInputStream(); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,AppUtil.charsetNameForURLConnection(urlConnection))); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, AppUtil + .charsetNameForURLConnection(urlConnection))); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); - Log.d("deneme",line); + Log.d("deneme", line); } ObjectMapper objectMapper = new ObjectMapper(); @@ -251,11 +256,21 @@ protected SearchQueryResults doInBackground(String... urls) { @Override protected void onPostExecute(SearchQueryResults results) { - for (int i = 0;i %s \"); console.log(document.body" + - ".innerHTML);})()",word,word); + ".innerHTML);" + + "var element = document.getElementById('salihaksit123');\n" + + " if(element != null) {\n" + + " console.log('salih78945613'); goToEl(element);\n" + + " }else{ console.log('salih78945613123456'); }" + + "})()",word,word); Log.d("jssss",js); mWebview.loadUrl(js); } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java index a4d77a4d8..716f4972f 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java @@ -3,6 +3,7 @@ import com.folioreader.ui.base.BaseMvpView; import org.readium.r2_streamer.model.publication.EpubPublication; +import org.readium.r2_streamer.model.searcher.SearchQueryResults; /** * @author gautam chibde on 8/6/17. @@ -10,4 +11,5 @@ public interface MainMvpView extends BaseMvpView { void onLoadPublication(EpubPublication publication); + void onShowSearchResults(SearchQueryResults results); } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java index 00da2e6b2..b830f517b 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java @@ -2,8 +2,11 @@ import com.folioreader.ui.base.ManifestCallBack; import com.folioreader.ui.base.ManifestTask; +import com.folioreader.ui.base.SearchListCallBack; +import com.folioreader.ui.base.SearchListTask; import org.readium.r2_streamer.model.publication.EpubPublication; +import org.readium.r2_streamer.model.searcher.SearchQueryResults; /** * @author gautam chibde on 8/6/17. @@ -20,6 +23,20 @@ public void parseManifest(String url) { new ManifestTask(this).execute(url); } + public void searchQuery(String searchUrl){ + new SearchListTask(new SearchListCallBack() { + @Override + public void onReceiveSearchList(SearchQueryResults searchQueryResults) { + mainMvpView.onShowSearchResults(searchQueryResults); + } + + @Override + public void onError() { + // TODO: 20.04.2018 + } + }).execute(searchUrl); + } + @Override public void onReceivePublication(EpubPublication publication) { mainMvpView.onLoadPublication(publication); From 9efbecd33d398eb8794c02b6027ecb3ef279c611 Mon Sep 17 00:00:00 2001 From: epostadeveloper Date: Sat, 21 Apr 2018 12:08:05 +0300 Subject: [PATCH 003/139] design,next search position, --- .../res/drawable/ic_search_green_24px.xml | 9 ++ .../res/drawable/ic_search_white_24px.xml | 2 +- folioreader/res/layout/folio_activity.xml | 20 ++- .../folioreader/model/event/SearchEvent.java | 28 ++++ .../folioreader/ui/base/SearchListTask.java | 2 +- .../ui/folio/activity/FolioActivity.java | 139 ++++++++++-------- .../ui/folio/fragment/FolioPageFragment.java | 45 ++++-- .../ui/folio/presenter/MainMvpView.java | 1 + .../ui/folio/presenter/MainPresenter.java | 34 +++-- 9 files changed, 186 insertions(+), 94 deletions(-) create mode 100644 folioreader/res/drawable/ic_search_green_24px.xml create mode 100644 folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java diff --git a/folioreader/res/drawable/ic_search_green_24px.xml b/folioreader/res/drawable/ic_search_green_24px.xml new file mode 100644 index 000000000..978c5867c --- /dev/null +++ b/folioreader/res/drawable/ic_search_green_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/folioreader/res/drawable/ic_search_white_24px.xml b/folioreader/res/drawable/ic_search_white_24px.xml index 978c5867c..01cde53b0 100644 --- a/folioreader/res/drawable/ic_search_white_24px.xml +++ b/folioreader/res/drawable/ic_search_white_24px.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="#ffffff"/> diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index 4b288711b..b779fda14 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -53,7 +53,7 @@ android:layout_marginBottom="16dp" android:layout_marginRight="16dp" android:layout_marginTop="16dp" - android:src="@drawable/ic_search_white_24px"/> + android:src="@drawable/ic_search_green_24px"/> @@ -124,18 +125,21 @@ android:id="@+id/search_query" android:layout_width="match_parent" android:layout_height="wrap_content" - android:imeOptions="actionSearch" android:layout_marginRight="8dp" - android:layout_toLeftOf="@+id/search_arr"/> + android:layout_toLeftOf="@+id/search_img" + android:imeOptions="actionSearch" + android:paddingLeft="4dp" + android:paddingRight="4dp" + android:textColor="@color/black"/> + android:layout_marginRight="16dp" + android:src="@drawable/ic_search_white_24px"/> diff --git a/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java b/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java new file mode 100644 index 000000000..944f2b40b --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java @@ -0,0 +1,28 @@ +package com.folioreader.model.event; + +public class SearchEvent { + + private String word; + private boolean isNewChapter; + + public SearchEvent(){ + + } + + public SearchEvent(String word,boolean isNewChapter){ + this.word=word; + this.isNewChapter = isNewChapter; + } + + public String getWord() { + return word; + } + + + + public boolean isNewChapter() { + return isNewChapter; + } + + +} diff --git a/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java index 54daa2f30..e31657407 100644 --- a/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java +++ b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java @@ -57,7 +57,7 @@ protected SearchQueryResults doInBackground(String... urls) { @Override protected void onPostExecute(SearchQueryResults results) { - if (results != null) { + if (results != null && results.getSearchCount()>0) { callBack.onReceiveSearchList(results); }else{ callBack.onError(); 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 9efa91476..99eaf88f6 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 @@ -20,7 +20,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; @@ -35,14 +34,13 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; +import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import com.folioreader.Config; import com.folioreader.Constants; import com.folioreader.R; @@ -75,12 +73,7 @@ import org.readium.r2_streamer.server.EpubServer; import org.readium.r2_streamer.server.EpubServerSingleton; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; import java.util.ArrayList; import java.util.List; @@ -115,8 +108,13 @@ public enum EpubSourceType { private static final String HIGHLIGHT_ITEM = "highlight_item"; public boolean mIsActionBarVisible; + public boolean mIsSearchSectionVisible = false; + public boolean isForSearch = true; + private DirectionalViewpager mFolioPageViewPager; private Toolbar mToolbar; + private RelativeLayout searchSection; + private SearchImageClickListener searchImageClickListener; private int mChapterPosition; private FolioPageFragmentAdapter mFolioPageFragmentAdapter; @@ -175,6 +173,10 @@ protected void onCreate(Bundle savedInstanceState) { initAudioView(); mToolbar = (Toolbar) findViewById(R.id.toolbar); + searchSection = (RelativeLayout) findViewById(R.id.search_section); + searchImageClickListener = new SearchImageClickListener(); + findViewById(R.id.search_img).setOnClickListener(searchImageClickListener); + searchAnimateHide(); findViewById(R.id.btn_drawer).setOnClickListener(new View.OnClickListener() { @Override @@ -209,9 +211,7 @@ public void onClick(View v) { findViewById(R.id.btn_search).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Toast.makeText(FolioActivity.this, "Salih says hi", Toast.LENGTH_SHORT).show(); - String urlString = Constants.LOCALHOST + bookFileName + "/search?query=" + "ButBibles"; - new SearchListTask().execute(urlString); + search(); } }); @@ -223,56 +223,44 @@ public void onClick(View view) { } } - class SearchListTask extends AsyncTask { - String strUrl; + private void search() { + isForSearch = true; + if (!mIsSearchSectionVisible) { + searchAnimateShow(); + } else { + searchAnimateHide(); + } - @Override - protected SearchQueryResults doInBackground(String... urls) { - strUrl = urls[0]; - try { - URL url = new URL(strUrl); - HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); - urlConnection.setRequestMethod("GET"); - - InputStream inputStream = urlConnection.getInputStream(); - - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, AppUtil - .charsetNameForURLConnection(urlConnection))); - StringBuilder stringBuilder = new StringBuilder(); - String line; - while ((line = bufferedReader.readLine()) != null) { - stringBuilder.append(line); - Log.d("deneme", line); - } + } - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - return objectMapper.readValue(stringBuilder.toString(), SearchQueryResults.class); - } catch (IOException e) { - Log.e(TAG, "SearchListTask IOException " + e.toString()); - } - return null; - } + class SearchImageClickListener implements View.OnClickListener { + + public ArrayList indexes; + private int currentIndex = 0; + public String query; @Override - protected void onPostExecute(SearchQueryResults results) { - for (int i = 0; i < results.getSearchResultList().size(); i++) { - Log.d("gözde123", results.getSearchResultList().get(i).getSearchIndex() + " : " + results - .getSearchResultList().get(i).getMatchString()); - Log.d("gözdesalih", results.getSearchResultList().get(i).getResource() + ":" + results - .getSearchResultList().get(i).getTitle()); - for (int j = 0; j < mSpineReferenceList.size(); j++) { - if (mSpineReferenceList.get(j).getHref().equalsIgnoreCase(results.getSearchResultList().get(i) - .getResource())) { - mFolioPageViewPager.setCurrentItem(j); + public void onClick(View view) { + Log.d("gözde***web", "salih"); + if (isForSearch) { + new MainPresenter(FolioActivity.this).searchQuery(); + } else { + if (indexes != null && query != null) { + if (indexes.size() > currentIndex) { + boolean isNew = true; + + if (currentIndex > 0 && indexes.get(currentIndex - 1).equals(indexes.get(currentIndex))) { + isNew = false; + }else{ + mFolioPageViewPager.setCurrentItem(indexes.get(currentIndex)); + } + Log.d("gözde***web2", "qwe"); + EventBus.getDefault().post(new SearchEvent(query,isNew)); + // TODO: 21.04.2018 multiple + currentIndex++; } } - break; } - - EventBus.getDefault().post(new SearchEvent(strUrl.split("=")[1])); - - cancel(true); } } @@ -433,6 +421,21 @@ public void goToChapter(String href) { } } + private void searchAnimateShow() { + if (!mIsSearchSectionVisible) { +// searchSection.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); + mIsSearchSectionVisible = true; + searchSection.setVisibility(View.VISIBLE); + } + } + + private void searchAnimateHide() { + mIsSearchSectionVisible = false; +// searchSection.animate().translationY(-searchSection.getHeight()).setInterpolator(new AccelerateInterpolator +// (2)).start(); + searchSection.setVisibility(View.GONE); + } + private void toolbarAnimateShow() { if (!mIsActionBarVisible) { mToolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); @@ -518,22 +521,36 @@ public void onLoadPublication(EpubPublication publication) { @Override public void onShowSearchResults(SearchQueryResults results) { + + isForSearch = false; String query = results.getSearchResultList().get(0).getSearchQuery(); + searchImageClickListener.query = query; + searchImageClickListener.currentIndex = 0; + searchImageClickListener.indexes = getSearchIndexes(results); + + } + + + private ArrayList getSearchIndexes(SearchQueryResults results) { + ArrayList searchQueryIndexes = new ArrayList<>(); for (int i = 0; i < results.getSearchResultList().size(); i++) { -// Log.d("gözde123", results.getSearchResultList().get(i).getSearchIndex() + " : " + results -// .getSearchResultList().get(i).getMatchString()); -// Log.d("gözdesalih", results.getSearchResultList().get(i).getResource() + ":" + results -// .getSearchResultList().get(i).getTitle()); for (int j = 0; j < mSpineReferenceList.size(); j++) { if (mSpineReferenceList.get(j).getHref().equalsIgnoreCase(results.getSearchResultList().get(i) .getResource())) { - mFolioPageViewPager.setCurrentItem(j); + searchQueryIndexes.add(j); + break; } } - break; } + return searchQueryIndexes; + } - EventBus.getDefault().post(new SearchEvent(query)); + @Override + public String getSearchQuery() { + EditText mEditText = (EditText) findViewById(R.id.search_query); + // TODO: 21.04.2018 eg. change space to %20 + return mEditText.getText() == null ? null : Constants.LOCALHOST + bookFileName + "/search?query=" + mEditText + .getText().toString(); } private void setConfig() { diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index a7fe7e393..02dc3f9ed 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -70,6 +70,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Locale; +import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -327,6 +328,7 @@ public void updateHighlight(UpdateHighlightEvent event) { */ @Subscribe(threadMode = ThreadMode.MAIN) public void jumpToAnchorPoint(AnchorIdEvent event) { + Log.d("eventqwe","12"); if (isAdded() && event != null && event.getHref() != null) { String href = event.getHref(); if (href != null && href.indexOf('#') != -1 && spineItem.href.equals(href.substring(0, href.lastIndexOf @@ -968,12 +970,22 @@ public void setWebView(final WebViewPosition position) { } } } - - @SuppressWarnings("unused") + int count = 0; + String id=""; @Subscribe(threadMode = ThreadMode.MAIN) - public void setWebView(SearchEvent searchEvent) { + public void setWebViewAccToSearch(SearchEvent searchEvent) { if (mWebview.getContentHeight() > 0) { - scrollAndHighlight(searchEvent.getWord()); + + + Log.d("gözde***", "salih5"); + if (searchEvent.isNewChapter()) { + count = 0; + id = scrollAndHighlight(searchEvent.getWord()); + }else{ + count++; + } + Log.d("salihWebview",id+" : "+count); + goNextElementInTheSameChapter(id, count); } } @@ -1040,19 +1052,30 @@ private void scrollToHighlightId() { mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } - private void scrollAndHighlight(String word) { + private String scrollAndHighlight(String word) { + String uniqueId = UUID.randomUUID().toString(); mWebview.addJavascriptInterface(this, "Android"); - String js = String.format("javascript:(function() { console.log(document.body.innerHTML); document.body.innerHTML = " + - "document.body.innerHTML.replace( \'%s\',\" %s \"); console.log(document.body" + ".innerHTML);" + - "var element = document.getElementById('salihaksit123');\n" + +// "var element = document.getElementsByName(\'%s\')[0];\n" + +// " if(element != null) {\n" + +// " console.log('salih78945613'); goToEl(element);\n" + +// " }else{ console.log('salih78945613123456'); }" + + "})()", word,uniqueId, word,uniqueId); + Log.d("jssss", js); + mWebview.loadUrl(js); + return uniqueId; + } + private void goNextElementInTheSameChapter(String uniqueId,int count){ + String js =String.format("javascript:(function() {var element = document.getElementsByName(\'%s\')[%d];\n" + " if(element != null) {\n" + " console.log('salih78945613'); goToEl(element);\n" + - " }else{ console.log('salih78945613123456'); }" + - "})()",word,word); - Log.d("jssss",js); + " }else{ console.log('salih78945613123456'); } })()",uniqueId,count); mWebview.loadUrl(js); } } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java index 716f4972f..4c62d041b 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java @@ -12,4 +12,5 @@ public interface MainMvpView extends BaseMvpView { void onLoadPublication(EpubPublication publication); void onShowSearchResults(SearchQueryResults results); + String getSearchQuery(); } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java index b830f517b..85a630487 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java @@ -1,5 +1,7 @@ package com.folioreader.ui.folio.presenter; +import android.util.Log; + import com.folioreader.ui.base.ManifestCallBack; import com.folioreader.ui.base.ManifestTask; import com.folioreader.ui.base.SearchListCallBack; @@ -23,18 +25,26 @@ public void parseManifest(String url) { new ManifestTask(this).execute(url); } - public void searchQuery(String searchUrl){ - new SearchListTask(new SearchListCallBack() { - @Override - public void onReceiveSearchList(SearchQueryResults searchQueryResults) { - mainMvpView.onShowSearchResults(searchQueryResults); - } - - @Override - public void onError() { - // TODO: 20.04.2018 - } - }).execute(searchUrl); + public void searchQuery() { + String searchUrl = mainMvpView.getSearchQuery(); + if (searchUrl == null) { + mainMvpView.onError(); + } else { + new SearchListTask(new SearchListCallBack() { + @Override + public void onReceiveSearchList(SearchQueryResults searchQueryResults) { + Log.d("gözde***","salih2"); + mainMvpView.onShowSearchResults(searchQueryResults); + } + + @Override + public void onError() { + Log.d("gözde***","salih3"); + // TODO: 20.04.2018 + } + }).execute(searchUrl); + } + Log.d("gözde***","salih4"); } @Override From 04fd6a0c289dc98c499d7357a74d40985e2bb470 Mon Sep 17 00:00:00 2001 From: epostadeveloper Date: Sat, 21 Apr 2018 18:33:28 +0300 Subject: [PATCH 004/139] design icons , attempt to solve empty uniqueID --- .../ic_keyboard_arrow_down_white_24.xml | 9 +++ folioreader/res/layout/folio_activity.xml | 31 +++++---- .../ui/folio/activity/FolioActivity.java | 64 +++++++++++++++++-- .../ui/folio/fragment/FolioPageFragment.java | 38 +++++++---- 4 files changed, 111 insertions(+), 31 deletions(-) create mode 100644 folioreader/res/drawable/ic_keyboard_arrow_down_white_24.xml diff --git a/folioreader/res/drawable/ic_keyboard_arrow_down_white_24.xml b/folioreader/res/drawable/ic_keyboard_arrow_down_white_24.xml new file mode 100644 index 000000000..4a969157c --- /dev/null +++ b/folioreader/res/drawable/ic_keyboard_arrow_down_white_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index b779fda14..e4abb7d84 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -112,34 +112,43 @@ - + android:orientation="horizontal" + android:visibility="gone"> + + android:textColor="@color/black" + android:textStyle="bold"/> - + + 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 99eaf88f6..493d40c75 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 @@ -26,6 +26,7 @@ import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.AppCompatImageView; import android.support.v7.widget.Toolbar; import android.text.Html; import android.util.Log; @@ -114,8 +115,13 @@ public enum EpubSourceType { private DirectionalViewpager mFolioPageViewPager; private Toolbar mToolbar; private RelativeLayout searchSection; + private AppCompatImageView searchImage; private SearchImageClickListener searchImageClickListener; + private EditText mSearchText; + private static final int SEARCH_ICON = 1; + private static final int DOWN_ARROW_ICON = 2; + private int mChapterPosition; private FolioPageFragmentAdapter mFolioPageFragmentAdapter; private int mWebViewScrollPosition; @@ -173,10 +179,16 @@ protected void onCreate(Bundle savedInstanceState) { initAudioView(); mToolbar = (Toolbar) findViewById(R.id.toolbar); + + ///////////////////search inits ///////////////////// searchSection = (RelativeLayout) findViewById(R.id.search_section); + searchImage = (AppCompatImageView) findViewById(R.id.search_img); + searchImage.setTag(SEARCH_ICON); + mSearchText = (EditText) findViewById(R.id.search_query); searchImageClickListener = new SearchImageClickListener(); - findViewById(R.id.search_img).setOnClickListener(searchImageClickListener); + searchImage.setOnClickListener(searchImageClickListener); searchAnimateHide(); + ///////////////////search inits ///////////////////// findViewById(R.id.btn_drawer).setOnClickListener(new View.OnClickListener() { @Override @@ -215,6 +227,14 @@ public void onClick(View view) { } }); + //cancel search + findViewById(R.id.cancel_img).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + clearSearchSection(); + clearSearchHighlights(); + } + }); mIsNightMode = mConfig.isNightMode(); if (mIsNightMode) { mToolbar.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.black)); @@ -223,14 +243,36 @@ public void onClick(View view) { } } + private void clearSearchSection() { + if (mSearchText != null) + mSearchText.getText().clear(); + changeSearchIcon(true); + } + + private void changeSearchIcon(boolean doSearch){ + if (doSearch/* && (int)searchImage.getTag()== DOWN_ARROW_ICON*/){ + searchImage.setTag(SEARCH_ICON); + searchImage.setImageResource(R.drawable.ic_search_white_24px); + findViewById(R.id.cancel_img).setVisibility(View.INVISIBLE); + }else if(!doSearch /*&& (int)searchImage.getTag()== SEARCH_ICON*/){ + searchImage.setTag(DOWN_ARROW_ICON); + searchImage.setImageResource(R.drawable.ic_keyboard_arrow_down_white_24); + findViewById(R.id.cancel_img).setVisibility(View.VISIBLE); + } + } + private void clearSearchHighlights(){ + // TODO: 21.04.2018 + } private void search() { isForSearch = true; if (!mIsSearchSectionVisible) { searchAnimateShow(); + clearSearchSection(); } else { searchAnimateHide(); + clearSearchHighlights(); } - + } class SearchImageClickListener implements View.OnClickListener { @@ -251,13 +293,17 @@ public void onClick(View view) { if (currentIndex > 0 && indexes.get(currentIndex - 1).equals(indexes.get(currentIndex))) { isNew = false; - }else{ + } else { mFolioPageViewPager.setCurrentItem(indexes.get(currentIndex)); } Log.d("gözde***web2", "qwe"); - EventBus.getDefault().post(new SearchEvent(query,isNew)); + EventBus.getDefault().post(new SearchEvent(query, isNew)); // TODO: 21.04.2018 multiple currentIndex++; + }else{ + // TODO: 21.04.2018 no more && maybe change icon + currentIndex = 0; + view.performClick(); } } } @@ -426,6 +472,7 @@ private void searchAnimateShow() { // searchSection.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); mIsSearchSectionVisible = true; searchSection.setVisibility(View.VISIBLE); + toolbarAnimateHide(); } } @@ -439,6 +486,7 @@ private void searchAnimateHide() { private void toolbarAnimateShow() { if (!mIsActionBarVisible) { mToolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); + searchSection.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); mIsActionBarVisible = true; } } @@ -446,6 +494,8 @@ private void toolbarAnimateShow() { private void toolbarAnimateHide() { mIsActionBarVisible = false; mToolbar.animate().translationY(-mToolbar.getHeight()).setInterpolator(new AccelerateInterpolator(2)).start(); + searchSection.animate().translationY(-mToolbar.getHeight()).setInterpolator(new AccelerateInterpolator(2)) + .start(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @@ -527,6 +577,7 @@ public void onShowSearchResults(SearchQueryResults results) { searchImageClickListener.query = query; searchImageClickListener.currentIndex = 0; searchImageClickListener.indexes = getSearchIndexes(results); + changeSearchIcon(false); } @@ -547,9 +598,10 @@ private ArrayList getSearchIndexes(SearchQueryResults results) { @Override public String getSearchQuery() { - EditText mEditText = (EditText) findViewById(R.id.search_query); + // TODO: 21.04.2018 eg. change space to %20 - return mEditText.getText() == null ? null : Constants.LOCALHOST + bookFileName + "/search?query=" + mEditText + return mSearchText.getText() == null ? null : Constants.LOCALHOST + bookFileName + "/search?query=" + + mSearchText .getText().toString(); } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 02dc3f9ed..6ae7a3207 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -328,7 +328,7 @@ public void updateHighlight(UpdateHighlightEvent event) { */ @Subscribe(threadMode = ThreadMode.MAIN) public void jumpToAnchorPoint(AnchorIdEvent event) { - Log.d("eventqwe","12"); + Log.d("eventqwe", "12"); if (isAdded() && event != null && event.getHref() != null) { String href = event.getHref(); if (href != null && href.indexOf('#') != -1 && spineItem.href.equals(href.substring(0, href.lastIndexOf @@ -970,8 +970,10 @@ public void setWebView(final WebViewPosition position) { } } } + int count = 0; - String id=""; + String id = ""; + @Subscribe(threadMode = ThreadMode.MAIN) public void setWebViewAccToSearch(SearchEvent searchEvent) { if (mWebview.getContentHeight() > 0) { @@ -980,11 +982,12 @@ public void setWebViewAccToSearch(SearchEvent searchEvent) { Log.d("gözde***", "salih5"); if (searchEvent.isNewChapter()) { count = 0; - id = scrollAndHighlight(searchEvent.getWord()); - }else{ + id = UUID.randomUUID().toString(); + scrollAndHighlight(searchEvent.getWord(), id); + } else { count++; } - Log.d("salihWebview",id+" : "+count); + Log.d("salihWebview", id + " : " + count); goNextElementInTheSameChapter(id, count); } } @@ -1052,8 +1055,7 @@ private void scrollToHighlightId() { mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } - private String scrollAndHighlight(String word) { - String uniqueId = UUID.randomUUID().toString(); + private void scrollAndHighlight(String word, String uniqueId) { mWebview.addJavascriptInterface(this, "Android"); String js = String.format("javascript:(function() { console.log(document.body.innerHTML); document.body" + ".innerHTML = " + @@ -1066,16 +1068,24 @@ private String scrollAndHighlight(String word) { // " if(element != null) {\n" + // " console.log('salih78945613'); goToEl(element);\n" + // " }else{ console.log('salih78945613123456'); }" + - "})()", word,uniqueId, word,uniqueId); + "})()", word, uniqueId, word, uniqueId); Log.d("jssss", js); - mWebview.loadUrl(js); - return uniqueId; + if (uniqueId!=null && !uniqueId.equalsIgnoreCase("")) { + mWebview.loadUrl(js); + } } - private void goNextElementInTheSameChapter(String uniqueId,int count){ - String js =String.format("javascript:(function() {var element = document.getElementsByName(\'%s\')[%d];\n" + + + int i = 0; + + private void goNextElementInTheSameChapter(String uniqueId, int count) { + String js = String.format("javascript:(function() {var element = document.getElementsByName(\'%s\')[%d];\n" + " if(element != null) {\n" + " console.log('salih78945613'); goToEl(element);\n" + - " }else{ console.log('salih78945613123456'); } })()",uniqueId,count); - mWebview.loadUrl(js); + " }else{ console.log('salih78945613123456'); } })()", uniqueId, count); + i++; + Log.d("jssss22", i + " : " + js); + if (uniqueId!=null && !uniqueId.equalsIgnoreCase("")) { + mWebview.loadUrl(js); + } } } From 164cb609a6c58f7feccdde23789fa70ca504b1aa Mon Sep 17 00:00:00 2001 From: epostadeveloper Date: Sat, 21 Apr 2018 21:28:49 +0300 Subject: [PATCH 005/139] document ready added,make variables more general --- folioreader/res/layout/folio_activity.xml | 6 ++- .../folioreader/model/event/SearchEvent.java | 17 ++++++-- .../ui/folio/activity/FolioActivity.java | 40 ++++++++++++------- .../ui/folio/fragment/FolioPageFragment.java | 36 +++++++---------- 4 files changed, 57 insertions(+), 42 deletions(-) diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index e4abb7d84..c2d8e020b 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -126,15 +126,17 @@ android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerInParent="true" - android:layout_marginRight="16dp" + android:layout_marginLeft="8dp" android:src="@android:drawable/ic_menu_close_clear_cancel" android:visibility="gone"/> diff --git a/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java b/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java index 944f2b40b..6ac588525 100644 --- a/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java +++ b/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java @@ -3,14 +3,18 @@ public class SearchEvent { private String word; + private String id; private boolean isNewChapter; + private int count; - public SearchEvent(){ + public SearchEvent() { } - public SearchEvent(String word,boolean isNewChapter){ - this.word=word; + public SearchEvent(String word, boolean isNewChapter, int count,String uniqueId) { + this.id = uniqueId; + this.word = word; + this.count = count; this.isNewChapter = isNewChapter; } @@ -19,10 +23,15 @@ public String getWord() { } - public boolean isNewChapter() { return isNewChapter; } + public String getId() { + return id; + } + public int getCount() { + return count; + } } 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 493d40c75..20f71590e 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 @@ -77,6 +77,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import static com.folioreader.Constants.CHAPTER_SELECTED; import static com.folioreader.Constants.HIGHLIGHT_SELECTED; @@ -121,7 +122,7 @@ public enum EpubSourceType { private static final int SEARCH_ICON = 1; private static final int DOWN_ARROW_ICON = 2; - + private int mChapterPosition; private FolioPageFragmentAdapter mFolioPageFragmentAdapter; private int mWebViewScrollPosition; @@ -233,6 +234,7 @@ public void onClick(View view) { public void onClick(View view) { clearSearchSection(); clearSearchHighlights(); + isForSearch = true; } }); mIsNightMode = mConfig.isNightMode(); @@ -249,20 +251,24 @@ private void clearSearchSection() { changeSearchIcon(true); } - private void changeSearchIcon(boolean doSearch){ - if (doSearch/* && (int)searchImage.getTag()== DOWN_ARROW_ICON*/){ + private void changeSearchIcon(boolean doSearch) { + if (doSearch/* && (int)searchImage.getTag()== DOWN_ARROW_ICON*/) { searchImage.setTag(SEARCH_ICON); searchImage.setImageResource(R.drawable.ic_search_white_24px); - findViewById(R.id.cancel_img).setVisibility(View.INVISIBLE); - }else if(!doSearch /*&& (int)searchImage.getTag()== SEARCH_ICON*/){ + findViewById(R.id.cancel_img).setVisibility(View.GONE); + searchSection.invalidate(); + } else if (!doSearch /*&& (int)searchImage.getTag()== SEARCH_ICON*/) { searchImage.setTag(DOWN_ARROW_ICON); searchImage.setImageResource(R.drawable.ic_keyboard_arrow_down_white_24); findViewById(R.id.cancel_img).setVisibility(View.VISIBLE); + searchSection.invalidate(); } } - private void clearSearchHighlights(){ + + private void clearSearchHighlights() { // TODO: 21.04.2018 } + private void search() { isForSearch = true; if (!mIsSearchSectionVisible) { @@ -272,14 +278,14 @@ private void search() { searchAnimateHide(); clearSearchHighlights(); } - + } class SearchImageClickListener implements View.OnClickListener { public ArrayList indexes; - private int currentIndex = 0; - public String query; + private int currentIndex = 0, count = 0; + public String query, uniqueID; @Override public void onClick(View view) { @@ -291,16 +297,19 @@ public void onClick(View view) { if (indexes.size() > currentIndex) { boolean isNew = true; - if (currentIndex > 0 && indexes.get(currentIndex - 1).equals(indexes.get(currentIndex))) { + if (currentIndex > 0 &&(int) indexes.get(currentIndex - 1) == ((int)indexes.get(currentIndex))) { isNew = false; + count++; } else { + uniqueID = UUID.randomUUID().toString(); + count = 0; mFolioPageViewPager.setCurrentItem(indexes.get(currentIndex)); } - Log.d("gözde***web2", "qwe"); - EventBus.getDefault().post(new SearchEvent(query, isNew)); + Log.d("gözde***web2", "currentIndex: "+ currentIndex+" : isNew:"+isNew+" : count: "+count); + EventBus.getDefault().post(new SearchEvent(query, isNew, count, uniqueID)); // TODO: 21.04.2018 multiple currentIndex++; - }else{ + } else { // TODO: 21.04.2018 no more && maybe change icon currentIndex = 0; view.performClick(); @@ -593,6 +602,7 @@ private ArrayList getSearchIndexes(SearchQueryResults results) { } } } + Log.d("gözde***web22",searchQueryIndexes.toString()); return searchQueryIndexes; } @@ -600,9 +610,9 @@ private ArrayList getSearchIndexes(SearchQueryResults results) { public String getSearchQuery() { // TODO: 21.04.2018 eg. change space to %20 - return mSearchText.getText() == null ? null : Constants.LOCALHOST + bookFileName + "/search?query=" + + return mSearchText.getText() == null ? null : Constants.LOCALHOST + bookFileName + "/search?query=" + mSearchText - .getText().toString(); + .getText().toString(); } private void setConfig() { diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 6ae7a3207..9688f2d36 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -70,7 +70,6 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Locale; -import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -971,8 +970,8 @@ public void setWebView(final WebViewPosition position) { } } - int count = 0; - String id = ""; +// static int count = 0; +// String id = ""; @Subscribe(threadMode = ThreadMode.MAIN) public void setWebViewAccToSearch(SearchEvent searchEvent) { @@ -981,14 +980,11 @@ public void setWebViewAccToSearch(SearchEvent searchEvent) { Log.d("gözde***", "salih5"); if (searchEvent.isNewChapter()) { - count = 0; - id = UUID.randomUUID().toString(); - scrollAndHighlight(searchEvent.getWord(), id); - } else { - count++; + scrollAndHighlight(searchEvent.getWord(), searchEvent.getId()); } - Log.d("salihWebview", id + " : " + count); - goNextElementInTheSameChapter(id, count); + Log.d("salihWebview", searchEvent.getId() + " : " + searchEvent.getCount() + " : " + searchEvent + .getWord()); + goNextElementInTheSameChapter(searchEvent.getId(), searchEvent.getCount()); } } @@ -1056,8 +1052,9 @@ private void scrollToHighlightId() { } private void scrollAndHighlight(String word, String uniqueId) { - mWebview.addJavascriptInterface(this, "Android"); - String js = String.format("javascript:(function() { console.log(document.body.innerHTML); document.body" + +// mWebview.addJavascriptInterface(this, "Android"); + String js = String.format("javascript:$(document).ready(function() { console.log(document.body.innerHTML); " + + "document.body" + ".innerHTML = " + "document.body.innerHTML.split( \'%s\').join(\" Date: Sun, 22 Apr 2018 16:31:58 +0300 Subject: [PATCH 006/139] search added(+js),some refactorings --- folioreader/res/values/strings.xml | 7 +- folioreader/src/main/assets/js/Bridge.js | 27 +++ .../com/folioreader/model/HighlightImpl.java | 3 +- .../ui/folio/activity/FolioActivity.java | 197 ++++++++++-------- .../ui/folio/fragment/FolioPageFragment.java | 88 ++++---- .../ui/folio/presenter/MainPresenter.java | 5 - 6 files changed, 175 insertions(+), 152 deletions(-) diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index c93343594..f91e4b31b 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -76,7 +76,7 @@ \\{\\{(-?\\d+\\.?\\d*)\\,(-?\\d+\\.?\\d*)\\}\\,\\s\\{(-?\\d+\\.?\\d*)\\,(-?\\d+\\.?\\d*)\\}\\} %s]]> - + %s Save your note @@ -84,8 +84,9 @@ please enter a note Contents - - \'%s\'"); console.log(document.body.innerHTML);})()]]> + javascript:giveBackgorundToSearchItems(\'%s\') + javascript:goToSearchQuery(%d) + Hello blank fragment Starting drag! diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 46436314e..bd3c3ed61 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -624,6 +624,33 @@ function gotoHighlight(highlightId){ goToEl(element); } } +function giveBackgorundToSearchItems(word){ + $(document).ready(function() { + if(!$('.mobilion')[0]){ + document.body.innerHTML = document.body.innerHTML.split(new RegExp(word,'i')).join(""+word+""); + console.log('class created'); + goToSearchQuery(0); + }else{ + console.log('class exists'); + } + }); +} + +function goToSearchQuery(c){ + $(document).ready(function() { + var element = document.getElementsByClassName('mobilion')[c]; + if(element != null) { + console.log("element is not null"); + if(element.scrollIntoViewIfNeeded){ + element.scrollIntoViewIfNeeded(); + }else{ + element.scrollIntoView(); + } + }else{ + console.log('element is null'); + } + }); +} $(function(){ window.ssReader = Class({ diff --git a/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java b/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java index ff9f8e889..c37051bc0 100644 --- a/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java +++ b/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java @@ -2,7 +2,6 @@ import android.os.Parcel; import android.os.Parcelable; -import android.util.Log; import java.util.Date; @@ -122,7 +121,7 @@ public HighlightImpl(int id, String bookId, String content, Date date, String ty this.note = note; this.uuid = uuid; - Log.d("gözde456",this.toString()); + } public HighlightImpl() { 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 20f71590e..0c1aab555 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 @@ -182,6 +182,7 @@ protected void onCreate(Bundle savedInstanceState) { mToolbar = (Toolbar) findViewById(R.id.toolbar); ///////////////////search inits ///////////////////// + searchSection = (RelativeLayout) findViewById(R.id.search_section); searchImage = (AppCompatImageView) findViewById(R.id.search_img); searchImage.setTag(SEARCH_ICON); @@ -189,6 +190,7 @@ protected void onCreate(Bundle savedInstanceState) { searchImageClickListener = new SearchImageClickListener(); searchImage.setOnClickListener(searchImageClickListener); searchAnimateHide(); + ///////////////////search inits ///////////////////// findViewById(R.id.btn_drawer).setOnClickListener(new View.OnClickListener() { @@ -245,79 +247,7 @@ public void onClick(View view) { } } - private void clearSearchSection() { - if (mSearchText != null) - mSearchText.getText().clear(); - changeSearchIcon(true); - } - private void changeSearchIcon(boolean doSearch) { - if (doSearch/* && (int)searchImage.getTag()== DOWN_ARROW_ICON*/) { - searchImage.setTag(SEARCH_ICON); - searchImage.setImageResource(R.drawable.ic_search_white_24px); - findViewById(R.id.cancel_img).setVisibility(View.GONE); - searchSection.invalidate(); - } else if (!doSearch /*&& (int)searchImage.getTag()== SEARCH_ICON*/) { - searchImage.setTag(DOWN_ARROW_ICON); - searchImage.setImageResource(R.drawable.ic_keyboard_arrow_down_white_24); - findViewById(R.id.cancel_img).setVisibility(View.VISIBLE); - searchSection.invalidate(); - } - } - - private void clearSearchHighlights() { - // TODO: 21.04.2018 - } - - private void search() { - isForSearch = true; - if (!mIsSearchSectionVisible) { - searchAnimateShow(); - clearSearchSection(); - } else { - searchAnimateHide(); - clearSearchHighlights(); - } - - } - - class SearchImageClickListener implements View.OnClickListener { - - public ArrayList indexes; - private int currentIndex = 0, count = 0; - public String query, uniqueID; - - @Override - public void onClick(View view) { - Log.d("gözde***web", "salih"); - if (isForSearch) { - new MainPresenter(FolioActivity.this).searchQuery(); - } else { - if (indexes != null && query != null) { - if (indexes.size() > currentIndex) { - boolean isNew = true; - - if (currentIndex > 0 &&(int) indexes.get(currentIndex - 1) == ((int)indexes.get(currentIndex))) { - isNew = false; - count++; - } else { - uniqueID = UUID.randomUUID().toString(); - count = 0; - mFolioPageViewPager.setCurrentItem(indexes.get(currentIndex)); - } - Log.d("gözde***web2", "currentIndex: "+ currentIndex+" : isNew:"+isNew+" : count: "+count); - EventBus.getDefault().post(new SearchEvent(query, isNew, count, uniqueID)); - // TODO: 21.04.2018 multiple - currentIndex++; - } else { - // TODO: 21.04.2018 no more && maybe change icon - currentIndex = 0; - view.performClick(); - } - } - } - } - } private void initBook(String mEpubFileName, int mEpubRawId, String mEpubFilePath, EpubSourceType mEpubSourceType) { try { @@ -476,21 +406,7 @@ public void goToChapter(String href) { } } - private void searchAnimateShow() { - if (!mIsSearchSectionVisible) { -// searchSection.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); - mIsSearchSectionVisible = true; - searchSection.setVisibility(View.VISIBLE); - toolbarAnimateHide(); - } - } - private void searchAnimateHide() { - mIsSearchSectionVisible = false; -// searchSection.animate().translationY(-searchSection.getHeight()).setInterpolator(new AccelerateInterpolator -// (2)).start(); - searchSection.setVisibility(View.GONE); - } private void toolbarAnimateShow() { if (!mIsActionBarVisible) { @@ -602,17 +518,28 @@ private ArrayList getSearchIndexes(SearchQueryResults results) { } } } - Log.d("gözde***web22",searchQueryIndexes.toString()); return searchQueryIndexes; } @Override public String getSearchQuery() { - - // TODO: 21.04.2018 eg. change space to %20 - return mSearchText.getText() == null ? null : Constants.LOCALHOST + bookFileName + "/search?query=" + - mSearchText - .getText().toString(); + if (mSearchText.getText() == null){ + return null; + }else{ + String searchQuery = mSearchText.getText().toString(); + if (!searchQuery.isEmpty()) { + if (searchQuery.contains(" ")) { + searchQuery = searchQuery.replaceAll(" ", "%20"); + } + if (searchQuery.length() != 0) { + return Constants.LOCALHOST + bookFileName + "/search?query=" +searchQuery; + }else{ + return null; + } + }else{ + return null; + } + } } private void setConfig() { @@ -829,4 +756,90 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis break; } } + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + private void clearSearchSection() { + if (mSearchText != null) + mSearchText.getText().clear(); + changeSearchIcon(true); + } + + private void changeSearchIcon(boolean doSearch) { + if (doSearch/* && (int)searchImage.getTag()== DOWN_ARROW_ICON*/) { + searchImage.setTag(SEARCH_ICON); + searchImage.setImageResource(R.drawable.ic_search_white_24px); + findViewById(R.id.cancel_img).setVisibility(View.GONE); + searchSection.invalidate(); + } else /* if (!doSearch && (int)searchImage.getTag()== SEARCH_ICON)*/ { + searchImage.setTag(DOWN_ARROW_ICON); + searchImage.setImageResource(R.drawable.ic_keyboard_arrow_down_white_24); + findViewById(R.id.cancel_img).setVisibility(View.VISIBLE); + searchSection.invalidate(); + } + } + + private void clearSearchHighlights() { + // TODO: 21.04.2018 + } + + private void search() { + isForSearch = true; + if (!mIsSearchSectionVisible) { + searchAnimateShow(); + clearSearchSection(); + } else { + searchAnimateHide(); + clearSearchHighlights(); + } + } + + private void searchAnimateShow() { + if (!mIsSearchSectionVisible) { + mIsSearchSectionVisible = true; + searchSection.setVisibility(View.VISIBLE); + toolbarAnimateHide(); + } + } + + private void searchAnimateHide() { + mIsSearchSectionVisible = false; + searchSection.setVisibility(View.GONE); + } + + class SearchImageClickListener implements View.OnClickListener { + + public ArrayList indexes; + private int currentIndex = 0, count = 0; + public String query, uniqueID; + + @Override + public void onClick(View view) { + if (isForSearch) { + new MainPresenter(FolioActivity.this).searchQuery(); + } else { + if (indexes != null && query != null) { + if (indexes.size() > currentIndex) { + boolean isNew = true; + if (currentIndex > 0 && (int) indexes.get(currentIndex - 1) == ((int) indexes.get + (currentIndex))) { + isNew = false; + count++; + } else { + uniqueID = UUID.randomUUID().toString(); + count = 0; + mChapterPosition = indexes.get(currentIndex); + mFolioPageViewPager.setCurrentItem(mChapterPosition); + } + EventBus.getDefault().post(new SearchEvent(query, isNew, count, uniqueID)); + currentIndex++; + } else { + // TODO: 21.04.2018 change icon & no restart since it may leak + currentIndex = 0; + view.performClick(); + } + } + } + } + } + } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 9688f2d36..a26874a3c 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -19,7 +19,6 @@ import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; -import android.webkit.ConsoleMessage; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.WebChromeClient; @@ -148,6 +147,10 @@ public interface FolioPageFragmentCallback { private Config mConfig; private String mBookId; + private String word; + private String uniqueId; + private int count; + public static FolioPageFragment newInstance(int position, String bookTitle, Link spineRef, String bookId) { FolioPageFragment fragment = new FolioPageFragment(); Bundle args = new Bundle(); @@ -327,7 +330,6 @@ public void updateHighlight(UpdateHighlightEvent event) { */ @Subscribe(threadMode = ThreadMode.MAIN) public void jumpToAnchorPoint(AnchorIdEvent event) { - Log.d("eventqwe", "12"); if (isAdded() && event != null && event.getHref() != null) { String href = event.getHref(); if (href != null && href.indexOf('#') != -1 && spineItem.href.equals(href.substring(0, href.lastIndexOf @@ -452,6 +454,11 @@ public void onPageFinished(WebView view, String url) { loadRangy(view, rangy); } scrollToHighlightId(); + + if (word!=null && uniqueId!=null) { + giveBackgroundToSearchItems(); + goNextElementInTheSameChapter(); + } } } @@ -531,18 +538,20 @@ public void onProgressChanged(WebView view, int progress) { mWebview.postDelayed(new Runnable() { @Override public void run() { - Log.d("scroll y", "Scrolly" + mScrollY); - mWebview.scrollTo(0, mScrollY); + if (word == null && uniqueId == null) { + Log.d("scroll y", "Scrolly" + mScrollY); + mWebview.scrollTo(0, mScrollY); + } } }, 100); } } - - @Override - public boolean onConsoleMessage(ConsoleMessage consoleMessage) { - android.util.Log.d("WebView", consoleMessage.message()); - return true; - } + // TODO: 22.04.2018 to see js log messages +// @Override +// public boolean onConsoleMessage(ConsoleMessage consoleMessage) { +// android.util.Log.d("WebView", consoleMessage.message()); +// return true; +// } @Override @@ -970,21 +979,20 @@ public void setWebView(final WebViewPosition position) { } } -// static int count = 0; -// String id = ""; - + @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) - public void setWebViewAccToSearch(SearchEvent searchEvent) { - if (mWebview.getContentHeight() > 0) { - - - Log.d("gözde***", "salih5"); - if (searchEvent.isNewChapter()) { - scrollAndHighlight(searchEvent.getWord(), searchEvent.getId()); + public void setWebViewAccToSearch(final SearchEvent searchEvent) { + if (isAdded()) { + word = searchEvent.getWord(); + uniqueId = searchEvent.getId(); + count = searchEvent.getCount(); + if (mWebview.getContentHeight() > 0) { + if (searchEvent.isNewChapter()) { + giveBackgroundToSearchItems(); + }else { + goNextElementInTheSameChapter(); + } } - Log.d("salihWebview", searchEvent.getId() + " : " + searchEvent.getCount() + " : " + searchEvent - .getWord()); - goNextElementInTheSameChapter(searchEvent.getId(), searchEvent.getCount()); } } @@ -993,7 +1001,9 @@ public void setWebViewPosition(final int position) { @Override public void run() { if (isAdded()) { - mWebview.scrollTo(0, position); + if (word == null && uniqueId == null) { + mWebview.scrollTo(0, position); + } } } }); @@ -1051,35 +1061,13 @@ private void scrollToHighlightId() { mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } - private void scrollAndHighlight(String word, String uniqueId) { -// mWebview.addJavascriptInterface(this, "Android"); - String js = String.format("javascript:$(document).ready(function() { console.log(document.body.innerHTML); " + - "document.body" + - ".innerHTML = " + - "document.body.innerHTML.split( \'%s\').join(\" %s \"); console.log(document.body" + - ".innerHTML);" + -// "var element = document.getElementsByName(\'%s\')[0];\n" + -// " if(element != null) {\n" + -// " console.log('salih78945613'); goToEl(element);\n" + -// " }else{ console.log('salih78945613123456'); }" + - "});", word, uniqueId, word); - Log.d("jssss", js); + private void giveBackgroundToSearchItems() { + String js = String.format(getString(R.string.search_highlight),word); mWebview.loadUrl(js); } - int i = 0; - - private void goNextElementInTheSameChapter(String uniqueId, int count) { - String js = String.format("javascript:$(document).ready(function() {var element = document.getElementsByName" + - "(\'%s\')[%d];\n" + - " if(element != null) {\n" + - " console.log('salih78945613'); goToEl(element);\n" + - " }else{ console.log('salih78945613123456'); } });", uniqueId, count); - i++; - Log.d("jssss22", i + " : " + js); + private void goNextElementInTheSameChapter() { + String js = String.format(getString(R.string.search_item_scroll),count); mWebview.loadUrl(js); } } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java index 85a630487..1999c3e61 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java @@ -1,7 +1,5 @@ package com.folioreader.ui.folio.presenter; -import android.util.Log; - import com.folioreader.ui.base.ManifestCallBack; import com.folioreader.ui.base.ManifestTask; import com.folioreader.ui.base.SearchListCallBack; @@ -33,18 +31,15 @@ public void searchQuery() { new SearchListTask(new SearchListCallBack() { @Override public void onReceiveSearchList(SearchQueryResults searchQueryResults) { - Log.d("gözde***","salih2"); mainMvpView.onShowSearchResults(searchQueryResults); } @Override public void onError() { - Log.d("gözde***","salih3"); // TODO: 20.04.2018 } }).execute(searchUrl); } - Log.d("gözde***","salih4"); } @Override From e4792148a2928414202c1e2a9773d4c1036b2c73 Mon Sep 17 00:00:00 2001 From: epostadeveloper Date: Sun, 22 Apr 2018 19:54:33 +0300 Subject: [PATCH 007/139] clear search highlights added,bug fixing --- folioreader/res/values/strings.xml | 1 + folioreader/src/main/assets/js/Bridge.js | 11 +- .../model/event/ClearSearchEvent.java | 4 + .../ui/folio/activity/FolioActivity.java | 115 +++++++++++------- .../ui/folio/fragment/FolioPageFragment.java | 52 +++++--- 5 files changed, 123 insertions(+), 60 deletions(-) create mode 100644 folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index f91e4b31b..cc4cbae4f 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -86,6 +86,7 @@ javascript:giveBackgorundToSearchItems(\'%s\') javascript:goToSearchQuery(%d) + javascript:removeSearchItemBackground() Hello blank fragment diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index bd3c3ed61..0f2e346c9 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -627,7 +627,7 @@ function gotoHighlight(highlightId){ function giveBackgorundToSearchItems(word){ $(document).ready(function() { if(!$('.mobilion')[0]){ - document.body.innerHTML = document.body.innerHTML.split(new RegExp(word,'i')).join(""+word+""); + document.body.innerHTML = document.body.innerHTML.split(new RegExp(word,'i')).join(""+word+""); console.log('class created'); goToSearchQuery(0); }else{ @@ -636,6 +636,15 @@ function giveBackgorundToSearchItems(word){ }); } +function removeSearchItemBackground(){ + $(document).ready(function() { + $('.mobilion').each(function() { + var elm =this; + elm.outerHTML = elm.innerHTML; + }); + }); +} + function goToSearchQuery(c){ $(document).ready(function() { var element = document.getElementsByClassName('mobilion')[c]; diff --git a/folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java b/folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java new file mode 100644 index 000000000..106cb0abb --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java @@ -0,0 +1,4 @@ +package com.folioreader.model.event; + +public class ClearSearchEvent { +} 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 0c1aab555..28aa3fd01 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 @@ -47,6 +47,7 @@ import com.folioreader.R; import com.folioreader.model.HighlightImpl; import com.folioreader.model.event.AnchorIdEvent; +import com.folioreader.model.event.ClearSearchEvent; import com.folioreader.model.event.MediaOverlayHighlightStyleEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; import com.folioreader.model.event.MediaOverlaySpeedEvent; @@ -248,7 +249,6 @@ public void onClick(View view) { } - private void initBook(String mEpubFileName, int mEpubRawId, String mEpubFilePath, EpubSourceType mEpubSourceType) { try { int portNumber = getIntent().getIntExtra(Config.INTENT_PORT, Constants.PORT_NUMBER); @@ -407,7 +407,6 @@ public void goToChapter(String href) { } - private void toolbarAnimateShow() { if (!mIsActionBarVisible) { mToolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); @@ -499,49 +498,13 @@ public void onShowSearchResults(SearchQueryResults results) { isForSearch = false; String query = results.getSearchResultList().get(0).getSearchQuery(); + searchImageClickListener.clearIndexes(); searchImageClickListener.query = query; - searchImageClickListener.currentIndex = 0; searchImageClickListener.indexes = getSearchIndexes(results); changeSearchIcon(false); } - - private ArrayList getSearchIndexes(SearchQueryResults results) { - ArrayList searchQueryIndexes = new ArrayList<>(); - for (int i = 0; i < results.getSearchResultList().size(); i++) { - for (int j = 0; j < mSpineReferenceList.size(); j++) { - if (mSpineReferenceList.get(j).getHref().equalsIgnoreCase(results.getSearchResultList().get(i) - .getResource())) { - searchQueryIndexes.add(j); - break; - } - } - } - return searchQueryIndexes; - } - - @Override - public String getSearchQuery() { - if (mSearchText.getText() == null){ - return null; - }else{ - String searchQuery = mSearchText.getText().toString(); - if (!searchQuery.isEmpty()) { - if (searchQuery.contains(" ")) { - searchQuery = searchQuery.replaceAll(" ", "%20"); - } - if (searchQuery.length() != 0) { - return Constants.LOCALHOST + bookFileName + "/search?query=" +searchQuery; - }else{ - return null; - } - }else{ - return null; - } - } - } - private void setConfig() { if (AppUtil.getSavedConfig(this) != null) { mConfig = AppUtil.getSavedConfig(this); @@ -757,11 +720,49 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis } } - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////SEARCH SECTION//////////////////////////////////////////////////////// + + private ArrayList getSearchIndexes(SearchQueryResults results) { + ArrayList searchQueryIndexes = new ArrayList<>(); + for (int i = 0; i < results.getSearchResultList().size(); i++) { + for (int j = 0; j < mSpineReferenceList.size(); j++) { + if (mSpineReferenceList.get(j).getHref().equalsIgnoreCase(results.getSearchResultList().get(i) + .getResource())) { + searchQueryIndexes.add(j); + break; + } + } + } + return searchQueryIndexes; + } + + @Override + public String getSearchQuery() { + if (mSearchText.getText() == null) { + return null; + } else { + String searchQuery = mSearchText.getText().toString(); + if (!searchQuery.isEmpty()) { + if (searchQuery.contains(" ")) { + searchQuery = searchQuery.replaceAll(" ", "%20"); + } + if (searchQuery.length() != 0) { + return Constants.LOCALHOST + bookFileName + "/search?query=" + searchQuery; + } else { + return null; + } + } else { + return null; + } + } + } + + private void clearSearchSection() { if (mSearchText != null) mSearchText.getText().clear(); changeSearchIcon(true); + } private void changeSearchIcon(boolean doSearch) { @@ -779,7 +780,7 @@ private void changeSearchIcon(boolean doSearch) { } private void clearSearchHighlights() { - // TODO: 21.04.2018 + EventBus.getDefault().post(new ClearSearchEvent()); } private void search() { @@ -809,11 +810,15 @@ private void searchAnimateHide() { class SearchImageClickListener implements View.OnClickListener { public ArrayList indexes; - private int currentIndex = 0, count = 0; + private int currentIndex = 0, oldIndex = 0; + private int count = 0; public String query, uniqueID; + private int fragmentPos; + private boolean onEndPos = false; @Override public void onClick(View view) { + // TODO: 22.04.2018 close keyboard if open if (isForSearch) { new MainPresenter(FolioActivity.this).searchQuery(); } else { @@ -825,21 +830,47 @@ public void onClick(View view) { isNew = false; count++; } else { + changeCurrentIndex(); uniqueID = UUID.randomUUID().toString(); count = 0; mChapterPosition = indexes.get(currentIndex); mFolioPageViewPager.setCurrentItem(mChapterPosition); } + oldIndex = currentIndex; EventBus.getDefault().post(new SearchEvent(query, isNew, count, uniqueID)); currentIndex++; + onEndPos = false; } else { // TODO: 21.04.2018 change icon & no restart since it may leak + onEndPos = true; currentIndex = 0; + oldIndex = 0; view.performClick(); } } } } + + public void clearIndexes() { + currentIndex = 0; + oldIndex = 0; + count = 0; + onEndPos = false; + } + + private void changeCurrentIndex() { + fragmentPos = mFolioPageViewPager.getCurrentItem(); + if (indexes != null) { + if (fragmentPos != indexes.get(oldIndex)) { + for (int i = 0; i < indexes.size(); i++) { + if (indexes.get(i) == fragmentPos && !onEndPos) { + currentIndex = i; + break; + } + } + } + } + } } } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index a26874a3c..2ed4f4df5 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -36,6 +36,7 @@ import com.folioreader.model.HighLight; import com.folioreader.model.HighlightImpl; import com.folioreader.model.event.AnchorIdEvent; +import com.folioreader.model.event.ClearSearchEvent; import com.folioreader.model.event.MediaOverlayHighlightStyleEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; import com.folioreader.model.event.MediaOverlaySpeedEvent; @@ -979,23 +980,6 @@ public void setWebView(final WebViewPosition position) { } } - @SuppressWarnings("unused") - @Subscribe(threadMode = ThreadMode.MAIN) - public void setWebViewAccToSearch(final SearchEvent searchEvent) { - if (isAdded()) { - word = searchEvent.getWord(); - uniqueId = searchEvent.getId(); - count = searchEvent.getCount(); - if (mWebview.getContentHeight() > 0) { - if (searchEvent.isNewChapter()) { - giveBackgroundToSearchItems(); - }else { - goNextElementInTheSameChapter(); - } - } - } - } - public void setWebViewPosition(final int position) { mWebview.post(new Runnable() { @Override @@ -1061,6 +1045,34 @@ private void scrollToHighlightId() { mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } + /////////////////////////////////////////////SEARCH SECTION//////////////////////////////////////////////////////// + @SuppressWarnings("unused") + @Subscribe(threadMode = ThreadMode.MAIN) + public void highlightAndGoSearchItem(final SearchEvent searchEvent) { + if (isAdded()) { + if (word != null && !word.equalsIgnoreCase(searchEvent.getWord())){ + clearSearchItemsBackground();// TODO: 22.04.2018 may remove this possibility + } + word = searchEvent.getWord(); + uniqueId = searchEvent.getId(); + count = searchEvent.getCount(); + if (mWebview.getContentHeight() > 0) { + if (searchEvent.isNewChapter()) { + giveBackgroundToSearchItems(); + }else { + goNextElementInTheSameChapter(); + } + } + } + } + @SuppressWarnings("unused") + @Subscribe(threadMode = ThreadMode.MAIN) + public void clearSearchItem( ClearSearchEvent event) { + if (isAdded()) { + clearSearchItemsBackground(); + } + } + private void giveBackgroundToSearchItems() { String js = String.format(getString(R.string.search_highlight),word); mWebview.loadUrl(js); @@ -1070,4 +1082,10 @@ private void goNextElementInTheSameChapter() { String js = String.format(getString(R.string.search_item_scroll),count); mWebview.loadUrl(js); } + + private void clearSearchItemsBackground(){ + String js = getString(R.string.search_highlight_clear); + mWebview.loadUrl(js); + mWebview.invalidate(); + } } From 2c331f5fef1f224decaf00fb8b65faaf2e3adf32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salih=20Ak=C5=9Fit?= Date: Mon, 21 May 2018 14:02:37 +0300 Subject: [PATCH 008/139] typo fixed --- folioreader/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index cc4cbae4f..a932ec7f9 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -84,7 +84,7 @@ please enter a note Contents - javascript:giveBackgorundToSearchItems(\'%s\') + javascript:giveBackgroundToSearchItems(\'%s\') javascript:goToSearchQuery(%d) javascript:removeSearchItemBackground() From abf79f93d2a7915e3c4bdeaa2b54883325d958f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salih=20Ak=C5=9Fit?= Date: Mon, 21 May 2018 14:04:13 +0300 Subject: [PATCH 009/139] search for old versions --- folioreader/src/main/assets/js/Bridge.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 0f2e346c9..228dcdbf6 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -618,20 +618,32 @@ function getHighlightString(style) { Highlight.getHighlightJson(JSON.stringify(params)); } +function onlyUnique(value, index, self) { + return self.indexOf(value) === index; +} function gotoHighlight(highlightId){ var element = document.getElementById(highlightId.toString()); if(element != null) { goToEl(element); } } -function giveBackgorundToSearchItems(word){ +function giveBackgroundToSearchItems(word){ $(document).ready(function() { if(!$('.mobilion')[0]){ - document.body.innerHTML = document.body.innerHTML.split(new RegExp(word,'i')).join(""+word+""); - console.log('class created'); - goToSearchQuery(0); + var allMatches = document.body.innerHTML.match(new RegExp(word,'gi')); + if(allMatches != null){ + var uniqueItems = allMatches.filter( onlyUnique ); + for(var i = 0 ; i"+uniqueItems[i]+""); + } + console.log('class created & allmatches is not null'); + goToSearchQuery(0); + }else{ + console.log('allmatches is null'); + } + }else{ - console.log('class exists'); + console.log('class exists'); } }); } From d9cd2a8713449b4a28e3be81ba91d726353e82d4 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Mon, 18 Jun 2018 15:49:55 +0530 Subject: [PATCH 010/139] Save last ReadPosition on Config changes --- .../ui/folio/fragment/FolioPageFragment.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 62517516d..58a1e60f5 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -142,7 +142,6 @@ public class FolioPageFragment private String mBookTitle; private String mEpubFileName = null; private boolean mIsPageReloaded; - private int mLastWebviewScrollpos; private String highlightStyle; @@ -290,8 +289,11 @@ public void styleChanged(MediaOverlayHighlightStyleEvent event) { @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void reload(ReloadDataEvent reloadDataEvent) { + + if (isCurrentFragment()) + getLastReadPosition(); + if (isAdded()) { - mLastWebviewScrollpos = mWebview.getScrollY(); mIsPageReloaded = true; setHtml(true); updatePagesLeftTextBg(); @@ -480,12 +482,18 @@ public void onPageFinished(WebView view, String url) { loadRangy(view, rangy); if (mIsPageReloaded) { - setWebViewPosition(mLastWebviewScrollpos); + if (isCurrentFragment()) { + mWebview.loadUrl(String.format("javascript:scrollToSpan(%b, %s)", + lastReadPosition.isUsingId(), lastReadPosition.getValue())); + } mIsPageReloaded = false; + } else if (!TextUtils.isEmpty(mAnchorId)) { view.loadUrl("javascript:document.getElementById(\"" + mAnchorId + "\").scrollIntoView()"); + } else if (!TextUtils.isEmpty(highlightId)) { scrollToHighlightId(); + } else if (isCurrentFragment()) { ReadPosition readPosition; From c3c564931b4ed46cca4453878e25bef473450f47 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Mon, 18 Jun 2018 16:56:57 +0530 Subject: [PATCH 011/139] Eliminate unnecessary EventBus call --- .../ui/folio/activity/FolioActivity.java | 7 +++-- .../ui/folio/fragment/FolioPageFragment.java | 29 ++----------------- .../com/folioreader/view/WebViewPager.java | 1 + 3 files changed, 8 insertions(+), 29 deletions(-) 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 7d9998c17..aa3b18177 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 @@ -277,9 +277,10 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } } else if (type.equals(HIGHLIGHT_SELECTED)) { HighlightImpl highlightImpl = data.getParcelableExtra(HIGHLIGHT_ITEM); - int position = highlightImpl.getPageNumber(); - mFolioPageViewPager.setCurrentItem(position); - EventBus.getDefault().post(new WebViewPosition(mSpineReferenceList.get(mChapterPosition).href, highlightImpl.getRangy())); + mFolioPageViewPager.setCurrentItem(highlightImpl.getPageNumber()); + FolioPageFragment folioPageFragment = (FolioPageFragment) + mFolioPageFragmentAdapter.getItem(highlightImpl.getPageNumber()); + folioPageFragment.scrollToHighlightId(highlightImpl.getRangy()); } } } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 58a1e60f5..397e3c1ac 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -492,7 +492,7 @@ public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:document.getElementById(\"" + mAnchorId + "\").scrollIntoView()"); } else if (!TextUtils.isEmpty(highlightId)) { - scrollToHighlightId(); + scrollToHighlightId(highlightId); } else if (isCurrentFragment()) { @@ -1056,30 +1056,6 @@ private String getPageName() { return mBookTitle + "$" + spineItem.href; } - @SuppressWarnings("unused") - @Subscribe(threadMode = ThreadMode.MAIN) - public void setWebView(final WebViewPosition position) { - if (position.getHref().equals(spineItem.href) && isAdded()) { - highlightId = position.getHighlightId(); - - if (mWebview.getContentHeight() > 0) { - scrollToHighlightId(); - //Webview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); - } - } - } - - public void setWebViewPosition(final int position) { - mWebview.post(new Runnable() { - @Override - public void run() { - if (isAdded()) { - mWebview.scrollTo(0, position); - } - } - }); - } - @Override public void highLightText(String fragmentId) { mWebview.loadUrl(String.format(getString(R.string.audio_mark_id), fragmentId)); @@ -1134,7 +1110,8 @@ private boolean isCurrentFragment() { public void onError() { } - private void scrollToHighlightId() { + public void scrollToHighlightId(String highlightId) { + this.highlightId = highlightId; mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } } diff --git a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java index fd097c82d..3253a16cc 100644 --- a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java +++ b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java @@ -106,6 +106,7 @@ public void setCurrentPage(final int pageIndex) { handler.post(new Runnable() { @Override public void run() { + folioWebView.invalidate(); setCurrentItem(pageIndex, false); } }); From b66971331e0d6a1f30d481b578f27df79759fca2 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Tue, 19 Jun 2018 13:27:14 +0530 Subject: [PATCH 012/139] Add LoadingView --- folioreader/AndroidManifest.xml | 4 +- .../res/layout/folio_page_fragment.xml | 8 ++- folioreader/res/layout/view_loading.xml | 20 ++++++ folioreader/res/values/colors.xml | 1 + folioreader/src/main/assets/js/Bridge.js | 23 ++++-- .../ui/folio/activity/FolioActivity.java | 1 + .../ui/folio/fragment/FolioPageFragment.java | 21 ++++-- .../com/folioreader/view/LoadingView.java | 70 +++++++++++++++++++ .../com/folioreader/view/WebViewPager.java | 6 +- 9 files changed, 139 insertions(+), 15 deletions(-) create mode 100644 folioreader/res/layout/view_loading.xml create mode 100644 folioreader/src/main/java/com/folioreader/view/LoadingView.java diff --git a/folioreader/AndroidManifest.xml b/folioreader/AndroidManifest.xml index d62406cb3..12474418c 100644 --- a/folioreader/AndroidManifest.xml +++ b/folioreader/AndroidManifest.xml @@ -3,7 +3,9 @@ package="com.folioreader"> - + \ No newline at end of file diff --git a/folioreader/res/layout/folio_page_fragment.xml b/folioreader/res/layout/folio_page_fragment.xml index 4c227be6e..64090345a 100644 --- a/folioreader/res/layout/folio_page_fragment.xml +++ b/folioreader/res/layout/folio_page_fragment.xml @@ -1,5 +1,6 @@ + + + + + + + \ No newline at end of file diff --git a/folioreader/res/values/colors.xml b/folioreader/res/values/colors.xml index 60533744e..e1e86d5fc 100644 --- a/folioreader/res/values/colors.xml +++ b/folioreader/res/values/colors.xml @@ -17,4 +17,5 @@ #FFFFFF #F02814 #a8a8a8 + #131313 \ No newline at end of file diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 0da621a7d..c7d737ece 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -718,10 +718,14 @@ function scrollToSpan(usingId, value) { } else { var spanCollection = document.getElementsByTagName("span"); if (spanCollection.length == 0 || value < 0 || value >= spanCollection.length - || value == null) + || value == null) { + LoadingView.invisible(); return; + } goToElement(spanCollection[value]); } + + LoadingView.invisible(); } // Class based onClick listener @@ -779,10 +783,19 @@ function getHighlightString(style) { } function gotoHighlight(highlightId){ - var element = document.getElementById(highlightId.toString()); - if(element != null) { - goToElement(element); - } + var element = document.getElementById(highlightId.toString()); + if (element) + goToElement(element); + + LoadingView.invisible(); +} + +function goToAnchor(anchorId) { + var element = document.getElementById(anchorId); + if (element) + goToElement(element); + + LoadingView.invisible(); } $(function(){ 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 aa3b18177..9df4f11c0 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 @@ -265,6 +265,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { String type = data.getStringExtra(TYPE); if (type.equals(CHAPTER_SELECTED)) { + //TODO: -> try to eliminate EventBus if possible String selectedChapterHref = data.getStringExtra(SELECTED_CHAPTER_POSITION); for (Link spine : mSpineReferenceList) { if (selectedChapterHref.contains(spine.href)) { diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 397e3c1ac..4de1f90a0 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -46,7 +46,6 @@ import com.folioreader.model.event.ReloadDataEvent; import com.folioreader.model.event.RewindIndexEvent; import com.folioreader.model.event.UpdateHighlightEvent; -import com.folioreader.model.event.WebViewPosition; import com.folioreader.model.quickaction.ActionItem; import com.folioreader.model.quickaction.QuickAction; import com.folioreader.model.sqlite.HighLightTable; @@ -63,6 +62,7 @@ import com.folioreader.util.UiUtil; import com.folioreader.view.DirectionalViewpager; import com.folioreader.view.FolioWebView; +import com.folioreader.view.LoadingView; import com.folioreader.view.MediaControllerView; import com.folioreader.view.VerticalSeekbar; import com.folioreader.view.WebViewPager; @@ -126,6 +126,7 @@ public class FolioPageFragment private View mRootView; + private LoadingView loadingView; private VerticalSeekbar mScrollSeekbar; private FolioWebView mWebview; private WebViewPager webViewPager; @@ -208,6 +209,7 @@ public View onCreateView(LayoutInflater inflater, mConfig = AppUtil.getSavedConfig(activity); + loadingView = mRootView.findViewById(R.id.loadingView); initSeekbar(); initAnimations(); initWebView(); @@ -294,6 +296,8 @@ public void reload(ReloadDataEvent reloadDataEvent) { getLastReadPosition(); if (isAdded()) { + loadingView.updateTheme(); + loadingView.setVisibility(View.VISIBLE); mIsPageReloaded = true; setHtml(true); updatePagesLeftTextBg(); @@ -330,7 +334,7 @@ public void jumpToAnchorPoint(AnchorIdEvent event) { if (href != null && href.indexOf('#') != -1 && spineItem.href.equals(href.substring(0, href.lastIndexOf('#')))) { mAnchorId = href.substring(href.lastIndexOf('#') + 1); if (mWebview.getContentHeight() > 0 && mAnchorId != null) { - mWebview.loadUrl("javascript:document.getElementById(\"" + mAnchorId + "\").scrollIntoView()"); + mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); } } } @@ -417,6 +421,7 @@ public void onLayoutChange(View view, int left, int top, int right, int bottom, mWebview.addJavascriptInterface(this, "Highlight"); mWebview.addJavascriptInterface(this, "FolioPageFragment"); mWebview.addJavascriptInterface(webViewPager, "WebViewPager"); + mWebview.addJavascriptInterface(loadingView, "LoadingView"); mWebview.setScrollListener(new FolioWebView.ScrollListener() { @Override @@ -464,10 +469,10 @@ public void onPageFinished(WebView view, String url) { if (isAdded()) { - view.loadUrl("javascript:alert(getReadingTime())"); + mWebview.loadUrl("javascript:alert(getReadingTime())"); if (!hasMediaOverlay) - view.loadUrl("javascript:wrappingSentencesWithinPTags()"); + mWebview.loadUrl("javascript:wrappingSentencesWithinPTags()"); if (mActivityCallback.getDirection() == DirectionalViewpager.Direction.HORIZONTAL) mWebview.loadUrl("javascript:initHorizontalDirection()"); @@ -479,7 +484,7 @@ public void onPageFinished(WebView view, String url) { String rangy = HighlightUtil.generateRangyString(getPageName()); FolioPageFragment.this.rangy = rangy; if (!rangy.isEmpty()) - loadRangy(view, rangy); + loadRangy(mWebview, rangy); if (mIsPageReloaded) { if (isCurrentFragment()) { @@ -489,7 +494,7 @@ public void onPageFinished(WebView view, String url) { mIsPageReloaded = false; } else if (!TextUtils.isEmpty(mAnchorId)) { - view.loadUrl("javascript:document.getElementById(\"" + mAnchorId + "\").scrollIntoView()"); + mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); } else if (!TextUtils.isEmpty(highlightId)) { scrollToHighlightId(highlightId); @@ -510,7 +515,11 @@ public void onPageFinished(WebView view, String url) { Log.d(LOG_TAG, "-> scrollToSpan -> " + readPosition.getValue()); mWebview.loadUrl(String.format("javascript:scrollToSpan(%b, %s)", readPosition.isUsingId(), readPosition.getValue())); + } else { + loadingView.invisible(); } + } else { + loadingView.invisible(); } } } diff --git a/folioreader/src/main/java/com/folioreader/view/LoadingView.java b/folioreader/src/main/java/com/folioreader/view/LoadingView.java new file mode 100644 index 000000000..0aa5611bb --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/view/LoadingView.java @@ -0,0 +1,70 @@ +package com.folioreader.view; + +import android.content.Context; +import android.support.constraint.ConstraintLayout; +import android.support.v4.content.ContextCompat; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.webkit.JavascriptInterface; +import android.widget.FrameLayout; +import android.widget.ProgressBar; + +import com.folioreader.Config; +import com.folioreader.R; +import com.folioreader.util.AppUtil; +import com.folioreader.util.UiUtil; + +public class LoadingView extends FrameLayout { + + private ConstraintLayout rootView; + private ProgressBar progressBar; + + private static final String LOG_TAG = LoadingView.class.getSimpleName(); + + public LoadingView(Context context) { + super(context); + init(context, null, 0); + } + + public LoadingView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs, 0); + } + + public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs, defStyleAttr); + } + + private void init(Context context, AttributeSet attrs, int defStyleAttr) { + + LayoutInflater.from(context).inflate(R.layout.view_loading, this); + + if (isInEditMode()) + return; + + rootView = findViewById(R.id.rootView); + progressBar = findViewById(R.id.progressBar); + + updateTheme(); + } + + public void updateTheme() { + + Config config = AppUtil.getSavedConfig(getContext()); + if (config == null) + config = new Config.ConfigBuilder().build(); + UiUtil.setColorToImage(getContext(), config.getThemeColor(), progressBar.getIndeterminateDrawable()); + if (config.isNightMode()) { + rootView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.webview_night)); + } else { + rootView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.white)); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + public void invisible() { + setVisibility(INVISIBLE); + } +} diff --git a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java index 3253a16cc..81e551a2c 100644 --- a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java +++ b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java @@ -93,6 +93,7 @@ public void setHorizontalPageCount(int horizontalPageCount) { this.horizontalPageCount = horizontalPageCount; setAdapter(new WebViewPagerAdapter()); + setCurrentItem(0); if (folioWebView == null) folioWebView = ((View) getParent()).findViewById(R.id.folioWebView); @@ -143,14 +144,15 @@ public Object instantiateItem(@NonNull ViewGroup container, int position) { View view = LayoutInflater.from(container.getContext()) .inflate(R.layout.view_webview_pager, container, false); - if (position % 2 == 0) { + //Debug code + /*if (position % 2 == 0) { view.setBackgroundResource(R.drawable.green_border_background); } else { view.setBackgroundResource(R.drawable.blue_border_background); } TextView textView = view.findViewById(R.id.textView); - textView.setText(Integer.toString(position)); + textView.setText(Integer.toString(position));*/ container.addView(view); return view; From d13ed415d39bb09cff9df6411d8402397aa9f219 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Tue, 19 Jun 2018 15:10:02 +0530 Subject: [PATCH 013/139] Refactor Config view --- folioreader/res/layout/view_config.xml | 64 ++++++------------- folioreader/res/values/strings.xml | 4 +- .../view/ConfigBottomSheetDialogFragment.kt | 20 +++--- 3 files changed, 31 insertions(+), 57 deletions(-) diff --git a/folioreader/res/layout/view_config.xml b/folioreader/res/layout/view_config.xml index 2a008dbb3..43e11ea64 100644 --- a/folioreader/res/layout/view_config.xml +++ b/folioreader/res/layout/view_config.xml @@ -1,11 +1,9 @@ + android:layout_height="203dp"> @@ -21,10 +18,8 @@ android:id="@+id/view_config_ib_night_mode" android:layout_width="0dp" android:layout_height="50dp" - android:adjustViewBounds="true" android:background="@android:color/transparent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/view_config_ib_day_mode" app:srcCompat="@drawable/icon_moon_sel" /> @@ -33,7 +28,6 @@ android:layout_width="0dp" android:layout_height="1dp" android:background="@color/grey_color" - android:visibility="visible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/view_config_ib_night_mode" /> @@ -46,8 +40,6 @@ android:text="@string/andada" android:textSize="17sp" app:layout_constraintEnd_toStartOf="@+id/view_config_font_lato" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintHorizontal_chainStyle="spread" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/view3" /> @@ -59,9 +51,7 @@ android:text="@string/lato" android:textSize="17sp" app:folio_font="@string/lato_font" - app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toStartOf="@+id/view_config_font_lora" - app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/view_config_font_andada" app:layout_constraintTop_toBottomOf="@+id/view3" /> @@ -74,7 +64,6 @@ android:textSize="17sp" app:folio_font="@string/lora_font" app:layout_constraintEnd_toStartOf="@+id/view_config_font_raleway" - app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/view_config_font_lato" app:layout_constraintTop_toBottomOf="@+id/view3" /> @@ -87,7 +76,6 @@ android:textSize="17sp" app:folio_font="@string/raleway_font" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/view_config_font_lora" app:layout_constraintTop_toBottomOf="@+id/view3" /> @@ -96,9 +84,7 @@ android:layout_width="0dp" android:layout_height="1dp" android:background="@color/grey_color" - android:visibility="visible" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.483" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/view_config_font_lato" /> @@ -106,36 +92,28 @@ android:id="@+id/view_config_iv_label_font_small" android:layout_width="36dp" android:layout_height="36dp" - android:layout_marginBottom="8dp" - android:layout_marginEnd="8dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:layout_marginStart="8dp" - android:layout_marginTop="8dp" + android:layout_margin="8dp" android:adjustViewBounds="false" android:scaleType="center" android:tint="@color/grey_color" + app:layout_constraintBottom_toTopOf="@id/view5" app:layout_constraintEnd_toStartOf="@+id/view_config_font_size_seek_bar" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/view_config_font_andada" + app:layout_constraintTop_toBottomOf="@+id/view4" app:srcCompat="@drawable/ic_format_font_black_24dp" /> + app:layout_constraintTop_toBottomOf="@+id/view4" /> + app:layout_constraintTop_toBottomOf="@+id/view_config_font_size_seek_bar" /> + app:layout_constraintTop_toBottomOf="@+id/view5" /> + app:layout_constraintStart_toEndOf="@+id/view_config_btn_vertical" + app:layout_constraintTop_toBottomOf="@+id/view5" /> diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index 0ae3da5f8..bf87e1464 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -91,6 +91,6 @@ Dictionary Wikipedia Cannot open epub it needs storage access ! - horizontal - vertical + Horizontal + Vertical diff --git a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt index 2216f742b..080d500bf 100644 --- a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt +++ b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt @@ -109,9 +109,9 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { setAudioPlayerBackground() } if (activityCallback.direction == DirectionalViewpager.Direction.HORIZONTAL) { - view_config_btn_horizontal_orientation.isSelected = true + view_config_btn_horizontal.isSelected = true } else { - view_config_btn_vertical_orientation.isSelected = true + view_config_btn_vertical.isSelected = true } } @@ -120,25 +120,25 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { 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_btn_vertical.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + view_config_btn_horizontal.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 { + view_config_btn_vertical.setOnClickListener { activityCallback.onDirectionChange(DirectionalViewpager.Direction.VERTICAL) SharedPreferenceUtil.setPagerOrientation(context, DirectionalViewpager.Direction.VERTICAL.toString()) - view_config_btn_horizontal_orientation.isSelected = false - view_config_btn_vertical_orientation.isSelected = true + view_config_btn_horizontal.isSelected = false + view_config_btn_vertical.isSelected = true } - view_config_btn_horizontal_orientation.setOnClickListener { + view_config_btn_horizontal.setOnClickListener { activityCallback.onDirectionChange(DirectionalViewpager.Direction.HORIZONTAL) SharedPreferenceUtil.setPagerOrientation(context, DirectionalViewpager.Direction.HORIZONTAL.toString()) - view_config_btn_horizontal_orientation.isSelected = true - view_config_btn_vertical_orientation.isSelected = false + view_config_btn_horizontal.isSelected = true + view_config_btn_vertical.isSelected = false } } From deeefd29ef53b5023683440b7622797969fa3908 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 20 Jun 2018 13:51:48 +0530 Subject: [PATCH 014/139] Add override config option --- folioreader/res/layout/view_config.xml | 10 +- .../src/main/java/com/folioreader/Config.java | 264 ++++++++++-------- .../main/java/com/folioreader/Constants.java | 1 - .../java/com/folioreader/FolioReader.java | 39 +-- .../ui/folio/activity/FolioActivity.java | 62 ++-- .../folio/activity/FolioActivityCallback.java | 6 +- .../ui/folio/fragment/FolioPageFragment.java | 4 +- .../java/com/folioreader/util/AppUtil.java | 9 +- .../util/SharedPreferenceUtil.java | 16 -- .../view/ConfigBottomSheetDialogFragment.kt | 64 +++-- .../view/DirectionalViewpager.java | 6 + .../com/folioreader/view/FolioWebView.java | 4 +- .../com/folioreader/view/LoadingView.java | 2 +- .../android/sample/HomeActivity.java | 74 ++--- 14 files changed, 293 insertions(+), 268 deletions(-) diff --git a/folioreader/res/layout/view_config.xml b/folioreader/res/layout/view_config.xml index 43e11ea64..a08a81bc7 100644 --- a/folioreader/res/layout/view_config.xml +++ b/folioreader/res/layout/view_config.xml @@ -135,13 +135,13 @@ android:layout_width="0dp" android:layout_height="1dp" android:background="@color/grey_color" - app:layout_constraintBottom_toTopOf="@+id/view_config_btn_vertical" + app:layout_constraintBottom_toTopOf="@+id/buttonVertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/view_config_font_size_seek_bar" /> diff --git a/folioreader/src/main/java/com/folioreader/Config.java b/folioreader/src/main/java/com/folioreader/Config.java index b7e7a1d49..4761b4d98 100644 --- a/folioreader/src/main/java/com/folioreader/Config.java +++ b/folioreader/src/main/java/com/folioreader/Config.java @@ -2,6 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; import org.json.JSONObject; @@ -9,33 +10,84 @@ * Created by mahavir on 4/12/16. */ public class Config implements Parcelable { + + private static final String LOG_TAG = Config.class.getSimpleName(); public static final String INTENT_CONFIG = "config"; + public static final String EXTRA_OVERRIDE_CONFIG = "com.folioreader.extra.OVERRIDE_CONFIG"; public static final String CONFIG_FONT = "font"; public static final String CONFIG_FONT_SIZE = "font_size"; public static final String CONFIG_IS_NIGHTMODE = "is_night_mode"; public static final String CONFIG_IS_THEMECOLOR = "theme_color"; public static final String CONFIG_IS_TTS = "is_tts"; + public static final String CONFIG_ALLOWED_DIRECTION = "allowed_direction"; + public static final String CONFIG_DIRECTION = "direction"; public static final String INTENT_PORT = "port"; - private int font; - private int fontSize; + private int font = 3; + private int fontSize = 2; private boolean nightMode; - private int themeColor; - private boolean showTts; + private int themeColor = R.color.app_green; + private boolean showTts = true; + private AllowedDirection allowedDirection = AllowedDirection.ONLY_VERTICAL; + private Direction direction = Direction.VERTICAL; + + public enum AllowedDirection { + ONLY_VERTICAL, ONLY_HORIZONTAL, VERTICAL_AND_HORIZONTAL + } + + public enum Direction { + VERTICAL, HORIZONTAL + } + + public static final Creator CREATOR = new Creator() { + @Override + public Config createFromParcel(Parcel in) { + return new Config(in); + } - public Config(int font, int fontSize, boolean nightMode, int iconcolor, boolean showTts) { + @Override + public Config[] newArray(int size) { + return new Config[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(font); + dest.writeInt(fontSize); + dest.writeByte((byte) (nightMode ? 1 : 0)); + dest.writeInt(themeColor); + dest.writeByte((byte) (showTts ? 1 : 0)); + dest.writeString(allowedDirection.toString()); + dest.writeString(direction.toString()); + } + + protected Config(Parcel in) { + font = in.readInt(); + fontSize = in.readInt(); + nightMode = in.readByte() != 0; + themeColor = in.readInt(); + showTts = in.readByte() != 0; + allowedDirection = getAllowedDirectionFromString(LOG_TAG, in.readString()); + direction = getDirectionFromString(LOG_TAG, in.readString()); + } + + public Config() { + } + + public Config(int font, int fontSize, boolean nightMode, int themeColor, boolean showTts, + AllowedDirection allowedDirection, Direction direction) { this.font = font; this.fontSize = fontSize; this.nightMode = nightMode; - this.themeColor = iconcolor; + this.themeColor = themeColor; this.showTts = showTts; - } - - private Config(ConfigBuilder configBuilder) { - font = configBuilder.mFont; - fontSize = configBuilder.mFontSize; - nightMode = configBuilder.mNightMode; - themeColor = configBuilder.mThemeColor; - showTts = configBuilder.mShowTts; + setAllowedDirection(allowedDirection); + setDirection(direction); } public Config(JSONObject jsonObject) { @@ -44,163 +96,143 @@ public Config(JSONObject jsonObject) { nightMode = jsonObject.optBoolean(CONFIG_IS_NIGHTMODE); themeColor = jsonObject.optInt(CONFIG_IS_THEMECOLOR); showTts = jsonObject.optBoolean(CONFIG_IS_TTS); + allowedDirection = getAllowedDirectionFromString(LOG_TAG, + jsonObject.optString(CONFIG_ALLOWED_DIRECTION)); + direction = getDirectionFromString(LOG_TAG, jsonObject.optString(CONFIG_DIRECTION)); + } + + public static Direction getDirectionFromString(String LOG_TAG, String directionString) { + + switch (directionString) { + case "VERTICAL": + return Direction.VERTICAL; + case "HORIZONTAL": + return Direction.HORIZONTAL; + default: + Log.w(LOG_TAG, "-> Illegal argument directionString = " + directionString + + ", defaulting direction to " + Direction.VERTICAL.toString()); + return Direction.VERTICAL; + } } - private Config() { - fontSize = 2; - font = 3; - nightMode = false; - themeColor = R.color.app_green; - showTts = true; - } - - private Config(Parcel in) { - readFromParcel(in); + public static AllowedDirection getAllowedDirectionFromString(String LOG_TAG, + String allowedDirectionString) { + + switch (allowedDirectionString) { + case "ONLY_VERTICAL": + return AllowedDirection.ONLY_VERTICAL; + case "ONLY_HORIZONTAL": + return AllowedDirection.ONLY_HORIZONTAL; + case "VERTICAL_AND_HORIZONTAL": + return AllowedDirection.VERTICAL_AND_HORIZONTAL; + default: + Log.w(LOG_TAG, "-> Illegal argument allowedDirectionString = " + allowedDirectionString + + ", defaulting direction to " + AllowedDirection.ONLY_VERTICAL.toString()); + return AllowedDirection.ONLY_VERTICAL; + } } - public int getFont() { return font; } - public void setFont(int font) { + public Config setFont(int font) { this.font = font; + return this; } public int getFontSize() { return fontSize; } - public void setFontSize(int fontSize) { + public Config setFontSize(int fontSize) { this.fontSize = fontSize; + return this; } public boolean isNightMode() { return nightMode; } - public void setNightMode(boolean nightMode) { + public Config setNightMode(boolean nightMode) { this.nightMode = nightMode; + return this; } - public int getThemeColor() { return themeColor; } - public void setThemeColor(int themeColor) { + public Config setThemeColor(int themeColor) { this.themeColor = themeColor; + return this; } public boolean isShowTts() { return showTts; } - public void setShowTts(boolean showTts) { + public Config setShowTts(boolean showTts) { this.showTts = showTts; + return this; } - @Override - - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Config)) return false; - - Config config = (Config) o; - - return font == config.font && fontSize == config.fontSize && nightMode == config.nightMode; - } - - @Override - public int hashCode() { - int result = font; - result = 31 * result - + fontSize; - result = 31 * result - + (nightMode ? 1 : 0); - return result; - } - - @Override - public String toString() { - return "Config{" - + "font=" - + font - + ", fontSize=" + fontSize - + ", nightMode=" + nightMode - + '}'; + public Direction getDirection() { + return direction; } - @Override - public int describeContents() { - return 0; - } + public Config setDirection(Direction direction) { - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(font); - dest.writeInt(fontSize); - dest.writeInt(nightMode ? 1 : 0); - dest.writeInt(themeColor); - dest.writeInt(showTts ? 1 : 0); - } + if (allowedDirection == AllowedDirection.ONLY_VERTICAL && direction != Direction.VERTICAL) { + this.direction = Direction.VERTICAL; - private void readFromParcel(Parcel in) { - font = in.readInt(); - fontSize = in.readInt(); - nightMode = in.readInt() == 1; - themeColor = in.readInt(); - showTts = in.readInt() == 1; - } + } else if (allowedDirection == AllowedDirection.ONLY_HORIZONTAL && direction != Direction.HORIZONTAL) { + this.direction = Direction.HORIZONTAL; - public static final Creator CREATOR = new Creator() { - @Override - public Config createFromParcel(Parcel in) { - return new Config(in); + } else { + this.allowedDirection = AllowedDirection.VERTICAL_AND_HORIZONTAL; + this.direction = direction; } - @Override - public Config[] newArray(int size) { - return new Config[size]; - } - }; + return this; + } - public static class ConfigBuilder { - private int mFont = 3; - private int mFontSize = 2; - private boolean mNightMode = false; - private int mThemeColor = R.color.app_green; - private boolean mShowTts = true; + public AllowedDirection getAllowedDirection() { + return allowedDirection; + } - public ConfigBuilder font(int font) { - mFont = font; - return this; - } + public Config setAllowedDirection(AllowedDirection allowedDirection) { - public ConfigBuilder fontSize(int fontSize) { - mFontSize = fontSize; - return this; - } + this.allowedDirection = allowedDirection; - public ConfigBuilder nightmode(boolean nightMode) { - mNightMode = nightMode; - return this; - } + if (allowedDirection == null) { + this.allowedDirection = AllowedDirection.VERTICAL_AND_HORIZONTAL; - public ConfigBuilder themeColor(int themeColor) { - mThemeColor = themeColor; - return this; - } + } else if (allowedDirection == AllowedDirection.ONLY_VERTICAL && direction != Direction.VERTICAL) { + direction = Direction.VERTICAL; + Log.w(LOG_TAG, "-> Allowed direction is " + allowedDirection.toString() + + " so defaulting direction to " + direction.toString()); - public ConfigBuilder setShowTts(boolean showTts) { - mShowTts = showTts; - return this; + } else if (allowedDirection == AllowedDirection.ONLY_HORIZONTAL && direction != Direction.HORIZONTAL) { + direction = Direction.HORIZONTAL; + Log.w(LOG_TAG, "-> Allowed direction is " + allowedDirection.toString() + + " so defaulting direction to " + direction.toString()); } + return this; + } - public Config build() { - return new Config(this); - } + @Override + public String toString() { + return "Config{" + + "font=" + font + + ", fontSize=" + fontSize + + ", nightMode=" + nightMode + + ", themeColor=" + themeColor + + ", showTts=" + showTts + + ", allowedDirection=" + allowedDirection + + ", direction=" + direction + + '}'; } } diff --git a/folioreader/src/main/java/com/folioreader/Constants.java b/folioreader/src/main/java/com/folioreader/Constants.java index 6b047667d..d61fe8357 100644 --- a/folioreader/src/main/java/com/folioreader/Constants.java +++ b/folioreader/src/main/java/com/folioreader/Constants.java @@ -23,7 +23,6 @@ public class Constants { public static final String DATE_FORMAT = "MMM dd, yyyy | HH:mm"; public static final String ASSET = "file:///android_asset/"; public static final int WRITE_EXTERNAL_STORAGE_REQUEST = 102; - public static final String VIEWPAGER_DIRECTION_KEY = "VIEWPAGER_DIRECTION_KEY"; public static String[] getWriteExternalStoragePerms() { return new String[] { diff --git a/folioreader/src/main/java/com/folioreader/FolioReader.java b/folioreader/src/main/java/com/folioreader/FolioReader.java index 72ba33cb8..34401a59e 100644 --- a/folioreader/src/main/java/com/folioreader/FolioReader.java +++ b/folioreader/src/main/java/com/folioreader/FolioReader.java @@ -31,6 +31,8 @@ public class FolioReader { private static FolioReader singleton = null; public static final String INTENT_BOOK_ID = "book_id"; private Context context; + private Config config; + private boolean overrideConfig; private OnHighlightListener onHighlightListener; private ReadPositionListener readPositionListener; private ReadPosition readPosition; @@ -99,57 +101,38 @@ public FolioReader openBook(int rawId) { return singleton; } - public FolioReader openBook(String assetOrSdcardPath, Config config) { + public FolioReader openBook(String assetOrSdcardPath, int port) { Intent intent = getIntentFromUrl(assetOrSdcardPath, 0); - intent.putExtra(Config.INTENT_CONFIG, config); - context.startActivity(intent); - return singleton; - } - - public FolioReader openBook(int rawId, Config config) { - Intent intent = getIntentFromUrl(null, rawId); - intent.putExtra(Config.INTENT_CONFIG, config); - context.startActivity(intent); - return singleton; - } - - public FolioReader openBook(String assetOrSdcardPath, Config config, int port) { - Intent intent = getIntentFromUrl(assetOrSdcardPath, 0); - intent.putExtra(Config.INTENT_CONFIG, config); intent.putExtra(Config.INTENT_PORT, port); context.startActivity(intent); return singleton; } - public FolioReader openBook(int rawId, Config config, int port) { + public FolioReader openBook(int rawId, int port) { Intent intent = getIntentFromUrl(null, rawId); - intent.putExtra(Config.INTENT_CONFIG, config); intent.putExtra(Config.INTENT_PORT, port); context.startActivity(intent); return singleton; } - public FolioReader openBook(String assetOrSdcardPath, Config config, int port, String bookId) { + public FolioReader openBook(String assetOrSdcardPath, int port, String bookId) { Intent intent = getIntentFromUrl(assetOrSdcardPath, 0); - intent.putExtra(Config.INTENT_CONFIG, config); intent.putExtra(Config.INTENT_PORT, port); intent.putExtra(INTENT_BOOK_ID, bookId); context.startActivity(intent); return singleton; } - public FolioReader openBook(int rawId, Config config, int port, String bookId) { + public FolioReader openBook(int rawId, int port, String bookId) { Intent intent = getIntentFromUrl(null, rawId); - intent.putExtra(Config.INTENT_CONFIG, config); intent.putExtra(Config.INTENT_PORT, port); intent.putExtra(INTENT_BOOK_ID, bookId); context.startActivity(intent); return singleton; } - public FolioReader openBook(String assetOrSdcardPath, Config config, String bookId) { + public FolioReader openBook(String assetOrSdcardPath, String bookId) { Intent intent = getIntentFromUrl(assetOrSdcardPath, 0); - intent.putExtra(Config.INTENT_CONFIG, config); intent.putExtra(INTENT_BOOK_ID, bookId); context.startActivity(intent); return singleton; @@ -159,6 +142,8 @@ private Intent getIntentFromUrl(String assetOrSdcardPath, int rawId) { Intent intent = new Intent(context, FolioActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(Config.INTENT_CONFIG, config); + intent.putExtra(Config.EXTRA_OVERRIDE_CONFIG, overrideConfig); intent.putExtra(FolioActivity.EXTRA_READ_POSITION, readPosition); if (rawId != 0) { @@ -175,6 +160,12 @@ private Intent getIntentFromUrl(String assetOrSdcardPath, int rawId) { return intent; } + public FolioReader setConfig(Config config, boolean overrideConfig) { + this.config = config; + this.overrideConfig = overrideConfig; + return singleton; + } + public FolioReader setOnHighlightListener(OnHighlightListener onHighlightListener) { this.onHighlightListener = onHighlightListener; return singleton; 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 9df4f11c0..972142f94 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 @@ -38,7 +38,6 @@ import com.folioreader.model.ReadPosition; import com.folioreader.model.event.AnchorIdEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; -import com.folioreader.model.event.WebViewPosition; import com.folioreader.ui.folio.adapter.FolioPageFragmentAdapter; import com.folioreader.ui.folio.fragment.FolioPageFragment; import com.folioreader.ui.folio.presenter.MainMvpView; @@ -76,8 +75,7 @@ public class FolioActivity FolioWebView.ToolBarListener, MainMvpView, MediaControllerCallback, - FolioToolbarCallback, - SharedPreferences.OnSharedPreferenceChangeListener { + FolioToolbarCallback { private static final String LOG_TAG = "FolioActivity"; @@ -111,13 +109,12 @@ public enum EpubSourceType { private List mSpineReferenceList = new ArrayList<>(); private EpubServer mEpubServer; - private Config mConfig; private String mBookId; private String mEpubFilePath; private EpubSourceType mEpubSourceType; int mEpubRawId = 0; private MediaControllerView mediaControllerView; - private DirectionalViewpager.Direction direction = DirectionalViewpager.Direction.VERTICAL; + private Config.Direction direction = Config.Direction.VERTICAL; @Override protected void onCreate(Bundle savedInstanceState) { @@ -126,10 +123,6 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.folio_activity); this.savedInstanceState = savedInstanceState; - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - sharedPreferences.registerOnSharedPreferenceChangeListener(this); - onSharedPreferenceChanged(sharedPreferences, Constants.VIEWPAGER_DIRECTION_KEY); - mBookId = getIntent().getStringExtra(FolioReader.INTENT_BOOK_ID); mEpubSourceType = (EpubSourceType) getIntent().getExtras().getSerializable(FolioActivity.INTENT_EPUB_SOURCE_TYPE); @@ -201,7 +194,7 @@ private void getEpubResource() { } @Override - public void onDirectionChange(@NonNull DirectionalViewpager.Direction newDirection) { + public void onDirectionChange(@NonNull Config.Direction newDirection) { Log.d(LOG_TAG, "-> onDirectionChange"); FolioPageFragment folioPageFragment = (FolioPageFragment) @@ -219,7 +212,8 @@ public void onDirectionChange(@NonNull DirectionalViewpager.Direction newDirecti @Override public void showConfigBottomSheetDialogFragment() { - new ConfigBottomSheetDialogFragment().show(getSupportFragmentManager(), ConfigBottomSheetDialogFragment.class.getSimpleName()); + new ConfigBottomSheetDialogFragment().show(getSupportFragmentManager(), + ConfigBottomSheetDialogFragment.class.getSimpleName()); } @Override @@ -430,15 +424,28 @@ public void storeLastReadPosition(ReadPosition lastReadPosition) { } private void setConfig() { - if (AppUtil.getSavedConfig(this) != null) { - mConfig = AppUtil.getSavedConfig(this); - } else if (getIntent().getParcelableExtra(Config.INTENT_CONFIG) != null) { - mConfig = getIntent().getParcelableExtra(Config.INTENT_CONFIG); - AppUtil.saveConfig(this, mConfig); + + Config config; + Config intentConfig = getIntent().getParcelableExtra(Config.INTENT_CONFIG); + boolean overrideConfig = getIntent().getBooleanExtra(Config.EXTRA_OVERRIDE_CONFIG, false); + Config savedConfig = AppUtil.getSavedConfig(this); + + if (savedConfig == null) { + if (intentConfig == null) { + config = new Config(); + } else { + config = intentConfig; + } } else { - mConfig = new Config.ConfigBuilder().build(); - AppUtil.saveConfig(this, mConfig); + if (intentConfig != null && overrideConfig) { + config = intentConfig; + } else { + config = savedConfig; + } } + + AppUtil.saveConfig(this, config); + direction = config.getDirection(); } @Override @@ -475,24 +482,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis } @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - - switch (key) { - case Constants.VIEWPAGER_DIRECTION_KEY: - String directionString = sharedPreferences.getString(key, - DirectionalViewpager.Direction.VERTICAL.toString()); - Log.v(LOG_TAG, "-> onSharedPreferenceChanged -> key: " + key + " value: " + directionString); - if (directionString.equals(DirectionalViewpager.Direction.HORIZONTAL.toString())) { - direction = DirectionalViewpager.Direction.HORIZONTAL; - } else { - direction = DirectionalViewpager.Direction.VERTICAL; - } - break; - } - } - - @Override - public DirectionalViewpager.Direction getDirection() { + public Config.Direction getDirection() { return direction; } } \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivityCallback.java b/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivityCallback.java index b7b98d44f..61acd51e0 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivityCallback.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivityCallback.java @@ -1,7 +1,7 @@ package com.folioreader.ui.folio.activity; +import com.folioreader.Config; import com.folioreader.model.ReadPosition; -import com.folioreader.view.DirectionalViewpager; public interface FolioActivityCallback { @@ -13,9 +13,9 @@ public interface FolioActivityCallback { void goToChapter(String href); - DirectionalViewpager.Direction getDirection(); + Config.Direction getDirection(); - void onDirectionChange(DirectionalViewpager.Direction newDirection); + void onDirectionChange(Config.Direction newDirection); void storeLastReadPosition(ReadPosition lastReadPosition); } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 4de1f90a0..54a2fd3b1 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -474,7 +474,7 @@ public void onPageFinished(WebView view, String url) { if (!hasMediaOverlay) mWebview.loadUrl("javascript:wrappingSentencesWithinPTags()"); - if (mActivityCallback.getDirection() == DirectionalViewpager.Direction.HORIZONTAL) + if (mActivityCallback.getDirection() == Config.Direction.HORIZONTAL) mWebview.loadUrl("javascript:initHorizontalDirection()"); view.loadUrl(String.format(getString(R.string.setmediaoverlaystyle), @@ -675,7 +675,7 @@ public ReadPosition getLastReadPosition() { synchronized (this) { boolean isHorizontal = mActivityCallback.getDirection() == - DirectionalViewpager.Direction.HORIZONTAL; + Config.Direction.HORIZONTAL; mWebview.loadUrl("javascript:getFirstVisibleSpan(" + isHorizontal +")"); beforeWait = new Date(); wait(2000); diff --git a/folioreader/src/main/java/com/folioreader/util/AppUtil.java b/folioreader/src/main/java/com/folioreader/util/AppUtil.java index 846597a19..422878d8f 100644 --- a/folioreader/src/main/java/com/folioreader/util/AppUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/AppUtil.java @@ -93,10 +93,11 @@ public static void saveConfig(Context context, Config config) { obj.put(Config.CONFIG_FONT_SIZE, config.getFontSize()); obj.put(Config.CONFIG_IS_NIGHTMODE, config.isNightMode()); obj.put(Config.CONFIG_IS_THEMECOLOR, config.getThemeColor()); - obj.put(Config.CONFIG_IS_TTS,config.isShowTts()); - SharedPreferenceUtil. - putSharedPreferencesString( - context, Config.INTENT_CONFIG, obj.toString()); + obj.put(Config.CONFIG_IS_TTS, config.isShowTts()); + obj.put(Config.CONFIG_ALLOWED_DIRECTION, config.getAllowedDirection().toString()); + obj.put(Config.CONFIG_DIRECTION, config.getDirection().toString()); + SharedPreferenceUtil.putSharedPreferencesString(context, Config.INTENT_CONFIG, + obj.toString()); } catch (JSONException e) { Log.e(TAG, e.getMessage()); } diff --git a/folioreader/src/main/java/com/folioreader/util/SharedPreferenceUtil.java b/folioreader/src/main/java/com/folioreader/util/SharedPreferenceUtil.java index 325d6a18d..94ed08b28 100644 --- a/folioreader/src/main/java/com/folioreader/util/SharedPreferenceUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/SharedPreferenceUtil.java @@ -4,9 +4,6 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; -import com.folioreader.Constants; -import com.folioreader.view.DirectionalViewpager; - import java.util.Set; /** @@ -94,17 +91,4 @@ public static boolean removeSharedPreferencesKey(Context context, String key) { editor.remove(key); return editor.commit(); } - - public static String getPagerOrientation(Context context) { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); - return preferences.getString(Constants.VIEWPAGER_DIRECTION_KEY, - DirectionalViewpager.Direction.VERTICAL.toString()); - } - - public static void setPagerOrientation(Context context, String orientation) { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); - SharedPreferences.Editor edit = preferences.edit(); - edit.putString(Constants.VIEWPAGER_DIRECTION_KEY, orientation); - edit.apply(); - } } diff --git a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt index 080d500bf..9c181ddd9 100644 --- a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt +++ b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt @@ -88,6 +88,13 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { } private fun inflateView() { + + if (config.allowedDirection != Config.AllowedDirection.VERTICAL_AND_HORIZONTAL) { + view5.visibility = View.GONE + buttonVertical.visibility = View.GONE + buttonHorizontal.visibility = View.GONE + } + view_config_ib_day_mode.setOnClickListener { isNightMode = true toggleBlackTheme() @@ -98,6 +105,7 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { 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() @@ -108,38 +116,46 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { setToolBarColor() setAudioPlayerBackground() } - if (activityCallback.direction == DirectionalViewpager.Direction.HORIZONTAL) { - view_config_btn_horizontal.isSelected = true - } else { - view_config_btn_vertical.isSelected = true + + if (activityCallback.direction == Config.Direction.HORIZONTAL) { + buttonHorizontal.isSelected = true + } else if (activityCallback.direction == Config.Direction.VERTICAL) { + buttonVertical.isSelected = true + } + + buttonVertical.setOnClickListener { + config = AppUtil.getSavedConfig(context) + config.direction = Config.Direction.VERTICAL + AppUtil.saveConfig(context, config) + activityCallback.onDirectionChange(Config.Direction.VERTICAL) + buttonHorizontal.isSelected = false + buttonVertical.isSelected = true + } + + buttonHorizontal.setOnClickListener { + config = AppUtil.getSavedConfig(context) + config.direction = Config.Direction.HORIZONTAL + AppUtil.saveConfig(context, config) + activityCallback.onDirectionChange(Config.Direction.HORIZONTAL) + buttonHorizontal.isSelected = true + buttonVertical.isSelected = false } } 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.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) - view_config_btn_horizontal.setTextColor(UiUtil.getColorList(activity, config.themeColor, R.color.grey_color)) + + val colorStateList = UiUtil.getColorList(activity, config.themeColor, R.color.grey_color) + buttonVertical.setTextColor(colorStateList) + buttonHorizontal.setTextColor(colorStateList) + view_config_font_andada.setTextColor(colorStateList) + view_config_font_lato.setTextColor(colorStateList) + view_config_font_lora.setTextColor(colorStateList) + view_config_font_raleway.setTextColor(colorStateList) + 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.setOnClickListener { - activityCallback.onDirectionChange(DirectionalViewpager.Direction.VERTICAL) - SharedPreferenceUtil.setPagerOrientation(context, DirectionalViewpager.Direction.VERTICAL.toString()) - view_config_btn_horizontal.isSelected = false - view_config_btn_vertical.isSelected = true - } - - view_config_btn_horizontal.setOnClickListener { - activityCallback.onDirectionChange(DirectionalViewpager.Direction.HORIZONTAL) - SharedPreferenceUtil.setPagerOrientation(context, DirectionalViewpager.Direction.HORIZONTAL.toString()) - view_config_btn_horizontal.isSelected = true - view_config_btn_vertical.isSelected = false - } } private fun selectFont(selectedFont: Int, isReloadNeeded: Boolean) { diff --git a/folioreader/src/main/java/com/folioreader/view/DirectionalViewpager.java b/folioreader/src/main/java/com/folioreader/view/DirectionalViewpager.java index 7ea607bac..fd5a67ca7 100644 --- a/folioreader/src/main/java/com/folioreader/view/DirectionalViewpager.java +++ b/folioreader/src/main/java/com/folioreader/view/DirectionalViewpager.java @@ -48,6 +48,7 @@ import android.view.animation.Interpolator; import android.widget.Scroller; +import com.folioreader.Config; import com.folioreader.R; import java.lang.reflect.Method; @@ -4109,6 +4110,11 @@ public void setDirection(Direction direction) { initViewPager(); } + public void setDirection(Config.Direction direction) { + mDirection = direction.name(); + initViewPager(); + } + private String logDestroyItem(int pos, View object) { return "populate() - destroyItem() with pos: " + pos + " view: " + object; } diff --git a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java index 810712916..0377fa7b5 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java +++ b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java @@ -5,13 +5,13 @@ import android.os.Handler; import android.support.v4.view.GestureDetectorCompat; import android.util.AttributeSet; -import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.webkit.WebView; +import com.folioreader.Config; import com.folioreader.R; import com.folioreader.ui.folio.activity.FolioActivityCallback; @@ -93,7 +93,7 @@ public boolean onTouchEvent(MotionEvent event) { hideOrShowToolBar(event); - if (folioActivityCallback.getDirection() == DirectionalViewpager.Direction.HORIZONTAL) { + if (folioActivityCallback.getDirection() == Config.Direction.HORIZONTAL) { return computeHorizontalScroll(event); } else { return computeVerticalScroll(event); diff --git a/folioreader/src/main/java/com/folioreader/view/LoadingView.java b/folioreader/src/main/java/com/folioreader/view/LoadingView.java index 0aa5611bb..b89e2e24e 100644 --- a/folioreader/src/main/java/com/folioreader/view/LoadingView.java +++ b/folioreader/src/main/java/com/folioreader/view/LoadingView.java @@ -53,7 +53,7 @@ public void updateTheme() { Config config = AppUtil.getSavedConfig(getContext()); if (config == null) - config = new Config.ConfigBuilder().build(); + config = new Config(); UiUtil.setColorToImage(getContext(), config.getThemeColor(), progressBar.getIndeterminateDrawable()); if (config.isNightMode()) { rootView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.webview_night)); diff --git a/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java index 4a98f319b..8d1032de8 100644 --- a/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java +++ b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java @@ -1,18 +1,18 @@ /* -* Copyright (C) 2016 Pedro Paulo de Amorim -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright (C) 2016 Pedro Paulo de Amorim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.folioreader.android.sample; import android.os.Bundle; @@ -25,11 +25,13 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import com.folioreader.Config; +import com.folioreader.FolioReader; import com.folioreader.model.HighLight; import com.folioreader.model.ReadPosition; import com.folioreader.model.ReadPositionImpl; import com.folioreader.ui.base.OnSaveHighlight; -import com.folioreader.FolioReader; +import com.folioreader.util.AppUtil; import com.folioreader.util.ObjectMapperSingleton; import com.folioreader.util.OnHighlightListener; import com.folioreader.util.ReadPositionListener; @@ -52,10 +54,23 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); + Config config = AppUtil.getSavedConfig(this); + if (config == null) + config = new Config(); + + config.setAllowedDirection(Config.AllowedDirection.VERTICAL_AND_HORIZONTAL) + .setDirection(Config.Direction.VERTICAL); + + ReadPosition readPosition = getLastReadPosition(); + folioReader = FolioReader.getInstance(getApplicationContext()) + .setConfig(config, true) .setOnHighlightListener(this) + .setReadPosition(readPosition) .setReadPositionListener(this); + getHighlightsAndSave(); + findViewById(R.id.btn_raw).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -69,30 +84,21 @@ public void onClick(View v) { folioReader.openBook("file:///android_asset/TheSilverChair.epub"); } }); - - getHighlightsAndSave(); - getLastReadPosition(); } - private void getLastReadPosition() { - - new Thread(new Runnable() { - @Override - public void run() { + private ReadPosition getLastReadPosition() { - ObjectReader objectReader = ObjectMapperSingleton.getObjectMapper().reader(); - ReadPosition readPosition = null; + ReadPosition readPosition = null; + ObjectReader objectReader = ObjectMapperSingleton.getObjectMapper().reader(); - try { - readPosition = objectReader.forType(ReadPositionImpl.class) - .readValue(getAssets().open("read_positions/read_position.json")); - } catch (IOException e) { - e.printStackTrace(); - } + try { + readPosition = objectReader.forType(ReadPositionImpl.class) + .readValue(getAssets().open("read_positions/read_position.json")); + } catch (IOException e) { + e.printStackTrace(); + } - folioReader.setReadPosition(readPosition); - } - }).start(); + return readPosition; } @Override From 3aaa91de87dd3b17240bc4655525aac6940751ff Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 20 Jun 2018 16:04:25 +0530 Subject: [PATCH 015/139] Pass root to fragment --- folioreader/build.gradle | 3 +-- folioreader/res/layout/folio_page_fragment.xml | 2 +- .../com/folioreader/ui/folio/fragment/FolioPageFragment.java | 3 +-- sample/build.gradle | 4 ++-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/folioreader/build.gradle b/folioreader/build.gradle index 5508f23ad..60aaee250 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -85,8 +85,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project(':webViewMarker') - //noinspection GradleDependency - implementation 'com.android.support.constraint:constraint-layout:1.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.2' 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/layout/folio_page_fragment.xml b/folioreader/res/layout/folio_page_fragment.xml index 64090345a..25c66de0d 100644 --- a/folioreader/res/layout/folio_page_fragment.xml +++ b/folioreader/res/layout/folio_page_fragment.xml @@ -1,7 +1,7 @@ diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 54a2fd3b1..edc00829b 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -200,8 +200,7 @@ public View onCreateView(LayoutInflater inflater, } } highlightStyle = HighlightImpl.HighlightStyle.classForStyle(HighlightImpl.HighlightStyle.Normal); - //TODO: -> root null ??? - mRootView = View.inflate(getActivity(), R.layout.folio_page_fragment, null); + mRootView = inflater.inflate(R.layout.folio_page_fragment, container, false); mPagesLeftTextView = (TextView) mRootView.findViewById(R.id.pagesLeft); mMinutesLeftTextView = (TextView) mRootView.findViewById(R.id.minutesLeft); diff --git a/sample/build.gradle b/sample/build.gradle index 02b00a77a..f1d4ccb3c 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -52,8 +52,8 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.0' + implementation "com.android.support:appcompat-v7:$ANDROID_LIB_VERSION" + implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' From 915230dd91d262402a08b527474615bee8a5936d Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 20 Jun 2018 16:25:17 +0530 Subject: [PATCH 016/139] Remember savedConfig on screen rotation --- .../ui/folio/activity/FolioActivity.java | 18 +++++++++++++----- .../android/sample/HomeActivity.java | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) 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 972142f94..c000ace2c 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 @@ -18,10 +18,8 @@ import android.Manifest; import android.app.Activity; import android.content.Intent; -import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; @@ -118,8 +116,9 @@ public enum EpubSourceType { @Override protected void onCreate(Bundle savedInstanceState) { - setConfig(); super.onCreate(savedInstanceState); + setConfig(savedInstanceState); + setContentView(R.layout.folio_activity); this.savedInstanceState = savedInstanceState; @@ -423,19 +422,23 @@ public void storeLastReadPosition(ReadPosition lastReadPosition) { this.lastReadPosition = lastReadPosition; } - private void setConfig() { + private void setConfig(Bundle savedInstanceState) { Config config; Config intentConfig = getIntent().getParcelableExtra(Config.INTENT_CONFIG); boolean overrideConfig = getIntent().getBooleanExtra(Config.EXTRA_OVERRIDE_CONFIG, false); Config savedConfig = AppUtil.getSavedConfig(this); - if (savedConfig == null) { + if (savedInstanceState != null) { + config = savedConfig; + + } else if (savedConfig == null) { if (intentConfig == null) { config = new Config(); } else { config = intentConfig; } + } else { if (intentConfig != null && overrideConfig) { config = intentConfig; @@ -444,6 +447,11 @@ private void setConfig() { } } + // Code would never enter this if, just added for any unexpected error + // and to avoid lint warning + if (config == null) + config = new Config(); + AppUtil.saveConfig(this, config); direction = config.getDirection(); } diff --git a/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java index 8d1032de8..af44af744 100644 --- a/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java +++ b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java @@ -104,7 +104,7 @@ private ReadPosition getLastReadPosition() { @Override public void saveReadPosition(ReadPosition readPosition) { - Toast.makeText(this, "ReadPosition = " + readPosition.toJson(), Toast.LENGTH_SHORT).show(); + //Toast.makeText(this, "ReadPosition = " + readPosition.toJson(), Toast.LENGTH_SHORT).show(); Log.i(LOG_TAG, "-> ReadPosition = " + readPosition.toJson()); } From b5ee2c419e6b7ec3c4b4c29487ef4a8c44bcdb93 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 20 Jun 2018 17:50:14 +0530 Subject: [PATCH 017/139] Minor bug fixes --- .../ui/folio/fragment/FolioPageFragment.java | 7 ++-- .../view/ConfigBottomSheetDialogFragment.kt | 16 +++++---- .../android/sample/HomeActivity.java | 34 ++++++++++++------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index edc00829b..a2b7789af 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -60,7 +60,6 @@ import com.folioreader.util.HighlightUtil; import com.folioreader.util.SMILParser; import com.folioreader.util.UiUtil; -import com.folioreader.view.DirectionalViewpager; import com.folioreader.view.FolioWebView; import com.folioreader.view.LoadingView; import com.folioreader.view.MediaControllerView; @@ -371,7 +370,7 @@ private void setHtml(boolean reloaded) { mWebview.loadDataWithBaseURL( Constants.LOCALHOST + mBookTitle + "/" + path, - HtmlUtil.getHtmlContent(getActivity(), mHtmlString, mConfig), + HtmlUtil.getHtmlContent(getContext(), mHtmlString, mConfig), "text/html", "UTF-8", null); @@ -489,6 +488,9 @@ public void onPageFinished(WebView view, String url) { if (isCurrentFragment()) { mWebview.loadUrl(String.format("javascript:scrollToSpan(%b, %s)", lastReadPosition.isUsingId(), lastReadPosition.getValue())); + } else { + //When config changes, make loading view invisible for all other fragments + loadingView.invisible(); } mIsPageReloaded = false; @@ -518,6 +520,7 @@ public void onPageFinished(WebView view, String url) { loadingView.invisible(); } } else { + //Make loading view invisible for all other fragments loadingView.invisible(); } } diff --git a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt index 9c181ddd9..b02f24224 100644 --- a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt +++ b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt @@ -9,6 +9,7 @@ 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.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -21,7 +22,6 @@ import com.folioreader.model.event.ReloadDataEvent import com.folioreader.ui.folio.activity.FolioActivity import com.folioreader.ui.folio.activity.FolioActivityCallback import com.folioreader.util.AppUtil -import com.folioreader.util.SharedPreferenceUtil import com.folioreader.util.UiUtil import kotlinx.android.synthetic.main.view_config.* import org.greenrobot.eventbus.EventBus @@ -30,6 +30,12 @@ import org.greenrobot.eventbus.EventBus * Created by mobisys2 on 11/16/2016. */ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { + + companion object { + const val FADE_DAY_NIGHT_MODE = 500 + @JvmField val LOG_TAG:String = ConfigBottomSheetDialogFragment::class.java.simpleName + } + private lateinit var config: Config private var isNightMode = false private lateinit var activityCallback: FolioActivityCallback @@ -111,8 +117,8 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { 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) + UiUtil.setColorToImage(activity, R.color.app_gray, view_config_ib_day_mode.drawable) + UiUtil.setColorToImage(activity, config.themeColor, view_config_ib_night_mode.drawable) setToolBarColor() setAudioPlayerBackground() } @@ -244,8 +250,4 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { (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/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java index af44af744..8503046bd 100644 --- a/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java +++ b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java @@ -54,19 +54,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); - Config config = AppUtil.getSavedConfig(this); - if (config == null) - config = new Config(); - - config.setAllowedDirection(Config.AllowedDirection.VERTICAL_AND_HORIZONTAL) - .setDirection(Config.Direction.VERTICAL); - - ReadPosition readPosition = getLastReadPosition(); - folioReader = FolioReader.getInstance(getApplicationContext()) - .setConfig(config, true) .setOnHighlightListener(this) - .setReadPosition(readPosition) .setReadPositionListener(this); getHighlightsAndSave(); @@ -74,14 +63,33 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { findViewById(R.id.btn_raw).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - folioReader.openBook(R.raw.adventures); + + Config config = AppUtil.getSavedConfig(getApplicationContext()); + if (config == null) + config = new Config(); + + config.setAllowedDirection(Config.AllowedDirection.VERTICAL_AND_HORIZONTAL); + + folioReader.setConfig(config, true) + .openBook(R.raw.adventures); } }); findViewById(R.id.btn_assest).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - folioReader.openBook("file:///android_asset/TheSilverChair.epub"); + + ReadPosition readPosition = getLastReadPosition(); + + Config config = AppUtil.getSavedConfig(getApplicationContext()); + if (config == null) + config = new Config(); + + config.setAllowedDirection(Config.AllowedDirection.VERTICAL_AND_HORIZONTAL); + + folioReader.setReadPosition(readPosition) + .setConfig(config, true) + .openBook("file:///android_asset/TheSilverChair.epub"); } }); } From 88602e0fd92415d4c3598ee1c6b45b6cd15d0ded Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 20 Jun 2018 20:51:58 +0530 Subject: [PATCH 018/139] Change NaviagtionBar color according to theme --- .../activity/ContentHighlightActivity.java | 18 ++++++++++++- .../ui/folio/activity/FolioActivity.java | 20 ++++++++++++++ .../view/ConfigBottomSheetDialogFragment.kt | 27 ++++++++++++++++++- .../java/com/folioreader/view/FolioToolbar.kt | 3 --- 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java b/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java index 697437069..32735b249 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java @@ -1,8 +1,11 @@ package com.folioreader.ui.folio.activity; +import android.content.res.TypedArray; import android.graphics.Color; +import android.os.Build; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ImageView; @@ -10,11 +13,11 @@ import com.folioreader.Config; import com.folioreader.Constants; +import com.folioreader.FolioReader; import com.folioreader.R; import com.folioreader.ui.folio.fragment.HighlightFragment; import com.folioreader.ui.tableofcontents.view.TableOfContentFragment; import com.folioreader.util.AppUtil; -import com.folioreader.FolioReader; import com.folioreader.util.UiUtil; public class ContentHighlightActivity extends AppCompatActivity { @@ -34,8 +37,10 @@ protected void onCreate(Bundle savedInstanceState) { } private void initViews() { + UiUtil.setColorToImage(this, mConfig.getThemeColor(), ((ImageView) findViewById(R.id.btn_close)).getDrawable()); findViewById(R.id.layout_content_highlights).setBackgroundDrawable(UiUtil.getShapeDrawable(this, mConfig.getThemeColor())); + if (mIsNightMode) { findViewById(R.id.toolbar).setBackgroundColor(Color.BLACK); findViewById(R.id.btn_contents).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), R.color.black)); @@ -50,6 +55,17 @@ private void initViews() { findViewById(R.id.btn_highlights).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), R.color.white)); } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + int color; + if (mIsNightMode) { + color = ContextCompat.getColor(this, R.color.black); + } else { + int[] attrs = {android.R.attr.navigationBarColor}; + TypedArray typedArray = getTheme().obtainStyledAttributes(attrs); + color = typedArray.getColor(0, ContextCompat.getColor(this, R.color.white)); + } + getWindow().setNavigationBarColor(color); + } loadContentFragment(); findViewById(R.id.btn_close).setOnClickListener(new View.OnClickListener() { 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 c000ace2c..f270f3632 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 @@ -19,6 +19,8 @@ import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.TypedArray; +import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; @@ -140,6 +142,11 @@ protected void onCreate(Bundle savedInstanceState) { setupBook(); } + initToolbar(savedInstanceState); + } + + private void initToolbar(Bundle savedInstanceState) { + toolbar = findViewById(R.id.toolbar); toolbar.setListeners(this); if (savedInstanceState != null) { @@ -149,6 +156,19 @@ protected void onCreate(Bundle savedInstanceState) { else toolbar.hide(); } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Config config = AppUtil.getSavedConfig(getApplicationContext()); + int color; + if (config.isNightMode()) { + color = ContextCompat.getColor(this, R.color.black); + } else { + int[] attrs = {android.R.attr.navigationBarColor}; + TypedArray typedArray = getTheme().obtainStyledAttributes(attrs); + color = typedArray.getColor(0, ContextCompat.getColor(this, R.color.white)); + } + getWindow().setNavigationBarColor(color); + } } @Override diff --git a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt index b02f24224..bf03e5aec 100644 --- a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt +++ b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt @@ -4,12 +4,12 @@ import android.animation.Animator import android.animation.ArgbEvaluator import android.animation.ValueAnimator import android.app.Activity +import android.os.Build 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.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -186,11 +186,14 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { } 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) @@ -212,6 +215,28 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { }) colorAnimation.duration = FADE_DAY_NIGHT_MODE.toLong() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + + val attrs = intArrayOf(android.R.attr.navigationBarColor) + val typedArray = activity?.theme?.obtainStyledAttributes(attrs) + val defaultNavigationBarColor = typedArray?.getColor(0, + ContextCompat.getColor(context!!, R.color.white)) + val black = ContextCompat.getColor(context!!, R.color.black) + + val navigationColorAnim = ValueAnimator.ofObject(ArgbEvaluator(), + if (isNightMode) black else defaultNavigationBarColor, + if (isNightMode) defaultNavigationBarColor else black) + + navigationColorAnim.addUpdateListener { valueAnimator -> + val value = valueAnimator.animatedValue as Int + activity?.window?.navigationBarColor = value + } + + navigationColorAnim.duration = FADE_DAY_NIGHT_MODE.toLong() + navigationColorAnim.start() + } + colorAnimation.start() } diff --git a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt index 220da4b5e..154fec61f 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt +++ b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt @@ -1,10 +1,7 @@ package com.folioreader.view -import android.animation.ValueAnimator import android.app.Activity import android.content.Context -import android.os.Parcel -import android.os.Parcelable import android.support.v4.content.ContextCompat import android.util.AttributeSet import android.view.LayoutInflater From 1745c0a12d675df7bf5d3795fc00d6aa043eee47 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 21 Jun 2018 18:38:40 +0530 Subject: [PATCH 019/139] Add scrollToLast() and scrollToFirst() --- folioreader/src/main/assets/js/Bridge.js | 141 ++++++++++++++---- .../ui/folio/activity/FolioActivity.java | 23 ++- .../adapter/FolioPageFragmentAdapter.java | 3 + .../ui/folio/fragment/FolioPageFragment.java | 53 +++++-- .../com/folioreader/view/WebViewPager.java | 31 +++- 5 files changed, 211 insertions(+), 40 deletions(-) diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index c7d737ece..3544f9f55 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -120,8 +120,8 @@ var getRectForSelectedText = function(elm) { // Method that call that a hightlight was clicked // with URL scheme and rect informations var callHighlightURL = function(elm) { - event.stopPropagation(); - var URLBase = "highlight://"; + event.stopPropagation(); + var URLBase = "highlight://"; var currentHighlightRect = getRectForSelectedText(elm); thisHighlight = elm; @@ -299,6 +299,93 @@ function sleep(seconds) while (new Date().getTime() <= e) {} } +// Mock objects for testing purpose +/*var FolioPageFragment = { + + setHorizontalPageCount : function(pageCount) { + console.warn("-> Mock call to FolioPageFragment.setHorizontalPageCount(" + pageCount + ")"); + }, + + storeFirstVisibleSpan : function(usingId, value) { + console.warn("-> Mock call to FolioPageFragment.storeFirstVisibleSpan(" + usingId + ", " + value + ")"); + }, + + getDirection : function() { + var direction = "VERTICAL"; + //var direction = "HORIZONTAL"; + console.warn("-> Mock call to FolioPageFragment.getDirection(), return " + direction); + return direction; + } +}; + +var WebViewPager = { + + setCurrentPage : function(pageIndex) { + console.warn("-> Mock call to WebViewPager.setCurrentPage(" + pageIndex + ")"); + }, + + setPageToLast : function() { + console.warn("-> Mock call to WebViewPager.setPageToLast()"); + }, + + setPageToFirst : function() { + console.warn("-> Mock call to WebViewPager.setPageToFirst()"); + } +}; + +var LoadingView = { + invisible : function() { + console.warn("-> Mock call to LoadingView.invisible()"); + } +};*/ + +// Testing purpose calls +function test() { + + wrappingSentencesWithinPTags(); + + if (FolioPageFragment.getDirection() == "HORIZONTAL") + initHorizontalDirection(); + + scrollToFirst(); +} + +function scrollToLast() { + console.log("-> scrollToLast"); + + var direction = FolioPageFragment.getDirection(); + var scrollingElement = bodyOrHtml(); + + if (direction == "VERTICAL") { + scrollingElement.scrollTop = + scrollingElement.scrollHeight - document.documentElement.clientHeight; + + } else if (direction == "HORIZONTAL") { + scrollingElement.scrollLeft = + scrollingElement.scrollWidth - document.documentElement.clientWidth; + WebViewPager.setPageToLast(); + } + + LoadingView.invisible(); +} + +function scrollToFirst() { + console.log("-> scrollToFirst"); + + var direction = FolioPageFragment.getDirection(); + var scrollingElement = bodyOrHtml(); + + if (direction == "VERTICAL") { + scrollingElement.scrollTop = 0; + + } else if (direction == "HORIZONTAL") { + scrollingElement.scrollLeft = 0; + WebViewPager.setPageToFirst(); + } + + LoadingView.invisible(); +} + function initHorizontalDirection() { preInitHorizontalDirection(); var pageCount = postInitHorizontalDirection(); @@ -312,7 +399,7 @@ function preInitHorizontalDirection() { var htmlElement = document.getElementsByTagName('html')[0]; var bodyElement = document.getElementsByTagName('body')[0]; - htmlElement.style.width = null; + htmlElement.style.width = null; bodyElement.style.width = null; htmlElement.style.height = null; bodyElement.style.height = null; @@ -731,36 +818,36 @@ function scrollToSpan(usingId, value) { // Class based onClick listener function addClassBasedOnClickListener(schemeName, querySelector, attributeName, selectAll) { - if (selectAll) { - // Get all elements with the given query selector - var elements = document.querySelectorAll(querySelector); - for (elementIndex = 0; elementIndex < elements.length; elementIndex++) { - var element = elements[elementIndex]; - addClassBasedOnClickListenerToElement(element, schemeName, attributeName); - } - } else { - // Get the first element with the given query selector - var element = document.querySelector(querySelector); - addClassBasedOnClickListenerToElement(element, schemeName, attributeName); - } + if (selectAll) { + // Get all elements with the given query selector + var elements = document.querySelectorAll(querySelector); + for (elementIndex = 0; elementIndex < elements.length; elementIndex++) { + var element = elements[elementIndex]; + addClassBasedOnClickListenerToElement(element, schemeName, attributeName); + } + } else { + // Get the first element with the given query selector + var element = document.querySelector(querySelector); + addClassBasedOnClickListenerToElement(element, schemeName, attributeName); + } } function addClassBasedOnClickListenerToElement(element, schemeName, attributeName) { - // Get the content from the given attribute name - var attributeContent = element.getAttribute(attributeName); - // Add the on click logic - element.setAttribute("onclick", "onClassBasedListenerClick(\"" + schemeName + "\", \"" + encodeURIComponent(attributeContent) + "\");"); + // Get the content from the given attribute name + var attributeContent = element.getAttribute(attributeName); + // Add the on click logic + element.setAttribute("onclick", "onClassBasedListenerClick(\"" + schemeName + "\", \"" + encodeURIComponent(attributeContent) + "\");"); } var onClassBasedListenerClick = function(schemeName, attributeContent) { - // Prevent the browser from performing the default on click behavior - event.preventDefault(); - // Don't pass the click event to other elemtents - event.stopPropagation(); - // Create parameters containing the click position inside the web view. - var positionParameterString = "/clientX=" + event.clientX + "&clientY=" + event.clientY; - // Set the custom link URL to the event - window.location = schemeName + "://" + attributeContent + positionParameterString; + // Prevent the browser from performing the default on click behavior + event.preventDefault(); + // Don't pass the click event to other elemtents + event.stopPropagation(); + // Create parameters containing the click position inside the web view. + var positionParameterString = "/clientX=" + event.clientX + "&clientY=" + event.clientY; + // Set the custom link URL to the event + window.location = schemeName + "://" + attributeContent + positionParameterString; } function getHighlightString(style) { 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 f270f3632..5f6670483 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 @@ -338,7 +338,9 @@ public void onLoadPublication(EpubPublication publication) { } private void configFolio() { + mFolioPageViewPager = findViewById(R.id.folioPageViewPager); + // Replacing with addOnPageChangeListener(), onPageSelected() is not invoked mFolioPageViewPager.setOnPageChangeListener(new DirectionalViewpager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { @@ -346,15 +348,32 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @Override public void onPageSelected(int position) { - EventBus.getDefault().post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, false, true)); + Log.d(LOG_TAG, "-> onPageSelected -> DirectionalViewpager -> position = " + position); + + EventBus.getDefault().post(new MediaOverlayPlayPauseEvent( + mSpineReferenceList.get(mChapterPosition).href, false, true)); mediaControllerView.setPlayButtonDrawable(); mChapterPosition = position; + toolbar.setTitle(mSpineReferenceList.get(mChapterPosition).bookTitle); } @Override public void onPageScrollStateChanged(int state) { + if (state == DirectionalViewpager.SCROLL_STATE_IDLE) { - toolbar.setTitle(mSpineReferenceList.get(mChapterPosition).bookTitle); + int position = mFolioPageViewPager.getCurrentItem(); + Log.d(LOG_TAG, "-> onPageScrollStateChanged -> DirectionalViewpager -> " + + "position = " + position); + + FolioPageFragment folioPageFragment = + (FolioPageFragment) mFolioPageFragmentAdapter.getItem(position - 1); + if (folioPageFragment != null) + folioPageFragment.scrollToLast(); + + folioPageFragment = + (FolioPageFragment) mFolioPageFragmentAdapter.getItem(position + 1); + if (folioPageFragment != null) + folioPageFragment.scrollToFirst(); } } }); diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java b/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java index 4ff81b9de..ab5f932b3 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java @@ -51,6 +51,9 @@ public Object instantiateItem(ViewGroup container, int position) { @Override public Fragment getItem(int position) { + if (mSpineReferences.size() == 0 || position < 0 || position >= mSpineReferences.size()) + return null; + Fragment fragment = fragments.get(position); if (fragment == null) { fragment = FolioPageFragment.newInstance(position, diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index a2b7789af..ba37da912 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -203,9 +203,7 @@ public View onCreateView(LayoutInflater inflater, mPagesLeftTextView = (TextView) mRootView.findViewById(R.id.pagesLeft); mMinutesLeftTextView = (TextView) mRootView.findViewById(R.id.minutesLeft); - Activity activity = getActivity(); - - mConfig = AppUtil.getSavedConfig(activity); + mConfig = AppUtil.getSavedConfig(getContext()); loadingView = mRootView.findViewById(R.id.loadingView); initSeekbar(); @@ -361,7 +359,7 @@ private void setHtml(boolean reloaded) { mediaController.setSMILItems(SMILParser.parseSMIL(mHtmlString)); mediaController.setUpMediaPlayer(spineItem.mediaOverlay, spineItem.mediaOverlay.getAudioPath(spineItem.href), mBookTitle); } - mConfig = AppUtil.getSavedConfig(getActivity()); + mConfig = AppUtil.getSavedConfig(getContext()); String path = ""; int forwardSlashLastIndex = ref.lastIndexOf('/'); @@ -383,6 +381,28 @@ public String getDirection() { return mActivityCallback.getDirection().toString(); } + public void scrollToLast() { + + boolean isPageLoading = loadingView == null || loadingView.getVisibility() == View.VISIBLE; + Log.d(LOG_TAG, "-> scrollToLast -> isPageLoading = " + isPageLoading); + + if (!isPageLoading) { + loadingView.setVisibility(View.VISIBLE); + mWebview.loadUrl("javascript:scrollToLast()"); + } + } + + public void scrollToFirst() { + + boolean isPageLoading = loadingView == null || loadingView.getVisibility() == View.VISIBLE; + Log.d(LOG_TAG, "-> scrollToFirst -> isPageLoading = " + isPageLoading); + + if (!isPageLoading) { + loadingView.setVisibility(View.VISIBLE); + mWebview.loadUrl("javascript:scrollToFirst()"); + } + } + private void initWebView() { FrameLayout webViewLayout = mRootView.findViewById(R.id.webViewLayout); @@ -485,13 +505,21 @@ public void onPageFinished(WebView view, String url) { loadRangy(mWebview, rangy); if (mIsPageReloaded) { + if (isCurrentFragment()) { mWebview.loadUrl(String.format("javascript:scrollToSpan(%b, %s)", lastReadPosition.isUsingId(), lastReadPosition.getValue())); + } else { - //When config changes, make loading view invisible for all other fragments - loadingView.invisible(); + if (mPosition == mActivityCallback.getChapterPosition() - 1) { + // Scroll to last, the page before current page + mWebview.loadUrl("javascript:scrollToLast()"); + } else { + // Make loading view invisible for all other fragments + loadingView.invisible(); + } } + mIsPageReloaded = false; } else if (!TextUtils.isEmpty(mAnchorId)) { @@ -519,9 +547,16 @@ public void onPageFinished(WebView view, String url) { } else { loadingView.invisible(); } + } else { - //Make loading view invisible for all other fragments - loadingView.invisible(); + + if (mPosition == mActivityCallback.getChapterPosition() - 1) { + // Scroll to last, the page before current page + mWebview.loadUrl("javascript:scrollToLast()"); + } else { + // Make loading view invisible for all other fragments + loadingView.invisible(); + } } } } @@ -595,9 +630,9 @@ public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceReque }; private WebChromeClient webChromeClient = new WebChromeClient() { + @Override public void onProgressChanged(WebView view, int progress) { - } @Override diff --git a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java index 81e551a2c..f9d4cda33 100644 --- a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java +++ b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java @@ -107,12 +107,38 @@ public void setCurrentPage(final int pageIndex) { handler.post(new Runnable() { @Override public void run() { - folioWebView.invalidate(); + folioWebView.postInvalidate(); setCurrentItem(pageIndex, false); } }); } + @SuppressWarnings("unused") + @JavascriptInterface + public void setPageToLast() { + + handler.post(new Runnable() { + @Override + public void run() { + folioWebView.postInvalidate(); + setCurrentItem(horizontalPageCount - 1); + } + }); + } + + @SuppressWarnings("unused") + @JavascriptInterface + public void setPageToFirst() { + + handler.post(new Runnable() { + @Override + public void run() { + folioWebView.postInvalidate(); + setCurrentItem(0); + } + }); + } + @Override public boolean onTouchEvent(MotionEvent event) { //Log.d(LOG_TAG, "-> onTouchEvent -> " + AppUtil.actionToString(event.getAction())); @@ -144,7 +170,8 @@ public Object instantiateItem(@NonNull ViewGroup container, int position) { View view = LayoutInflater.from(container.getContext()) .inflate(R.layout.view_webview_pager, container, false); - //Debug code + // Debug code + // Set alpha for folioWebView in folio_page_fragment.xml to 0.5f also. /*if (position % 2 == 0) { view.setBackgroundResource(R.drawable.green_border_background); } else { From 557198c2fa107f3bb89100a0ced08c3d5f6b0a0d Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Fri, 22 Jun 2018 12:25:10 +0530 Subject: [PATCH 020/139] Prepare v0.3.10 Changelog - Fix FolioReader/FolioReader-Android#214 Fix FolioReader/FolioReader-Android#215 --- README.md | 2 +- build.gradle | 2 +- folioreader/build.gradle | 2 +- webViewMarker/build.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b81dc0c93..6fbeddd53 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ FolioReader-Android is an ePub reader written in Java. ### Gradle Add following dependency to your app build.gradle ``` java -compile 'com.folioreader:folioreader:0.3.9' +compile 'com.folioreader:folioreader:0.3.10' ``` Add maven repository to your top level build.gradle diff --git a/build.gradle b/build.gradle index 334072821..e70aaefc9 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext.KOTLIN_VERSION= '1.2.41' ext.ANDROID_LIB_VERSION = '27.1.1' - ext.R2_STREAMER_VERSION = '0.1.5' + ext.R2_STREAMER_VERSION = '0.1.6' def KOTLIN_VERSION = ext.KOTLIN_VERSION repositories { diff --git a/folioreader/build.gradle b/folioreader/build.gradle index 76e5b239e..9bd7e18ee 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -17,7 +17,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.9' + libraryVersion = '0.3.10' developerId = 'mobisystech' developerName = 'Folio Reader' diff --git a/webViewMarker/build.gradle b/webViewMarker/build.gradle index ca9032116..1b2e8e78b 100644 --- a/webViewMarker/build.gradle +++ b/webViewMarker/build.gradle @@ -13,7 +13,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.9' + libraryVersion = '0.3.10' developerId = 'mobisystech' developerName = 'Folio Reader' From 51866bfc126393f5c496cc767da41c781ec21584 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Fri, 22 Jun 2018 15:48:25 +0530 Subject: [PATCH 021/139] Fix Horizontal pagination error for single page --- folioreader/src/main/assets/js/Bridge.js | 28 +++++++++++++------ .../src/main/java/com/folioreader/Config.java | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 3544f9f55..3b5ee560a 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -270,9 +270,9 @@ function goToElement(element) { } else if (FolioPageFragment.getDirection() == "HORIZONTAL" && top == 0) { - var windowVisibleWidth = document.documentElement.clientWidth; - var pageIndex = Math.floor(element.offsetLeft / windowVisibleWidth); - var newScrollLeft = windowVisibleWidth * pageIndex; + var clientWidth = document.documentElement.clientWidth; + var pageIndex = Math.floor(element.offsetLeft / clientWidth); + var newScrollLeft = clientWidth * pageIndex; //console.log("-> newScrollLeft = " + newScrollLeft); scrollingElement.scrollLeft = newScrollLeft; WebViewPager.setCurrentPage(pageIndex); @@ -346,8 +346,6 @@ function test() { if (FolioPageFragment.getDirection() == "HORIZONTAL") initHorizontalDirection(); - - scrollToFirst(); } function scrollToLast() { @@ -399,6 +397,7 @@ function preInitHorizontalDirection() { var htmlElement = document.getElementsByTagName('html')[0]; var bodyElement = document.getElementsByTagName('body')[0]; + // TODO: -> Check if this is needed htmlElement.style.width = null; bodyElement.style.width = null; htmlElement.style.height = null; @@ -421,6 +420,8 @@ function preInitHorizontalDirection() { //console.log("-> window.innerWidth = " + window.innerWidth); //console.log("-> window.innerHeight = " + window.innerHeight); + //console.log("-> clientWidth = " + document.documentElement.clientWidth); + //console.log("-> clientHeight = " + document.documentElement.clientHeight); //console.log("-> bodyElement.offsetWidth = " + bodyElement.offsetWidth); //console.log("-> bodyElement.offsetHeight = " + bodyElement.offsetHeight); //console.log("-> pageWidth = " + pageWidth); @@ -439,17 +440,26 @@ function postInitHorizontalDirection() { var paddingRight = parseInt(bodyStyle.paddingRight, 10); var paddingBottom = parseInt(bodyStyle.paddingBottom, 10); var paddingLeft = parseInt(bodyStyle.paddingLeft, 10); - var windowVisibleWidth = document.documentElement.clientWidth; + var clientWidth = document.documentElement.clientWidth; - var scrollWidth = document.documentElement.scrollWidth + paddingRight; + var scrollWidth = document.documentElement.scrollWidth; + if (scrollWidth > clientWidth) + scrollWidth += paddingRight; var newBodyWidth = scrollWidth - (paddingLeft + paddingRight); htmlElement.style.width = scrollWidth + 'px'; bodyElement.style.width = newBodyWidth + 'px'; - var pageCount = Math.round(scrollWidth / windowVisibleWidth); + // pageCount deliberately rounded instead of ceiling to avoid any unexpected error + var pageCount = Math.round(scrollWidth / clientWidth); + var pageCountFloat = scrollWidth / clientWidth; + + if (pageCount != pageCountFloat) { + console.warn("-> pageCount = " + pageCount + ", pageCountFloat = " + pageCountFloat + + ", Something wrong in pageCount calculation"); + } + //console.log("-> scrollWidth = " + scrollWidth); - //console.log("-> windowVisibleWidth = " + windowVisibleWidth); //console.log("-> newBodyWidth = " + newBodyWidth); //console.log("-> pageCount = " + pageCount); diff --git a/folioreader/src/main/java/com/folioreader/Config.java b/folioreader/src/main/java/com/folioreader/Config.java index 4761b4d98..346111cbf 100644 --- a/folioreader/src/main/java/com/folioreader/Config.java +++ b/folioreader/src/main/java/com/folioreader/Config.java @@ -127,7 +127,7 @@ public static AllowedDirection getAllowedDirectionFromString(String LOG_TAG, return AllowedDirection.VERTICAL_AND_HORIZONTAL; default: Log.w(LOG_TAG, "-> Illegal argument allowedDirectionString = " + allowedDirectionString - + ", defaulting direction to " + AllowedDirection.ONLY_VERTICAL.toString()); + + ", defaulting allowedDirection to " + AllowedDirection.ONLY_VERTICAL.toString()); return AllowedDirection.ONLY_VERTICAL; } } From 0546d989104796cc0de20ab4ea65b879d7228189 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Mon, 25 Jun 2018 16:23:00 +0530 Subject: [PATCH 022/139] Prepare v0.3.11 Fixes FolioReader/FolioReader-Android#221 --- README.md | 2 +- build.gradle | 2 +- folioreader/build.gradle | 2 +- webViewMarker/build.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6fbeddd53..7992389b4 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ FolioReader-Android is an ePub reader written in Java. ### Gradle Add following dependency to your app build.gradle ``` java -compile 'com.folioreader:folioreader:0.3.10' +compile 'com.folioreader:folioreader:0.3.11' ``` Add maven repository to your top level build.gradle diff --git a/build.gradle b/build.gradle index e70aaefc9..4ea73c138 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext.KOTLIN_VERSION= '1.2.41' ext.ANDROID_LIB_VERSION = '27.1.1' - ext.R2_STREAMER_VERSION = '0.1.6' + ext.R2_STREAMER_VERSION = '0.1.7' def KOTLIN_VERSION = ext.KOTLIN_VERSION repositories { diff --git a/folioreader/build.gradle b/folioreader/build.gradle index 9bd7e18ee..c96feb6e7 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -17,7 +17,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.10' + libraryVersion = '0.3.11' developerId = 'mobisystech' developerName = 'Folio Reader' diff --git a/webViewMarker/build.gradle b/webViewMarker/build.gradle index 1b2e8e78b..78a8b04e0 100644 --- a/webViewMarker/build.gradle +++ b/webViewMarker/build.gradle @@ -13,7 +13,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.10' + libraryVersion = '0.3.11' developerId = 'mobisystech' developerName = 'Folio Reader' From 13933a2b596338bb1b06b484ddb87255373daf99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salih=20Ak=C5=9Fit?= Date: Mon, 25 Jun 2018 23:23:20 +0300 Subject: [PATCH 023/139] Merge branch 'master' of https://github.com/FolioReader/FolioReader-Android # Conflicts: # folioreader/res/layout/folio_activity.xml # folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java # folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java --- build.gradle | 2 +- folioreader/build.gradle | 2 +- .../res/drawable/ic_search_green_24px.xml | 12 +- folioreader/res/layout/folio_activity.xml | 7 + folioreader/res/layout/folio_toolbar.xml | 14 +- folioreader/res/values/strings.xml | 2 +- folioreader/src/main/assets/js/Bridge.js | 7 + .../com/folioreader/model/HighlightImpl.java | 2 - .../model/event/ClearSearchEvent.java | 4 + .../folioreader/model/event/SearchEvent.java | 2 +- .../ui/base/SearchListCallBack.java | 2 +- .../folioreader/ui/base/SearchListTask.java | 5 +- .../ui/folio/activity/FolioActivity.java | 193 ++++++++++++++++-- .../ui/folio/fragment/FolioPageFragment.java | 64 +++++- .../ui/folio/presenter/MainMvpView.java | 1 - .../ui/folio/presenter/MainPresenter.java | 11 +- .../java/com/folioreader/view/FolioToolbar.kt | 10 +- .../folioreader/view/FolioToolbarCallback.kt | 1 + webViewMarker/build.gradle | 2 +- 19 files changed, 297 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index 4ea73c138..e70aaefc9 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext.KOTLIN_VERSION= '1.2.41' ext.ANDROID_LIB_VERSION = '27.1.1' - ext.R2_STREAMER_VERSION = '0.1.7' + ext.R2_STREAMER_VERSION = '0.1.6' def KOTLIN_VERSION = ext.KOTLIN_VERSION repositories { diff --git a/folioreader/build.gradle b/folioreader/build.gradle index c96feb6e7..9bd7e18ee 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -17,7 +17,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.11' + libraryVersion = '0.3.10' developerId = 'mobisystech' developerName = 'Folio Reader' diff --git a/folioreader/res/drawable/ic_search_green_24px.xml b/folioreader/res/drawable/ic_search_green_24px.xml index 978c5867c..7b7247130 100644 --- a/folioreader/res/drawable/ic_search_green_24px.xml +++ b/folioreader/res/drawable/ic_search_green_24px.xml @@ -1,9 +1,9 @@ - - + android:viewportHeight="24" + android:viewportWidth="24"> + + \ No newline at end of file diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index be99caae4..455f620d9 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -17,6 +17,13 @@ android:layout_width="match_parent" android:layout_height="?android:attr/actionBarSize" /> + + + + + + \\{\\{(-?\\d+\\.?\\d*)\\,(-?\\d+\\.?\\d*)\\}\\,\\s\\{(-?\\d+\\.?\\d*)\\,(-?\\d+\\.?\\d*)\\}\\} %s]]> - + %s Save your note diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 04cc714dd..4de07bfe9 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -681,6 +681,13 @@ function getHighlightString(style) { Highlight.getHighlightJson(JSON.stringify(params)); } +function gotoHighlight(highlightId){ + var element = document.getElementById(highlightId.toString()); + if(element != null) { + goToEl(element); + } +} + function onlyUnique(value, index, self) { return self.indexOf(value) === index; } diff --git a/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java b/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java index c37051bc0..4792a7970 100644 --- a/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java +++ b/folioreader/src/main/java/com/folioreader/model/HighlightImpl.java @@ -120,8 +120,6 @@ public HighlightImpl(int id, String bookId, String content, Date date, String ty this.rangy = rangy; this.note = note; this.uuid = uuid; - - } public HighlightImpl() { diff --git a/folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java b/folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java index 106cb0abb..5bbe4622b 100644 --- a/folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java +++ b/folioreader/src/main/java/com/folioreader/model/event/ClearSearchEvent.java @@ -1,4 +1,8 @@ package com.folioreader.model.event; public class ClearSearchEvent { + + public ClearSearchEvent() { + + } } diff --git a/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java b/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java index 6ac588525..1716c1098 100644 --- a/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java +++ b/folioreader/src/main/java/com/folioreader/model/event/SearchEvent.java @@ -11,7 +11,7 @@ public SearchEvent() { } - public SearchEvent(String word, boolean isNewChapter, int count,String uniqueId) { + public SearchEvent(String word, boolean isNewChapter, int count, String uniqueId) { this.id = uniqueId; this.word = word; this.count = count; diff --git a/folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java b/folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java index 73a61f07e..4c36a5b68 100644 --- a/folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java +++ b/folioreader/src/main/java/com/folioreader/ui/base/SearchListCallBack.java @@ -4,4 +4,4 @@ public interface SearchListCallBack extends BaseMvpView { void onReceiveSearchList(SearchQueryResults searchQueryResults); -} +} \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java index e31657407..854dd6336 100644 --- a/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java +++ b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.folioreader.util.AppUtil; + import org.readium.r2_streamer.model.searcher.SearchQueryResults; import java.io.BufferedReader; @@ -57,9 +58,9 @@ protected SearchQueryResults doInBackground(String... urls) { @Override protected void onPostExecute(SearchQueryResults results) { - if (results != null && results.getSearchCount()>0) { + if (results != null && results.getSearchCount() > 0) { callBack.onReceiveSearchList(results); - }else{ + } else { callBack.onError(); } cancel(true); 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 07d57f19d..43680378a 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 @@ -1,21 +1,22 @@ /* -* Copyright (C) 2016 Pedro Paulo de Amorim -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright (C) 2016 Pedro Paulo de Amorim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.folioreader.ui.folio.activity; import android.Manifest; +import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; @@ -25,6 +26,8 @@ import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; +import android.view.View; +import android.view.inputmethod.InputMethodManager; import android.widget.Toast; import com.folioreader.Config; @@ -34,7 +37,9 @@ import com.folioreader.model.HighlightImpl; import com.folioreader.model.ReadPosition; import com.folioreader.model.event.AnchorIdEvent; +import com.folioreader.model.event.ClearSearchEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; +import com.folioreader.model.event.SearchEvent; import com.folioreader.model.event.WebViewPosition; import com.folioreader.ui.folio.adapter.FolioPageFragmentAdapter; import com.folioreader.ui.folio.fragment.FolioPageFragment; @@ -44,6 +49,8 @@ import com.folioreader.util.FileUtil; import com.folioreader.view.ConfigBottomSheetDialogFragment; import com.folioreader.view.DirectionalViewpager; +import com.folioreader.view.FolioSearchBar; +import com.folioreader.view.FolioSearchBarCallback; import com.folioreader.view.FolioToolbar; import com.folioreader.view.FolioToolbarCallback; import com.folioreader.view.MediaControllerCallback; @@ -51,16 +58,19 @@ import com.folioreader.view.ObservableWebView; import org.greenrobot.eventbus.EventBus; +import org.jetbrains.annotations.Nullable; import org.readium.r2_streamer.model.container.Container; import org.readium.r2_streamer.model.container.EpubContainer; import org.readium.r2_streamer.model.publication.EpubPublication; import org.readium.r2_streamer.model.publication.link.Link; +import org.readium.r2_streamer.model.searcher.SearchQueryResults; import org.readium.r2_streamer.server.EpubServer; import org.readium.r2_streamer.server.EpubServerSingleton; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import static com.folioreader.Constants.CHAPTER_SELECTED; import static com.folioreader.Constants.HIGHLIGHT_SELECTED; @@ -74,7 +84,8 @@ public class FolioActivity ConfigBottomSheetDialogFragment.ConfigDialogCallback, MainMvpView, MediaControllerCallback, - FolioToolbarCallback { + FolioToolbarCallback, + FolioSearchBarCallback { private static final String TAG = "FolioActivity"; @@ -95,6 +106,7 @@ public enum EpubSourceType { private DirectionalViewpager mFolioPageViewPager; private FolioToolbar toolbar; + private FolioSearchBar folioSearchBar; private int mChapterPosition; private FolioPageFragmentAdapter mFolioPageFragmentAdapter; @@ -136,6 +148,9 @@ protected void onCreate(Bundle savedInstanceState) { toolbar = findViewById(R.id.toolbar); toolbar.setListeners(this); + + folioSearchBar = findViewById(R.id.search_section); + folioSearchBar.setListeners(this); } @Override @@ -279,6 +294,11 @@ public void showConfigBottomSheetDialogFragment() { @Override public void hideOrShowToolBar() { + if (toolbar.getVisible()) { + folioSearchBar.show(false); + } else { + folioSearchBar.hide(false); + } toolbar.showOrHideIfVisible(); } @@ -412,4 +432,147 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis break; } } + + /////////////////////////////////////////////////////////////////////////////////////////////////////// + public ArrayList indexes; + private int currentIndex = 0, oldIndex = 0; + private int count = 0; + public String query, uniqueID; + private int fragmentPos; + private boolean onEndPos = false; + public boolean mIsSearchSectionVisible = false; + + private void searchAnimateShow() { + if (!mIsSearchSectionVisible) { + mIsSearchSectionVisible = true; + folioSearchBar.show(true); + toolbar.hide(); + } + } + + private void searchAnimateHide() { + mIsSearchSectionVisible = false; + folioSearchBar.hide(true); + } + + @Override + public void search() { + folioSearchBar.setForSearch(true); + if (!mIsSearchSectionVisible) { + searchAnimateShow(); + folioSearchBar.clearSearchSection(); + } else { + searchAnimateHide(); + clearSearchHighlights(); + } + } + + @Override + public void disableSearch() { + + folioSearchBar.clearSearchSection(); + clearSearchHighlights(); + folioSearchBar.setForSearch(true); + } + + @Override + public void showSearch(@Nullable String query) { + if (query != null) { + hideKeyboard(FolioActivity.this); + new MainPresenter(FolioActivity.this).searchQuery(Constants.LOCALHOST + bookFileName + "/search?query=" + query); + } + } + + @Override + public void goNextResult() { + if (indexes != null && query != null) { + if (indexes.size() > currentIndex) { + boolean isNew = true; + if (currentIndex > 0 && (int) indexes.get(currentIndex - 1) == ((int) indexes.get + (currentIndex))) { + isNew = false; + count++; + } else { + changeCurrentIndex(); + uniqueID = UUID.randomUUID().toString(); + count = 0; + mChapterPosition = indexes.get(currentIndex); + mFolioPageViewPager.setCurrentItem(mChapterPosition); + } + oldIndex = currentIndex; + EventBus.getDefault().post(new SearchEvent(query, isNew, count, "")); + currentIndex++; + onEndPos = false; + } else { + // TODO: 21.04.2018 change icon & no restart since it may leak + onEndPos = true; + currentIndex = 0; + oldIndex = 0; + folioSearchBar.callback.goNextResult(); + } + } + } + + + @Override + public void onShowSearchResults(SearchQueryResults results) { + folioSearchBar.setForSearch(false); + query = results.getSearchResultList().get(0).getSearchQuery(); + clearIndexes(); + indexes = getSearchIndexes(results); + folioSearchBar.changeSearchIcon(false); + } + + private ArrayList getSearchIndexes(SearchQueryResults results) { + ArrayList searchQueryIndexes = new ArrayList<>(); + for (int i = 0; i < results.getSearchResultList().size(); i++) { + for (int j = 0; j < mSpineReferenceList.size(); j++) { + if (mSpineReferenceList.get(j).getHref().equalsIgnoreCase(results.getSearchResultList().get(i) + .getResource())) { + searchQueryIndexes.add(j); + break; + } + } + } + return searchQueryIndexes; + } + + public void clearIndexes() { + currentIndex = 0; + oldIndex = 0; + count = 0; + onEndPos = false; + } + + private void changeCurrentIndex() { + fragmentPos = mFolioPageViewPager.getCurrentItem(); + if (indexes != null) { + if (fragmentPos != indexes.get(oldIndex)) { + for (int i = 0; i < indexes.size(); i++) { + if (indexes.get(i) == fragmentPos && !onEndPos) { + currentIndex = i; + break; + } + } + } + } + } + + private void hideKeyboard(Activity activity) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + //Find the currently focused view, so we can grab the correct window token from it. + View view = activity.getCurrentFocus(); + //If no view currently has focus, create a new one, just so we can grab a window token from it + if (view == null) { + view = new View(activity); + } + if (imm != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + } + + private void clearSearchHighlights() { + EventBus.getDefault().post(new ClearSearchEvent()); + } } \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index a02fe77ae..ef19b2c9d 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -39,11 +39,13 @@ import com.folioreader.model.ReadPosition; import com.folioreader.model.ReadPositionImpl; import com.folioreader.model.event.AnchorIdEvent; +import com.folioreader.model.event.ClearSearchEvent; import com.folioreader.model.event.MediaOverlayHighlightStyleEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; import com.folioreader.model.event.MediaOverlaySpeedEvent; import com.folioreader.model.event.ReloadDataEvent; import com.folioreader.model.event.RewindIndexEvent; +import com.folioreader.model.event.SearchEvent; import com.folioreader.model.event.UpdateHighlightEvent; import com.folioreader.model.event.WebViewPosition; import com.folioreader.model.quickaction.ActionItem; @@ -147,6 +149,10 @@ public interface FolioPageFragmentCallback { private Config mConfig; private String mBookId; + private String word; + private String uniqueId; + private int count; + public static FolioPageFragment newInstance(int position, String bookTitle, Link spineRef, String bookId) { FolioPageFragment fragment = new FolioPageFragment(); Bundle args = new Bundle(); @@ -456,6 +462,11 @@ public void onPageFinished(WebView view, String url) { entryReadPosition.isUsingId(), entryReadPosition.getValue())); } } + + if (word!=null && uniqueId!=null) { + giveBackgroundToSearchItems(); + goNextElementInTheSameChapter(); + } } } @@ -535,8 +546,10 @@ public void onProgressChanged(WebView view, int progress) { mWebview.postDelayed(new Runnable() { @Override public void run() { - Log.d("scroll y", "Scrolly" + mScrollY); - mWebview.scrollTo(0, mScrollY); + if (word == null && uniqueId == null) { + Log.d("scroll y", "Scrolly" + mScrollY); + mWebview.scrollTo(0, mScrollY); + } } }, 100); } @@ -1012,7 +1025,9 @@ public void setWebViewPosition(final int position) { @Override public void run() { if (isAdded()) { - mWebview.scrollTo(0, position); + if (word == null && uniqueId == null) { + mWebview.scrollTo(0, position); + } } } }); @@ -1069,4 +1084,47 @@ public void onError() { private void scrollToHighlightId() { mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } + /////////////////////////////////////////////SEARCH SECTION//////////////////////////////////////////////////////// + @SuppressWarnings("unused") + @Subscribe(threadMode = ThreadMode.MAIN) + public void highlightAndGoSearchItem(final SearchEvent searchEvent) { + if (isAdded()) { + if (word != null && !word.equalsIgnoreCase(searchEvent.getWord())){ + clearSearchItemsBackground();// TODO: 22.04.2018 may remove this possibility + } + word = searchEvent.getWord(); + uniqueId = searchEvent.getId(); + count = searchEvent.getCount(); + if (mWebview.getContentHeight() > 0) { + if (searchEvent.isNewChapter()) { + giveBackgroundToSearchItems(); + }else { + goNextElementInTheSameChapter(); + } + } + } + } + @SuppressWarnings("unused") + @Subscribe(threadMode = ThreadMode.MAIN) + public void clearSearchItem( ClearSearchEvent event) { + if (isAdded()) { + clearSearchItemsBackground(); + } + } + + private void giveBackgroundToSearchItems() { + String js = String.format(getString(R.string.search_highlight),word); + mWebview.loadUrl(js); + } + + private void goNextElementInTheSameChapter() { + String js = String.format(getString(R.string.search_item_scroll),count); + mWebview.loadUrl(js); + } + + private void clearSearchItemsBackground(){ + String js = getString(R.string.search_highlight_clear); + mWebview.loadUrl(js); + mWebview.invalidate(); + } } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java index 4c62d041b..716f4972f 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainMvpView.java @@ -12,5 +12,4 @@ public interface MainMvpView extends BaseMvpView { void onLoadPublication(EpubPublication publication); void onShowSearchResults(SearchQueryResults results); - String getSearchQuery(); } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java index 1999c3e61..22245fd40 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/presenter/MainPresenter.java @@ -18,13 +18,7 @@ public class MainPresenter implements ManifestCallBack { public MainPresenter(MainMvpView mainMvpView) { this.mainMvpView = mainMvpView; } - - public void parseManifest(String url) { - new ManifestTask(this).execute(url); - } - - public void searchQuery() { - String searchUrl = mainMvpView.getSearchQuery(); + public void searchQuery(String searchUrl) { if (searchUrl == null) { mainMvpView.onError(); } else { @@ -41,6 +35,9 @@ public void onError() { }).execute(searchUrl); } } + public void parseManifest(String url) { + new ManifestTask(this).execute(url); + } @Override public void onReceivePublication(EpubPublication publication) { diff --git a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt index bedc2d992..f81b078da 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt +++ b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt @@ -20,7 +20,7 @@ import kotlinx.android.synthetic.main.folio_toolbar.view.* */ class FolioToolbar : RelativeLayout { private lateinit var config: Config - private var visible: Boolean = false + var visible: Boolean = false lateinit var callback: FolioToolbarCallback constructor(context: Context) : this(context, null, 0) @@ -43,6 +43,7 @@ class FolioToolbar : RelativeLayout { UiUtil.setColorToImage(context, config.themeColor, btn_drawer.drawable) UiUtil.setColorToImage(context, config.themeColor, btn_config.drawable) UiUtil.setColorToImage(context, config.themeColor, btn_speaker.drawable) + UiUtil.setColorToImage(context, config.themeColor, btn_search.drawable) } private fun initListeners() { @@ -58,6 +59,9 @@ class FolioToolbar : RelativeLayout { btn_speaker.setOnClickListener { callback.showMediaController() } + btn_search.setOnClickListener { + callback.search() + } } fun setListeners(callback: FolioToolbarCallback) { @@ -79,7 +83,7 @@ class FolioToolbar : RelativeLayout { visible = !visible } - private fun show() { + fun show() { this.animate().translationY(0f) .setInterpolator(DecelerateInterpolator(2f)) .start() @@ -95,7 +99,7 @@ class FolioToolbar : RelativeLayout { label_center.setTextColor(ContextCompat.getColor(context, R.color.black)) } - private fun hide() { + fun hide() { this.animate().translationY((-this.height) .toFloat()) .setInterpolator(AccelerateInterpolator(2f)) diff --git a/folioreader/src/main/java/com/folioreader/view/FolioToolbarCallback.kt b/folioreader/src/main/java/com/folioreader/view/FolioToolbarCallback.kt index 14b90ff05..5ed9d87ec 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioToolbarCallback.kt +++ b/folioreader/src/main/java/com/folioreader/view/FolioToolbarCallback.kt @@ -4,4 +4,5 @@ interface FolioToolbarCallback { fun startContentHighlightActivity() fun showConfigBottomSheetDialogFragment() fun showMediaController() + fun search() } \ No newline at end of file diff --git a/webViewMarker/build.gradle b/webViewMarker/build.gradle index 78a8b04e0..1b2e8e78b 100644 --- a/webViewMarker/build.gradle +++ b/webViewMarker/build.gradle @@ -13,7 +13,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.11' + libraryVersion = '0.3.10' developerId = 'mobisystech' developerName = 'Folio Reader' From b2c8eb00b17b228f6ea4602a5ef0e4cb192d4b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salih=20Ak=C5=9Fit?= Date: Mon, 25 Jun 2018 23:25:27 +0300 Subject: [PATCH 024/139] Merge branch 'master' of https://github.com/FolioReader/FolioReader-Android # Conflicts: # folioreader/res/layout/folio_activity.xml # folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java # folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java --- folioreader/src/main/assets/js/Bridge.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 4de07bfe9..014c2104a 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -681,12 +681,6 @@ function getHighlightString(style) { Highlight.getHighlightJson(JSON.stringify(params)); } -function gotoHighlight(highlightId){ - var element = document.getElementById(highlightId.toString()); - if(element != null) { - goToEl(element); - } -} function onlyUnique(value, index, self) { return self.indexOf(value) === index; From b037280fd5b969696f7ae8f27aa582d5ddac376c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salih=20Ak=C5=9Fit?= Date: Tue, 26 Jun 2018 01:01:32 +0300 Subject: [PATCH 025/139] fixing some style issues --- folioreader/res/layout/folio_search_bar.xml | 10 +-- .../folioreader/model/event/SearchEvent.java | 26 ++++---- .../com/folioreader/ui/base/ManifestTask.java | 13 ++-- .../folioreader/ui/base/SearchListTask.java | 19 +++--- .../ui/folio/activity/FolioActivity.java | 66 ++++++++++--------- .../ui/folio/fragment/FolioPageFragment.java | 46 ++++++------- .../com/folioreader/view/FolioSearchBar.kt | 40 +++++------ 7 files changed, 110 insertions(+), 110 deletions(-) diff --git a/folioreader/res/layout/folio_search_bar.xml b/folioreader/res/layout/folio_search_bar.xml index 895a31399..b35745146 100644 --- a/folioreader/res/layout/folio_search_bar.xml +++ b/folioreader/res/layout/folio_search_bar.xml @@ -8,7 +8,7 @@ android:orientation="horizontal"> { private static final String TAG = "ManifestTask"; - private ManifestCallBack manifestCallBack; + private ManifestCallBack mCallBack; - public ManifestTask(ManifestCallBack manifestCallBack) { - this.manifestCallBack = manifestCallBack; + public ManifestTask(ManifestCallBack mCallBack) { + this.mCallBack = mCallBack; } @Override @@ -41,7 +41,8 @@ protected EpubPublication doInBackground(String... urls) { URL url = new URL(strUrl); URLConnection urlConnection = url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, AppUtil.charsetNameForURLConnection(urlConnection))); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, + AppUtil.charsetNameForURLConnection(urlConnection))); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { @@ -65,9 +66,9 @@ protected void onPostExecute(EpubPublication publication) { setBookTitle(link, publication); } } - manifestCallBack.onReceivePublication(publication); + mCallBack.onReceivePublication(publication); } else { - manifestCallBack.onError(); + mCallBack.onError(); } cancel(true); } diff --git a/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java index 854dd6336..2c64dec35 100644 --- a/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java +++ b/folioreader/src/main/java/com/folioreader/ui/base/SearchListTask.java @@ -21,25 +21,24 @@ public class SearchListTask extends AsyncTask private static final String TAG = "SearchListTask"; - private SearchListCallBack callBack; - String strUrl; + private SearchListCallBack mCallBack; - public SearchListTask(SearchListCallBack callBack) { - this.callBack = callBack; + public SearchListTask(SearchListCallBack mCallBack) { + this.mCallBack = mCallBack; } @Override protected SearchQueryResults doInBackground(String... urls) { - strUrl = urls[0]; + String mUrl = urls[0]; try { - URL url = new URL(strUrl); + URL url = new URL(mUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); InputStream inputStream = urlConnection.getInputStream(); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, AppUtil - .charsetNameForURLConnection(urlConnection))); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, + AppUtil.charsetNameForURLConnection(urlConnection))); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { @@ -59,9 +58,9 @@ protected SearchQueryResults doInBackground(String... urls) { protected void onPostExecute(SearchQueryResults results) { if (results != null && results.getSearchCount() > 0) { - callBack.onReceiveSearchList(results); + mCallBack.onReceiveSearchList(results); } else { - callBack.onError(); + mCallBack.onError(); } cancel(true); } 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 43680378a..a12d2ef9c 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 @@ -433,13 +433,12 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis } } - /////////////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// public ArrayList indexes; - private int currentIndex = 0, oldIndex = 0; - private int count = 0; + private int mCurIndex = 0, mOldIndex = 0; + private int mCount = 0; public String query, uniqueID; - private int fragmentPos; - private boolean onEndPos = false; + private boolean mOnEndPos = false; public boolean mIsSearchSectionVisible = false; private void searchAnimateShow() { @@ -479,35 +478,37 @@ public void disableSearch() { public void showSearch(@Nullable String query) { if (query != null) { hideKeyboard(FolioActivity.this); - new MainPresenter(FolioActivity.this).searchQuery(Constants.LOCALHOST + bookFileName + "/search?query=" + query); + new MainPresenter(FolioActivity.this) + .searchQuery( + Constants.LOCALHOST + bookFileName + "/search?query=" + query); } } @Override public void goNextResult() { if (indexes != null && query != null) { - if (indexes.size() > currentIndex) { + if (indexes.size() > mCurIndex) { boolean isNew = true; - if (currentIndex > 0 && (int) indexes.get(currentIndex - 1) == ((int) indexes.get - (currentIndex))) { + if (mCurIndex > 0 && indexes.get(mCurIndex - 1) == ((int) indexes.get + (mCurIndex))) { isNew = false; - count++; + mCount++; } else { changeCurrentIndex(); uniqueID = UUID.randomUUID().toString(); - count = 0; - mChapterPosition = indexes.get(currentIndex); + mCount = 0; + mChapterPosition = indexes.get(mCurIndex); mFolioPageViewPager.setCurrentItem(mChapterPosition); } - oldIndex = currentIndex; - EventBus.getDefault().post(new SearchEvent(query, isNew, count, "")); - currentIndex++; - onEndPos = false; + mOldIndex = mCurIndex; + EventBus.getDefault().post(new SearchEvent(query, isNew, mCount, "")); + mCurIndex++; + mOnEndPos = false; } else { // TODO: 21.04.2018 change icon & no restart since it may leak - onEndPos = true; - currentIndex = 0; - oldIndex = 0; + mOnEndPos = true; + mCurIndex = 0; + mOldIndex = 0; folioSearchBar.callback.goNextResult(); } } @@ -523,12 +524,12 @@ public void onShowSearchResults(SearchQueryResults results) { folioSearchBar.changeSearchIcon(false); } - private ArrayList getSearchIndexes(SearchQueryResults results) { + private ArrayList getSearchIndexes(SearchQueryResults results) { ArrayList searchQueryIndexes = new ArrayList<>(); for (int i = 0; i < results.getSearchResultList().size(); i++) { for (int j = 0; j < mSpineReferenceList.size(); j++) { - if (mSpineReferenceList.get(j).getHref().equalsIgnoreCase(results.getSearchResultList().get(i) - .getResource())) { + if (mSpineReferenceList.get(j).getHref().equalsIgnoreCase( + results.getSearchResultList().get(i).getResource())) { searchQueryIndexes.add(j); break; } @@ -538,19 +539,19 @@ private ArrayList getSearchIndexes(SearchQueryResults results) { } public void clearIndexes() { - currentIndex = 0; - oldIndex = 0; - count = 0; - onEndPos = false; + mCurIndex = 0; + mOldIndex = 0; + mCount = 0; + mOnEndPos = false; } private void changeCurrentIndex() { - fragmentPos = mFolioPageViewPager.getCurrentItem(); + int fragmentPos = mFolioPageViewPager.getCurrentItem(); if (indexes != null) { - if (fragmentPos != indexes.get(oldIndex)) { + if (fragmentPos != indexes.get(mOldIndex)) { for (int i = 0; i < indexes.size(); i++) { - if (indexes.get(i) == fragmentPos && !onEndPos) { - currentIndex = i; + if (indexes.get(i) == fragmentPos && !mOnEndPos) { + mCurIndex = i; break; } } @@ -559,10 +560,11 @@ private void changeCurrentIndex() { } private void hideKeyboard(Activity activity) { - InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + InputMethodManager imm = + (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); //Find the currently focused view, so we can grab the correct window token from it. View view = activity.getCurrentFocus(); - //If no view currently has focus, create a new one, just so we can grab a window token from it + //If no view currently has focus, create a new one, just so we can grab a window token if (view == null) { view = new View(activity); } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index ef19b2c9d..ef755c79a 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -149,9 +149,9 @@ public interface FolioPageFragmentCallback { private Config mConfig; private String mBookId; - private String word; - private String uniqueId; - private int count; + private String mQuery; + private String mUniqueId; + private int mCount; public static FolioPageFragment newInstance(int position, String bookTitle, Link spineRef, String bookId) { FolioPageFragment fragment = new FolioPageFragment(); @@ -310,7 +310,7 @@ public void reload(ReloadDataEvent reloadDataEvent) { /** * [EVENT BUS FUNCTION] - * + *

* Function triggered when highlight is deleted and page is needed to * be updated. * @@ -318,8 +318,8 @@ public void reload(ReloadDataEvent reloadDataEvent) { */ @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) - public void updateHighlight(UpdateHighlightEvent event){ - if(isAdded()) { + public void updateHighlight(UpdateHighlightEvent event) { + if (isAdded()) { this.rangy = HighlightUtil.generateRangyString(getPageName()); loadRangy(mWebview, this.rangy); } @@ -463,7 +463,7 @@ public void onPageFinished(WebView view, String url) { } } - if (word!=null && uniqueId!=null) { + if (mQuery != null && mUniqueId != null) { giveBackgroundToSearchItems(); goNextElementInTheSameChapter(); } @@ -513,7 +513,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { // prevent favicon.ico to be loaded automatically @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { - if(url.toLowerCase().contains("/favicon.ico")) { + if (url.toLowerCase().contains("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, null); } catch (Exception e) { @@ -527,7 +527,7 @@ public WebResourceResponse shouldInterceptRequest(WebView view, String url) { @Override @SuppressLint("NewApi") public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - if(!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico")) { + if (!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, null); } catch (Exception e) { @@ -546,7 +546,7 @@ public void onProgressChanged(WebView view, int progress) { mWebview.postDelayed(new Runnable() { @Override public void run() { - if (word == null && uniqueId == null) { + if (mQuery == null && mUniqueId == null) { Log.d("scroll y", "Scrolly" + mScrollY); mWebview.scrollTo(0, mScrollY); } @@ -663,7 +663,7 @@ public void onStop() { * and then ReadPositionImpl is broadcast to {@link FolioReader#readPositionReceiver} * * @param usingId if span tag has id then true or else false - * @param value if usingId true then span id else span index + * @param value if usingId true then span id else span index */ @JavascriptInterface public void storeFirstVisibleSpan(boolean usingId, String value) { @@ -1025,7 +1025,7 @@ public void setWebViewPosition(final int position) { @Override public void run() { if (isAdded()) { - if (word == null && uniqueId == null) { + if (mQuery == null && mUniqueId == null) { mWebview.scrollTo(0, position); } } @@ -1084,45 +1084,47 @@ public void onError() { private void scrollToHighlightId() { mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); } - /////////////////////////////////////////////SEARCH SECTION//////////////////////////////////////////////////////// + + /////////////////////////////////////////////SEARCH SECTION/////////////////////////////////// @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void highlightAndGoSearchItem(final SearchEvent searchEvent) { if (isAdded()) { - if (word != null && !word.equalsIgnoreCase(searchEvent.getWord())){ + if (mQuery != null && !mQuery.equalsIgnoreCase(searchEvent.getWord())) { clearSearchItemsBackground();// TODO: 22.04.2018 may remove this possibility } - word = searchEvent.getWord(); - uniqueId = searchEvent.getId(); - count = searchEvent.getCount(); + mQuery = searchEvent.getWord(); + mUniqueId = searchEvent.getId(); + mCount = searchEvent.getCount(); if (mWebview.getContentHeight() > 0) { if (searchEvent.isNewChapter()) { giveBackgroundToSearchItems(); - }else { + } else { goNextElementInTheSameChapter(); } } } } + @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) - public void clearSearchItem( ClearSearchEvent event) { + public void clearSearchItem(ClearSearchEvent event) { if (isAdded()) { clearSearchItemsBackground(); } } private void giveBackgroundToSearchItems() { - String js = String.format(getString(R.string.search_highlight),word); + String js = String.format(getString(R.string.search_highlight), mQuery); mWebview.loadUrl(js); } private void goNextElementInTheSameChapter() { - String js = String.format(getString(R.string.search_item_scroll),count); + String js = String.format(getString(R.string.search_item_scroll), mCount); mWebview.loadUrl(js); } - private void clearSearchItemsBackground(){ + private void clearSearchItemsBackground() { String js = getString(R.string.search_highlight_clear); mWebview.loadUrl(js); mWebview.invalidate(); diff --git a/folioreader/src/main/java/com/folioreader/view/FolioSearchBar.kt b/folioreader/src/main/java/com/folioreader/view/FolioSearchBar.kt index a80cb3e7a..5c366d6a4 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioSearchBar.kt +++ b/folioreader/src/main/java/com/folioreader/view/FolioSearchBar.kt @@ -1,7 +1,6 @@ package com.folioreader.view import android.content.Context -import android.support.v4.content.ContextCompat import android.util.AttributeSet import android.view.LayoutInflater import android.view.View @@ -12,14 +11,11 @@ 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_search_bar.view.* -import kotlinx.android.synthetic.main.folio_toolbar.view.* class FolioSearchBar : RelativeLayout { private lateinit var config: Config - private var visible: Boolean = false var isForSearch: Boolean = true lateinit var callback: FolioSearchBarCallback @@ -35,11 +31,11 @@ class FolioSearchBar : RelativeLayout { if (config.isNightMode) setNightMode() else setDayMode() initColors() initListeners() - search_query.setOnEditorActionListener() { v, actionId, event -> + edit_query.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_SEARCH) { - search_img.performClick() + btn_query_search.performClick() true - } + }else false } } @@ -50,10 +46,10 @@ class FolioSearchBar : RelativeLayout { } private fun initListeners() { - cancel_img.setOnClickListener { + btn_disable.setOnClickListener { callback.disableSearch() } - search_img.setOnClickListener { + btn_query_search.setOnClickListener { if (isForSearch) callback.showSearch(getSearchQuery()) else @@ -67,15 +63,15 @@ class FolioSearchBar : RelativeLayout { fun changeSearchIcon(doSearch: Boolean) { if (doSearch) { - search_img.setImageResource(R.drawable.ic_search_white_24px) + btn_query_search.setImageResource(R.drawable.ic_search_white_24px) } else { - search_img.setImageResource(R.drawable.ic_keyboard_arrow_down_white_24) + btn_query_search.setImageResource(R.drawable.ic_keyboard_arrow_down_white_24) } } fun clearSearchSection() { - if (search_query != null) - search_query.text.clear() + if (edit_query != null) + edit_query.text.clear() changeSearchIcon(true) } @@ -88,11 +84,11 @@ class FolioSearchBar : RelativeLayout { } - fun setNightMode() { + private fun setNightMode() { // search_bar_container.setBackgroundColor(ContextCompat.getColor(context, R.color.black)) } - fun setDayMode() { + private fun setDayMode() { // search_bar_container.setBackgroundColor(ContextCompat.getColor(context, R.color.white)) } @@ -104,22 +100,22 @@ class FolioSearchBar : RelativeLayout { .start() } - fun getSearchQuery(): String? { - if (search_query.text == null) { + private fun getSearchQuery(): String? { + if (edit_query.text == null) { return null } else { - var searchQuery: String = search_query.text.toString().trim() - if (!searchQuery.isEmpty()) { + var searchQuery: String = edit_query.text.toString().trim() + return if (!searchQuery.isEmpty()) { if (searchQuery.contains(" ")) { searchQuery = searchQuery.replace(" ", "%20") } if (searchQuery.isNotEmpty()) { - return searchQuery + searchQuery } else { - return null + null } } else { - return null + null } } } From ecde25bf0b5f77b75a5b21d90237aa0d2f152bf3 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Tue, 26 Jun 2018 11:48:50 +0530 Subject: [PATCH 026/139] Fix Quirks mode and

margins When a xhtml contents is loaded with text/html MIME type, the page might load into Quirks mode. So it is neccessary to load xhtml pages with application/xhtml+xml MIME type. If the page gets loaded in Quirks mode, then majority of the modern CSS styles might not work. References - https://stackoverflow.com/questions/8052178/difference-between-document-documentelement-clientheight-and-document-body-clien https://en.wikipedia.org/wiki/Quirks_mode --- folioreader/res/values/strings.xml | 6 +- folioreader/src/main/assets/css/Style.css | 2 +- folioreader/src/main/assets/js/Bridge.js | 15 ++++- .../com/folioreader/ui/base/HtmlUtil.java | 63 +++++++++---------- .../ui/folio/fragment/FolioPageFragment.java | 11 +++- .../com/folioreader/view/FolioWebView.java | 13 ++++ 6 files changed, 71 insertions(+), 39 deletions(-) diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index bf87e1464..6ea4ae2b1 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -69,7 +69,7 @@ javascript:gotoHighlight(\'%s\') javascript:getHighlightString(\'%s\') javascript:setHighlightStyle(\'%s\'); - ]]> + ]]> ]]> %s]]> %s]]> @@ -93,4 +93,8 @@ Cannot open epub it needs storage access ! Horizontal Vertical + + application/xhtml+xml + text/html + BackCompat diff --git a/folioreader/src/main/assets/css/Style.css b/folioreader/src/main/assets/css/Style.css index 4751e311e..0e832c7f1 100755 --- a/folioreader/src/main/assets/css/Style.css +++ b/folioreader/src/main/assets/css/Style.css @@ -76,7 +76,7 @@ a { -webkit-touch-callout: none; } /* Disable link callback */ * { -webkit-user-select: text; } img { -webkit-user-select: none; } p { - margin: 1.3em 0 1.5em 0; + margin: 1.3em 0 1.5em 0 !important; line-height: 1.40em !important; text-indent: 1.25em; } diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 3b5ee560a..72bd46cd3 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -311,13 +311,20 @@ function sleep(seconds) }, getDirection : function() { - var direction = "VERTICAL"; - //var direction = "HORIZONTAL"; + //var direction = "VERTICAL"; + var direction = "HORIZONTAL"; console.warn("-> Mock call to FolioPageFragment.getDirection(), return " + direction); return direction; } }; +var FolioWebView = { + + setCompatMode : function(compatMode) { + console.warn("-> Mock call to FolioWebView.setCompatMode(" + compatMode + ")"); + } +}; + var WebViewPager = { setCurrentPage : function(pageIndex) { @@ -384,6 +391,10 @@ function scrollToFirst() { LoadingView.invisible(); } +function getCompatMode() { + FolioWebView.setCompatMode(document.compatMode); +} + function initHorizontalDirection() { preInitHorizontalDirection(); var pageCount = postInitHorizontalDirection(); diff --git a/folioreader/src/main/java/com/folioreader/ui/base/HtmlUtil.java b/folioreader/src/main/java/com/folioreader/ui/base/HtmlUtil.java index d0798704b..641ddbc78 100644 --- a/folioreader/src/main/java/com/folioreader/ui/base/HtmlUtil.java +++ b/folioreader/src/main/java/com/folioreader/ui/base/HtmlUtil.java @@ -20,44 +20,39 @@ public final class HtmlUtil { * @return modified raw html string */ public static String getHtmlContent(Context context, String htmlContent, Config config) { + String cssPath = String.format(context.getString(R.string.css_tag), "file:///android_asset/css/Style.css"); - String jsPath = String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/jsface.min.js"); - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/jquery-3.1.1.min.js"); - - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/rangy-core.js"); - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/rangy-highlighter.js"); - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/rangy-classapplier.js"); - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/rangy-serializer.js"); - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/rangy-serializer.js"); - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/js/Bridge.js"); - - jsPath = - jsPath + String.format(context.getString(R.string.script_tag), - "file:///android_asset/android.selection.js"); - jsPath = - jsPath + String.format(context.getString(R.string.script_tag_method_call), - "setMediaOverlayStyleColors('#C0ED72','#C0ED72')"); - - jsPath = - jsPath + ""; + "file:///android_asset/js/jsface.min.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag), + "file:///android_asset/js/jquery-3.1.1.min.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag), + "file:///android_asset/js/rangy-core.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag), + "file:///android_asset/js/rangy-highlighter.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag), + "file:///android_asset/js/rangy-classapplier.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag), + "file:///android_asset/js/rangy-serializer.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag), + "file:///android_asset/js/Bridge.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag), + "file:///android_asset/android.selection.js") + "\n"; + + jsPath = jsPath + String.format(context.getString(R.string.script_tag_method_call), + "setMediaOverlayStyleColors('#C0ED72','#C0ED72')") + "\n"; + + jsPath = jsPath + + ""; String toInject = "\n" + cssPath + "\n" + jsPath + "\n"; htmlContent = htmlContent.replace("", toInject); diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index ba37da912..ed7692bf8 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -366,10 +366,17 @@ private void setHtml(boolean reloaded) { if (forwardSlashLastIndex != -1) path = ref.substring(0, forwardSlashLastIndex + 1); + String mimeType; + if (spineItem.typeLink.equalsIgnoreCase(getString(R.string.xhtml_mime_type))) { + mimeType = getString(R.string.xhtml_mime_type); + } else { + mimeType = getString(R.string.html_mime_type); + } + mWebview.loadDataWithBaseURL( Constants.LOCALHOST + mBookTitle + "/" + path, HtmlUtil.getHtmlContent(getContext(), mHtmlString, mConfig), - "text/html", + mimeType, "UTF-8", null); } @@ -440,6 +447,7 @@ public void onLayoutChange(View view, int left, int top, int right, int bottom, mWebview.addJavascriptInterface(this, "FolioPageFragment"); mWebview.addJavascriptInterface(webViewPager, "WebViewPager"); mWebview.addJavascriptInterface(loadingView, "LoadingView"); + mWebview.addJavascriptInterface(mWebview, "FolioWebView"); mWebview.setScrollListener(new FolioWebView.ScrollListener() { @Override @@ -487,6 +495,7 @@ public void onPageFinished(WebView view, String url) { if (isAdded()) { + mWebview.loadUrl("javascript:getCompatMode()"); mWebview.loadUrl("javascript:alert(getReadingTime())"); if (!hasMediaOverlay) diff --git a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java index 0377fa7b5..6c46aa211 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java +++ b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java @@ -5,10 +5,12 @@ import android.os.Handler; import android.support.v4.view.GestureDetectorCompat; import android.util.AttributeSet; +import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; +import android.webkit.JavascriptInterface; import android.webkit.WebView; import com.folioreader.Config; @@ -62,6 +64,17 @@ private void init() { touchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); } + @SuppressWarnings("unused") + @JavascriptInterface + public void setCompatMode(String compatMode) { + Log.d(LOG_TAG, "-> setCompatMode -> compatMode = " + compatMode); + if (compatMode.equals(getContext().getString(R.string.back_compat))) { + Log.e(LOG_TAG, "-> Web page loaded in Quirks mode. Please report to developer " + + "for debugging with current EPUB file as many features might stop working " + + "(ex. Horizontal scroll feature)."); + } + } + public void setFolioActivityCallback(FolioActivityCallback folioActivityCallback) { this.folioActivityCallback = folioActivityCallback; } From 64ebf41c1d4e30f8ccc19ee8ebb47be04e61939e Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 27 Jun 2018 12:01:26 +0530 Subject: [PATCH 027/139] Workaround for slow rendering of webpages document.documentElement.scrollWidth gives incorrect value when the webview is busy re-drawing contents. Reproducable only on Android Chrome and not on Desktop Chrome. --- folioreader/src/main/assets/js/Bridge.js | 21 ++++++++++++++++--- .../ui/folio/fragment/FolioPageFragment.java | 4 +++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 72bd46cd3..609cd42de 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -349,6 +349,7 @@ var LoadingView = { // Testing purpose calls function test() { + getCompatMode(); wrappingSentencesWithinPTags(); if (FolioPageFragment.getDirection() == "HORIZONTAL") @@ -395,10 +396,23 @@ function getCompatMode() { FolioWebView.setCompatMode(document.compatMode); } +var scrollWidth; + function initHorizontalDirection() { + preInitHorizontalDirection(); - var pageCount = postInitHorizontalDirection(); - FolioPageFragment.setHorizontalPageCount(pageCount); + postInitHorizontalDirection(); + + setTimeout(function() { + if (window.scrollWidth != document.documentElement.scrollWidth) { + // Rare condition + // This might happen when document.documentElement.scrollWidth gives incorrect value + // when the webview is busy re-drawing contents. + console.warn("-> scrollWidth changed from " + window.scrollWidth + " to " + + document.documentElement.scrollWidth); + postInitHorizontalDirection(); + } + }, 1000); } function preInitHorizontalDirection() { @@ -457,6 +471,7 @@ function postInitHorizontalDirection() { if (scrollWidth > clientWidth) scrollWidth += paddingRight; var newBodyWidth = scrollWidth - (paddingLeft + paddingRight); + window.scrollWidth = scrollWidth; htmlElement.style.width = scrollWidth + 'px'; bodyElement.style.width = newBodyWidth + 'px'; @@ -474,7 +489,7 @@ function postInitHorizontalDirection() { //console.log("-> newBodyWidth = " + newBodyWidth); //console.log("-> pageCount = " + pageCount); - return pageCount; + FolioPageFragment.setHorizontalPageCount(pageCount); } /** diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index ed7692bf8..decf7d747 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -627,7 +627,9 @@ public WebResourceResponse shouldInterceptRequest(WebView view, String url) { @Override @SuppressLint("NewApi") public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - if (!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico")) { + if (!request.isForMainFrame() + && request.getUrl().getPath() != null + && request.getUrl().getPath().endsWith("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, null); } catch (Exception e) { From 15f437eaed91e7ef008127a371cf21665f0b7187 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 27 Jun 2018 13:39:31 +0530 Subject: [PATCH 028/139] Revert

margin changes --- folioreader/src/main/assets/css/Style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/folioreader/src/main/assets/css/Style.css b/folioreader/src/main/assets/css/Style.css index 0e832c7f1..4751e311e 100755 --- a/folioreader/src/main/assets/css/Style.css +++ b/folioreader/src/main/assets/css/Style.css @@ -76,7 +76,7 @@ a { -webkit-touch-callout: none; } /* Disable link callback */ * { -webkit-user-select: text; } img { -webkit-user-select: none; } p { - margin: 1.3em 0 1.5em 0 !important; + margin: 1.3em 0 1.5em 0; line-height: 1.40em !important; text-indent: 1.25em; } From fabf6f7e992f3e6994c18b704a6703d64084a50a Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 27 Jun 2018 13:45:13 +0530 Subject: [PATCH 029/139] Make LoadingView focusable and clickable --- folioreader/res/layout/view_loading.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/folioreader/res/layout/view_loading.xml b/folioreader/res/layout/view_loading.xml index cdf2e9570..d6842d3a8 100644 --- a/folioreader/res/layout/view_loading.xml +++ b/folioreader/res/layout/view_loading.xml @@ -5,6 +5,8 @@ android:id="@+id/rootView" android:layout_width="match_parent" android:layout_height="match_parent" + android:clickable="true" + android:focusable="true" tools:background="@color/webview_night"> Date: Wed, 27 Jun 2018 16:28:02 +0530 Subject: [PATCH 030/139] Remove transition effect and optimise workaround for slow rendering --- folioreader/src/main/assets/css/Style.css | 1 - folioreader/src/main/assets/js/Bridge.js | 38 ++++++++++++++++------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/folioreader/src/main/assets/css/Style.css b/folioreader/src/main/assets/css/Style.css index 4751e311e..16ccc2c3e 100755 --- a/folioreader/src/main/assets/css/Style.css +++ b/folioreader/src/main/assets/css/Style.css @@ -194,7 +194,6 @@ html .highlight_yellow, html .highlight_green, html .highlight_blue, html .highl */ html { - -webkit-transition: all 0.6s ease; background-color: #FFFFFF !important; } diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 609cd42de..ca835dbee 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -397,22 +397,35 @@ function getCompatMode() { } var scrollWidth; +var horizontalInterval; +var horizontalIntervalPeriod = 1000; +var horizontalIntervalCounter = 0; +var horizontalIntervalLimit = 3000; + +function horizontalRecheck() { + + horizontalIntervalCounter += horizontalIntervalPeriod; + + if (window.scrollWidth != document.documentElement.scrollWidth) { + // Rare condition + // This might happen when document.documentElement.scrollWidth gives incorrect value + // when the webview is busy re-drawing contents. + //console.log("-> horizontalIntervalCounter = " + horizontalIntervalCounter); + console.warn("-> scrollWidth changed from " + window.scrollWidth + " to " + + document.documentElement.scrollWidth); + postInitHorizontalDirection(); + } + + if (horizontalIntervalCounter >= horizontalIntervalLimit) + clearInterval(horizontalInterval); +} function initHorizontalDirection() { preInitHorizontalDirection(); postInitHorizontalDirection(); - setTimeout(function() { - if (window.scrollWidth != document.documentElement.scrollWidth) { - // Rare condition - // This might happen when document.documentElement.scrollWidth gives incorrect value - // when the webview is busy re-drawing contents. - console.warn("-> scrollWidth changed from " + window.scrollWidth + " to " + - document.documentElement.scrollWidth); - postInitHorizontalDirection(); - } - }, 1000); + horizontalInterval = setInterval(horizontalRecheck, horizontalIntervalPeriod); } function preInitHorizontalDirection() { @@ -468,8 +481,11 @@ function postInitHorizontalDirection() { var clientWidth = document.documentElement.clientWidth; var scrollWidth = document.documentElement.scrollWidth; - if (scrollWidth > clientWidth) + //console.log("-> document.documentElement.offsetWidth = " + document.documentElement.offsetWidth); + if (scrollWidth > clientWidth + && scrollWidth > document.documentElement.offsetWidth) { scrollWidth += paddingRight; + } var newBodyWidth = scrollWidth - (paddingLeft + paddingRight); window.scrollWidth = scrollWidth; From 83a1504804ca4793db12bd0d09bcce775077033f Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 27 Jun 2018 18:19:48 +0530 Subject: [PATCH 031/139] Nullify highlightId and anchorId --- folioreader/res/layout/folio_page_fragment.xml | 3 ++- .../ui/folio/fragment/FolioPageFragment.java | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/folioreader/res/layout/folio_page_fragment.xml b/folioreader/res/layout/folio_page_fragment.xml index 25c66de0d..45e2e1e81 100644 --- a/folioreader/res/layout/folio_page_fragment.xml +++ b/folioreader/res/layout/folio_page_fragment.xml @@ -49,7 +49,8 @@ android:gravity="center" android:orientation="horizontal" android:paddingBottom="2dp" - android:paddingTop="2dp"> + android:paddingTop="2dp" + android:visibility="gone"> 0 && mAnchorId != null) { + if (mWebview.getContentHeight() > 0 && mAnchorId != null + && loadingView != null && loadingView.getVisibility() != View.VISIBLE) { mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); + mAnchorId = null; } } } @@ -533,9 +536,11 @@ public void onPageFinished(WebView view, String url) { } else if (!TextUtils.isEmpty(mAnchorId)) { mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); + mAnchorId = null; } else if (!TextUtils.isEmpty(highlightId)) { - scrollToHighlightId(highlightId); + mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); + highlightId = null; } else if (isCurrentFragment()) { @@ -1169,6 +1174,10 @@ public void onError() { public void scrollToHighlightId(String highlightId) { this.highlightId = highlightId; - mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); + + if (loadingView != null && loadingView.getVisibility() != View.VISIBLE) { + mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); + this.highlightId = null; + } } } From 074b951c0baf0381ae1c4cce5847dbf037c3a756 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 27 Jun 2018 18:40:45 +0530 Subject: [PATCH 032/139] Eliminate EventBus for anchorId --- .../ui/folio/activity/FolioActivity.java | 7 ++--- .../ui/folio/fragment/FolioPageFragment.java | 27 +++++-------------- 2 files changed, 11 insertions(+), 23 deletions(-) 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 5f6670483..e3c1e2dd5 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 @@ -36,7 +36,6 @@ import com.folioreader.R; import com.folioreader.model.HighlightImpl; import com.folioreader.model.ReadPosition; -import com.folioreader.model.event.AnchorIdEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; import com.folioreader.ui.folio.adapter.FolioPageFragmentAdapter; import com.folioreader.ui.folio.fragment.FolioPageFragment; @@ -277,15 +276,17 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ACTION_CONTENT_HIGHLIGHT && resultCode == RESULT_OK && data.hasExtra(TYPE)) { String type = data.getStringExtra(TYPE); + if (type.equals(CHAPTER_SELECTED)) { - //TODO: -> try to eliminate EventBus if possible String selectedChapterHref = data.getStringExtra(SELECTED_CHAPTER_POSITION); for (Link spine : mSpineReferenceList) { if (selectedChapterHref.contains(spine.href)) { mChapterPosition = mSpineReferenceList.indexOf(spine); mFolioPageViewPager.setCurrentItem(mChapterPosition); toolbar.setTitle(data.getStringExtra(Constants.BOOK_TITLE)); - EventBus.getDefault().post(new AnchorIdEvent(selectedChapterHref)); + FolioPageFragment folioPageFragment = (FolioPageFragment) + mFolioPageFragmentAdapter.getItem(mChapterPosition); + folioPageFragment.scrollToAnchorId(selectedChapterHref); break; } } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 8f27bd493..ca184c6b4 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -39,7 +39,6 @@ import com.folioreader.model.HighlightImpl; import com.folioreader.model.ReadPosition; import com.folioreader.model.ReadPositionImpl; -import com.folioreader.model.event.AnchorIdEvent; import com.folioreader.model.event.MediaOverlayHighlightStyleEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; import com.folioreader.model.event.MediaOverlaySpeedEvent; @@ -52,7 +51,6 @@ import com.folioreader.ui.base.HtmlTask; import com.folioreader.ui.base.HtmlTaskCallback; import com.folioreader.ui.base.HtmlUtil; -import com.folioreader.ui.folio.activity.FolioActivity; import com.folioreader.ui.folio.activity.FolioActivityCallback; import com.folioreader.ui.folio.mediaoverlay.MediaController; import com.folioreader.ui.folio.mediaoverlay.MediaControllerCallbacks; @@ -317,24 +315,13 @@ public void updateHighlight(UpdateHighlightEvent event) { } } - /** - * [EVENT BUS FUNCTION] - * Function triggered from {@link FolioActivity#onActivityResult(int, int, Intent)} when any item in toc clicked. - * - * @param event of type {@link AnchorIdEvent} contains selected chapter href. - */ - @SuppressWarnings("unused") - @Subscribe(threadMode = ThreadMode.MAIN) - public void jumpToAnchorPoint(AnchorIdEvent event) { - if (isAdded() && event != null && event.getHref() != null) { - String href = event.getHref(); - if (href != null && href.indexOf('#') != -1 && spineItem.href.equals(href.substring(0, href.lastIndexOf('#')))) { - mAnchorId = href.substring(href.lastIndexOf('#') + 1); - if (mWebview.getContentHeight() > 0 && mAnchorId != null - && loadingView != null && loadingView.getVisibility() != View.VISIBLE) { - mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); - mAnchorId = null; - } + public void scrollToAnchorId(String href) { + + if (!TextUtils.isEmpty(href) && href.indexOf('#') != -1) { + mAnchorId = href.substring(href.lastIndexOf('#') + 1); + if (loadingView != null && loadingView.getVisibility() != View.VISIBLE) { + mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); + mAnchorId = null; } } } From 71f639e50a449fd9b8979ed33ce796668fe4e0c1 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 27 Jun 2018 19:02:51 +0530 Subject: [PATCH 033/139] scrollToFirst the chapter selected from TOC --- .../java/com/folioreader/ui/folio/activity/FolioActivity.java | 1 + 1 file changed, 1 insertion(+) 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 e3c1e2dd5..f0a105174 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 @@ -286,6 +286,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { toolbar.setTitle(data.getStringExtra(Constants.BOOK_TITLE)); FolioPageFragment folioPageFragment = (FolioPageFragment) mFolioPageFragmentAdapter.getItem(mChapterPosition); + folioPageFragment.scrollToFirst(); folioPageFragment.scrollToAnchorId(selectedChapterHref); break; } From ee5aadb36726e20aee01010a642c68d4b0e845bc Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 28 Jun 2018 12:32:38 +0530 Subject: [PATCH 034/139] Fix bug in anchor scrolling --- folioreader/res/values/strings.xml | 3 ++- folioreader/src/main/assets/js/Bridge.js | 2 +- .../folioreader/ui/folio/fragment/FolioPageFragment.java | 8 ++++---- .../src/main/java/com/folioreader/view/FolioToolbar.kt | 4 +--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index 6ea4ae2b1..182fa14f2 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -66,7 +66,8 @@ please wait till audio is been parsed, Retry after some time javascript:alert(audioMarkID(\'epub-media-overlay-playing\',\'%s\')) javascript:setMediaOverlayStyle(\'%s\') - javascript:gotoHighlight(\'%s\') + javascript:goToAnchor(\'%s\') + javascript:goToHighlight(\'%s\') javascript:getHighlightString(\'%s\') javascript:setHighlightStyle(\'%s\'); ]]> diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index ca835dbee..8f147dad2 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -921,7 +921,7 @@ function getHighlightString(style) { Highlight.getHighlightJson(JSON.stringify(params)); } -function gotoHighlight(highlightId){ +function goToHighlight(highlightId){ var element = document.getElementById(highlightId.toString()); if (element) goToElement(element); diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index ca184c6b4..91e36e74a 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -320,7 +320,7 @@ public void scrollToAnchorId(String href) { if (!TextUtils.isEmpty(href) && href.indexOf('#') != -1) { mAnchorId = href.substring(href.lastIndexOf('#') + 1); if (loadingView != null && loadingView.getVisibility() != View.VISIBLE) { - mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); + mWebview.loadUrl(String.format(getString(R.string.go_to_anchor), mAnchorId)); mAnchorId = null; } } @@ -522,11 +522,11 @@ public void onPageFinished(WebView view, String url) { mIsPageReloaded = false; } else if (!TextUtils.isEmpty(mAnchorId)) { - mWebview.loadUrl(String.format("javascript:goToAnchor(%s)", mAnchorId)); + mWebview.loadUrl(String.format(getString(R.string.go_to_anchor), mAnchorId)); mAnchorId = null; } else if (!TextUtils.isEmpty(highlightId)) { - mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); + mWebview.loadUrl(String.format(getString(R.string.go_to_highlight), highlightId)); highlightId = null; } else if (isCurrentFragment()) { @@ -1163,7 +1163,7 @@ public void scrollToHighlightId(String highlightId) { this.highlightId = highlightId; if (loadingView != null && loadingView.getVisibility() != View.VISIBLE) { - mWebview.loadUrl(String.format(getString(R.string.goto_highlight), highlightId)); + mWebview.loadUrl(String.format(getString(R.string.go_to_highlight), highlightId)); this.highlightId = null; } } diff --git a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt index 154fec61f..cea80ae3c 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt +++ b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt @@ -65,9 +65,7 @@ class FolioToolbar : RelativeLayout { } fun setTitle(title: String?) { - title?.let { - label_center?.text = title - } + label_center?.text = title } fun showOrHideIfVisible() { From e132939049c3a45b179afb4dd055aa47ed46cb11 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 28 Jun 2018 13:38:31 +0530 Subject: [PATCH 035/139] Add duration limit for LoadingView --- folioreader/src/main/assets/js/Bridge.js | 25 +++++++++--- .../ui/folio/fragment/FolioPageFragment.java | 17 ++++---- .../com/folioreader/view/LoadingView.java | 40 +++++++++++++++++++ 3 files changed, 68 insertions(+), 14 deletions(-) diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 8f147dad2..04a7565d5 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -341,6 +341,19 @@ var WebViewPager = { }; var LoadingView = { + + show : function() { + console.warn("-> Mock call to LoadingView.show()"); + }, + + hide : function() { + console.warn("-> Mock call to LoadingView.hide()"); + }, + + visible : function() { + console.warn("-> Mock call to LoadingView.visible()"); + }, + invisible : function() { console.warn("-> Mock call to LoadingView.invisible()"); } @@ -372,7 +385,7 @@ function scrollToLast() { WebViewPager.setPageToLast(); } - LoadingView.invisible(); + LoadingView.hide(); } function scrollToFirst() { @@ -389,7 +402,7 @@ function scrollToFirst() { WebViewPager.setPageToFirst(); } - LoadingView.invisible(); + LoadingView.hide(); } function getCompatMode() { @@ -858,13 +871,13 @@ function scrollToSpan(usingId, value) { var spanCollection = document.getElementsByTagName("span"); if (spanCollection.length == 0 || value < 0 || value >= spanCollection.length || value == null) { - LoadingView.invisible(); + LoadingView.hide(); return; } goToElement(spanCollection[value]); } - LoadingView.invisible(); + LoadingView.hide(); } // Class based onClick listener @@ -926,7 +939,7 @@ function goToHighlight(highlightId){ if (element) goToElement(element); - LoadingView.invisible(); + LoadingView.hide(); } function goToAnchor(anchorId) { @@ -934,7 +947,7 @@ function goToAnchor(anchorId) { if (element) goToElement(element); - LoadingView.invisible(); + LoadingView.hide(); } $(function(){ diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 91e36e74a..ce509d6a9 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -291,7 +291,7 @@ public void reload(ReloadDataEvent reloadDataEvent) { if (isAdded()) { loadingView.updateTheme(); - loadingView.setVisibility(View.VISIBLE); + loadingView.show(); mIsPageReloaded = true; setHtml(true); updatePagesLeftTextBg(); @@ -320,6 +320,7 @@ public void scrollToAnchorId(String href) { if (!TextUtils.isEmpty(href) && href.indexOf('#') != -1) { mAnchorId = href.substring(href.lastIndexOf('#') + 1); if (loadingView != null && loadingView.getVisibility() != View.VISIBLE) { + loadingView.show(); mWebview.loadUrl(String.format(getString(R.string.go_to_anchor), mAnchorId)); mAnchorId = null; } @@ -384,7 +385,7 @@ public void scrollToLast() { Log.d(LOG_TAG, "-> scrollToLast -> isPageLoading = " + isPageLoading); if (!isPageLoading) { - loadingView.setVisibility(View.VISIBLE); + loadingView.show(); mWebview.loadUrl("javascript:scrollToLast()"); } } @@ -395,7 +396,7 @@ public void scrollToFirst() { Log.d(LOG_TAG, "-> scrollToFirst -> isPageLoading = " + isPageLoading); if (!isPageLoading) { - loadingView.setVisibility(View.VISIBLE); + loadingView.show(); mWebview.loadUrl("javascript:scrollToFirst()"); } } @@ -508,14 +509,13 @@ public void onPageFinished(WebView view, String url) { if (isCurrentFragment()) { mWebview.loadUrl(String.format("javascript:scrollToSpan(%b, %s)", lastReadPosition.isUsingId(), lastReadPosition.getValue())); - } else { if (mPosition == mActivityCallback.getChapterPosition() - 1) { // Scroll to last, the page before current page mWebview.loadUrl("javascript:scrollToLast()"); } else { // Make loading view invisible for all other fragments - loadingView.invisible(); + loadingView.hide(); } } @@ -546,17 +546,17 @@ public void onPageFinished(WebView view, String url) { mWebview.loadUrl(String.format("javascript:scrollToSpan(%b, %s)", readPosition.isUsingId(), readPosition.getValue())); } else { - loadingView.invisible(); + loadingView.hide(); } } else { if (mPosition == mActivityCallback.getChapterPosition() - 1) { // Scroll to last, the page before current page - mWebview.loadUrl("javascript:scrollToLast()"); + mWebview.loadUrl("javascript:scrollToLast()"); } else { // Make loading view invisible for all other fragments - loadingView.invisible(); + loadingView.hide(); } } } @@ -1163,6 +1163,7 @@ public void scrollToHighlightId(String highlightId) { this.highlightId = highlightId; if (loadingView != null && loadingView.getVisibility() != View.VISIBLE) { + loadingView.show(); mWebview.loadUrl(String.format(getString(R.string.go_to_highlight), highlightId)); this.highlightId = null; } diff --git a/folioreader/src/main/java/com/folioreader/view/LoadingView.java b/folioreader/src/main/java/com/folioreader/view/LoadingView.java index b89e2e24e..cef393097 100644 --- a/folioreader/src/main/java/com/folioreader/view/LoadingView.java +++ b/folioreader/src/main/java/com/folioreader/view/LoadingView.java @@ -1,9 +1,11 @@ package com.folioreader.view; import android.content.Context; +import android.os.Handler; import android.support.constraint.ConstraintLayout; import android.support.v4.content.ContextCompat; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import android.webkit.JavascriptInterface; import android.widget.FrameLayout; @@ -18,6 +20,15 @@ public class LoadingView extends FrameLayout { private ConstraintLayout rootView; private ProgressBar progressBar; + private static final int VISIBLE_DURATION = 6000; + private Handler handler; + + private Runnable hideRunnable = new Runnable() { + @Override + public void run() { + hide(); + } + }; private static final String LOG_TAG = LoadingView.class.getSimpleName(); @@ -43,10 +54,12 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr) { if (isInEditMode()) return; + handler = new Handler(); rootView = findViewById(R.id.rootView); progressBar = findViewById(R.id.progressBar); updateTheme(); + show(); } public void updateTheme() { @@ -62,9 +75,36 @@ public void updateTheme() { } } + @SuppressWarnings("unused") + @JavascriptInterface + public void show() { + //Log.d(LOG_TAG, "-> show"); + + handler.removeCallbacks(hideRunnable); + setVisibility(VISIBLE); + handler.postDelayed(hideRunnable, VISIBLE_DURATION); + } + + @SuppressWarnings("unused") + @JavascriptInterface + public void hide() { + //Log.d(LOG_TAG, "-> hide"); + + handler.removeCallbacks(hideRunnable); + setVisibility(INVISIBLE); + } + + @SuppressWarnings("unused") + @JavascriptInterface + public void visible() { + //Log.d(LOG_TAG, "-> visible"); + setVisibility(VISIBLE); + } + @SuppressWarnings("unused") @JavascriptInterface public void invisible() { + //Log.d(LOG_TAG, "-> invisible"); setVisibility(INVISIBLE); } } From fa7f133f99f2840eaa761a0c7347a0f46c216fb2 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 28 Jun 2018 16:14:11 +0530 Subject: [PATCH 036/139] Make margin override for html and body This is done because if the html and body has its own margins then vertical direction doesn't have any issue but for horizontal direction pagination layout breaks. --- folioreader/src/main/assets/css/Style.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/folioreader/src/main/assets/css/Style.css b/folioreader/src/main/assets/css/Style.css index 16ccc2c3e..400acc4b3 100755 --- a/folioreader/src/main/assets/css/Style.css +++ b/folioreader/src/main/assets/css/Style.css @@ -33,10 +33,12 @@ footer, header, hgroup, menu, nav, section { /* ePUB */ html { -webkit-text-size-adjust: none; /* Never autoresize text */ + margin: 0 !important; padding: 0 0 !important; } body { + margin: 0 !important; padding: 20px 20px !important; overflow: !important; } From 90574ca01a427b241e88ef5874f0f2c8d35d0415 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 28 Jun 2018 16:17:07 +0530 Subject: [PATCH 037/139] Remove setTitle for TOC link clicked If the text is set here then it would change only when next page is selected. --- .../java/com/folioreader/ui/folio/activity/FolioActivity.java | 1 - 1 file changed, 1 deletion(-) 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 f0a105174..4bbb48d9b 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 @@ -283,7 +283,6 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (selectedChapterHref.contains(spine.href)) { mChapterPosition = mSpineReferenceList.indexOf(spine); mFolioPageViewPager.setCurrentItem(mChapterPosition); - toolbar.setTitle(data.getStringExtra(Constants.BOOK_TITLE)); FolioPageFragment folioPageFragment = (FolioPageFragment) mFolioPageFragmentAdapter.getItem(mChapterPosition); folioPageFragment.scrollToFirst(); From c0c435d923a340b957b30975674d784feb186468 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 28 Jun 2018 19:31:56 +0530 Subject: [PATCH 038/139] Edit log level --- folioreader/src/main/assets/js/Bridge.js | 5 +-- .../ui/folio/activity/FolioActivity.java | 10 +++--- .../ui/folio/fragment/FolioPageFragment.java | 36 ++++++------------- .../com/folioreader/view/FolioWebView.java | 3 +- .../com/folioreader/view/WebViewPager.java | 4 +-- 5 files changed, 22 insertions(+), 36 deletions(-) diff --git a/folioreader/src/main/assets/js/Bridge.js b/folioreader/src/main/assets/js/Bridge.js index 04a7565d5..07229dd90 100755 --- a/folioreader/src/main/assets/js/Bridge.js +++ b/folioreader/src/main/assets/js/Bridge.js @@ -425,7 +425,7 @@ function horizontalRecheck() { // when the webview is busy re-drawing contents. //console.log("-> horizontalIntervalCounter = " + horizontalIntervalCounter); console.warn("-> scrollWidth changed from " + window.scrollWidth + " to " + - document.documentElement.scrollWidth); + document.documentElement.scrollWidth); postInitHorizontalDirection(); } @@ -448,7 +448,8 @@ function preInitHorizontalDirection() { var htmlElement = document.getElementsByTagName('html')[0]; var bodyElement = document.getElementsByTagName('body')[0]; - // TODO: -> Check if this is needed + // Required when initHorizontalDirection() is called multiple times. + // Currently it is called only once per page. htmlElement.style.width = null; bodyElement.style.width = null; htmlElement.style.height = null; 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 4bbb48d9b..a98001b8f 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 @@ -213,7 +213,7 @@ private void getEpubResource() { @Override public void onDirectionChange(@NonNull Config.Direction newDirection) { - Log.d(LOG_TAG, "-> onDirectionChange"); + Log.v(LOG_TAG, "-> onDirectionChange"); FolioPageFragment folioPageFragment = (FolioPageFragment) mFolioPageFragmentAdapter.getItem(mFolioPageViewPager.getCurrentItem()); @@ -349,7 +349,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @Override public void onPageSelected(int position) { - Log.d(LOG_TAG, "-> onPageSelected -> DirectionalViewpager -> position = " + position); + Log.v(LOG_TAG, "-> onPageSelected -> DirectionalViewpager -> position = " + position); EventBus.getDefault().post(new MediaOverlayPlayPauseEvent( mSpineReferenceList.get(mChapterPosition).href, false, true)); @@ -363,7 +363,7 @@ public void onPageScrollStateChanged(int state) { if (state == DirectionalViewpager.SCROLL_STATE_IDLE) { int position = mFolioPageViewPager.getCurrentItem(); - Log.d(LOG_TAG, "-> onPageScrollStateChanged -> DirectionalViewpager -> " + + Log.v(LOG_TAG, "-> onPageScrollStateChanged -> DirectionalViewpager -> " + "position = " + position); FolioPageFragment folioPageFragment = @@ -450,7 +450,7 @@ private int getChapterIndex(String caseString, String value) { @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - Log.d(LOG_TAG, "-> onSaveInstanceState"); + Log.v(LOG_TAG, "-> onSaveInstanceState"); this.outState = outState; outState.putBoolean(BUNDLE_TOOLBAR_IS_VISIBLE, toolbar.getVisible()); @@ -458,7 +458,7 @@ protected void onSaveInstanceState(Bundle outState) { @Override public void storeLastReadPosition(ReadPosition lastReadPosition) { - Log.d(LOG_TAG, "-> storeLastReadPosition"); + Log.v(LOG_TAG, "-> storeLastReadPosition"); this.lastReadPosition = lastReadPosition; } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index ce509d6a9..f47c0ab18 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -113,10 +113,6 @@ public class FolioPageFragment private String rangy = ""; private String highlightId; - //TODO: -> remove after debugging - private Date beforeWait; - private Date beforeNotify; - private ReadPosition lastReadPosition; private Bundle outState; private Bundle savedInstanceState; @@ -184,9 +180,6 @@ public View onCreateView(LayoutInflater inflater, mBookId = getArguments().getString(FolioReader.INTENT_BOOK_ID); } - if (isCurrentFragment()) - Log.d(LOG_TAG, "-> onCreateView"); - if (spineItem != null) { if (spineItem.properties.contains("media-overlay")) { mediaController = new MediaController(getActivity(), MediaController.MediaType.SMIL, this); @@ -382,7 +375,7 @@ public String getDirection() { public void scrollToLast() { boolean isPageLoading = loadingView == null || loadingView.getVisibility() == View.VISIBLE; - Log.d(LOG_TAG, "-> scrollToLast -> isPageLoading = " + isPageLoading); + Log.v(LOG_TAG, "-> scrollToLast -> isPageLoading = " + isPageLoading); if (!isPageLoading) { loadingView.show(); @@ -393,7 +386,7 @@ public void scrollToLast() { public void scrollToFirst() { boolean isPageLoading = loadingView == null || loadingView.getVisibility() == View.VISIBLE; - Log.d(LOG_TAG, "-> scrollToFirst -> isPageLoading = " + isPageLoading); + Log.v(LOG_TAG, "-> scrollToFirst -> isPageLoading = " + isPageLoading); if (!isPageLoading) { loadingView.show(); @@ -460,7 +453,6 @@ public void startSelection() { @Override public void selectionChanged(String text) { - Log.d(LOG_TAG, "-> selectionChanged -> " + text); mSelectedText = text; getActivity().runOnUiThread(new Runnable() { @Override @@ -533,16 +525,16 @@ public void onPageFinished(WebView view, String url) { ReadPosition readPosition; if (savedInstanceState == null) { - Log.d(LOG_TAG, "-> onPageFinished -> took from getEntryReadPosition"); + Log.v(LOG_TAG, "-> onPageFinished -> took from getEntryReadPosition"); readPosition = mActivityCallback.getEntryReadPosition(); } else { - Log.d(LOG_TAG, "-> onPageFinished -> took from bundle"); + Log.v(LOG_TAG, "-> onPageFinished -> took from bundle"); readPosition = savedInstanceState.getParcelable(BUNDLE_READ_POSITION_CONFIG_CHANGE); savedInstanceState.remove(BUNDLE_READ_POSITION_CONFIG_CHANGE); } if (readPosition != null) { - Log.d(LOG_TAG, "-> scrollToSpan -> " + readPosition.getValue()); + Log.v(LOG_TAG, "-> scrollToSpan -> " + readPosition.getValue()); mWebview.loadUrl(String.format("javascript:scrollToSpan(%b, %s)", readPosition.isUsingId(), readPosition.getValue())); } else { @@ -699,7 +691,7 @@ public boolean onJsAlert(WebView view, String url, String message, JsResult resu @Override public void onStop() { super.onStop(); - Log.d(LOG_TAG, "-> onStop -> " + spineItem.originalHref + " -> " + isCurrentFragment()); + Log.v(LOG_TAG, "-> onStop -> " + spineItem.originalHref + " -> " + isCurrentFragment()); mediaController.stop(); //TODO save last media overlay item @@ -709,15 +701,14 @@ public void onStop() { } public ReadPosition getLastReadPosition() { - Log.d(LOG_TAG, "-> getLastReadPosition -> " + spineItem.originalHref); + Log.v(LOG_TAG, "-> getLastReadPosition -> " + spineItem.originalHref); try { synchronized (this) { - boolean isHorizontal = mActivityCallback.getDirection() == Config.Direction.HORIZONTAL; mWebview.loadUrl("javascript:getFirstVisibleSpan(" + isHorizontal +")"); - beforeWait = new Date(); + wait(2000); } } catch (InterruptedException e) { @@ -745,10 +736,6 @@ public void storeFirstVisibleSpan(boolean usingId, String value) { intent.putExtra(FolioReader.EXTRA_READ_POSITION, lastReadPosition); LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); - beforeNotify = new Date(); - Log.i(LOG_TAG, "-> storeFirstVisibleSpan -> time taken for last read position evaluation = " - + (beforeNotify.getTime() - beforeWait.getTime())); - notify(); } } @@ -756,9 +743,8 @@ public void storeFirstVisibleSpan(boolean usingId, String value) { @SuppressWarnings("unused") @JavascriptInterface public void setHorizontalPageCount(int horizontalPageCount) { - - if (isCurrentFragment()) - Log.d(LOG_TAG, "-> setHorizontalPageCount = " + horizontalPageCount); + Log.v(LOG_TAG, "-> setHorizontalPageCount = " + horizontalPageCount + + " -> " + spineItem.originalHref); mWebview.setHorizontalPageCount(horizontalPageCount); } @@ -900,7 +886,7 @@ public void onSaveInstanceState(Bundle outState) { this.outState = outState; if (isCurrentFragment()) - Log.d(LOG_TAG, "-> onSaveInstanceState"); + Log.v(LOG_TAG, "-> onSaveInstanceState"); outState.putInt(KEY_FRAGMENT_FOLIO_POSITION, mPosition); outState.putString(KEY_FRAGMENT_FOLIO_BOOK_TITLE, mBookTitle); diff --git a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java index 6c46aa211..687ab39d0 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java +++ b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java @@ -67,7 +67,7 @@ private void init() { @SuppressWarnings("unused") @JavascriptInterface public void setCompatMode(String compatMode) { - Log.d(LOG_TAG, "-> setCompatMode -> compatMode = " + compatMode); + Log.v(LOG_TAG, "-> setCompatMode -> compatMode = " + compatMode); if (compatMode.equals(getContext().getString(R.string.back_compat))) { Log.e(LOG_TAG, "-> Web page loaded in Quirks mode. Please report to developer " + "for debugging with current EPUB file as many features might stop working " + @@ -99,7 +99,6 @@ public void setToolBarListener(ToolBarListener listener) { mToolBarListener = listener; } - @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { //Log.v(LOG_TAG, "-> onTouchEvent -> " + AppUtil.actionToString(event.getAction())); diff --git a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java index f9d4cda33..ac9936284 100644 --- a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java +++ b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java @@ -62,7 +62,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @Override public void onPageSelected(int position) { - Log.d(LOG_TAG, "-> onPageSelected -> " + position); + Log.v(LOG_TAG, "-> onPageSelected -> " + position); } @Override @@ -102,7 +102,7 @@ public void setHorizontalPageCount(int horizontalPageCount) { @SuppressWarnings("unused") @JavascriptInterface public void setCurrentPage(final int pageIndex) { - Log.d(LOG_TAG, "-> setCurrentItem -> pageIndex = " + pageIndex); + Log.v(LOG_TAG, "-> setCurrentItem -> pageIndex = " + pageIndex); handler.post(new Runnable() { @Override From 3f344e61038ca124498b39d3cbad2ea2bc03abb2 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Fri, 29 Jun 2018 12:54:07 +0530 Subject: [PATCH 039/139] Default allowedDirection to ONLY_VERTICAL and direction to VERTICAL --- .../src/main/java/com/folioreader/Config.java | 53 ++++++++++++------- .../java/com/folioreader/util/AppUtil.java | 4 +- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/folioreader/src/main/java/com/folioreader/Config.java b/folioreader/src/main/java/com/folioreader/Config.java index 346111cbf..9210906ce 100644 --- a/folioreader/src/main/java/com/folioreader/Config.java +++ b/folioreader/src/main/java/com/folioreader/Config.java @@ -16,8 +16,8 @@ public class Config implements Parcelable { public static final String EXTRA_OVERRIDE_CONFIG = "com.folioreader.extra.OVERRIDE_CONFIG"; public static final String CONFIG_FONT = "font"; public static final String CONFIG_FONT_SIZE = "font_size"; - public static final String CONFIG_IS_NIGHTMODE = "is_night_mode"; - public static final String CONFIG_IS_THEMECOLOR = "theme_color"; + public static final String CONFIG_IS_NIGHT_MODE = "is_night_mode"; + public static final String CONFIG_IS_THEME_COLOR = "theme_color"; public static final String CONFIG_IS_TTS = "is_tts"; public static final String CONFIG_ALLOWED_DIRECTION = "allowed_direction"; public static final String CONFIG_DIRECTION = "direction"; @@ -27,8 +27,10 @@ public class Config implements Parcelable { private boolean nightMode; private int themeColor = R.color.app_green; private boolean showTts = true; - private AllowedDirection allowedDirection = AllowedDirection.ONLY_VERTICAL; - private Direction direction = Direction.VERTICAL; + private static final AllowedDirection DEFAULT_ALLOWED_DIRECTION = AllowedDirection.ONLY_VERTICAL; + private static final Direction DEFAULT_DIRECTION = Direction.VERTICAL; + private AllowedDirection allowedDirection = DEFAULT_ALLOWED_DIRECTION; + private Direction direction = DEFAULT_DIRECTION; public enum AllowedDirection { ONLY_VERTICAL, ONLY_HORIZONTAL, VERTICAL_AND_HORIZONTAL @@ -93,8 +95,8 @@ public Config(int font, int fontSize, boolean nightMode, int themeColor, boolean public Config(JSONObject jsonObject) { font = jsonObject.optInt(CONFIG_FONT); fontSize = jsonObject.optInt(CONFIG_FONT_SIZE); - nightMode = jsonObject.optBoolean(CONFIG_IS_NIGHTMODE); - themeColor = jsonObject.optInt(CONFIG_IS_THEMECOLOR); + nightMode = jsonObject.optBoolean(CONFIG_IS_NIGHT_MODE); + themeColor = jsonObject.optInt(CONFIG_IS_THEME_COLOR); showTts = jsonObject.optBoolean(CONFIG_IS_TTS); allowedDirection = getAllowedDirectionFromString(LOG_TAG, jsonObject.optString(CONFIG_ALLOWED_DIRECTION)); @@ -109,9 +111,9 @@ public static Direction getDirectionFromString(String LOG_TAG, String directionS case "HORIZONTAL": return Direction.HORIZONTAL; default: - Log.w(LOG_TAG, "-> Illegal argument directionString = " + directionString - + ", defaulting direction to " + Direction.VERTICAL.toString()); - return Direction.VERTICAL; + Log.w(LOG_TAG, "-> Illegal argument directionString = `" + directionString + + "`, defaulting direction to " + DEFAULT_DIRECTION); + return DEFAULT_DIRECTION; } } @@ -126,9 +128,10 @@ public static AllowedDirection getAllowedDirectionFromString(String LOG_TAG, case "VERTICAL_AND_HORIZONTAL": return AllowedDirection.VERTICAL_AND_HORIZONTAL; default: - Log.w(LOG_TAG, "-> Illegal argument allowedDirectionString = " + allowedDirectionString - + ", defaulting allowedDirection to " + AllowedDirection.ONLY_VERTICAL.toString()); - return AllowedDirection.ONLY_VERTICAL; + Log.w(LOG_TAG, "-> Illegal argument allowedDirectionString = `" + + allowedDirectionString + "`, defaulting allowedDirection to " + + DEFAULT_ALLOWED_DIRECTION); + return DEFAULT_ALLOWED_DIRECTION; } } @@ -183,14 +186,22 @@ public Direction getDirection() { public Config setDirection(Direction direction) { - if (allowedDirection == AllowedDirection.ONLY_VERTICAL && direction != Direction.VERTICAL) { + if (allowedDirection == AllowedDirection.VERTICAL_AND_HORIZONTAL && direction == null) { + this.direction = DEFAULT_DIRECTION; + Log.w(LOG_TAG, "-> direction cannot be `null` when allowedDirection is " + + allowedDirection + ", defaulting direction to " + this.direction); + + } else if (allowedDirection == AllowedDirection.ONLY_VERTICAL && direction != Direction.VERTICAL) { this.direction = Direction.VERTICAL; + Log.w(LOG_TAG, "-> direction cannot be `" + direction + "` when allowedDirection is " + + allowedDirection + ", defaulting direction to " + this.direction); } else if (allowedDirection == AllowedDirection.ONLY_HORIZONTAL && direction != Direction.HORIZONTAL) { this.direction = Direction.HORIZONTAL; + Log.w(LOG_TAG, "-> direction cannot be `" + direction + "` when allowedDirection is " + + allowedDirection + ", defaulting direction to " + this.direction); } else { - this.allowedDirection = AllowedDirection.VERTICAL_AND_HORIZONTAL; this.direction = direction; } @@ -206,17 +217,21 @@ public Config setAllowedDirection(AllowedDirection allowedDirection) { this.allowedDirection = allowedDirection; if (allowedDirection == null) { - this.allowedDirection = AllowedDirection.VERTICAL_AND_HORIZONTAL; + this.allowedDirection = DEFAULT_ALLOWED_DIRECTION; + direction = DEFAULT_DIRECTION; + Log.w(LOG_TAG, "-> allowedDirection cannot be null, defaulting " + + "allowedDirection to " + DEFAULT_ALLOWED_DIRECTION + " and direction to " + + DEFAULT_DIRECTION); } else if (allowedDirection == AllowedDirection.ONLY_VERTICAL && direction != Direction.VERTICAL) { direction = Direction.VERTICAL; - Log.w(LOG_TAG, "-> Allowed direction is " + allowedDirection.toString() - + " so defaulting direction to " + direction.toString()); + Log.w(LOG_TAG, "-> allowedDirection is " + allowedDirection + + ", defaulting direction to " + direction); } else if (allowedDirection == AllowedDirection.ONLY_HORIZONTAL && direction != Direction.HORIZONTAL) { direction = Direction.HORIZONTAL; - Log.w(LOG_TAG, "-> Allowed direction is " + allowedDirection.toString() - + " so defaulting direction to " + direction.toString()); + Log.w(LOG_TAG, "-> allowedDirection is " + allowedDirection + + ", defaulting direction to " + direction); } return this; diff --git a/folioreader/src/main/java/com/folioreader/util/AppUtil.java b/folioreader/src/main/java/com/folioreader/util/AppUtil.java index 422878d8f..d6fef82dc 100644 --- a/folioreader/src/main/java/com/folioreader/util/AppUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/AppUtil.java @@ -91,8 +91,8 @@ public static void saveConfig(Context context, Config config) { try { obj.put(Config.CONFIG_FONT, config.getFont()); obj.put(Config.CONFIG_FONT_SIZE, config.getFontSize()); - obj.put(Config.CONFIG_IS_NIGHTMODE, config.isNightMode()); - obj.put(Config.CONFIG_IS_THEMECOLOR, config.getThemeColor()); + obj.put(Config.CONFIG_IS_NIGHT_MODE, config.isNightMode()); + obj.put(Config.CONFIG_IS_THEME_COLOR, config.getThemeColor()); obj.put(Config.CONFIG_IS_TTS, config.isShowTts()); obj.put(Config.CONFIG_ALLOWED_DIRECTION, config.getAllowedDirection().toString()); obj.put(Config.CONFIG_DIRECTION, config.getDirection().toString()); From 1545995ea97e4925759677a24a15b0be06622a9e Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Fri, 29 Jun 2018 20:35:47 +0530 Subject: [PATCH 040/139] Prepare v0.4.0 --- .travis.yml | 3 +- README.md | 49 +++++++---- folioreader/build.gradle | 2 +- .../src/main/java/com/folioreader/Config.java | 84 ++++++++++++------- .../java/com/folioreader/FolioReader.java | 9 +- .../folioreader/model/ReadPositionImpl.java | 2 +- .../ui/folio/activity/FolioActivity.java | 5 +- .../adapter/FolioPageFragmentAdapter.java | 1 - .../ui/folio/fragment/FolioPageFragment.java | 1 - .../java/com/folioreader/util/UiUtil.java | 1 - .../com/folioreader/view/FolioWebView.java | 1 - .../com/folioreader/view/LoadingView.java | 2 +- .../com/folioreader/view/WebViewPager.java | 1 - sample/src/main/AndroidManifest.xml | 1 - webViewMarker/build.gradle | 2 +- 15 files changed, 103 insertions(+), 61 deletions(-) diff --git a/.travis.yml b/.travis.yml index 827115c1c..97a89c460 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,7 @@ before_install: android: components: - - build-tools-27.0.3 - - android-27 + - android-28 - extra-android-m2repository licenses: diff --git a/README.md b/README.md index 7992389b4..f99023a76 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ FolioReader-Android is an ePub reader written in Java. - [x] Add Notes to a Highlight - [ ] Better Documentation - [x] Last Read Position Listener +- [x] Horizontal reading ## Demo ##### Custom Fonts @@ -35,12 +36,14 @@ FolioReader-Android is an ePub reader written in Java. ![Media Overlay](https://cloud.githubusercontent.com/assets/1277242/19012908/d61f3ce2-87df-11e6-8652-d72b6a1ad9a3.gif) ### Gradle -Add following dependency to your app build.gradle + +Add following dependency to your app build.gradle: + ``` java -compile 'com.folioreader:folioreader:0.3.11' +compile 'com.folioreader:folioreader:0.4.0' ``` -Add maven repository to your top level build.gradle +Add maven repository to your top level build.gradle: ```groovy allprojects { @@ -54,32 +57,50 @@ allprojects { ### Usage -First add activity tag for FolioActivity in your AndroidManifest.xml +First add permissions and activity tag for `FolioActivity` in your `AndroidManifest.xml`: ```xml - + + + + + + + + + ... + + + + ... + + + + ``` -To use FolioReader, get singleton object of **FolioReader**. +**Note: In case if you are upgrading to 0.4.0 and above don't forget to remove `android:configChanges="orientation|screenSize"` from `` tag of `FolioActivity`.** + +Get singleton object of `FolioReader`: ```java FolioReader folioReader = FolioReader.getInstance(getApplicationContext()); ``` -Call the function openBook(). +Call the function `openBook()`: -##### opening book from assets +##### opening book from assets - ```java -folioReader.openBook("file:///android_asset/adventures.epub"); +folioReader.openBook("file:///android_asset/TheSilverChair.epub"); ``` -##### opening book from raw +##### opening book from raw - ```java -folioReader.openBook(R.raw.barrett); +folioReader.openBook(R.raw.adventures); ``` ## WIKI diff --git a/folioreader/build.gradle b/folioreader/build.gradle index 9d9da4946..0d64acf77 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -17,7 +17,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.11' + libraryVersion = '0.4.0' developerId = 'mobisystech' developerName = 'Folio Reader' diff --git a/folioreader/src/main/java/com/folioreader/Config.java b/folioreader/src/main/java/com/folioreader/Config.java index 9210906ce..f0046f065 100644 --- a/folioreader/src/main/java/com/folioreader/Config.java +++ b/folioreader/src/main/java/com/folioreader/Config.java @@ -7,8 +7,9 @@ import org.json.JSONObject; /** - * Created by mahavir on 4/12/16. + * Configuration class for FolioReader. */ +@SuppressWarnings("PMD.AvoidDuplicateLiterals") public class Config implements Parcelable { private static final String LOG_TAG = Config.class.getSimpleName(); @@ -22,20 +23,27 @@ public class Config implements Parcelable { public static final String CONFIG_ALLOWED_DIRECTION = "allowed_direction"; public static final String CONFIG_DIRECTION = "direction"; public static final String INTENT_PORT = "port"; + private static final AllowedDirection DEFAULT_ALLOWED_DIRECTION = AllowedDirection.ONLY_VERTICAL; + private static final Direction DEFAULT_DIRECTION = Direction.VERTICAL; + private int font = 3; private int fontSize = 2; private boolean nightMode; private int themeColor = R.color.app_green; private boolean showTts = true; - private static final AllowedDirection DEFAULT_ALLOWED_DIRECTION = AllowedDirection.ONLY_VERTICAL; - private static final Direction DEFAULT_DIRECTION = Direction.VERTICAL; private AllowedDirection allowedDirection = DEFAULT_ALLOWED_DIRECTION; private Direction direction = DEFAULT_DIRECTION; + /** + * Reading modes available + */ public enum AllowedDirection { ONLY_VERTICAL, ONLY_HORIZONTAL, VERTICAL_AND_HORIZONTAL } + /** + * Reading directions + */ public enum Direction { VERTICAL, HORIZONTAL } @@ -180,38 +188,18 @@ public Config setShowTts(boolean showTts) { return this; } - public Direction getDirection() { - return direction; - } - - public Config setDirection(Direction direction) { - - if (allowedDirection == AllowedDirection.VERTICAL_AND_HORIZONTAL && direction == null) { - this.direction = DEFAULT_DIRECTION; - Log.w(LOG_TAG, "-> direction cannot be `null` when allowedDirection is " + - allowedDirection + ", defaulting direction to " + this.direction); - - } else if (allowedDirection == AllowedDirection.ONLY_VERTICAL && direction != Direction.VERTICAL) { - this.direction = Direction.VERTICAL; - Log.w(LOG_TAG, "-> direction cannot be `" + direction + "` when allowedDirection is " + - allowedDirection + ", defaulting direction to " + this.direction); - - } else if (allowedDirection == AllowedDirection.ONLY_HORIZONTAL && direction != Direction.HORIZONTAL) { - this.direction = Direction.HORIZONTAL; - Log.w(LOG_TAG, "-> direction cannot be `" + direction + "` when allowedDirection is " + - allowedDirection + ", defaulting direction to " + this.direction); - - } else { - this.direction = direction; - } - - return this; - } - public AllowedDirection getAllowedDirection() { return allowedDirection; } + /** + * Set reading direction mode options for users. This method should be called before + * {@link #setDirection(Direction)} as it has higher preference. + * + * @param allowedDirection reading direction mode options for users. Setting to + * {@link AllowedDirection#VERTICAL_AND_HORIZONTAL} users will have + * choice to select the reading direction at runtime. + */ public Config setAllowedDirection(AllowedDirection allowedDirection) { this.allowedDirection = allowedDirection; @@ -237,6 +225,40 @@ public Config setAllowedDirection(AllowedDirection allowedDirection) { return this; } + public Direction getDirection() { + return direction; + } + + /** + * Set reading direction. This method should be called after + * {@link #setAllowedDirection(AllowedDirection)} as it has lower preference. + * + * @param direction reading direction. + */ + public Config setDirection(Direction direction) { + + if (allowedDirection == AllowedDirection.VERTICAL_AND_HORIZONTAL && direction == null) { + this.direction = DEFAULT_DIRECTION; + Log.w(LOG_TAG, "-> direction cannot be `null` when allowedDirection is " + + allowedDirection + ", defaulting direction to " + this.direction); + + } else if (allowedDirection == AllowedDirection.ONLY_VERTICAL && direction != Direction.VERTICAL) { + this.direction = Direction.VERTICAL; + Log.w(LOG_TAG, "-> direction cannot be `" + direction + "` when allowedDirection is " + + allowedDirection + ", defaulting direction to " + this.direction); + + } else if (allowedDirection == AllowedDirection.ONLY_HORIZONTAL && direction != Direction.HORIZONTAL) { + this.direction = Direction.HORIZONTAL; + Log.w(LOG_TAG, "-> direction cannot be `" + direction + "` when allowedDirection is " + + allowedDirection + ", defaulting direction to " + this.direction); + + } else { + this.direction = direction; + } + + return this; + } + @Override public String toString() { return "Config{" + diff --git a/folioreader/src/main/java/com/folioreader/FolioReader.java b/folioreader/src/main/java/com/folioreader/FolioReader.java index 34401a59e..b24159f94 100644 --- a/folioreader/src/main/java/com/folioreader/FolioReader.java +++ b/folioreader/src/main/java/com/folioreader/FolioReader.java @@ -5,8 +5,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.os.Build; -import android.os.Parcelable; import android.support.v4.content.LocalBroadcastManager; import com.folioreader.model.HighLight; @@ -160,6 +158,13 @@ private Intent getIntentFromUrl(String assetOrSdcardPath, int rawId) { return intent; } + /** + * Pass your configuration and choose to override it every time or just for first execution. + * @param config custom configuration. + * @param overrideConfig true will override the config, false will use either this + * config if it is null in application context or will fetch previously + * saved one while execution. + */ public FolioReader setConfig(Config config, boolean overrideConfig) { this.config = config; this.overrideConfig = overrideConfig; diff --git a/folioreader/src/main/java/com/folioreader/model/ReadPositionImpl.java b/folioreader/src/main/java/com/folioreader/model/ReadPositionImpl.java index 0fc9ab3a3..9251a4912 100644 --- a/folioreader/src/main/java/com/folioreader/model/ReadPositionImpl.java +++ b/folioreader/src/main/java/com/folioreader/model/ReadPositionImpl.java @@ -59,7 +59,7 @@ public static ReadPosition createInstance(String jsonString) { .forType(ReadPositionImpl.class) .readValue(jsonString); } catch (IOException e) { - e.printStackTrace(); + Log.e(LOG_TAG, "-> " + e); } return readPosition; } 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 a98001b8f..98486af95 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 @@ -150,10 +150,11 @@ private void initToolbar(Bundle savedInstanceState) { toolbar.setListeners(this); if (savedInstanceState != null) { toolbar.setVisible(savedInstanceState.getBoolean(BUNDLE_TOOLBAR_IS_VISIBLE)); - if (toolbar.getVisible()) + if (toolbar.getVisible()) { toolbar.show(); - else + } else { toolbar.hide(); + } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java b/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java index ab5f932b3..eaa450d74 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/adapter/FolioPageFragmentAdapter.java @@ -3,7 +3,6 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; -import android.util.Log; import android.view.ViewGroup; import com.folioreader.ui.folio.fragment.FolioPageFragment; diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index f47c0ab18..2024e2e7c 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -71,7 +71,6 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.Date; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/folioreader/src/main/java/com/folioreader/util/UiUtil.java b/folioreader/src/main/java/com/folioreader/util/UiUtil.java index f2fb02a9f..9ccb78946 100644 --- a/folioreader/src/main/java/com/folioreader/util/UiUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/UiUtil.java @@ -26,7 +26,6 @@ import android.widget.TextView; import com.folioreader.R; -import com.folioreader.view.DirectionalViewpager; import com.folioreader.view.UnderlinedTextView; import java.lang.ref.SoftReference; diff --git a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java index 687ab39d0..08091ccef 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioWebView.java +++ b/folioreader/src/main/java/com/folioreader/view/FolioWebView.java @@ -1,6 +1,5 @@ package com.folioreader.view; -import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.support.v4.view.GestureDetectorCompat; diff --git a/folioreader/src/main/java/com/folioreader/view/LoadingView.java b/folioreader/src/main/java/com/folioreader/view/LoadingView.java index cef393097..8baa5701f 100644 --- a/folioreader/src/main/java/com/folioreader/view/LoadingView.java +++ b/folioreader/src/main/java/com/folioreader/view/LoadingView.java @@ -5,7 +5,6 @@ import android.support.constraint.ConstraintLayout; import android.support.v4.content.ContextCompat; import android.util.AttributeSet; -import android.util.Log; import android.view.LayoutInflater; import android.webkit.JavascriptInterface; import android.widget.FrameLayout; @@ -16,6 +15,7 @@ import com.folioreader.util.AppUtil; import com.folioreader.util.UiUtil; +@SuppressWarnings("PMD.AvoidDuplicateLiterals") public class LoadingView extends FrameLayout { private ConstraintLayout rootView; diff --git a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java index ac9936284..91678c9ca 100644 --- a/folioreader/src/main/java/com/folioreader/view/WebViewPager.java +++ b/folioreader/src/main/java/com/folioreader/view/WebViewPager.java @@ -13,7 +13,6 @@ import android.view.View; import android.view.ViewGroup; import android.webkit.JavascriptInterface; -import android.widget.TextView; import com.folioreader.R; diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index c583c8bf8..330ec6898 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -26,7 +26,6 @@ diff --git a/webViewMarker/build.gradle b/webViewMarker/build.gradle index 4aae6a388..fa97f71f3 100644 --- a/webViewMarker/build.gradle +++ b/webViewMarker/build.gradle @@ -13,7 +13,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.11' + libraryVersion = '0.4.0' developerId = 'mobisystech' developerName = 'Folio Reader' From edeb5e8471b8eefff309449ce318b6a22825876a Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Sun, 1 Jul 2018 02:03:52 +0530 Subject: [PATCH 041/139] Fix Travis build fail issue --- .travis.yml | 25 ++++++++++++++++--------- build.gradle | 20 +++++++++++++++----- folioreader/build.gradle | 12 ++++++------ gradle.properties | 9 +-------- sample/build.gradle | 10 +++++----- webViewMarker/build.gradle | 12 ++++++------ 6 files changed, 49 insertions(+), 39 deletions(-) diff --git a/.travis.yml b/.travis.yml index 97a89c460..23421e2a8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,23 @@ language: android -before_install: - - echo yes | android update sdk --filter extra-android-support --no-ui --force > /dev/null - - echo yes | android update sdk --filter extra-android-m2repository --no-ui --force > /dev/null +script: + - ./gradlew build android: - components: - - android-28 - - extra-android-m2repository licenses: - - android-sdk-license-.+ + - android-sdk-preview-license-.+ + - android-sdk-license-.+ + + components: + # https://docs.travis-ci.com/user/languages/android/#Installing-a-newer-SDK-Platform-Tools-revision + - tools + - platform-tools + - tools + + # The BuildTools version used by your project + - build-tools-27.0.3 - script: - ./gradlew build \ No newline at end of file + # The SDK version used to compile your project + - android-28 + - extra-android-m2repository \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7c5f8f107..3287b8a17 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - - ext.KOTLIN_VERSION = '1.2.41' - ext.ANDROID_LIB_VERSION = '27.1.1' - ext.R2_STREAMER_VERSION = '0.1.7' - def KOTLIN_VERSION = ext.KOTLIN_VERSION + ext.KOTLIN_VERSION = '1.2.50' repositories { google() @@ -34,6 +30,20 @@ allprojects { } } +ext { + LIBRARY_VERSION = "0.4.0" + + VERSION_NAME = "1.0" + VERSION_CODE = 1 + + ANDROID_MIN_SDK = 14 + ANDROID_COMPILE_SDK_VERSION = 28 + ANDROID_TARGET_SDK_VERSION = 28 + ANDROID_LIB_VERSION = '28.0.0-alpha3' + + R2_STREAMER_VERSION = '0.1.7' +} + task clean(type: Delete) { delete rootProject.buildDir } diff --git a/folioreader/build.gradle b/folioreader/build.gradle index 0d64acf77..1b9093118 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -17,7 +17,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.4.0' + libraryVersion = LIBRARY_VERSION developerId = 'mobisystech' developerName = 'Folio Reader' @@ -30,13 +30,13 @@ ext { android { useLibrary 'org.apache.http.legacy' - compileSdkVersion Integer.parseInt(project.ANDROID_COMPILE_SDK_VERSION) + compileSdkVersion ANDROID_COMPILE_SDK_VERSION defaultConfig { - minSdkVersion Integer.parseInt(project.ANDROID_MIN_SDK) - targetSdkVersion Integer.parseInt(project.ANDROID_TARGET_SDK_VERSION) - versionCode Integer.parseInt(project.VERSION_CODE) - versionName project.VERSION_NAME + minSdkVersion ANDROID_MIN_SDK + targetSdkVersion ANDROID_TARGET_SDK_VERSION + versionCode VERSION_CODE + versionName VERSION_NAME } sourceSets { diff --git a/gradle.properties b/gradle.properties index 5c64d0435..b2b3bb211 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,11 +10,4 @@ org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -VERSION_NAME=1.0 -VERSION_CODE=1 - -ANDROID_COMPILE_SDK_VERSION=28 -ANDROID_TARGET_SDK_VERSION=28 -ANDROID_MIN_SDK=14 \ No newline at end of file +# org.gradle.parallel=true \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index f1d4ccb3c..2b3913540 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -3,14 +3,14 @@ apply plugin: 'checkstyle' android { - compileSdkVersion Integer.parseInt(project.ANDROID_COMPILE_SDK_VERSION) + compileSdkVersion ANDROID_COMPILE_SDK_VERSION defaultConfig { applicationId "com.folioreader.android.sample" - minSdkVersion Integer.parseInt(project.ANDROID_MIN_SDK) - targetSdkVersion Integer.parseInt(project.ANDROID_TARGET_SDK_VERSION) - versionCode Integer.parseInt(project.VERSION_CODE) - versionName project.VERSION_NAME + minSdkVersion ANDROID_MIN_SDK + targetSdkVersion ANDROID_TARGET_SDK_VERSION + versionCode VERSION_CODE + versionName VERSION_NAME testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/webViewMarker/build.gradle b/webViewMarker/build.gradle index fa97f71f3..69b59cf0c 100644 --- a/webViewMarker/build.gradle +++ b/webViewMarker/build.gradle @@ -13,7 +13,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.4.0' + libraryVersion = LIBRARY_VERSION developerId = 'mobisystech' developerName = 'Folio Reader' @@ -25,13 +25,13 @@ ext { } android { - compileSdkVersion Integer.parseInt(project.ANDROID_COMPILE_SDK_VERSION) + compileSdkVersion ANDROID_COMPILE_SDK_VERSION defaultConfig { - minSdkVersion Integer.parseInt(project.ANDROID_MIN_SDK) - targetSdkVersion Integer.parseInt(project.ANDROID_TARGET_SDK_VERSION) - versionCode Integer.parseInt(project.VERSION_CODE) - versionName project.VERSION_NAME + minSdkVersion ANDROID_MIN_SDK + targetSdkVersion ANDROID_TARGET_SDK_VERSION + versionCode VERSION_CODE + versionName VERSION_NAME } buildTypes { From 8fc350eece7dfa6ec933528287b44bd663edf9de Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 5 Jul 2018 13:32:14 +0530 Subject: [PATCH 042/139] Avoid eating ACTION_UP for SDK >= 26 in TextSelectionSupport If TextSelectionSupport eats ACTION_UP then fling scroll stops in WebView. --- folioreader/res/menu/menu_text_selection.xml | 26 +++++++++++------ folioreader/res/values/strings.xml | 5 ++++ .../java/com/folioreader/util/UiUtil.java | 5 +--- .../com/folioreader/view/LoadingView.java | 28 ++++++++++++++++--- .../webviewmarker/TextSelectionSupport.java | 11 ++++++-- 5 files changed, 57 insertions(+), 18 deletions(-) diff --git a/folioreader/res/menu/menu_text_selection.xml b/folioreader/res/menu/menu_text_selection.xml index aff062895..34696bfc0 100644 --- a/folioreader/res/menu/menu_text_selection.xml +++ b/folioreader/res/menu/menu_text_selection.xml @@ -1,11 +1,21 @@

- - - - + + + + + + + + + \ No newline at end of file diff --git a/folioreader/res/values/strings.xml b/folioreader/res/values/strings.xml index 182fa14f2..da83b4a6f 100644 --- a/folioreader/res/values/strings.xml +++ b/folioreader/res/values/strings.xml @@ -98,4 +98,9 @@ application/xhtml+xml text/html BackCompat + + Copy + Highlight + Define + Share diff --git a/folioreader/src/main/java/com/folioreader/util/UiUtil.java b/folioreader/src/main/java/com/folioreader/util/UiUtil.java index 9ccb78946..d03d7109f 100644 --- a/folioreader/src/main/java/com/folioreader/util/UiUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/UiUtil.java @@ -128,10 +128,7 @@ private static void setUnderLineColor(UnderlinedTextView underlinedTextView, Con } public static float convertDpToPixel(float dp, Context context) { - Resources resources = context.getResources(); - DisplayMetrics metrics = resources.getDisplayMetrics(); - float px = dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); - return px; + return dp * context.getResources().getDisplayMetrics().density; } public static void copyToClipboard(Context context, String text) { diff --git a/folioreader/src/main/java/com/folioreader/view/LoadingView.java b/folioreader/src/main/java/com/folioreader/view/LoadingView.java index 8baa5701f..fa3f00029 100644 --- a/folioreader/src/main/java/com/folioreader/view/LoadingView.java +++ b/folioreader/src/main/java/com/folioreader/view/LoadingView.java @@ -81,7 +81,12 @@ public void show() { //Log.d(LOG_TAG, "-> show"); handler.removeCallbacks(hideRunnable); - setVisibility(VISIBLE); + handler.post(new Runnable() { + @Override + public void run() { + setVisibility(VISIBLE); + } + }); handler.postDelayed(hideRunnable, VISIBLE_DURATION); } @@ -91,20 +96,35 @@ public void hide() { //Log.d(LOG_TAG, "-> hide"); handler.removeCallbacks(hideRunnable); - setVisibility(INVISIBLE); + handler.post(new Runnable() { + @Override + public void run() { + setVisibility(INVISIBLE); + } + }); } @SuppressWarnings("unused") @JavascriptInterface public void visible() { //Log.d(LOG_TAG, "-> visible"); - setVisibility(VISIBLE); + handler.post(new Runnable() { + @Override + public void run() { + setVisibility(VISIBLE); + } + }); } @SuppressWarnings("unused") @JavascriptInterface public void invisible() { //Log.d(LOG_TAG, "-> invisible"); - setVisibility(INVISIBLE); + handler.post(new Runnable() { + @Override + public void run() { + setVisibility(INVISIBLE); + } + }); } } diff --git a/webViewMarker/src/main/java/com/bossturban/webviewmarker/TextSelectionSupport.java b/webViewMarker/src/main/java/com/bossturban/webviewmarker/TextSelectionSupport.java index 456f7efa5..33de50149 100644 --- a/webViewMarker/src/main/java/com/bossturban/webviewmarker/TextSelectionSupport.java +++ b/webViewMarker/src/main/java/com/bossturban/webviewmarker/TextSelectionSupport.java @@ -211,10 +211,17 @@ public boolean onTouch(View v, MotionEvent event) { mScrollDiffX = 0; mScrollDiffY = 0; mScrolling = false; - // + // Fixes 4.4 double selection // See: http://stackoverflow.com/questions/20391783/how-to-avoid-default-selection-on-long-press-in-android-kitkat-4-4 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && isInSelectionMode()) { + + // This fix is not required for Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + // Selection handles might not work as intended only on emulators but would work on + // actual devices. + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + && Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1 + && isInSelectionMode()) { return true; } break; From b93eb675de6e1e51582611d5f24c0926212f7419 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Fri, 6 Jul 2018 18:28:17 +0530 Subject: [PATCH 043/139] Store colorInt instead of colorResId in Config Fixes FolioReader/FolioReader-Android#211 --- folioreader/AndroidManifest.xml | 7 +++ .../com/folioreader/AppContextProvider.java | 59 +++++++++++++++++++ .../src/main/java/com/folioreader/Config.java | 51 +++++++++++----- .../java/com/folioreader/FolioReader.java | 8 +-- .../activity/ContentHighlightActivity.java | 20 +++---- .../ui/folio/fragment/FolioPageFragment.java | 4 +- .../tableofcontents/adapter/TOCAdapter.java | 2 +- .../java/com/folioreader/util/AppUtil.java | 2 +- .../java/com/folioreader/util/UiUtil.java | 40 +++++++++---- .../view/ConfigBottomSheetDialogFragment.kt | 23 ++++---- .../java/com/folioreader/view/FolioToolbar.kt | 8 +-- .../com/folioreader/view/LoadingView.java | 2 +- .../folioreader/view/MediaControllerView.kt | 26 ++++---- .../android/sample/HomeActivity.java | 2 +- 14 files changed, 177 insertions(+), 77 deletions(-) create mode 100644 folioreader/src/main/java/com/folioreader/AppContextProvider.java diff --git a/folioreader/AndroidManifest.xml b/folioreader/AndroidManifest.xml index 12474418c..1373f25a2 100644 --- a/folioreader/AndroidManifest.xml +++ b/folioreader/AndroidManifest.xml @@ -3,9 +3,16 @@ package="com.folioreader"> + + + + \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/AppContextProvider.java b/folioreader/src/main/java/com/folioreader/AppContextProvider.java new file mode 100644 index 000000000..46a6119d9 --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/AppContextProvider.java @@ -0,0 +1,59 @@ +package com.folioreader; + +import android.annotation.SuppressLint; +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +public class AppContextProvider extends ContentProvider { + + @SuppressLint("StaticFieldLeak") + private static Context context; + + @Override + public boolean onCreate() { + Log.v("AppContextProvider", "-> onCreate"); + context = getContext(); + return false; + } + + public static Context get() { + return context; + } + + @Nullable + @Override + public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, + @Nullable String[] selectionArgs, @Nullable String sortOrder) { + return null; + } + + @Nullable + @Override + public String getType(@NonNull Uri uri) { + return null; + } + + @Nullable + @Override + public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { + return null; + } + + @Override + public int delete(@NonNull Uri uri, @Nullable String selection, + @Nullable String[] selectionArgs) { + return 0; + } + + @Override + public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, + @Nullable String[] selectionArgs) { + return 0; + } +} diff --git a/folioreader/src/main/java/com/folioreader/Config.java b/folioreader/src/main/java/com/folioreader/Config.java index f0046f065..5880e17ea 100644 --- a/folioreader/src/main/java/com/folioreader/Config.java +++ b/folioreader/src/main/java/com/folioreader/Config.java @@ -1,7 +1,11 @@ package com.folioreader; +import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.ColorInt; +import android.support.annotation.ColorRes; +import android.support.v4.content.ContextCompat; import android.util.Log; import org.json.JSONObject; @@ -18,18 +22,21 @@ public class Config implements Parcelable { public static final String CONFIG_FONT = "font"; public static final String CONFIG_FONT_SIZE = "font_size"; public static final String CONFIG_IS_NIGHT_MODE = "is_night_mode"; - public static final String CONFIG_IS_THEME_COLOR = "theme_color"; + public static final String CONFIG_THEME_COLOR_INT = "theme_color_int"; public static final String CONFIG_IS_TTS = "is_tts"; public static final String CONFIG_ALLOWED_DIRECTION = "allowed_direction"; public static final String CONFIG_DIRECTION = "direction"; public static final String INTENT_PORT = "port"; private static final AllowedDirection DEFAULT_ALLOWED_DIRECTION = AllowedDirection.ONLY_VERTICAL; private static final Direction DEFAULT_DIRECTION = Direction.VERTICAL; + private static final int DEFAULT_THEME_COLOR_INT = + ContextCompat.getColor(AppContextProvider.get(), R.color.app_green); private int font = 3; private int fontSize = 2; private boolean nightMode; - private int themeColor = R.color.app_green; + @ColorInt + private int themeColor = DEFAULT_THEME_COLOR_INT; private boolean showTts = true; private AllowedDirection allowedDirection = DEFAULT_ALLOWED_DIRECTION; private Direction direction = DEFAULT_DIRECTION; @@ -89,22 +96,11 @@ protected Config(Parcel in) { public Config() { } - public Config(int font, int fontSize, boolean nightMode, int themeColor, boolean showTts, - AllowedDirection allowedDirection, Direction direction) { - this.font = font; - this.fontSize = fontSize; - this.nightMode = nightMode; - this.themeColor = themeColor; - this.showTts = showTts; - setAllowedDirection(allowedDirection); - setDirection(direction); - } - public Config(JSONObject jsonObject) { font = jsonObject.optInt(CONFIG_FONT); fontSize = jsonObject.optInt(CONFIG_FONT_SIZE); nightMode = jsonObject.optBoolean(CONFIG_IS_NIGHT_MODE); - themeColor = jsonObject.optInt(CONFIG_IS_THEME_COLOR); + themeColor = getValidColorInt(jsonObject.optInt(CONFIG_THEME_COLOR_INT)); showTts = jsonObject.optBoolean(CONFIG_IS_TTS); allowedDirection = getAllowedDirectionFromString(LOG_TAG, jsonObject.optString(CONFIG_ALLOWED_DIRECTION)); @@ -170,12 +166,35 @@ public Config setNightMode(boolean nightMode) { return this; } + @ColorInt + private int getValidColorInt(@ColorInt int colorInt) { + if (colorInt >= 0) { + Log.w(LOG_TAG, "-> getValidColorInt -> Invalid argument colorInt = " + colorInt + + ", Returning DEFAULT_THEME_COLOR_INT = " + DEFAULT_THEME_COLOR_INT); + return DEFAULT_THEME_COLOR_INT; + } + return colorInt; + } + + @ColorInt public int getThemeColor() { return themeColor; } - public Config setThemeColor(int themeColor) { - this.themeColor = themeColor; + public Config setThemeColorRes(@ColorRes int colorResId) { + try { + this.themeColor = ContextCompat.getColor(AppContextProvider.get(), colorResId); + } catch (Resources.NotFoundException e) { + Log.w(LOG_TAG, "-> setThemeColorRes -> " + e); + Log.w(LOG_TAG, "-> setThemeColorRes -> Defaulting themeColor to " + + DEFAULT_THEME_COLOR_INT); + this.themeColor = DEFAULT_THEME_COLOR_INT; + } + return this; + } + + public Config setThemeColorInt(@ColorInt int colorInt) { + this.themeColor = getValidColorInt(colorInt); return this; } diff --git a/folioreader/src/main/java/com/folioreader/FolioReader.java b/folioreader/src/main/java/com/folioreader/FolioReader.java index b24159f94..7aa076e18 100644 --- a/folioreader/src/main/java/com/folioreader/FolioReader.java +++ b/folioreader/src/main/java/com/folioreader/FolioReader.java @@ -60,15 +60,15 @@ public void onReceive(Context context, Intent intent) { } }; - public static FolioReader getInstance(Context context) { + public static FolioReader get() { if (singleton == null) { synchronized (FolioReader.class) { if (singleton == null) { - if (context == null) { - throw new IllegalArgumentException("-> context cannot be null"); + if (AppContextProvider.get() == null) { + throw new IllegalArgumentException("-> context == null"); } - singleton = new FolioReader(context.getApplicationContext()); + singleton = new FolioReader(AppContextProvider.get()); } } } diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java b/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java index 32735b249..83546c0c8 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/activity/ContentHighlightActivity.java @@ -38,21 +38,21 @@ protected void onCreate(Bundle savedInstanceState) { private void initViews() { - UiUtil.setColorToImage(this, mConfig.getThemeColor(), ((ImageView) findViewById(R.id.btn_close)).getDrawable()); - findViewById(R.id.layout_content_highlights).setBackgroundDrawable(UiUtil.getShapeDrawable(this, mConfig.getThemeColor())); + UiUtil.setColorIntToDrawable(mConfig.getThemeColor(), ((ImageView) findViewById(R.id.btn_close)).getDrawable()); + findViewById(R.id.layout_content_highlights).setBackgroundDrawable(UiUtil.getShapeDrawable(mConfig.getThemeColor())); if (mIsNightMode) { findViewById(R.id.toolbar).setBackgroundColor(Color.BLACK); - findViewById(R.id.btn_contents).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), R.color.black)); - findViewById(R.id.btn_highlights).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), R.color.black)); - ((TextView) findViewById(R.id.btn_contents)).setTextColor(UiUtil.getColorList(this, R.color.black, mConfig.getThemeColor())); - ((TextView) findViewById(R.id.btn_highlights)).setTextColor(UiUtil.getColorList(this, R.color.black, mConfig.getThemeColor())); + findViewById(R.id.btn_contents).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(mConfig.getThemeColor(), ContextCompat.getColor(this, R.color.black))); + findViewById(R.id.btn_highlights).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(mConfig.getThemeColor(), ContextCompat.getColor(this, R.color.black))); + ((TextView) findViewById(R.id.btn_contents)).setTextColor(UiUtil.getColorList(ContextCompat.getColor(this, R.color.black), mConfig.getThemeColor())); + ((TextView) findViewById(R.id.btn_highlights)).setTextColor(UiUtil.getColorList(ContextCompat.getColor(this, R.color.black), mConfig.getThemeColor())); } else { - ((TextView) findViewById(R.id.btn_contents)).setTextColor(UiUtil.getColorList(this, R.color.white, mConfig.getThemeColor())); - ((TextView) findViewById(R.id.btn_highlights)).setTextColor(UiUtil.getColorList(this, R.color.white, mConfig.getThemeColor())); - findViewById(R.id.btn_contents).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), R.color.white)); - findViewById(R.id.btn_highlights).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), R.color.white)); + ((TextView) findViewById(R.id.btn_contents)).setTextColor(UiUtil.getColorList(ContextCompat.getColor(this, R.color.white), mConfig.getThemeColor())); + ((TextView) findViewById(R.id.btn_highlights)).setTextColor(UiUtil.getColorList(ContextCompat.getColor(this, R.color.white), mConfig.getThemeColor())); + findViewById(R.id.btn_contents).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(mConfig.getThemeColor(), ContextCompat.getColor(this, R.color.white))); + findViewById(R.id.btn_highlights).setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(mConfig.getThemeColor(), ContextCompat.getColor(this, R.color.white))); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index 2024e2e7c..44f32db1a 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -753,9 +753,9 @@ private void loadRangy(WebView view, String rangy) { } private void setupScrollBar() { - UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), mScrollSeekbar.getProgressDrawable()); + UiUtil.setColorIntToDrawable(mConfig.getThemeColor(), mScrollSeekbar.getProgressDrawable()); Drawable thumbDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.icons_sroll); - UiUtil.setColorToImage(getActivity(), mConfig.getThemeColor(), (thumbDrawable)); + UiUtil.setColorIntToDrawable(mConfig.getThemeColor(), thumbDrawable); mScrollSeekbar.setThumb(thumbDrawable); } diff --git a/folioreader/src/main/java/com/folioreader/ui/tableofcontents/adapter/TOCAdapter.java b/folioreader/src/main/java/com/folioreader/ui/tableofcontents/adapter/TOCAdapter.java index 242435e60..86c53fac3 100644 --- a/folioreader/src/main/java/com/folioreader/ui/tableofcontents/adapter/TOCAdapter.java +++ b/folioreader/src/main/java/com/folioreader/ui/tableofcontents/adapter/TOCAdapter.java @@ -114,7 +114,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { R.color.black)); } if (tocLinkWrapper.getTocLink().href.equals(selectedHref)) { - viewHolder.sectionTitle.setTextColor(ContextCompat.getColor(mContext, mConfig.getThemeColor())); + viewHolder.sectionTitle.setTextColor(mConfig.getThemeColor()); } } diff --git a/folioreader/src/main/java/com/folioreader/util/AppUtil.java b/folioreader/src/main/java/com/folioreader/util/AppUtil.java index d6fef82dc..34f763d75 100644 --- a/folioreader/src/main/java/com/folioreader/util/AppUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/AppUtil.java @@ -92,7 +92,7 @@ public static void saveConfig(Context context, Config config) { obj.put(Config.CONFIG_FONT, config.getFont()); obj.put(Config.CONFIG_FONT_SIZE, config.getFontSize()); obj.put(Config.CONFIG_IS_NIGHT_MODE, config.isNightMode()); - obj.put(Config.CONFIG_IS_THEME_COLOR, config.getThemeColor()); + obj.put(Config.CONFIG_THEME_COLOR_INT, config.getThemeColor()); obj.put(Config.CONFIG_IS_TTS, config.isShowTts()); obj.put(Config.CONFIG_ALLOWED_DIRECTION, config.getAllowedDirection().toString()); obj.put(Config.CONFIG_DIRECTION, config.getDirection().toString()); diff --git a/folioreader/src/main/java/com/folioreader/util/UiUtil.java b/folioreader/src/main/java/com/folioreader/util/UiUtil.java index d03d7109f..7853cf14b 100644 --- a/folioreader/src/main/java/com/folioreader/util/UiUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/UiUtil.java @@ -14,10 +14,11 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.StateListDrawable; +import android.support.annotation.ColorInt; +import android.support.annotation.ColorRes; import android.support.v4.content.ContextCompat; import android.text.TextUtils; import android.util.AttributeSet; -import android.util.DisplayMetrics; import android.util.Log; import android.util.StateSet; import android.view.View; @@ -25,6 +26,7 @@ import android.widget.Button; import android.widget.TextView; +import com.folioreader.AppContextProvider; import com.folioreader.R; import com.folioreader.view.UnderlinedTextView; @@ -35,6 +37,9 @@ * Created by mahavir on 3/30/16. */ public class UiUtil { + + private static final String LOG_TAG = UiUtil.class.getSimpleName(); + public static void setCustomFont(View view, Context ctx, AttributeSet attrs, int[] attributeSet, int fontId) { TypedArray a = ctx.obtainStyledAttributes(attrs, attributeSet); @@ -80,14 +85,15 @@ public static Typeface getFont(Context c, String name) { } } - public static ColorStateList getColorList(Context context, int selectedColor, int unselectedColor) { + public static ColorStateList getColorList(@ColorInt int selectedColor, + @ColorInt int unselectedColor) { int[][] states = new int[][]{ new int[]{android.R.attr.state_selected}, new int[]{} }; int[] colors = new int[]{ - ContextCompat.getColor(context, selectedColor), - ContextCompat.getColor(context, unselectedColor) + selectedColor, + unselectedColor }; ColorStateList list = new ColorStateList(states, colors); return list; @@ -147,24 +153,32 @@ public static void share(Context context, String text) { context.getResources().getText(R.string.send_to))); } - - public static void setColorToImage(Context context, int color, Drawable drawable) { - drawable.setColorFilter(ContextCompat.getColor(context, color), PorterDuff.Mode.SRC_ATOP); + public static void setColorIntToDrawable(@ColorInt int color, Drawable drawable) { + drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); } + public static void setColorResToDrawable(@ColorRes int colorResId, Drawable drawable) { + try { + int color = ContextCompat.getColor(AppContextProvider.get(), colorResId); + drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); + } catch (Resources.NotFoundException e) { + Log.e(LOG_TAG, "-> " + e); + } + } - public static StateListDrawable convertColorIntoStateDrawable(Context context, int colorSelected, int colorNormal) { + public static StateListDrawable convertColorIntoStateDrawable(@ColorInt int colorSelected, + @ColorInt int colorNormal) { StateListDrawable stateListDrawable = new StateListDrawable(); - stateListDrawable.addState(new int[]{android.R.attr.state_selected}, new ColorDrawable(ContextCompat.getColor(context, colorSelected))); - stateListDrawable.addState(StateSet.WILD_CARD, new ColorDrawable(ContextCompat.getColor(context, colorNormal))); + stateListDrawable.addState(new int[]{android.R.attr.state_selected}, new ColorDrawable(colorSelected)); + stateListDrawable.addState(StateSet.WILD_CARD, new ColorDrawable(colorNormal)); return stateListDrawable; } - public static GradientDrawable getShapeDrawable(Context context, int color) { + public static GradientDrawable getShapeDrawable(@ColorInt int color) { GradientDrawable gradientDrawable = new GradientDrawable(); gradientDrawable.setShape(GradientDrawable.RECTANGLE); - gradientDrawable.setStroke(pxToDp(2), ContextCompat.getColor(context, color)); - gradientDrawable.setColor(ContextCompat.getColor(context, color)); + gradientDrawable.setStroke(pxToDp(2), color); + gradientDrawable.setColor(color); gradientDrawable.setCornerRadius(pxToDp(3)); return gradientDrawable; } diff --git a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt index bf03e5aec..1d7e77455 100644 --- a/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt +++ b/folioreader/src/main/java/com/folioreader/view/ConfigBottomSheetDialogFragment.kt @@ -83,13 +83,13 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { 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) + UiUtil.setColorIntToDrawable(config.themeColor, view_config_ib_night_mode.drawable) + UiUtil.setColorResToDrawable(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) + UiUtil.setColorIntToDrawable(config.themeColor, view_config_ib_day_mode!!.drawable) + UiUtil.setColorResToDrawable(R.color.app_gray, view_config_ib_night_mode.drawable) } } @@ -108,8 +108,8 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { 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) + UiUtil.setColorResToDrawable(R.color.app_gray, view_config_ib_night_mode.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, view_config_ib_day_mode.drawable) } view_config_ib_night_mode.setOnClickListener { @@ -117,8 +117,8 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { toggleBlackTheme() view_config_ib_day_mode.isSelected = false view_config_ib_night_mode.isSelected = true - UiUtil.setColorToImage(activity, R.color.app_gray, view_config_ib_day_mode.drawable) - UiUtil.setColorToImage(activity, config.themeColor, view_config_ib_night_mode.drawable) + UiUtil.setColorResToDrawable(R.color.app_gray, view_config_ib_day_mode.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, view_config_ib_night_mode.drawable) setToolBarColor() setAudioPlayerBackground() } @@ -150,7 +150,8 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { private fun configFonts() { - val colorStateList = UiUtil.getColorList(activity, config.themeColor, R.color.grey_color) + val colorStateList = UiUtil.getColorList(config.themeColor, + ContextCompat.getColor(context!!, R.color.grey_color)) buttonVertical.setTextColor(colorStateList) buttonHorizontal.setTextColor(colorStateList) view_config_font_andada.setTextColor(colorStateList) @@ -242,8 +243,8 @@ class ConfigBottomSheetDialogFragment : BottomSheetDialogFragment() { 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) + UiUtil.setColorIntToDrawable(config.themeColor, thumbDrawable) + UiUtil.setColorResToDrawable(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 { diff --git a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt index cea80ae3c..8ad4abdda 100644 --- a/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt +++ b/folioreader/src/main/java/com/folioreader/view/FolioToolbar.kt @@ -39,10 +39,10 @@ class FolioToolbar : RelativeLayout { } 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) + UiUtil.setColorIntToDrawable(config.themeColor, btn_close.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, btn_drawer.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, btn_config.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, btn_speaker.drawable) } private fun initListeners() { diff --git a/folioreader/src/main/java/com/folioreader/view/LoadingView.java b/folioreader/src/main/java/com/folioreader/view/LoadingView.java index fa3f00029..1d60fb40f 100644 --- a/folioreader/src/main/java/com/folioreader/view/LoadingView.java +++ b/folioreader/src/main/java/com/folioreader/view/LoadingView.java @@ -67,7 +67,7 @@ public void updateTheme() { Config config = AppUtil.getSavedConfig(getContext()); if (config == null) config = new Config(); - UiUtil.setColorToImage(getContext(), config.getThemeColor(), progressBar.getIndeterminateDrawable()); + UiUtil.setColorIntToDrawable(config.getThemeColor(), progressBar.getIndeterminateDrawable()); if (config.isNightMode()) { rootView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.webview_night)); } else { diff --git a/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt b/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt index 7a9f14f86..2a5109e12 100644 --- a/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt +++ b/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt @@ -53,17 +53,17 @@ class MediaControllerView : RelativeLayout { } private fun initColors() { - btn_half_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) - btn_one_and_half_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) - btn_twox_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) - btn_one_x_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) - btn_text_undeline_style.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) - btn_backcolor_style.setTextColor(UiUtil.getColorList(context, R.color.white, R.color.grey_color)) - btn_backcolor_style.setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(context, config.themeColor, android.R.color.transparent)) - btn_text_color_style.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) - UiUtil.setColorToImage(context, config.themeColor, play_button.drawable) - UiUtil.setColorToImage(context, config.themeColor, next_button.drawable) - UiUtil.setColorToImage(context, config.themeColor, prev_button.drawable) + btn_half_speed.setTextColor(UiUtil.getColorList(config.themeColor, ContextCompat.getColor(context, R.color.grey_color))) + btn_one_and_half_speed.setTextColor(UiUtil.getColorList(config.themeColor, ContextCompat.getColor(context, R.color.grey_color))) + btn_twox_speed.setTextColor(UiUtil.getColorList(config.themeColor, ContextCompat.getColor(context, R.color.grey_color))) + btn_one_x_speed.setTextColor(UiUtil.getColorList(config.themeColor, ContextCompat.getColor(context, R.color.grey_color))) + btn_text_undeline_style.setTextColor(UiUtil.getColorList(config.themeColor, ContextCompat.getColor(context, R.color.grey_color))) + btn_backcolor_style.setTextColor(UiUtil.getColorList(ContextCompat.getColor(context, R.color.white), ContextCompat.getColor(context, R.color.grey_color))) + btn_backcolor_style.setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(config.themeColor, ContextCompat.getColor(context, android.R.color.transparent))) + btn_text_color_style.setTextColor(UiUtil.getColorList(config.themeColor, ContextCompat.getColor(context, R.color.grey_color))) + UiUtil.setColorIntToDrawable(config.themeColor, play_button.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, next_button.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, prev_button.drawable) } private fun initListeners() { @@ -73,11 +73,11 @@ class MediaControllerView : RelativeLayout { if (isPlaying) { callback.pause() play_button.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.play_icon)) - UiUtil.setColorToImage(context, config.themeColor, play_button.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, play_button.drawable) } else { callback.play() play_button.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.pause_btn)) - UiUtil.setColorToImage(context, config.themeColor, play_button.drawable) + UiUtil.setColorIntToDrawable(config.themeColor, play_button.drawable) } isPlaying = !isPlaying } diff --git a/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java index 8503046bd..784e769f2 100644 --- a/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java +++ b/sample/src/main/java/com/folioreader/android/sample/HomeActivity.java @@ -54,7 +54,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); - folioReader = FolioReader.getInstance(getApplicationContext()) + folioReader = FolioReader.get() .setOnHighlightListener(this) .setReadPositionListener(this); From dd213f766a34929a388841185580cfb90c37bca9 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Mon, 9 Jul 2018 13:29:21 +0530 Subject: [PATCH 044/139] Rename AppContext Content Provider --- folioreader/AndroidManifest.xml | 2 +- .../{AppContextProvider.java => AppContext.java} | 6 +++--- folioreader/src/main/java/com/folioreader/Config.java | 4 ++-- folioreader/src/main/java/com/folioreader/FolioReader.java | 4 ++-- folioreader/src/main/java/com/folioreader/util/UiUtil.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) rename folioreader/src/main/java/com/folioreader/{AppContextProvider.java => AppContext.java} (91%) diff --git a/folioreader/AndroidManifest.xml b/folioreader/AndroidManifest.xml index 1373f25a2..ddf20afa3 100644 --- a/folioreader/AndroidManifest.xml +++ b/folioreader/AndroidManifest.xml @@ -5,7 +5,7 @@ diff --git a/folioreader/src/main/java/com/folioreader/AppContextProvider.java b/folioreader/src/main/java/com/folioreader/AppContext.java similarity index 91% rename from folioreader/src/main/java/com/folioreader/AppContextProvider.java rename to folioreader/src/main/java/com/folioreader/AppContext.java index 46a6119d9..062f11501 100644 --- a/folioreader/src/main/java/com/folioreader/AppContextProvider.java +++ b/folioreader/src/main/java/com/folioreader/AppContext.java @@ -10,16 +10,16 @@ import android.support.annotation.Nullable; import android.util.Log; -public class AppContextProvider extends ContentProvider { +public class AppContext extends ContentProvider { @SuppressLint("StaticFieldLeak") private static Context context; @Override public boolean onCreate() { - Log.v("AppContextProvider", "-> onCreate"); + Log.v("AppContext", "-> onCreate"); context = getContext(); - return false; + return true; } public static Context get() { diff --git a/folioreader/src/main/java/com/folioreader/Config.java b/folioreader/src/main/java/com/folioreader/Config.java index 5880e17ea..2b403d294 100644 --- a/folioreader/src/main/java/com/folioreader/Config.java +++ b/folioreader/src/main/java/com/folioreader/Config.java @@ -30,7 +30,7 @@ public class Config implements Parcelable { private static final AllowedDirection DEFAULT_ALLOWED_DIRECTION = AllowedDirection.ONLY_VERTICAL; private static final Direction DEFAULT_DIRECTION = Direction.VERTICAL; private static final int DEFAULT_THEME_COLOR_INT = - ContextCompat.getColor(AppContextProvider.get(), R.color.app_green); + ContextCompat.getColor(AppContext.get(), R.color.app_green); private int font = 3; private int fontSize = 2; @@ -183,7 +183,7 @@ public int getThemeColor() { public Config setThemeColorRes(@ColorRes int colorResId) { try { - this.themeColor = ContextCompat.getColor(AppContextProvider.get(), colorResId); + this.themeColor = ContextCompat.getColor(AppContext.get(), colorResId); } catch (Resources.NotFoundException e) { Log.w(LOG_TAG, "-> setThemeColorRes -> " + e); Log.w(LOG_TAG, "-> setThemeColorRes -> Defaulting themeColor to " + diff --git a/folioreader/src/main/java/com/folioreader/FolioReader.java b/folioreader/src/main/java/com/folioreader/FolioReader.java index 7aa076e18..e44fa2c8d 100644 --- a/folioreader/src/main/java/com/folioreader/FolioReader.java +++ b/folioreader/src/main/java/com/folioreader/FolioReader.java @@ -65,10 +65,10 @@ public static FolioReader get() { if (singleton == null) { synchronized (FolioReader.class) { if (singleton == null) { - if (AppContextProvider.get() == null) { + if (AppContext.get() == null) { throw new IllegalArgumentException("-> context == null"); } - singleton = new FolioReader(AppContextProvider.get()); + singleton = new FolioReader(AppContext.get()); } } } diff --git a/folioreader/src/main/java/com/folioreader/util/UiUtil.java b/folioreader/src/main/java/com/folioreader/util/UiUtil.java index 7853cf14b..c07488ca8 100644 --- a/folioreader/src/main/java/com/folioreader/util/UiUtil.java +++ b/folioreader/src/main/java/com/folioreader/util/UiUtil.java @@ -26,7 +26,7 @@ import android.widget.Button; import android.widget.TextView; -import com.folioreader.AppContextProvider; +import com.folioreader.AppContext; import com.folioreader.R; import com.folioreader.view.UnderlinedTextView; @@ -159,7 +159,7 @@ public static void setColorIntToDrawable(@ColorInt int color, Drawable drawable) public static void setColorResToDrawable(@ColorRes int colorResId, Drawable drawable) { try { - int color = ContextCompat.getColor(AppContextProvider.get(), colorResId); + int color = ContextCompat.getColor(AppContext.get(), colorResId); drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); } catch (Resources.NotFoundException e) { Log.e(LOG_TAG, "-> " + e); From 227e2990ac1cc3e3ba759904c03515f0d0f38d7c Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Mon, 9 Jul 2018 14:17:38 +0530 Subject: [PATCH 045/139] Fix FolioReader/FolioReader-Android#235 --- folioreader/res/layout/view_config.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/folioreader/res/layout/view_config.xml b/folioreader/res/layout/view_config.xml index a08a81bc7..804abb11e 100644 --- a/folioreader/res/layout/view_config.xml +++ b/folioreader/res/layout/view_config.xml @@ -96,7 +96,7 @@ android:adjustViewBounds="false" android:scaleType="center" android:tint="@color/grey_color" - app:layout_constraintBottom_toTopOf="@id/view5" + app:layout_constraintBottom_toTopOf="@+id/view5" app:layout_constraintEnd_toStartOf="@+id/view_config_font_size_seek_bar" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/view4" @@ -110,7 +110,7 @@ android:cropToPadding="false" android:scaleType="center" android:tint="@color/grey_color" - app:layout_constraintBottom_toTopOf="@id/view5" + app:layout_constraintBottom_toTopOf="@+id/view5" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/view_config_font_size_seek_bar" app:layout_constraintTop_toBottomOf="@+id/view4" @@ -125,7 +125,7 @@ android:max="4" android:maxHeight="0.2dp" android:minHeight="0.2dp" - app:layout_constraintBottom_toTopOf="@id/view5" + app:layout_constraintBottom_toTopOf="@+id/view5" app:layout_constraintEnd_toStartOf="@+id/view_config_iv_label_font_big" app:layout_constraintStart_toEndOf="@+id/view_config_iv_label_font_small" app:layout_constraintTop_toBottomOf="@+id/view4" /> From 3876e38384c82d8b5ce0570b44b77cb21428a43a Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 11 Jul 2018 18:01:53 +0530 Subject: [PATCH 046/139] Apply themeColor to Dictionary-Wikipedia dialog Fixes FolioReader/FolioReader-Android#226 --- folioreader/res/layout/item_dictionary.xml | 1 + folioreader/res/layout/layout_dictionary.xml | 17 ++++-- folioreader/res/values/colors.xml | 2 +- .../activity/ContentHighlightActivity.java | 8 +-- .../ui/folio/adapter/DictionaryAdapter.java | 19 ++++++ .../ui/folio/fragment/DictionaryFragment.java | 58 ++++++++++++++++++- .../java/com/folioreader/util/UiUtil.java | 8 ++- .../folioreader/view/MediaControllerView.kt | 2 +- .../android/sample/HomeActivity.java | 18 ++---- 9 files changed, 104 insertions(+), 29 deletions(-) diff --git a/folioreader/res/layout/item_dictionary.xml b/folioreader/res/layout/item_dictionary.xml index 59e5925ac..02a54e8b4 100644 --- a/folioreader/res/layout/item_dictionary.xml +++ b/folioreader/res/layout/item_dictionary.xml @@ -2,6 +2,7 @@ @@ -20,7 +21,7 @@ + android:layout_height="match_parent"> @@ -95,7 +98,8 @@ android:drawablePadding="8dp" android:drawableTop="@drawable/ic_offline_gray_48dp" android:text="offline" - android:visibility="gone" /> + android:visibility="gone" + tools:visibility="visible" />