From 781c475697257709f9181b057633738bd3aa54fa Mon Sep 17 00:00:00 2001 From: Mohamed Sameh Date: Thu, 5 Mar 2020 12:42:54 +0200 Subject: [PATCH 01/49] issue #1350: Add search option in tab mode to open in a new tab --- app/detekt_baseline.xml | 3 -- core/detekt_baseline.xml | 7 +--- .../core/main/CoreMainActivity.java | 40 +++++++++++++++---- .../kiwix/kiwixmobile/core/main/MainMenu.kt | 20 ++-------- .../kiwixmobile/core/search/SearchActivity.kt | 8 ++++ .../kiwixmobile/core/utils/Constants.java | 2 + 6 files changed, 49 insertions(+), 31 deletions(-) diff --git a/app/detekt_baseline.xml b/app/detekt_baseline.xml index 86dd07fb8..e8547da19 100644 --- a/app/detekt_baseline.xml +++ b/app/detekt_baseline.xml @@ -43,9 +43,6 @@ ReturnCount:Fat32Checker.kt$Fat32Checker$private fun canCreate4GbFile(storage: String): Boolean ReturnCount:LanguageActivity.kt$LanguageActivity$override fun onOptionsItemSelected(item: MenuItem): Boolean ReturnCount:LibraryFragment.kt$LibraryFragment$private fun onBookItemClick(item: BookItem) - SpreadOperator:LanguageAdapter.kt$LanguageAdapter$(*delegates) - SpreadOperator:LibraryAdapter.kt$LibraryAdapter$( *delegates ) - SpreadOperator:ZimManageViewModel.kt$ZimManageViewModel$(*disposables()) TooGenericExceptionCaught:FileWritingFileSystemChecker.kt$FileWritingFileSystemChecker$e: Exception TooGenericExceptionCaught:KiwixMainActivity.kt$KiwixMainActivity$e: Exception TooGenericExceptionThrown:ActivityExtensions.kt$throw RuntimeException( """ applicationContext is ${applicationContext::class.java.simpleName} application is ${application::class.java.simpleName} """.trimIndent() ) diff --git a/core/detekt_baseline.xml b/core/detekt_baseline.xml index 680cd1446..ccd125fad 100644 --- a/core/detekt_baseline.xml +++ b/core/detekt_baseline.xml @@ -15,7 +15,6 @@ MagicNumber:KiloByte.kt$KiloByte$1024.0 MagicNumber:MainMenu.kt$MainMenu$99 MagicNumber:SearchResultGenerator.kt$ZimSearchResultGenerator$200 - MagicNumber:SearchViewModel.kt$SearchViewModel$100 MagicNumber:Seconds.kt$Seconds$24 MagicNumber:Seconds.kt$Seconds$60 MagicNumber:Seconds.kt$Seconds$60.0 @@ -37,10 +36,6 @@ ReturnCount:FileUtils.kt$FileUtils$@JvmStatic fun hasPart(file: File): Boolean ReturnCount:FileUtils.kt$FileUtils$@Synchronized private fun deleteZimFileParts(path: String): Boolean ReturnCount:ImageUtils.kt$ImageUtils$private fun getBitmapFromView(width: Int, height: Int, viewToDrawFrom: View): Bitmap? - SpreadOperator:AlertDialogShower.kt$AlertDialogShower$(dialog.message, *bodyArguments(dialog)) - SpreadOperator:BooksOnDiskAdapter.kt$BooksOnDiskAdapter$( *delegates ) - SpreadOperator:FileSearch.kt$FileSearch$(*zimFileExtensions) - SpreadOperator:SearchAdapter.kt$SearchAdapter$(*delegates) TooGenericExceptionThrown:AbstractContentProvider.kt$AbstractContentProvider$throw RuntimeException("Operation not supported") TooGenericExceptionThrown:AdapterDelegateManager.kt$AdapterDelegateManager$throw RuntimeException("No delegate registered for $item") TooGenericExceptionThrown:Bytes.kt$Bytes$throw RuntimeException("impossible value $size") @@ -52,8 +47,10 @@ TooManyFunctions:CoreComponent.kt$CoreComponent$CoreComponent TooManyFunctions:FetchDownloadMonitor.kt$FetchDownloadMonitor$<no name provided> : FetchListener TooManyFunctions:FileUtils.kt$FileUtils$FileUtils + TooManyFunctions:MainMenu.kt$MainMenu.MenuClickListener$MenuClickListener TooManyFunctions:NewBookDao.kt$NewBookDao$NewBookDao TooManyFunctions:Repository.kt$Repository$Repository + TooManyFunctions:SearchActivity.kt$SearchActivity$SearchActivity TooManyFunctions:ZimFileReader.kt$ZimFileReader$ZimFileReader TooManyFunctions:ZimReaderContainer.kt$ZimReaderContainer$ZimReaderContainer TopLevelPropertyNaming:Bytes.kt$const val Eb = Pb * 1024 diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index 62c19cccb..0595d56a1 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -145,6 +145,7 @@ import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_CURRENT_FILE; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_CURRENT_POSITIONS; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_CURRENT_TAB; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_FILE_SEARCHED; +import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_FROM_TAB_SWITCHER; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_KIWIX; import static org.kiwix.kiwixmobile.core.utils.LanguageUtils.getResourceString; import static org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil.PREF_KIWIX_MOBILE; @@ -406,7 +407,7 @@ public abstract class CoreMainActivity extends BaseActivity private void handleIntentExtras(Intent intent) { if (intent.hasExtra(TAG_FILE_SEARCHED)) { - searchForTitle(intent.getStringExtra(TAG_FILE_SEARCHED)); + searchForTitle(intent.getStringExtra(TAG_FILE_SEARCHED), isInTabSwitcher()); selectTab(webViewList.size() - 1); } if (intent.hasExtra(EXTRA_CHOSE_X_URL)) { @@ -650,7 +651,7 @@ public abstract class CoreMainActivity extends BaseActivity visitCounterPref.setNoThanksState(true); return Unit.INSTANCE; }, - () ->{ + () -> { tempVisitCount = 0; visitCounterPref.setCount(tempVisitCount); return Unit.INSTANCE; @@ -963,6 +964,16 @@ public abstract class CoreMainActivity extends BaseActivity // to be implemented in subclasses } + @Override + public boolean navigateToSearch(ZimFileReader zimFileReader) { + Intent i = new Intent(this, SearchActivity.class); + i.putExtra(EXTRA_ZIM_FILE, zimFileReader.getZimFile().getAbsolutePath()); + i.putExtra(TAG_FROM_TAB_SWITCHER, isInTabSwitcher()); + startActivityForResult(i, MainMenuKt.REQUEST_FILE_SEARCH); + overridePendingTransition(0, 0); + return true; + } + protected abstract void createNewTab(); /** Creates the full screen AddNoteDialog, which is a DialogFragment */ @@ -1084,7 +1095,7 @@ public abstract class CoreMainActivity extends BaseActivity startActivity(intent); return Unit.INSTANCE; } - ); + ); } protected void openZimFile(@NonNull File file) { @@ -1363,6 +1374,13 @@ public abstract class CoreMainActivity extends BaseActivity alertDialogShower.show(KiwixDialog.ContentsDrawerHint.INSTANCE); } + private void openArticleInNewTab(String articleUrl) { + if (articleUrl != null) { + createNewTab(); + loadUrlWithCurrentWebview(redirectOrOriginal(contentUrl(articleUrl))); + } + } + private void openArticle(String articleUrl) { if (articleUrl != null) { loadUrlWithCurrentWebview(redirectOrOriginal(contentUrl(articleUrl))); @@ -1409,7 +1427,7 @@ public abstract class CoreMainActivity extends BaseActivity tabRecyclerView.setAdapter(tabsAdapter); } - private void searchForTitle(String title) { + private void searchForTitle(String title, boolean openInNewTab) { String articleUrl; if (title.startsWith("A/")) { @@ -1417,14 +1435,18 @@ public abstract class CoreMainActivity extends BaseActivity } else { articleUrl = zimReaderContainer.getPageUrlFromTitle(title); } - openArticle(articleUrl); + if (openInNewTab) { + openArticleInNewTab(articleUrl); + } else { + openArticle(articleUrl); + } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { + boolean openSearchInANewTab = isInTabSwitcher(); // check if in tab mode hideTabSwitcher(); Log.i(TAG_KIWIX, "Intent data: " + data); - switch (requestCode) { case MainMenuKt.REQUEST_FILE_SEARCH: if (resultCode == RESULT_OK) { @@ -1442,7 +1464,7 @@ public abstract class CoreMainActivity extends BaseActivity compatCallback.findAll(); compatCallback.showSoftInput(); } else { - searchForTitle(title); + searchForTitle(title, openSearchInANewTab); } } else { //TODO: Inform the User Log.w(TAG_KIWIX, "Unhandled search failure"); @@ -1724,4 +1746,8 @@ public abstract class CoreMainActivity extends BaseActivity private boolean checkNull(View view) { return view != null; } + + public boolean isInTabSwitcher() { + return tabSwitcherRoot != null && tabSwitcherRoot.getVisibility() == View.VISIBLE; + } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt index 1a268b34b..2cea01153 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt @@ -30,10 +30,8 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.start import org.kiwix.kiwixmobile.core.help.HelpActivity import org.kiwix.kiwixmobile.core.history.HistoryActivity import org.kiwix.kiwixmobile.core.reader.ZimFileReader -import org.kiwix.kiwixmobile.core.search.SearchActivity import org.kiwix.kiwixmobile.core.settings.CoreSettingsActivity import org.kiwix.kiwixmobile.core.utils.Constants -import org.kiwix.kiwixmobile.core.utils.Constants.EXTRA_ZIM_FILE const val REQUEST_FILE_SEARCH = 1236 @@ -70,6 +68,7 @@ class MainMenu( fun onFullscreenMenuClicked() fun onSupportKiwixMenuClicked() fun onHostBooksMenuClicked() + fun navigateToSearch(zimFileReader: ZimFileReader): Boolean } init { @@ -151,11 +150,11 @@ class MainMenu( fun onFileOpened(zimFileReader: ZimFileReader, urlIsValid: Boolean) { setVisibility(urlIsValid, randomArticle, search, readAloud, addNote, fullscreen) - search.setOnMenuItemClickListener { navigateToSearch(zimFileReader) } + search.setOnMenuItemClickListener { menuClickListener.navigateToSearch(zimFileReader) } } fun showTabSwitcherOptions() { - setVisibility(false, randomArticle, search, readAloud, addNote, fullscreen) + setVisibility(false, randomArticle, readAloud, addNote, fullscreen) } fun showWebViewOptions(urlIsValid: Boolean) { @@ -167,17 +166,6 @@ class MainMenu( tabSwitcherTextView?.text = if (tabs > 99) ":D" else "$tabs" } - private fun navigateToSearch(zimFileReader: ZimFileReader): Boolean { - activity.startActivityForResult( - activity.intent { - putExtra(EXTRA_ZIM_FILE, zimFileReader.zimFile.absolutePath) - }, - REQUEST_FILE_SEARCH - ) - activity.overridePendingTransition(0, 0) - return true - } - fun onTextToSpeechStartedTalking() { readAloud?.setTitle(R.string.menu_read_aloud_stop) } @@ -192,7 +180,7 @@ class MainMenu( fun tryExpandSearch(zimFileReader: ZimFileReader?) { if (search.isVisible) { - zimFileReader?.let(::navigateToSearch) + zimFileReader?.let(menuClickListener::navigateToSearch) } } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt index 1d129d880..d3db65693 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt @@ -54,6 +54,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.SearchViewModel import org.kiwix.kiwixmobile.core.search.viewmodel.State import org.kiwix.kiwixmobile.core.search.viewmodel.State.NoResults import org.kiwix.kiwixmobile.core.search.viewmodel.State.Results +import org.kiwix.kiwixmobile.core.utils.Constants.TAG_FROM_TAB_SWITCHER import org.kiwix.kiwixmobile.core.utils.SimpleTextListener import javax.inject.Inject @@ -104,6 +105,11 @@ class SearchActivity : BaseActivity() { overridePendingTransition(anim.fade_in, anim.fade_out) } + override fun onPrepareOptionsMenu(menu: Menu?): Boolean { + menu?.findItem(R.id.menu_searchintext)?.isVisible = !isFromTabSwitcher() + return super.onPrepareOptionsMenu(menu) + } + override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_search, menu) val searchMenuItem = menu.findItem(id.menu_search) @@ -155,4 +161,6 @@ class SearchActivity : BaseActivity() { super.onActivityResult(requestCode, resultCode, data) searchViewModel.actions.offer(ActivityResultReceived(requestCode, resultCode, data)) } + + private fun isFromTabSwitcher() = intent.getBooleanExtra(TAG_FROM_TAB_SWITCHER, false) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.java b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.java index 0f0a902cf..02287ec2a 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.java @@ -53,6 +53,8 @@ public final class Constants { public static final String TAG_CURRENT_TAB = "currenttab"; + public static final String TAG_FROM_TAB_SWITCHER = "fromtabswitcher"; + // Extras public static final String EXTRA_ZIM_FILE = "zimFile"; From 0f605ed6aceb4b6766cee2140d6bdc89fdd83a6c Mon Sep 17 00:00:00 2001 From: Mohamed Sameh Date: Tue, 17 Mar 2020 22:04:30 +0200 Subject: [PATCH 02/49] issue #1350: fix SearchActivity architecture --- core/detekt_baseline.xml | 3 +- .../core/main/CoreMainActivity.java | 24 ++++----------- .../kiwix/kiwixmobile/core/main/MainMenu.kt | 25 ++++++++++++++-- .../kiwixmobile/core/search/SearchActivity.kt | 30 ++++++++----------- .../core/search/viewmodel/Action.kt | 1 + .../core/search/viewmodel/SearchViewModel.kt | 20 ++++++++----- .../core/search/viewmodel/State.kt | 16 ++++++++-- .../effects/SearchIntentProcessing.kt | 7 +++++ 8 files changed, 76 insertions(+), 50 deletions(-) diff --git a/core/detekt_baseline.xml b/core/detekt_baseline.xml index ccd125fad..ee0f581dd 100644 --- a/core/detekt_baseline.xml +++ b/core/detekt_baseline.xml @@ -47,10 +47,9 @@ TooManyFunctions:CoreComponent.kt$CoreComponent$CoreComponent TooManyFunctions:FetchDownloadMonitor.kt$FetchDownloadMonitor$<no name provided> : FetchListener TooManyFunctions:FileUtils.kt$FileUtils$FileUtils - TooManyFunctions:MainMenu.kt$MainMenu.MenuClickListener$MenuClickListener + TooManyFunctions:MainMenu.kt$MainMenu$MainMenu TooManyFunctions:NewBookDao.kt$NewBookDao$NewBookDao TooManyFunctions:Repository.kt$Repository$Repository - TooManyFunctions:SearchActivity.kt$SearchActivity$SearchActivity TooManyFunctions:ZimFileReader.kt$ZimFileReader$ZimFileReader TooManyFunctions:ZimReaderContainer.kt$ZimReaderContainer$ZimReaderContainer TopLevelPropertyNaming:Bytes.kt$const val Eb = Pb * 1024 diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index 0595d56a1..ea54a0b0c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -145,7 +145,6 @@ import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_CURRENT_FILE; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_CURRENT_POSITIONS; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_CURRENT_TAB; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_FILE_SEARCHED; -import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_FROM_TAB_SWITCHER; import static org.kiwix.kiwixmobile.core.utils.Constants.TAG_KIWIX; import static org.kiwix.kiwixmobile.core.utils.LanguageUtils.getResourceString; import static org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil.PREF_KIWIX_MOBILE; @@ -407,7 +406,7 @@ public abstract class CoreMainActivity extends BaseActivity private void handleIntentExtras(Intent intent) { if (intent.hasExtra(TAG_FILE_SEARCHED)) { - searchForTitle(intent.getStringExtra(TAG_FILE_SEARCHED), isInTabSwitcher()); + searchForTitle(intent.getStringExtra(TAG_FILE_SEARCHED), mainMenu.isInTabSwitcher()); selectTab(webViewList.size() - 1); } if (intent.hasExtra(EXTRA_CHOSE_X_URL)) { @@ -964,16 +963,6 @@ public abstract class CoreMainActivity extends BaseActivity // to be implemented in subclasses } - @Override - public boolean navigateToSearch(ZimFileReader zimFileReader) { - Intent i = new Intent(this, SearchActivity.class); - i.putExtra(EXTRA_ZIM_FILE, zimFileReader.getZimFile().getAbsolutePath()); - i.putExtra(TAG_FROM_TAB_SWITCHER, isInTabSwitcher()); - startActivityForResult(i, MainMenuKt.REQUEST_FILE_SEARCH); - overridePendingTransition(0, 0); - return true; - } - protected abstract void createNewTab(); /** Creates the full screen AddNoteDialog, which is a DialogFragment */ @@ -1444,12 +1433,11 @@ public abstract class CoreMainActivity extends BaseActivity @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - boolean openSearchInANewTab = isInTabSwitcher(); // check if in tab mode - hideTabSwitcher(); Log.i(TAG_KIWIX, "Intent data: " + data); switch (requestCode) { case MainMenuKt.REQUEST_FILE_SEARCH: if (resultCode == RESULT_OK) { + hideTabSwitcher(); String title = data.getStringExtra(TAG_FILE_SEARCHED).replace("", "").replace("", ""); boolean isSearchInText = @@ -1464,13 +1452,14 @@ public abstract class CoreMainActivity extends BaseActivity compatCallback.findAll(); compatCallback.showSoftInput(); } else { - searchForTitle(title, openSearchInANewTab); + searchForTitle(title, mainMenu.isInTabSwitcher()); } } else { //TODO: Inform the User Log.w(TAG_KIWIX, "Unhandled search failure"); } break; case REQUEST_PREFERENCES: + hideTabSwitcher(); if (resultCode == RESULT_RESTART) { recreate(); } @@ -1485,6 +1474,7 @@ public abstract class CoreMainActivity extends BaseActivity case BOOKMARK_CHOSEN_REQUEST: case REQUEST_FILE_SELECT: case REQUEST_HISTORY_ITEM_CHOSEN: + hideTabSwitcher(); if (resultCode == RESULT_OK) { if (data.getBooleanExtra(HistoryActivity.USER_CLEARED_HISTORY, false)) { for (KiwixWebView kiwixWebView : webViewList) { @@ -1746,8 +1736,4 @@ public abstract class CoreMainActivity extends BaseActivity private boolean checkNull(View view) { return view != null; } - - public boolean isInTabSwitcher() { - return tabSwitcherRoot != null && tabSwitcherRoot.getVisibility() == View.VISIBLE; - } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt index 2cea01153..736c886c3 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt @@ -30,8 +30,11 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.start import org.kiwix.kiwixmobile.core.help.HelpActivity import org.kiwix.kiwixmobile.core.history.HistoryActivity import org.kiwix.kiwixmobile.core.reader.ZimFileReader +import org.kiwix.kiwixmobile.core.search.SearchActivity import org.kiwix.kiwixmobile.core.settings.CoreSettingsActivity import org.kiwix.kiwixmobile.core.utils.Constants +import org.kiwix.kiwixmobile.core.utils.Constants.EXTRA_ZIM_FILE +import org.kiwix.kiwixmobile.core.utils.Constants.TAG_FROM_TAB_SWITCHER const val REQUEST_FILE_SEARCH = 1236 @@ -68,7 +71,6 @@ class MainMenu( fun onFullscreenMenuClicked() fun onSupportKiwixMenuClicked() fun onHostBooksMenuClicked() - fun navigateToSearch(zimFileReader: ZimFileReader): Boolean } init { @@ -90,6 +92,7 @@ class MainMenu( private val help = menu.findItem(R.id.menu_help) private val settings = menu.findItem(R.id.menu_settings) private val supportKiwix = menu.findItem(R.id.menu_support_kiwix) + private var isInTabSwitcher: Boolean = false init { if (disableReadAloud) { @@ -150,14 +153,16 @@ class MainMenu( fun onFileOpened(zimFileReader: ZimFileReader, urlIsValid: Boolean) { setVisibility(urlIsValid, randomArticle, search, readAloud, addNote, fullscreen) - search.setOnMenuItemClickListener { menuClickListener.navigateToSearch(zimFileReader) } + search.setOnMenuItemClickListener { navigateToSearch(zimFileReader) } } fun showTabSwitcherOptions() { + isInTabSwitcher = true setVisibility(false, randomArticle, readAloud, addNote, fullscreen) } fun showWebViewOptions(urlIsValid: Boolean) { + isInTabSwitcher = false fullscreen.isVisible = true setVisibility(urlIsValid, randomArticle, search, readAloud, addNote) } @@ -166,6 +171,18 @@ class MainMenu( tabSwitcherTextView?.text = if (tabs > 99) ":D" else "$tabs" } + private fun navigateToSearch(zimFileReader: ZimFileReader): Boolean { + activity.startActivityForResult( + activity.intent { + putExtra(EXTRA_ZIM_FILE, zimFileReader.zimFile.absolutePath) + putExtra(TAG_FROM_TAB_SWITCHER, isInTabSwitcher) + }, + REQUEST_FILE_SEARCH + ) + activity.overridePendingTransition(0, 0) + return true + } + fun onTextToSpeechStartedTalking() { readAloud?.setTitle(R.string.menu_read_aloud_stop) } @@ -180,9 +197,11 @@ class MainMenu( fun tryExpandSearch(zimFileReader: ZimFileReader?) { if (search.isVisible) { - zimFileReader?.let(menuClickListener::navigateToSearch) + zimFileReader?.let(::navigateToSearch) } } + + fun isInTabSwitcher(): Boolean = isInTabSwitcher } private fun MenuItem?.menuItemClickListener(function: (MenuItem) -> Unit) { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt index d3db65693..4f1d4cd4e 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchActivity.kt @@ -50,11 +50,11 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ExitedSearch import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemClick import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemLongClick +import org.kiwix.kiwixmobile.core.search.viewmodel.SearchOrigin.FromWebView import org.kiwix.kiwixmobile.core.search.viewmodel.SearchViewModel import org.kiwix.kiwixmobile.core.search.viewmodel.State import org.kiwix.kiwixmobile.core.search.viewmodel.State.NoResults import org.kiwix.kiwixmobile.core.search.viewmodel.State.Results -import org.kiwix.kiwixmobile.core.utils.Constants.TAG_FROM_TAB_SWITCHER import org.kiwix.kiwixmobile.core.utils.SimpleTextListener import javax.inject.Inject @@ -105,11 +105,6 @@ class SearchActivity : BaseActivity() { overridePendingTransition(anim.fade_in, anim.fade_out) } - override fun onPrepareOptionsMenu(menu: Menu?): Boolean { - menu?.findItem(R.id.menu_searchintext)?.isVisible = !isFromTabSwitcher() - return super.onPrepareOptionsMenu(menu) - } - override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_search, menu) val searchMenuItem = menu.findItem(id.menu_search) @@ -137,15 +132,18 @@ class SearchActivity : BaseActivity() { return true } - private fun render(state: State) = when (state) { - is Results -> { - searchViewAnimator.setDistinctDisplayedChild(0) - searchAdapter.items = state.values - render(state.searchString) - } - is NoResults -> { - searchViewAnimator.setDistinctDisplayedChild(1) - render(state.searchString) + private fun render(state: State) { + searchInTextMenuItem.isVisible = state.searchOrigin == FromWebView + when (state) { + is Results -> { + searchViewAnimator.setDistinctDisplayedChild(0) + searchAdapter.items = state.values + render(state.searchString) + } + is NoResults -> { + searchViewAnimator.setDistinctDisplayedChild(1) + render(state.searchString) + } } } @@ -161,6 +159,4 @@ class SearchActivity : BaseActivity() { super.onActivityResult(requestCode, resultCode, data) searchViewModel.actions.offer(ActivityResultReceived(requestCode, resultCode, data)) } - - private fun isFromTabSwitcher() = intent.getBooleanExtra(TAG_FROM_TAB_SWITCHER, false) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/Action.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/Action.kt index 564413864..ebd7276f9 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/Action.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/Action.kt @@ -30,6 +30,7 @@ sealed class Action { data class OnItemClick(val searchListItem: SearchListItem) : Action() data class OnItemLongClick(val searchListItem: SearchListItem) : Action() data class Filter(val term: String) : Action() + data class ScreenOrigin(val searchOrigin: SearchOrigin) : Action() data class ConfirmedDelete(val searchListItem: SearchListItem) : Action() data class CreatedWithIntent(val intent: Intent?) : Action() data class ActivityResultReceived(val requestCode: Int, val resultCode: Int, val data: Intent?) : diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt index edc782223..58cfddc66 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt @@ -22,7 +22,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import io.reactivex.Flowable import io.reactivex.disposables.CompositeDisposable -import io.reactivex.functions.Function3 +import io.reactivex.functions.Function4 import io.reactivex.processors.BehaviorProcessor import io.reactivex.processors.PublishProcessor import io.reactivex.schedulers.Schedulers @@ -40,7 +40,9 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemClick import org.kiwix.kiwixmobile.core.search.viewmodel.Action.OnItemLongClick import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ReceivedPromptForSpeechInput +import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ScreenOrigin import org.kiwix.kiwixmobile.core.search.viewmodel.Action.StartSpeechInputFailed +import org.kiwix.kiwixmobile.core.search.viewmodel.SearchOrigin.FromWebView import org.kiwix.kiwixmobile.core.search.viewmodel.State.NoResults import org.kiwix.kiwixmobile.core.search.viewmodel.State.Results import org.kiwix.kiwixmobile.core.search.viewmodel.effects.DeleteRecentSearch @@ -61,10 +63,11 @@ class SearchViewModel @Inject constructor( private val searchResultGenerator: SearchResultGenerator ) : ViewModel() { - val state = MutableLiveData().apply { value = NoResults("") } + val state = MutableLiveData().apply { value = NoResults("", FromWebView) } val effects = PublishProcessor.create>() val actions = PublishProcessor.create() private val filter = BehaviorProcessor.createDefault("") + private val searchOrigin = BehaviorProcessor.createDefault(FromWebView) private val compositeDisposable = CompositeDisposable() @@ -93,6 +96,7 @@ class SearchViewModel @Inject constructor( StartSpeechInputFailed -> effects.offer(ShowToast(R.string.speech_not_supported)) is ActivityResultReceived -> effects.offer(ProcessActivityResult(it.requestCode, it.resultCode, it.data, actions)) + is ScreenOrigin -> searchOrigin.offer(it.searchOrigin) } }.subscribe( {}, @@ -125,19 +129,21 @@ class SearchViewModel @Inject constructor( recentSearchDao.recentSearches(zimReaderContainer.id), searchResultsFromZimReader(), filter, - Function3(this::reduce) + searchOrigin, + Function4(this::reduce) ).subscribe(state::postValue, Throwable::printStackTrace) private fun reduce( recentSearchResults: List, zimSearchResults: List, - searchString: String + searchString: String, + searchOrigin: SearchOrigin ) = when { searchString.isNotEmpty() && zimSearchResults.isNotEmpty() -> - Results(searchString, zimSearchResults) + Results(searchString, zimSearchResults, searchOrigin) searchString.isEmpty() && recentSearchResults.isNotEmpty() -> - Results(searchString, recentSearchResults) - else -> NoResults(searchString) + Results(searchString, recentSearchResults, searchOrigin) + else -> NoResults(searchString, searchOrigin) } private fun searchResultsFromZimReader() = filter diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/State.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/State.kt index 2546db534..dc7b4b93b 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/State.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/State.kt @@ -20,9 +20,21 @@ package org.kiwix.kiwixmobile.core.search.viewmodel import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem +enum class SearchOrigin { + FromWebView, + FromTabView +} + sealed class State { abstract val searchString: String + abstract val searchOrigin: SearchOrigin - data class Results(override val searchString: String, val values: List) : State() - data class NoResults(override val searchString: String) : State() + data class Results( + override val searchString: String, + val values: List, + override val searchOrigin: SearchOrigin + ) : State() + + data class NoResults(override val searchString: String, override val searchOrigin: SearchOrigin) : + State() } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt index b12251845..2c69f3f41 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt @@ -27,6 +27,8 @@ import org.kiwix.kiwixmobile.core.base.SideEffect import org.kiwix.kiwixmobile.core.search.viewmodel.Action import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ReceivedPromptForSpeechInput +import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ScreenOrigin +import org.kiwix.kiwixmobile.core.search.viewmodel.SearchOrigin import org.kiwix.kiwixmobile.core.utils.Constants data class SearchIntentProcessing( @@ -36,6 +38,11 @@ data class SearchIntentProcessing( @TargetApi(VERSION_CODES.M) override fun invokeWith(activity: AppCompatActivity) { if (intent != null) { + if (intent.getBooleanExtra(Constants.TAG_FROM_TAB_SWITCHER, false)) { + actions.offer(ScreenOrigin(SearchOrigin.FromTabView)) + } else { + actions.offer(ScreenOrigin(SearchOrigin.FromWebView)) + } if (intent.hasExtra(Intent.EXTRA_PROCESS_TEXT)) { actions.offer(Filter(intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT))) } From 959c6c2a6b8edd14e2f1e0b7918dd3f974bfa301 Mon Sep 17 00:00:00 2001 From: Mohamed Sameh Date: Tue, 17 Mar 2020 22:12:57 +0200 Subject: [PATCH 03/49] issue #1350: Fix bug in opening new tab --- .../java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index ea54a0b0c..3929efe55 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -1437,6 +1437,7 @@ public abstract class CoreMainActivity extends BaseActivity switch (requestCode) { case MainMenuKt.REQUEST_FILE_SEARCH: if (resultCode == RESULT_OK) { + boolean isFromTabSwitcher = mainMenu.isInTabSwitcher(); hideTabSwitcher(); String title = data.getStringExtra(TAG_FILE_SEARCHED).replace("", "").replace("", ""); @@ -1452,7 +1453,7 @@ public abstract class CoreMainActivity extends BaseActivity compatCallback.findAll(); compatCallback.showSoftInput(); } else { - searchForTitle(title, mainMenu.isInTabSwitcher()); + searchForTitle(title, isFromTabSwitcher); } } else { //TODO: Inform the User Log.w(TAG_KIWIX, "Unhandled search failure"); From db02ca43c16f32f4ba56441f3ae00c21e944a5a5 Mon Sep 17 00:00:00 2001 From: Hritik Wadhwa Date: Wed, 18 Mar 2020 05:59:17 +0530 Subject: [PATCH 04/49] parent 219f9752f5ce3d40ae109a35bc7d32fd55d868c6 author Hritik Wadhwa 1584491357 +0530 committer Hritik Wadhwa 1584532410 +0530 --- .../utils/{BookUtils.java => BookUtils.kt} | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) rename core/src/main/java/org/kiwix/kiwixmobile/core/utils/{BookUtils.java => BookUtils.kt} (50%) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.java b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt similarity index 50% rename from core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.java rename to core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt index 64ee81000..e6f3b3d64 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt @@ -1,6 +1,6 @@ /* * Kiwix Android - * Copyright (c) 2019 Kiwix + * Copyright (c) 2020 Kiwix * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,46 +15,44 @@ * along with this program. If not, see . * */ -package org.kiwix.kiwixmobile.core.utils; +package org.kiwix.kiwixmobile.core.utils -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.util.HashMap +import java.util.Locale /** * Created by mhutti1 on 19/04/17. */ - -public class BookUtils { - - public final Map localeMap; +class BookUtils { + val localeMap: Map // Create a map of ISO 369-2 language codes - public BookUtils() { - String[] languages = Locale.getISOLanguages(); - localeMap = new HashMap<>(languages.length); - for (String language : languages) { - Locale locale = new Locale(language); - localeMap.put(locale.getISO3Language(), locale); - } + init { + val languages = Locale.getISOLanguages() + localeMap = HashMap(languages.size) + languages + .asSequence() + .map(::Locale) + .forEach { localeMap.put(it.isO3Language, it) } } // Get the language from the language codes of the parsed xml stream - public String getLanguage(String languageCode) { - + fun getLanguage(languageCode: String?): String { + var language = "" if (languageCode == null) { - return ""; - } - - if (languageCode.length() == 2) { - return new LanguageContainer(languageCode).getLanguageName(); - } else if (languageCode.length() == 3) { - try { - return localeMap.get(languageCode).getDisplayLanguage(); - } catch (Exception e) { - return ""; + language = "" + } else { + if (languageCode.length == 2) + language = LanguageContainer(languageCode).languageName + else if (languageCode.length == LANGUAGE_CODE_LENGTH_THREE) { + val locale = localeMap[languageCode] + language = locale?.displayLanguage.toString() } } - return ""; + return language + } + + companion object { + const val LANGUAGE_CODE_LENGTH_THREE = 3 } } From 35e57e7619c6d1de91ef289f75a9630e542ad8f0 Mon Sep 17 00:00:00 2001 From: Mohamed Sameh Date: Wed, 18 Mar 2020 21:40:50 +0200 Subject: [PATCH 05/49] issue #1350: Use more kotlin features --- .../effects/SearchIntentProcessing.kt | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt index 2c69f3f41..74c8fcc80 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt @@ -37,19 +37,23 @@ data class SearchIntentProcessing( ) : SideEffect { @TargetApi(VERSION_CODES.M) override fun invokeWith(activity: AppCompatActivity) { - if (intent != null) { - if (intent.getBooleanExtra(Constants.TAG_FROM_TAB_SWITCHER, false)) { - actions.offer(ScreenOrigin(SearchOrigin.FromTabView)) - } else { - actions.offer(ScreenOrigin(SearchOrigin.FromWebView)) + intent?.let { + actions.offer( + ScreenOrigin( + if (it.getBooleanExtra( + Constants.TAG_FROM_TAB_SWITCHER, + false + ) + ) SearchOrigin.FromTabView else SearchOrigin.FromWebView + ) + ) + if (it.hasExtra(Intent.EXTRA_PROCESS_TEXT)) { + actions.offer(Filter(it.getStringExtra(Intent.EXTRA_PROCESS_TEXT))) } - if (intent.hasExtra(Intent.EXTRA_PROCESS_TEXT)) { - actions.offer(Filter(intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT))) - } - if (intent.hasExtra(Constants.EXTRA_SEARCH)) { + if (it.hasExtra(Constants.EXTRA_SEARCH)) { actions.offer(Filter(intent.getStringExtra(Constants.EXTRA_SEARCH))) } - if (intent.getBooleanExtra(Constants.EXTRA_IS_WIDGET_VOICE, false)) { + if (it.getBooleanExtra(Constants.EXTRA_IS_WIDGET_VOICE, false)) { actions.offer(ReceivedPromptForSpeechInput) } } From f156c74bbb6f7b64aba5dd59c7f31a8521d086c5 Mon Sep 17 00:00:00 2001 From: Frans-Lukas Date: Thu, 19 Mar 2020 10:49:21 +0100 Subject: [PATCH 06/49] #1868 Fix app crash on tab navigation after closing tab. --- .../java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index dad536b00..15fe03442 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -845,6 +845,7 @@ public abstract class CoreMainActivity extends BaseActivity } private void closeTab(int index) { + currentWebViewIndex = 0; tempForUndo = webViewList.get(index); webViewList.remove(index); tabsAdapter.notifyItemRemoved(index); From c8fded3cfe401011c9e6fd4ac344a93333534f78 Mon Sep 17 00:00:00 2001 From: Frans-Lukas Date: Thu, 19 Mar 2020 17:30:51 +0100 Subject: [PATCH 07/49] #1868 Sets the currentWebViewIndex correctly. --- .../org/kiwix/kiwixmobile/core/main/CoreMainActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index 15fe03442..af4278a72 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -845,9 +845,11 @@ public abstract class CoreMainActivity extends BaseActivity } private void closeTab(int index) { - currentWebViewIndex = 0; tempForUndo = webViewList.get(index); webViewList.remove(index); + if(currentWebViewIndex >= webViewList.size()){ + currentWebViewIndex = webViewList.size() - 1; + } tabsAdapter.notifyItemRemoved(index); tabsAdapter.notifyDataSetChanged(); Snackbar.make(tabSwitcherRoot, R.string.tab_closed, Snackbar.LENGTH_LONG) From f0dfff7df98871773b7168a3f0482299e7f669cb Mon Sep 17 00:00:00 2001 From: Frans-Lukas Date: Thu, 19 Mar 2020 17:48:59 +0100 Subject: [PATCH 08/49] #1868 now sets the currentWebViewIndex correctly! --- .../org/kiwix/kiwixmobile/core/main/CoreMainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index af4278a72..130aceeb9 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -847,8 +847,8 @@ public abstract class CoreMainActivity extends BaseActivity private void closeTab(int index) { tempForUndo = webViewList.get(index); webViewList.remove(index); - if(currentWebViewIndex >= webViewList.size()){ - currentWebViewIndex = webViewList.size() - 1; + if(index <= currentWebViewIndex){ + currentWebViewIndex--; } tabsAdapter.notifyItemRemoved(index); tabsAdapter.notifyDataSetChanged(); From c71892aa27873255a4892fb0113365b62a0e5602 Mon Sep 17 00:00:00 2001 From: Mohamed Sameh Date: Thu, 19 Mar 2020 21:30:27 +0200 Subject: [PATCH 09/49] issue #1350: Use more kotlin features --- .../org/kiwix/kiwixmobile/core/main/CoreMainActivity.java | 4 ++-- .../core/search/viewmodel/effects/SearchIntentProcessing.kt | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index 3929efe55..8145930bc 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -1437,7 +1437,7 @@ public abstract class CoreMainActivity extends BaseActivity switch (requestCode) { case MainMenuKt.REQUEST_FILE_SEARCH: if (resultCode == RESULT_OK) { - boolean isFromTabSwitcher = mainMenu.isInTabSwitcher(); + boolean wasFromTabSwitcher = mainMenu.isInTabSwitcher(); hideTabSwitcher(); String title = data.getStringExtra(TAG_FILE_SEARCHED).replace("", "").replace("", ""); @@ -1453,7 +1453,7 @@ public abstract class CoreMainActivity extends BaseActivity compatCallback.findAll(); compatCallback.showSoftInput(); } else { - searchForTitle(title, isFromTabSwitcher); + searchForTitle(title, wasFromTabSwitcher); } } else { //TODO: Inform the User Log.w(TAG_KIWIX, "Unhandled search failure"); diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt index 74c8fcc80..a11260c8e 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchIntentProcessing.kt @@ -28,7 +28,8 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.Action import org.kiwix.kiwixmobile.core.search.viewmodel.Action.Filter import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ReceivedPromptForSpeechInput import org.kiwix.kiwixmobile.core.search.viewmodel.Action.ScreenOrigin -import org.kiwix.kiwixmobile.core.search.viewmodel.SearchOrigin +import org.kiwix.kiwixmobile.core.search.viewmodel.SearchOrigin.FromWebView +import org.kiwix.kiwixmobile.core.search.viewmodel.SearchOrigin.FromTabView import org.kiwix.kiwixmobile.core.utils.Constants data class SearchIntentProcessing( @@ -44,7 +45,7 @@ data class SearchIntentProcessing( Constants.TAG_FROM_TAB_SWITCHER, false ) - ) SearchOrigin.FromTabView else SearchOrigin.FromWebView + ) FromTabView else FromWebView ) ) if (it.hasExtra(Intent.EXTRA_PROCESS_TEXT)) { From 94fc17da27e7aed509d670b06266338e8ed4d160 Mon Sep 17 00:00:00 2001 From: Mohamed Sameh Date: Thu, 19 Mar 2020 22:11:43 +0200 Subject: [PATCH 10/49] Fix old tests --- .../search/viewmodel/SearchViewModelTest.kt | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt index 7f51f9756..d6df05369 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt @@ -63,6 +63,7 @@ import org.kiwix.sharedFunctions.InstantExecutorExtension import org.kiwix.sharedFunctions.resetSchedulers import org.kiwix.sharedFunctions.setScheduler import java.util.concurrent.TimeUnit.MILLISECONDS +import org.kiwix.kiwixmobile.core.search.viewmodel.SearchOrigin.FromWebView @ExtendWith(InstantExecutorExtension::class) internal class SearchViewModelTest { @@ -98,7 +99,7 @@ internal class SearchViewModelTest { inner class StateTests { @Test fun `initial state is Initialising`() { - viewModel.state.test().assertValue(NoResults("")) + viewModel.state.test().assertValue(NoResults("", FromWebView)) } @Test @@ -110,7 +111,7 @@ internal class SearchViewModelTest { searchResults = listOf(item), databaseResults = listOf(RecentSearchListItem("")) ) - resultsIn(Results(searchTerm, listOf(item))) + resultsIn(Results(searchTerm, listOf(item), FromWebView)) } @Test @@ -120,7 +121,7 @@ internal class SearchViewModelTest { searchResults = emptyList(), databaseResults = listOf(RecentSearchListItem("")) ) - resultsIn(NoResults("a")) + resultsIn(NoResults("a", FromWebView)) } @Test @@ -131,7 +132,7 @@ internal class SearchViewModelTest { searchResults = listOf(ZimSearchResultListItem("")), databaseResults = listOf(item) ) - resultsIn(Results("", listOf(item))) + resultsIn(Results("", listOf(item), FromWebView)) } @Test @@ -141,7 +142,7 @@ internal class SearchViewModelTest { searchResults = listOf(ZimSearchResultListItem("")), databaseResults = emptyList() ) - resultsIn(NoResults("")) + resultsIn(NoResults("", FromWebView)) } @Test @@ -156,7 +157,10 @@ internal class SearchViewModelTest { viewModel.actions.offer(Filter(searchString)) viewModel.state.test() .also { testScheduler.advanceTimeBy(100, MILLISECONDS) } - .assertValueHistory(NoResults(""), Results(searchString, listOf(item))) + .assertValueHistory( + NoResults("", FromWebView), + Results(searchString, listOf(item), FromWebView) + ) } @Test @@ -174,7 +178,7 @@ internal class SearchViewModelTest { ) viewModel.state.test() .also { testScheduler.advanceTimeBy(100, MILLISECONDS) } - .assertValueHistory(NoResults(""), Results("b", listOf(item))) + .assertValueHistory(NoResults("", FromWebView), Results("b", listOf(item), FromWebView)) } } From 91fc864d9fe282ccedad53245dfd6135e3931b94 Mon Sep 17 00:00:00 2001 From: Hritik Wadhwa Date: Fri, 20 Mar 2020 02:05:11 +0530 Subject: [PATCH 11/49] Minor fix in BookUtil --- .../kiwix/kiwixmobile/core/utils/BookUtils.kt | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt index e6f3b3d64..652e688f1 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt @@ -24,35 +24,23 @@ import java.util.Locale * Created by mhutti1 on 19/04/17. */ class BookUtils { - val localeMap: Map - - // Create a map of ISO 369-2 language codes - init { - val languages = Locale.getISOLanguages() - localeMap = HashMap(languages.size) - languages - .asSequence() - .map(::Locale) - .forEach { localeMap.put(it.isO3Language, it) } - } + val localeMap = Locale.getISOLanguages().associateBy { Locale(it).isO3Language; Locale(it) } // Get the language from the language codes of the parsed xml stream + @Suppress("MagicNumber") fun getLanguage(languageCode: String?): String { - var language = "" - if (languageCode == null) { - language = "" - } else { - if (languageCode.length == 2) - language = LanguageContainer(languageCode).languageName - else if (languageCode.length == LANGUAGE_CODE_LENGTH_THREE) { - val locale = localeMap[languageCode] - language = locale?.displayLanguage.toString() + return when { + languageCode == null -> "" + languageCode.length == 2 -> { + LanguageContainer(languageCode).languageName + } + languageCode.length == 3 -> { + localeMap.filter { it.value == languageCode }.keys.first().displayLanguage + } + else -> { + "" } } - return language - } - - companion object { - const val LANGUAGE_CODE_LENGTH_THREE = 3 } } +} From 41b7abf5656cc9d2873ce595bc2016b03cb5d986 Mon Sep 17 00:00:00 2001 From: Hritik Wadhwa Date: Fri, 20 Mar 2020 03:27:28 +0530 Subject: [PATCH 12/49] Fixing BookUtil error --- .../kiwix/kiwixmobile/core/extensions/BookExtensions.kt | 2 +- .../java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/BookExtensions.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/BookExtensions.kt index 3ec287a37..45ae77a10 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/BookExtensions.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/BookExtensions.kt @@ -45,7 +45,7 @@ fun Book.buildSearchableText(bookUtils: BookUtils): String = append(NetworkUtils.parseURL(CoreApp.getInstance(), url)) append("|") if (bookUtils.localeMap.containsKey(language)) { - append(bookUtils.localeMap[language]!!.displayLanguage) + append(bookUtils.localeMap[language]?.displayLanguage) append("|") } }.toString() diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt index 652e688f1..e0b7d43d3 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt @@ -17,25 +17,24 @@ */ package org.kiwix.kiwixmobile.core.utils -import java.util.HashMap import java.util.Locale /** * Created by mhutti1 on 19/04/17. */ class BookUtils { - val localeMap = Locale.getISOLanguages().associateBy { Locale(it).isO3Language; Locale(it) } + val localeMap = Locale.getISOLanguages().associateBy({ Locale(it).isO3Language }, ::Locale) // Get the language from the language codes of the parsed xml stream @Suppress("MagicNumber") - fun getLanguage(languageCode: String?): String { + fun getLanguage(languageCode: String): String? { return when { languageCode == null -> "" languageCode.length == 2 -> { LanguageContainer(languageCode).languageName } languageCode.length == 3 -> { - localeMap.filter { it.value == languageCode }.keys.first().displayLanguage + localeMap[languageCode]?.displayLanguage } else -> { "" @@ -43,4 +42,4 @@ class BookUtils { } } } -} + From 2b07462ae1d7c5d004570a65d178c3b08f985af7 Mon Sep 17 00:00:00 2001 From: Hritik Wadhwa Date: Fri, 20 Mar 2020 03:45:13 +0530 Subject: [PATCH 13/49] Fixing Lint for BookUtils --- core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt index e0b7d43d3..c2a3f1d16 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/BookUtils.kt @@ -42,4 +42,3 @@ class BookUtils { } } } - From f0f34c956177bdeb23d1543944a7978bea842d1d Mon Sep 17 00:00:00 2001 From: Hritik Wadhwa Date: Fri, 20 Mar 2020 04:45:27 +0530 Subject: [PATCH 14/49] Fix #1920 Converted MetaLinkNetworkEntityTest to Kotlin --- .../entity/MetaLinkNetworkEntityTest.java | 109 --------------- .../core/entity/MetaLinkNetworkEntityTest.kt | 124 ++++++++++++++++++ 2 files changed, 124 insertions(+), 109 deletions(-) delete mode 100644 core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.java create mode 100644 core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.kt diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.java b/core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.java deleted file mode 100644 index fa67611a6..000000000 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Kiwix Android - * Copyright (c) 2019 Kiwix - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package org.kiwix.kiwixmobile.core.entity; - -import org.hamcrest.CoreMatchers; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeMatcher; -import org.junit.Assert; -import org.junit.jupiter.api.Test; -import org.simpleframework.xml.Serializer; -import org.simpleframework.xml.core.Persister; - -public class MetaLinkNetworkEntityTest { - private static Matcher url( - String location, int priority, String value) { - return new UrlMatcher(location, priority, value); - } - - @Test - public void testDeserialize() throws Exception { - Serializer serializer = new Persister(); - final MetaLinkNetworkEntity result = serializer.read( - MetaLinkNetworkEntity.class, - MetaLinkNetworkEntityTest.class.getClassLoader().getResourceAsStream( - "wikipedia_af_all_nopic_2016-05.zim.meta4" - )); - Assert.assertThat(result.getUrls().size(), CoreMatchers.is(5)); - Assert.assertThat(result.getUrls(), CoreMatchers.hasItems( - url("us", 1, - "http://ftpmirror.your.org/pub/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim"), - url("gb", 2, - "http://www.mirrorservice.org/sites/download.kiwix.org/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim"), - url("us", 3, - "http://download.wikimedia.org/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim"), - url("de", 4, - "http://mirror.netcologne.de/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim"), - url("fr", 5, "http://mirror3.kiwix.org/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim") - )); - - // Basic file attributes - Assert.assertThat(result.getFile().getName(), - CoreMatchers.is("wikipedia_af_all_nopic_2016-05.zim")); - Assert.assertThat(result.getFile().getSize(), CoreMatchers.is(63973123L)); - - // File hashes - Assert.assertThat(result.getFile().getHash("md5"), - CoreMatchers.is("6f06866b61c4a921b57f28cfd4307220")); - Assert.assertThat(result.getFile().getHash("sha-1"), - CoreMatchers.is("8aac4c7f89e3cdd45b245695e19ecde5aac59593")); - Assert.assertThat(result.getFile().getHash("sha-256"), - CoreMatchers.is("83126775538cf588a85edb10db04d6e012321a2025278a08a084b258849b3a5c")); - - // Pieces - Assert.assertThat(result.getFile().getPieceHashType(), CoreMatchers.is("sha-1")); - Assert.assertThat(result.getFile().getPieceLength(), CoreMatchers.is(1048576)); - - // Check only the first and the last elements of the piece hashes - Assert.assertThat(result.getFile().getPieceHashes().size(), CoreMatchers.is(62)); - Assert.assertThat(result.getFile().getPieceHashes().get(0), - CoreMatchers.is("f36815d904d4fd563aaef4ee6ef2600fb1fd70b2")); - Assert.assertThat(result.getFile().getPieceHashes().get(61), - CoreMatchers.is("8055e515aa6e78f2810bbb0e0cd07330838b8920")); - } - - /** - * Implemented as a matcher only to avoid putting extra code into {@code MetaLinkNetworkEntity}. - * However in case {@code equals} and {@code hashCode} methods are added to - * {@code MetaLinkNetworkEntity.Url} class itself, this Matcher should be deleted. - */ - private static class UrlMatcher extends TypeSafeMatcher { - private String location; - private int priority; - private String value; - - public UrlMatcher(String location, int priority, String value) { - this.location = location; - this.priority = priority; - this.value = value; - } - - @Override - protected boolean matchesSafely(MetaLinkNetworkEntity.Url item) { - return location.equals(item.getLocation()) && priority == item.getPriority() - && value.equals(item.getValue()); - } - - @Override - public void describeTo(Description description) { - description.appendText(String.format( - "Url (location=%s, priority=%d, value=%s", location, priority, value)); - } - } -} diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.kt new file mode 100644 index 000000000..a7d173166 --- /dev/null +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/entity/MetaLinkNetworkEntityTest.kt @@ -0,0 +1,124 @@ +/* +* Kiwix Android +* Copyright (c) 2019 Kiwix +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +*/ +package org.kiwix.kiwixmobile.core.entity + +import org.hamcrest.CoreMatchers +import org.hamcrest.Description +import org.hamcrest.Matcher +import org.hamcrest.TypeSafeMatcher +import org.junit.Assert +import org.junit.jupiter.api.Test +import org.simpleframework.xml.core.Persister + +class MetaLinkNetworkEntityTest { + private fun url( + location: String, priority: Int, value: String + ): Matcher = UrlMatcher(location, priority, value) + + @Test + @Throws(Exception::class) + fun testDeserialize() { + val serializer = Persister() + val result = serializer.read( + MetaLinkNetworkEntity::class.java, + MetaLinkNetworkEntityTest::class.java!!.classLoader.getResourceAsStream( + "wikipedia_af_all_nopic_2016-05.zim.meta4" + ) + ) + Assert.assertThat(result.urls.size, CoreMatchers.`is`(5)) + Assert.assertThat( + result.urls, CoreMatchers.hasItems( + url( + "us", 1, + "http://ftpmirror.your.org/pub/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim" + ), + url( + "gb", 2, + "http://www.mirrorservice.org/sites/download.kiwix.org/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim" + ), + url( + "us", 3, + "http://download.wikimedia.org/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim" + ), + url( + "de", 4, + "http://mirror.netcologne.de/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim" + ), + url("fr", 5, "http://mirror3.kiwix.org/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim") + ) + ) + // Basic file attributes + Assert.assertThat( + result.getFile().getName(), + CoreMatchers.`is`("wikipedia_af_all_nopic_2016-05.zim") + ) + Assert.assertThat(result.getFile().size, CoreMatchers.`is`(63973123L)) + // File hashes + Assert.assertThat( + result.getFile().getHash("md5"), + CoreMatchers.`is`("6f06866b61c4a921b57f28cfd4307220") + ) + Assert.assertThat( + result.getFile().getHash("sha-1"), + CoreMatchers.`is`("8aac4c7f89e3cdd45b245695e19ecde5aac59593") + ) + Assert.assertThat( + result.getFile().getHash("sha-256"), + CoreMatchers.`is`("83126775538cf588a85edb10db04d6e012321a2025278a08a084b258849b3a5c") + ) + // Pieces + Assert.assertThat(result.getFile().pieceHashType, CoreMatchers.`is`("sha-1")) + Assert.assertThat(result.getFile().pieceLength, CoreMatchers.`is`(1048576)) + // Check only the first and the last elements of the piece hashes + Assert.assertThat(result.getFile().pieceHashes.size, CoreMatchers.`is`(62)) + Assert.assertThat( + result.getFile().pieceHashes[0], + CoreMatchers.`is`("f36815d904d4fd563aaef4ee6ef2600fb1fd70b2") + ) + Assert.assertThat( + result.getFile().pieceHashes[61], + CoreMatchers.`is`("8055e515aa6e78f2810bbb0e0cd07330838b8920") + ) + } + + /** + * Implemented as a matcher only to avoid putting extra code into {@code MetaLinkNetworkEntity}. + * However in case {@code equals} and {@code hashCode} methods are added to + * {@code MetaLinkNetworkEntity.Url} class itself, this Matcher should be deleted. + */ + private class UrlMatcher( + val location: String, val priority: Int, + val value: String + ) : + + TypeSafeMatcher() { + + override fun matchesSafely(item: MetaLinkNetworkEntity.Url): Boolean { + return (location == item.location && priority == item.priority + && value == item.value) + } + + override fun describeTo(description: Description) { + description.appendText( + String.format( + "Url (location=%s, priority=%d, value=%s", location, priority, value + ) + ) + } + } +} From 0c536cdc272f33bcc44a03652f70c9b7f8629c9e Mon Sep 17 00:00:00 2001 From: Sonu Sourav Date: Wed, 11 Mar 2020 16:13:10 +0530 Subject: [PATCH 15/49] Revamped the UI of recycler views --- .idea/codeStyles/Project.xml | 5 +- app/lint-baseline.xml | 3221 +++++++-------------- app/src/main/res/layout/item_download.xml | 15 +- app/src/main/res/layout/item_library.xml | 240 +- core/src/main/res/layout/item_book.xml | 224 +- core/src/main/res/layout/item_help.xml | 1 + core/src/main/res/values-night/color.xml | 3 + core/src/main/res/values/colors.xml | 5 +- core/src/main/res/values/dimens.xml | 2 + 9 files changed, 1322 insertions(+), 2394 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 386afcc2a..4ce8cb6cb 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -10,9 +10,6 @@