From 20d5ec251d67f6750b6dc4cd64ca4f69dcf71b9d Mon Sep 17 00:00:00 2001 From: epostadeveloper Date: Fri, 20 Apr 2018 12:33:22 +0300 Subject: [PATCH 01/40] 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 02/40] 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 03/40] 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 04/40] 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 05/40] 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 06/40] 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 07/40] 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 08/40] 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 09/40] 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 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 10/40] 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 11/40] 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 12/40] 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 8fc350eece7dfa6ec933528287b44bd663edf9de Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Thu, 5 Jul 2018 13:32:14 +0530 Subject: [PATCH 13/40] 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 14/40] 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 15/40] 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 16/40] 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 17/40] 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" />