From ba7275b775a2003070b445d9f43f29f844105efa Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Mon, 9 Sep 2019 12:41:22 +0100 Subject: [PATCH] #1383 remove rendundant menu items + reorganise items/constants + clear notes in KiwixSettingsActivity --- .../kiwix/kiwixmobile/main/AddNoteDialog.java | 11 +- .../kiwix/kiwixmobile/main/MainActivity.java | 537 +++++++----------- .../settings/KiwixSettingsActivity.java | 71 ++- .../kiwix/kiwixmobile/utils/Constants.java | 45 -- .../utils/SharedPreferenceUtil.java | 48 +- .../ic_baseline_delete_sweep_24px.xml | 9 - app/src/main/res/menu/menu_main.xml | 137 ++--- app/src/main/res/values/strings.xml | 8 +- app/src/main/res/xml/preferences.xml | 10 + 9 files changed, 375 insertions(+), 501 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_baseline_delete_sweep_24px.xml diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java b/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java index dfda49a15..d27fc36c2 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/AddNoteDialog.java @@ -35,12 +35,11 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.kiwix.kiwixmobile.BuildConfig; +import org.kiwix.kiwixmobile.KiwixApplication; import org.kiwix.kiwixmobile.R; import org.kiwix.kiwixmobile.data.ZimContentProvider; import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil; -import static org.kiwix.kiwixmobile.utils.Constants.NOTES_DIRECTORY; - /** * Created by @author Aditya-Sood (21/05/19) as a part of GSoC 2019 * @@ -53,6 +52,8 @@ import static org.kiwix.kiwixmobile.utils.Constants.NOTES_DIRECTORY; public class AddNoteDialog extends DialogFragment implements ConfirmationAlertDialogFragment.UserClickListener { + public static final String NOTES_DIRECTORY = + Environment.getExternalStorageDirectory() + "/Kiwix/Notes/"; public static final String TAG = "AddNoteDialog"; private SharedPreferenceUtil sharedPreferenceUtil; @@ -298,7 +299,7 @@ public class AddNoteDialog extends DialogFragment * "{External Storage}/Kiwix/Notes/ZimFileTitle/ArticleTitle.txt" * */ - if (isExternalStorageWritable()) { + if (KiwixApplication.getInstance().isExternalStorageWritable()) { if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { @@ -415,10 +416,6 @@ public class AddNoteDialog extends DialogFragment } } - static boolean isExternalStorageWritable() { - return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - } - private void showToast(int stringResource, int duration) { Toast.makeText(getActivity(), stringResource, duration).show(); } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java index e975f182b..223b2ad5d 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/MainActivity.java @@ -26,7 +26,6 @@ import android.appwidget.AppWidgetManager; import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -86,7 +85,6 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.navigation.NavigationView; import com.google.android.material.snackbar.Snackbar; import io.reactivex.android.schedulers.AndroidSchedulers; - import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -136,8 +134,6 @@ import static org.kiwix.kiwixmobile.utils.Constants.EXTRA_LIBRARY; import static org.kiwix.kiwixmobile.utils.Constants.EXTRA_SEARCH; import static org.kiwix.kiwixmobile.utils.Constants.EXTRA_ZIM_FILE; import static org.kiwix.kiwixmobile.utils.Constants.EXTRA_ZIM_FILE_2; -import static org.kiwix.kiwixmobile.utils.Constants.NOTES_DIRECTORY; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_KIWIX_MOBILE; import static org.kiwix.kiwixmobile.utils.Constants.REQUEST_FILE_SEARCH; import static org.kiwix.kiwixmobile.utils.Constants.REQUEST_FILE_SELECT; import static org.kiwix.kiwixmobile.utils.Constants.REQUEST_HISTORY_ITEM_CHOSEN; @@ -154,11 +150,12 @@ import static org.kiwix.kiwixmobile.utils.Constants.TAG_CURRENT_TAB; import static org.kiwix.kiwixmobile.utils.Constants.TAG_FILE_SEARCHED; import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX; import static org.kiwix.kiwixmobile.utils.LanguageUtils.getResourceString; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_KIWIX_MOBILE; import static org.kiwix.kiwixmobile.utils.StyleUtils.dialogStyle; import static org.kiwix.kiwixmobile.utils.UpdateUtils.reformatProviderUrl; public class MainActivity extends BaseActivity implements WebViewCallback, - MainContract.View { + MainContract.View { private static final String NEW_TAB = "NEW_TAB"; private static final String HOME_URL = "file:///android_asset/home.html"; @@ -256,21 +253,21 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private ItemTouchHelper.Callback tabCallback = new ItemTouchHelper.Callback() { @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, - @NonNull RecyclerView.ViewHolder viewHolder) { + @NonNull RecyclerView.ViewHolder viewHolder) { return makeMovementFlags(0, ItemTouchHelper.UP | ItemTouchHelper.DOWN); } @Override public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, - @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, - boolean isCurrentlyActive) { + @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, + boolean isCurrentlyActive) { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); viewHolder.itemView.setAlpha(1 - Math.abs(dY) / viewHolder.itemView.getMeasuredHeight()); } @Override public boolean onMove(@NonNull RecyclerView recyclerView, - @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { return false; } @@ -314,13 +311,13 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void readAloudSelection(Menu menu) { if (menu != null) { menu.findItem(R.id.menu_speak_text) - .setOnMenuItemClickListener(item -> { - tts.readSelection(getCurrentWebView()); - if (actionMode != null) { - actionMode.finish(); - } - return true; - }); + .setOnMenuItemClickListener(item -> { + tts.readSelection(getCurrentWebView()); + if (actionMode != null) { + actionMode.finish(); + } + return true; + }); } } @@ -347,7 +344,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, }); tableDrawerRight = - tableDrawerRightContainer.getHeaderView(0).findViewById(R.id.right_drawer_list); + tableDrawerRightContainer.getHeaderView(0).findViewById(R.id.right_drawer_list); checkForRateDialog(); @@ -364,7 +361,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, setupDocumentParser(); if (BuildConfig.IS_CUSTOM_APP) { - Log.d(TAG_KIWIX, "This is a custom app:" +BuildConfig.APPLICATION_ID); + Log.d(TAG_KIWIX, "This is a custom app:" + BuildConfig.APPLICATION_ID); if (loadCustomAppContent()) { Log.d(TAG_KIWIX, "Found custom content, continuing..."); // Continue @@ -375,7 +372,6 @@ public class MainActivity extends BaseActivity implements WebViewCallback, // it didn't crash yet today the app crashes because it tries to load books // in onResume(); } - } else { manageExternalLaunchAndRestoringViewState(); @@ -388,14 +384,14 @@ public class MainActivity extends BaseActivity implements WebViewCallback, wasHideToolbar = isHideToolbar; booksAdapter = new BooksOnDiskAdapter( - new BookOnDiskDelegate.BookDelegate(sharedPreferenceUtil, - bookOnDiskItem -> { - open(bookOnDiskItem); - return Unit.INSTANCE; - }, - null, - null), - BookOnDiskDelegate.LanguageDelegate.INSTANCE + new BookOnDiskDelegate.BookDelegate(sharedPreferenceUtil, + bookOnDiskItem -> { + open(bookOnDiskItem); + return Unit.INSTANCE; + }, + null, + null), + BookOnDiskDelegate.LanguageDelegate.INSTANCE ); searchFiles(); @@ -513,8 +509,8 @@ public class MainActivity extends BaseActivity implements WebViewCallback, @Override public void onSectionClick(View view, int position) { getCurrentWebView().loadUrl("javascript:document.getElementById('" - + documentSections.get(position).id - + "').scrollIntoView();"); + + documentSections.get(position).id + + "').scrollIntoView();"); drawerLayout.closeDrawers(); } }); @@ -524,7 +520,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void showTabSwitcher() { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator( - ContextCompat.getDrawable(this, R.drawable.ic_round_add_white_36dp)); + ContextCompat.getDrawable(this, R.drawable.ic_round_add_white_36dp)); actionBar.setDisplayShowTitleEnabled(false); drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); @@ -535,7 +531,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, tabSwitcherRoot.setVisibility(View.VISIBLE); supportInvalidateOptionsMenu(); if (tabsAdapter.getSelected() < webViewList.size() && - tabRecyclerView.getLayoutManager() != null) { + tabRecyclerView.getLayoutManager() != null) { tabRecyclerView.getLayoutManager().scrollToPosition(tabsAdapter.getSelected()); } } @@ -546,7 +542,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); closeAllTabsButton.setImageDrawable( - ContextCompat.getDrawable(this, R.drawable.ic_close_black_24dp)); + ContextCompat.getDrawable(this, R.drawable.ic_close_black_24dp)); tabSwitcherRoot.setVisibility(View.GONE); progressBar.setVisibility(View.VISIBLE); contentFrame.setVisibility(View.VISIBLE); @@ -598,8 +594,8 @@ public class MainActivity extends BaseActivity implements WebViewCallback, visitCounterPref.setCount(tempVisitCount); if (tempVisitCount >= 10 - && !visitCounterPref.getNoThanksState() - && NetworkUtils.isNetworkAvailable(this) && !BuildConfig.DEBUG) { + && !visitCounterPref.getNoThanksState() + && NetworkUtils.isNetworkAvailable(this) && !BuildConfig.DEBUG) { showRateDialog(); } } @@ -607,26 +603,26 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void showRateDialog() { String title = getString(R.string.rate_dialog_title); String message = getString(R.string.rate_dialog_msg_1) + " " - + getString(R.string.app_name) - + getString(R.string.rate_dialog_msg_2); + + getString(R.string.app_name) + + getString(R.string.rate_dialog_msg_2); String positive = getString(R.string.rate_dialog_positive); String negative = getString(R.string.rate_dialog_negative); String neutral = getString(R.string.rate_dialog_neutral); new AlertDialog.Builder(this, dialogStyle()) - .setTitle(title) - .setMessage(message) - .setPositiveButton(positive, (dialog, id) -> { - visitCounterPref.setNoThanksState(true); - goToRateApp(); - }) - .setNegativeButton(negative, (dialog, id) -> visitCounterPref.setNoThanksState(true)) - .setNeutralButton(neutral, (dialog, id) -> { - tempVisitCount = 0; - visitCounterPref.setCount(tempVisitCount); - }) - .setIcon(ContextCompat.getDrawable(this, R.mipmap.kiwix_icon)) - .show(); + .setTitle(title) + .setMessage(message) + .setPositiveButton(positive, (dialog, id) -> { + visitCounterPref.setNoThanksState(true); + goToRateApp(); + }) + .setNegativeButton(negative, (dialog, id) -> visitCounterPref.setNoThanksState(true)) + .setNeutralButton(neutral, (dialog, id) -> { + tempVisitCount = 0; + visitCounterPref.setCount(tempVisitCount); + }) + .setIcon(ContextCompat.getDrawable(this, R.mipmap.kiwix_icon)) + .show(); } private void goToSearch(boolean isVoice) { @@ -641,22 +637,21 @@ public class MainActivity extends BaseActivity implements WebViewCallback, } private void goToRateApp() { - Uri kiwixLocalMarketUri = Uri.parse("market://details?id=" + getPackageName()); - Uri kiwixBrowserMarketUri = - Uri.parse("http://play.google.com/store/apps/details?id=" + getPackageName()); + Uri kiwixLocalMarketUri = Uri.parse("market://details?id=" + getPackageName()); + Uri kiwixBrowserMarketUri = + Uri.parse("http://play.google.com/store/apps/details?id=" + getPackageName()); - - Intent goToMarket = new Intent(Intent.ACTION_VIEW, kiwixLocalMarketUri); + Intent goToMarket = new Intent(Intent.ACTION_VIEW, kiwixLocalMarketUri); goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | - Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | - Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | + Intent.FLAG_ACTIVITY_MULTIPLE_TASK); try { startActivity(goToMarket); } catch (ActivityNotFoundException e) { startActivity(new Intent(Intent.ACTION_VIEW, - kiwixBrowserMarketUri)); + kiwixBrowserMarketUri)); } } @@ -683,7 +678,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, isSpeaking = true; runOnUiThread(() -> { menu.findItem(R.id.menu_read_aloud) - .setTitle(createMenuItem(getResources().getString(R.string.menu_read_aloud_stop))); + .setTitle(createMenuItem(getResources().getString(R.string.menu_read_aloud_stop))); TTSControls.setVisibility(View.VISIBLE); }); } @@ -693,7 +688,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, isSpeaking = false; runOnUiThread(() -> { menu.findItem(R.id.menu_read_aloud) - .setTitle(createMenuItem(getResources().getString(R.string.menu_read_aloud))); + .setTitle(createMenuItem(getResources().getString(R.string.menu_read_aloud))); TTSControls.setVisibility(View.GONE); pauseTTSButton.setText(R.string.tts_pause); }); @@ -768,8 +763,8 @@ public class MainActivity extends BaseActivity implements WebViewCallback, KiwixWebView webView; if (!isHideToolbar) { webView = - new ToolbarScrollingKiwixWebView(MainActivity.this, this, toolbarContainer, bottomToolbar, - attrs); + new ToolbarScrollingKiwixWebView(MainActivity.this, this, toolbarContainer, bottomToolbar, + attrs); } else { webView = new ToolbarStaticKiwixWebView(MainActivity.this, this, attrs); } @@ -780,7 +775,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private KiwixWebView newTab() { String mainPage = - Uri.parse(ZimContentProvider.CONTENT_URI + ZimContentProvider.getMainPage()).toString(); + Uri.parse(ZimContentProvider.CONTENT_URI + ZimContentProvider.getMainPage()).toString(); return newTab(mainPage); } @@ -808,13 +803,13 @@ public class MainActivity extends BaseActivity implements WebViewCallback, tabsAdapter.notifyItemRemoved(index); tabsAdapter.notifyItemRangeChanged(index, webViewList.size()); Snackbar.make(snackbarRoot, R.string.tab_closed, Snackbar.LENGTH_LONG) - .setAction(R.string.undo, v -> { - webViewList.add(index, tempForUndo); - tabsAdapter.notifyItemInserted(index); - setUpWebView(); - updateTabSwitcherIcon(); - }) - .show(); + .setAction(R.string.undo, v -> { + webViewList.add(index, tempForUndo); + tabsAdapter.notifyItemInserted(index); + setUpWebView(); + updateTabSwitcherIcon(); + }) + .show(); openHomeScreen(); updateTabSwitcherIcon(); } @@ -853,7 +848,6 @@ public class MainActivity extends BaseActivity implements WebViewCallback, @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case R.id.menu_new_tab: case android.R.id.home: if (tabSwitcherRoot.getVisibility() == View.VISIBLE) { hideTabSwitcher(); @@ -861,17 +855,6 @@ public class MainActivity extends BaseActivity implements WebViewCallback, newTab(HOME_URL); return true; - case R.id.menu_home: - openMainPage(); - break; - - case R.id.menu_searchintext: - compatCallback.setActive(); - compatCallback.setWebView(getCurrentWebView()); - startSupportActionMode(compatCallback); - compatCallback.showSoftInput(); - break; - case R.id.menu_add_note: if (requestExternalStorageWritePermissionForNotes()) { // Check permission since notes are stored in the public-external storage @@ -879,12 +862,6 @@ public class MainActivity extends BaseActivity implements WebViewCallback, } break; - case R.id.menu_clear_notes: - if (requestExternalStorageWritePermissionForNotes()) { // Check permission since notes are stored in the public-external storage - showClearAllNotesDialog(); - } - break; - case R.id.menu_bookmarks_list: goToBookmarks(); break; @@ -928,7 +905,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, case R.id.menu_history: startActivityForResult(new Intent(this, HistoryActivity.class), - REQUEST_HISTORY_ITEM_CHOSEN); + REQUEST_HISTORY_ITEM_CHOSEN); return true; case R.id.menu_support_kiwix: @@ -950,75 +927,6 @@ public class MainActivity extends BaseActivity implements WebViewCallback, return super.onOptionsItemSelected(item); } - /** Dialog to take user confirmation before deleting all notes */ - private void showClearAllNotesDialog() { - - AlertDialog.Builder builder; - if (sharedPreferenceUtil != null && sharedPreferenceUtil.nightMode()) { // Night Mode support - builder = new AlertDialog.Builder(this, R.style.AppTheme_Dialog_Night); - } else { - builder = new AlertDialog.Builder(this); - } - - builder.setMessage(R.string.delete_notes_confirmation_msg) - .setNegativeButton(android.R.string.cancel, null) // Do nothing for 'Cancel' button - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - clearAllNotes(); - } - }) - .show(); - } - - /** Method to delete all user notes */ - void clearAllNotes() { - - boolean result = true; // Result of all delete() calls is &&-ed to this variable - - if (AddNoteDialog.isExternalStorageWritable()) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { - Log.d("MainActivity", "WRITE_EXTERNAL_STORAGE permission not granted"); - showToast(R.string.ext_storage_permission_not_granted, Toast.LENGTH_LONG); - return; - } - - // TODO: Replace below code with Kotlin's deleteRecursively() method - - File notesDirectory = new File(NOTES_DIRECTORY); - File[] filesInNotesDirectory = notesDirectory.listFiles(); - - if (filesInNotesDirectory == null) { // Notes folder doesn't exist - showToast(R.string.notes_deletion_none_found, Toast.LENGTH_LONG); - return; - } - - for (File wikiFileDirectory : filesInNotesDirectory) { - if (wikiFileDirectory.isDirectory()) { - File[] filesInWikiDirectory = wikiFileDirectory.listFiles(); - - for (File noteFile : filesInWikiDirectory) { - if (noteFile.isFile()) { - result = result && noteFile.delete(); - } - } - } - - result = result && wikiFileDirectory.delete(); // Wiki specific notes directory deleted - } - - result = - result && notesDirectory.delete(); // "{External Storage}/Kiwix/Notes" directory deleted - } - - if (result) { - showToast(R.string.notes_deletion_successful, Toast.LENGTH_SHORT); - } else { - showToast(R.string.notes_deletion_unsuccessful, Toast.LENGTH_SHORT); - } - } - /** Creates the full screen AddNoteDialog, which is a DialogFragment */ private void showAddNoteDialog() { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); @@ -1039,7 +947,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, if (Build.VERSION.SDK_INT >= 23) { // For Marshmallow & higher API levels if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) - == PackageManager.PERMISSION_GRANTED) { + == PackageManager.PERMISSION_GRANTED) { return true; } else { if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { @@ -1051,7 +959,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, } requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, - REQUEST_WRITE_STORAGE_PERMISSION_ADD_NOTE); + REQUEST_WRITE_STORAGE_PERMISSION_ADD_NOTE); } } else { // For Android versions below Marshmallow 6.0 (API 23) return true; // As already requested at install time @@ -1122,8 +1030,8 @@ public class MainActivity extends BaseActivity implements WebViewCallback, // Show popup with warning that this url is external and could lead to additional costs // or may event not work when the user is offline. if (intent.hasExtra(EXTRA_EXTERNAL_LINK) - && intent.getBooleanExtra(EXTRA_EXTERNAL_LINK, false) - && isExternalLinkPopup) { + && intent.getBooleanExtra(EXTRA_EXTERNAL_LINK, false) + && isExternalLinkPopup) { externalLinkPopup(intent); } else { startActivity(intent); @@ -1139,25 +1047,25 @@ public class MainActivity extends BaseActivity implements WebViewCallback, ? R.drawable.ic_warning_white : R.drawable.ic_warning_black; new AlertDialog.Builder(this, dialogStyle()) - .setTitle(R.string.external_link_popup_dialog_title) - .setMessage(R.string.external_link_popup_dialog_message) - .setNegativeButton(android.R.string.no, (dialogInterface, i) -> { - // do nothing - }) - .setNeutralButton(R.string.do_not_ask_anymore, (dialogInterface, i) -> { - sharedPreferenceUtil.putPrefExternalLinkPopup(false); - isExternalLinkPopup = false; + .setTitle(R.string.external_link_popup_dialog_title) + .setMessage(R.string.external_link_popup_dialog_message) + .setNegativeButton(android.R.string.no, (dialogInterface, i) -> { + // do nothing + }) + .setNeutralButton(R.string.do_not_ask_anymore, (dialogInterface, i) -> { + sharedPreferenceUtil.putPrefExternalLinkPopup(false); + isExternalLinkPopup = false; - startActivity(intent); - }) - .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> startActivity(intent)) - .setIcon(warningResId) - .show(); + startActivity(intent); + }) + .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> startActivity(intent)) + .setIcon(warningResId) + .show(); } private void openZimFile(File file, boolean clearHistory) { if (file.canRead() || Build.VERSION.SDK_INT < 19 || (BuildConfig.IS_CUSTOM_APP - && Build.VERSION.SDK_INT != 23)) { + && Build.VERSION.SDK_INT != 23)) { if (file.exists()) { if (ZimContentProvider.setZimFile(file.getAbsolutePath()) != null) { @@ -1175,40 +1083,40 @@ public class MainActivity extends BaseActivity implements WebViewCallback, presenter.loadCurrentZimBookmarksUrl(); } else { Toast.makeText(this, getResources().getString(R.string.error_file_invalid), - Toast.LENGTH_LONG).show(); + Toast.LENGTH_LONG).show(); showHomePage(); } } else { Log.w(TAG_KIWIX, "ZIM file doesn't exist at " + file.getAbsolutePath()); Toast.makeText(this, getResources().getString(R.string.error_file_not_found), - Toast.LENGTH_LONG) - .show(); + Toast.LENGTH_LONG) + .show(); showHomePage(); } } else { this.file = file; ActivityCompat.requestPermissions(this, - new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, - REQUEST_STORAGE_PERMISSION); + new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, + REQUEST_STORAGE_PERMISSION); if (BuildConfig.IS_CUSTOM_APP && Build.VERSION.SDK_INT == Build.VERSION_CODES.M) { Toast.makeText(this, getResources().getString(R.string.request_storage_custom), - Toast.LENGTH_LONG) - .show(); + Toast.LENGTH_LONG) + .show(); } else { Toast.makeText(this, getResources().getString(R.string.request_storage), Toast.LENGTH_LONG) - .show(); + .show(); } } } @Override public void onRequestPermissionsResult(int requestCode, - @NonNull String[] permissions, @NonNull int[] grantResults) { + @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case REQUEST_STORAGE_PERMISSION: { if (grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { finish(); Intent newZimFile = new Intent(MainActivity.this, MainActivity.class); newZimFile.setData(Uri.fromFile(file)); @@ -1224,17 +1132,17 @@ public class MainActivity extends BaseActivity implements WebViewCallback, case REQUEST_READ_STORAGE_PERMISSION: { if (grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { scanStorageForZims(); } else { Snackbar.make(snackbarRoot, R.string.request_storage, Snackbar.LENGTH_LONG) - .setAction(R.string.menu_settings, view -> { - Intent intent = new Intent(); - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - Uri uri = Uri.fromParts("package", getPackageName(), null); - intent.setData(uri); - startActivity(intent); - }).show(); + .setAction(R.string.menu_settings, view -> { + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivity(intent); + }).show(); } break; } @@ -1246,7 +1154,8 @@ public class MainActivity extends BaseActivity implements WebViewCallback, showAddNoteDialog(); } else { Toast.makeText(getApplicationContext(), - getString(R.string.ext_storage_write_permission_denied_add_note), Toast.LENGTH_LONG); + getString(R.string.ext_storage_write_permission_denied_add_note), Toast.LENGTH_LONG) + .show(); } break; @@ -1256,9 +1165,9 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void scanStorageForZims() { storageObserver.getBooksOnFileSystem() - .take(1) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(presenter::saveBooks, Throwable::printStackTrace); + .take(1) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(presenter::saveBooks, Throwable::printStackTrace); } // Workaround for popup bottom menu on older devices @@ -1290,9 +1199,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void initAllMenuItems() { try { menu.findItem(R.id.menu_fullscreen).setVisible(true); - menu.findItem(R.id.menu_home).setVisible(true); menu.findItem(R.id.menu_random_article).setVisible(true); - menu.findItem(R.id.menu_searchintext).setVisible(true); MenuItem searchItem = menu.findItem(R.id.menu_search); searchItem.setVisible(true); @@ -1309,7 +1216,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, menu.findItem(R.id.menu_read_aloud).setVisible(true); if (isSpeaking) { menu.findItem(R.id.menu_read_aloud) - .setTitle(createMenuItem(getResources().getString(R.string.menu_read_aloud_stop))); + .setTitle(createMenuItem(getResources().getString(R.string.menu_read_aloud_stop))); } } } catch (Exception e) { @@ -1368,7 +1275,8 @@ public class MainActivity extends BaseActivity implements WebViewCallback, boolean isBookmark = false; if (articleUrl != null && !bookmarks.contains(articleUrl)) { if (ZimContentProvider.getId() != null) { - presenter.saveBookmark( BookmarkItem.fromZimContentProvider(getCurrentWebView().getTitle(), articleUrl)); + presenter.saveBookmark( + BookmarkItem.fromZimContentProvider(getCurrentWebView().getTitle(), articleUrl)); } else { Toast.makeText(this, R.string.unable_to_add_to_bookmarks, Toast.LENGTH_SHORT).show(); } @@ -1384,12 +1292,12 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void popBookmarkSnackbar(boolean isBookmark) { if (isBookmark) { Snackbar.make(snackbarRoot, R.string.bookmark_added, Snackbar.LENGTH_LONG) - .setAction(getString(R.string.open), v -> goToBookmarks()) - .setActionTextColor(getResources().getColor(R.color.white)) - .show(); + .setAction(getString(R.string.open), v -> goToBookmarks()) + .setActionTextColor(getResources().getColor(R.color.white)) + .show(); } else { Snackbar.make(snackbarRoot, R.string.bookmark_removed, Snackbar.LENGTH_LONG) - .show(); + .show(); } } @@ -1421,9 +1329,9 @@ public class MainActivity extends BaseActivity implements WebViewCallback, } if (!webViewList.isEmpty() && currentWebViewIndex < webViewList.size() && - webViewList.get(currentWebViewIndex).getUrl() != null && - webViewList.get(currentWebViewIndex).getUrl().equals(HOME_URL) && - webViewList.get(currentWebViewIndex).findViewById(R.id.get_content_card) != null) { + webViewList.get(currentWebViewIndex).getUrl() != null && + webViewList.get(currentWebViewIndex).getUrl().equals(HOME_URL) && + webViewList.get(currentWebViewIndex).findViewById(R.id.get_content_card) != null) { webViewList.get(currentWebViewIndex).findViewById(R.id.get_content_card).setEnabled(true); } updateBottomToolbarVisibility(); @@ -1482,12 +1390,12 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void updateBottomToolbarVisibility() { if (checkNull(bottomToolbar)) { if (!HOME_URL.equals( - getCurrentWebView().getUrl()) - && tabSwitcherRoot.getVisibility() != View.VISIBLE) { + getCurrentWebView().getUrl()) + && tabSwitcherRoot.getVisibility() != View.VISIBLE) { bottomToolbar.setVisibility(View.VISIBLE); if (getCurrentWebView() instanceof ToolbarStaticKiwixWebView) { contentFrame.setPadding(0, 0, 0, - (int) getResources().getDimension(R.dimen.bottom_toolbar_height)); + (int) getResources().getDimension(R.dimen.bottom_toolbar_height)); } else { contentFrame.setPadding(0, 0, 0, 0); } @@ -1528,10 +1436,10 @@ public class MainActivity extends BaseActivity implements WebViewCallback, AlertDialog.Builder builder = new AlertDialog.Builder(this, dialogStyle()); builder.setMessage(getString(R.string.hint_contents_drawer_message)) - .setPositiveButton(getString(R.string.got_it), (dialog, id) -> { - }) - .setTitle(getString(R.string.did_you_know)) - .setIcon(R.drawable.icon_question); + .setPositiveButton(getString(R.string.got_it), (dialog, id) -> { + }) + .setTitle(getString(R.string.did_you_know)) + .setIcon(R.drawable.icon_question); AlertDialog alert = builder.create(); alert.show(); } @@ -1539,7 +1447,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void openArticle(String articleUrl) { if (articleUrl != null) { getCurrentWebView().loadUrl( - Uri.parse(ZimContentProvider.CONTENT_URI + articleUrl).toString()); + Uri.parse(ZimContentProvider.CONTENT_URI + articleUrl).toString()); } } @@ -1590,13 +1498,10 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void toggleActionItemsConfig() { if (menu != null) { MenuItem random = menu.findItem(R.id.menu_random_article); - MenuItem home = menu.findItem(R.id.menu_home); if (getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE) { random.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - home.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } else { random.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - home.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } } } @@ -1621,7 +1526,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, case REQUEST_FILE_SEARCH: if (resultCode == RESULT_OK) { String title = - data.getStringExtra(TAG_FILE_SEARCHED).replace("", "").replace("", ""); + data.getStringExtra(TAG_FILE_SEARCHED).replace("", "").replace("", ""); boolean isSearchInText = data.getBooleanExtra(EXTRA_SEARCH_IN_TEXT, false); if (isSearchInText) { //if the search is localized trigger find in page UI. @@ -1738,7 +1643,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, this.menu = menu; if (getCurrentWebView().getUrl() == null || - getCurrentWebView().getUrl().equals(HOME_URL)) { + getCurrentWebView().getUrl().equals(HOME_URL)) { menu.findItem(R.id.menu_read_aloud).setVisible(false); } else { menu.findItem(R.id.menu_read_aloud).setVisible(true); @@ -1747,25 +1652,19 @@ public class MainActivity extends BaseActivity implements WebViewCallback, if (tabSwitcherRoot.getVisibility() == View.VISIBLE) { menu.findItem(R.id.menu_search).setVisible(false); menu.findItem(R.id.menu_fullscreen).setVisible(false); - menu.findItem(R.id.menu_home).setVisible(false); menu.findItem(R.id.menu_random_article).setVisible(false); - menu.findItem(R.id.menu_searchintext).setVisible(false); menu.findItem(R.id.menu_read_aloud).setVisible(false); } else { menu.findItem(R.id.menu_search).setVisible(true); menu.findItem(R.id.menu_fullscreen).setVisible(true); if (getCurrentWebView().getUrl() == null || - getCurrentWebView().getUrl().equals(HOME_URL)) { + getCurrentWebView().getUrl().equals(HOME_URL)) { menu.findItem(R.id.menu_read_aloud).setVisible(false); - menu.findItem(R.id.menu_home).setVisible(false); menu.findItem(R.id.menu_random_article).setVisible(false); - menu.findItem(R.id.menu_searchintext).setVisible(false); menu.findItem(R.id.menu_host_books).setVisible(true); } else { menu.findItem(R.id.menu_read_aloud).setVisible(true); - menu.findItem(R.id.menu_home).setVisible(true); menu.findItem(R.id.menu_random_article).setVisible(true); - menu.findItem(R.id.menu_searchintext).setVisible(true); } } return true; @@ -1784,10 +1683,10 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void refreshBookmarkSymbol() { if (checkNull(bottomToolbarBookmark)) { if (getCurrentWebView().getUrl() != null && - ZimContentProvider.getId() != null && - !getCurrentWebView().getUrl().equals(HOME_URL)) { + ZimContentProvider.getId() != null && + !getCurrentWebView().getUrl().equals(HOME_URL)) { int icon = bookmarks.contains(getCurrentWebView().getUrl()) ? R.drawable.ic_bookmark_24dp - : R.drawable.ic_bookmark_border_24dp; + : R.drawable.ic_bookmark_border_24dp; bottomToolbarBookmark.setImageResource(icon); } else { bottomToolbarBookmark.setImageResource(R.drawable.ic_bookmark_border_24dp); @@ -1905,100 +1804,100 @@ public class MainActivity extends BaseActivity implements WebViewCallback, * loadCustomAppContent Return true if all's well, else false. */ private boolean loadCustomAppContent() { - Log.d(TAG_KIWIX, "Kiwix Custom App starting for the first time. Checking Companion ZIM: " - + BuildConfig.ZIM_FILE_NAME); + Log.d(TAG_KIWIX, "Kiwix Custom App starting for the first time. Checking Companion ZIM: " + + BuildConfig.ZIM_FILE_NAME); - String currentLocaleCode = Locale.getDefault().toString(); - // Custom App recommends to start off a specific language - if (BuildConfig.ENFORCED_LANG.length() > 0 && !BuildConfig.ENFORCED_LANG - .equals(currentLocaleCode)) { + String currentLocaleCode = Locale.getDefault().toString(); + // Custom App recommends to start off a specific language + if (BuildConfig.ENFORCED_LANG.length() > 0 && !BuildConfig.ENFORCED_LANG + .equals(currentLocaleCode)) { - // change the locale machinery - LanguageUtils.handleLocaleChange(this, BuildConfig.ENFORCED_LANG); + // change the locale machinery + LanguageUtils.handleLocaleChange(this, BuildConfig.ENFORCED_LANG); - // save new locale into preferences for next startup - sharedPreferenceUtil.putPrefLanguage(BuildConfig.ENFORCED_LANG); + // save new locale into preferences for next startup + sharedPreferenceUtil.putPrefLanguage(BuildConfig.ENFORCED_LANG); - // restart activity for new locale to take effect - this.setResult(1236); - this.finish(); - this.startActivity(new Intent(this, this.getClass())); - return false; + // restart activity for new locale to take effect + this.setResult(1236); + this.finish(); + this.startActivity(new Intent(this, this.getClass())); + return false; + } + + String filePath = ""; + if (BuildConfig.HAS_EMBEDDED_ZIM) { + String appPath = getPackageResourcePath(); + File libDir = new File(appPath.substring(0, appPath.lastIndexOf("/")) + "/lib/"); + if (libDir.exists() && libDir.listFiles().length > 0) { + filePath = libDir.listFiles()[0].getPath() + "/" + BuildConfig.ZIM_FILE_NAME; } - - String filePath = ""; - if (BuildConfig.HAS_EMBEDDED_ZIM) { - String appPath = getPackageResourcePath(); - File libDir = new File(appPath.substring(0, appPath.lastIndexOf("/")) + "/lib/"); - if (libDir.exists() && libDir.listFiles().length > 0) { - filePath = libDir.listFiles()[0].getPath() + "/" + BuildConfig.ZIM_FILE_NAME; - } - if (filePath.isEmpty() || !new File(filePath).exists()) { - filePath = String.format("/data/data/%s/lib/%s", BuildConfig.APPLICATION_ID, - BuildConfig.ZIM_FILE_NAME); - } - } else { - String fileName = FileUtils.getExpansionAPKFileName(true); - filePath = FileUtils.generateSaveFileName(fileName); + if (filePath.isEmpty() || !new File(filePath).exists()) { + filePath = String.format("/data/data/%s/lib/%s", BuildConfig.APPLICATION_ID, + BuildConfig.ZIM_FILE_NAME); } + } else { + String fileName = FileUtils.getExpansionAPKFileName(true); + filePath = FileUtils.generateSaveFileName(fileName); + } - Log.d(TAG_KIWIX, "BuildConfig.ZIM_FILE_SIZE = " + BuildConfig.ZIM_FILE_SIZE); - if (!FileUtils.doesFileExist(filePath, BuildConfig.ZIM_FILE_SIZE, false)) { + Log.d(TAG_KIWIX, "BuildConfig.ZIM_FILE_SIZE = " + BuildConfig.ZIM_FILE_SIZE); + if (!FileUtils.doesFileExist(filePath, BuildConfig.ZIM_FILE_SIZE, false)) { - AlertDialog.Builder zimFileMissingBuilder = - new AlertDialog.Builder(this, dialogStyle()); - zimFileMissingBuilder.setTitle(R.string.app_name); - zimFileMissingBuilder.setMessage(R.string.custom_app_missing_content); - zimFileMissingBuilder.setIcon(R.mipmap.kiwix_icon); - final Activity activity = this; - zimFileMissingBuilder.setPositiveButton(getString(R.string.go_to_play_store), - (dialog, which) -> { - String market_uri = "market://details?id=" + BuildConfig.APPLICATION_ID; - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(market_uri)); - startActivity(intent); - activity.finish(); - }); - zimFileMissingBuilder.setCancelable(false); - AlertDialog zimFileMissingDialog = zimFileMissingBuilder.create(); - zimFileMissingDialog.show(); - return false; - } else { - openZimFile(new File(filePath), true); - return true; - } + AlertDialog.Builder zimFileMissingBuilder = + new AlertDialog.Builder(this, dialogStyle()); + zimFileMissingBuilder.setTitle(R.string.app_name); + zimFileMissingBuilder.setMessage(R.string.custom_app_missing_content); + zimFileMissingBuilder.setIcon(R.mipmap.kiwix_icon); + final Activity activity = this; + zimFileMissingBuilder.setPositiveButton(getString(R.string.go_to_play_store), + (dialog, which) -> { + String market_uri = "market://details?id=" + BuildConfig.APPLICATION_ID; + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(market_uri)); + startActivity(intent); + activity.finish(); + }); + zimFileMissingBuilder.setCancelable(false); + AlertDialog zimFileMissingDialog = zimFileMissingBuilder.create(); + zimFileMissingDialog.show(); + return false; + } else { + openZimFile(new File(filePath), true); + return true; + } } private void manageExternalLaunchAndRestoringViewState() { if (getIntent().getData() != null) { String filePath = - FileUtils.getLocalFilePathByUri(getApplicationContext(), getIntent().getData()); + FileUtils.getLocalFilePathByUri(getApplicationContext(), getIntent().getData()); if (filePath == null || !new File(filePath).exists()) { - Toast.makeText(MainActivity.this, getString(R.string.error_file_not_found), Toast.LENGTH_LONG) - .show(); + Toast.makeText(MainActivity.this, getString(R.string.error_file_not_found), + Toast.LENGTH_LONG) + .show(); return; } Log.d(TAG_KIWIX, "Kiwix started from a file manager. Intent filePath: " - + filePath - + " -> open this zim file and load menu_main page"); + + filePath + + " -> open this zim file and load menu_main page"); openZimFile(new File(filePath), false); } else { SharedPreferences settings = getSharedPreferences(PREF_KIWIX_MOBILE, 0); String zimFile = settings.getString(TAG_CURRENT_FILE, null); if (zimFile != null && new File(zimFile).exists()) { Log.d(TAG_KIWIX, - "Kiwix normal start, zimFile loaded last time -> Open last used zimFile " + zimFile); + "Kiwix normal start, zimFile loaded last time -> Open last used zimFile " + zimFile); restoreTabStates(); // Alternative would be to restore webView state. But more effort to implement, and actually // fits better normal android behavior if after closing app ("back" button) state is not maintained. } else { - Log.d(TAG_KIWIX, "Kiwix normal start, no zimFile loaded last time -> display home page"); - showHomePage(); - } - + Log.d(TAG_KIWIX, "Kiwix normal start, no zimFile loaded last time -> display home page"); + showHomePage(); + } } } @@ -2007,7 +1906,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, super.onPause(); saveTabStates(); Log.d(TAG_KIWIX, - "onPause Save current zim file to preferences: " + ZimContentProvider.getZimFile()); + "onPause Save current zim file to preferences: " + ZimContentProvider.getZimFile()); } @Override @@ -2029,18 +1928,18 @@ public class MainActivity extends BaseActivity implements WebViewCallback, if (url != null && !url.equals(HOME_URL)) { final long timeStamp = System.currentTimeMillis(); SimpleDateFormat sdf = - new SimpleDateFormat("d MMM yyyy", LanguageUtils.getCurrentLocale(this)); + new SimpleDateFormat("d MMM yyyy", LanguageUtils.getCurrentLocale(this)); HistoryListItem.HistoryItem history = new HistoryListItem.HistoryItem( - 0L, - ZimContentProvider.getId(), - ZimContentProvider.getName(), - ZimContentProvider.getZimFile(), - ZimContentProvider.getFavicon(), - getCurrentWebView().getTitle(), - getCurrentWebView().getUrl(), - sdf.format(new Date(timeStamp)), - timeStamp, - 0L + 0L, + ZimContentProvider.getId(), + ZimContentProvider.getName(), + ZimContentProvider.getZimFile(), + ZimContentProvider.getFavicon(), + getCurrentWebView().getTitle(), + getCurrentWebView().getUrl(), + sdf.format(new Date(timeStamp)), + timeStamp, + 0L ); presenter.saveHistory(history); } @@ -2060,7 +1959,7 @@ public class MainActivity extends BaseActivity implements WebViewCallback, if (progress == 100) { if (requestClearHistoryAfterLoad) { Log.d(TAG_KIWIX, - "Loading article finished and requestClearHistoryAfterLoad -> clearHistory"); + "Loading article finished and requestClearHistoryAfterLoad -> clearHistory"); getCurrentWebView().clearHistory(); requestClearHistoryAfterLoad = false; } @@ -2082,8 +1981,8 @@ public class MainActivity extends BaseActivity implements WebViewCallback, hideBackToTopTimer.start(); if (getCurrentWebView().getScrollY() > 200) { if ((backToTopButton.getVisibility() == View.GONE - || backToTopButton.getVisibility() == View.INVISIBLE) - && TTSControls.getVisibility() == View.GONE) { + || backToTopButton.getVisibility() == View.INVISIBLE) + && TTSControls.getVisibility() == View.GONE) { backToTopButton.show(); } } else { @@ -2114,11 +2013,11 @@ public class MainActivity extends BaseActivity implements WebViewCallback, if (isOpenNewTabInBackground) { newTabInBackground(url); Snackbar.make(snackbarRoot, R.string.new_tab_snack_bar, Snackbar.LENGTH_LONG) - .setAction(getString(R.string.open), v -> { - if (webViewList.size() > 1) selectTab(webViewList.size() - 1); - }) - .setActionTextColor(getResources().getColor(R.color.white)) - .show(); + .setAction(getString(R.string.open), v -> { + if (webViewList.size() > 1) selectTab(webViewList.size() - 1); + }) + .setActionTextColor(getResources().getColor(R.color.white)) + .show(); } else { newTab(url); } @@ -2154,11 +2053,11 @@ public class MainActivity extends BaseActivity implements WebViewCallback, private void searchFiles() { if (Build.VERSION.SDK_INT >= VERSION_CODES.M && ContextCompat.checkSelfPermission(this, - Manifest.permission.READ_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { + Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, - new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, - REQUEST_READ_STORAGE_PERMISSION); + new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, + REQUEST_READ_STORAGE_PERMISSION); } else { scanStorageForZims(); } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java index 65bf92804..723246591 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java @@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.settings; +import android.Manifest; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -37,6 +38,7 @@ import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; import eu.mhutti1.utils.storage.StorageDevice; import eu.mhutti1.utils.storage.StorageSelectDialog; import java.io.File; @@ -44,27 +46,27 @@ import java.util.List; import java.util.Locale; import javax.inject.Inject; import kotlin.Unit; +import kotlin.io.FilesKt; import org.kiwix.kiwixmobile.BuildConfig; import org.kiwix.kiwixmobile.KiwixApplication; import org.kiwix.kiwixmobile.R; import org.kiwix.kiwixmobile.base.BaseActivity; +import org.kiwix.kiwixmobile.extensions.ContextExtensionsKt; +import org.kiwix.kiwixmobile.main.AddNoteDialog; import org.kiwix.kiwixmobile.main.MainActivity; import org.kiwix.kiwixmobile.utils.LanguageUtils; import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil; import static org.kiwix.kiwixmobile.utils.Constants.EXTRA_WEBVIEWS_LIST; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_AUTONIGHTMODE; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_CLEAR_ALL_HISTORY; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_CREDITS; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_LANG; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_NIGHTMODE; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_STORAGE; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_VERSION; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_WIFI_ONLY; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_ZOOM; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_ZOOM_ENABLED; import static org.kiwix.kiwixmobile.utils.Constants.RESULT_HISTORY_CLEARED; import static org.kiwix.kiwixmobile.utils.Constants.RESULT_RESTART; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_AUTONIGHTMODE; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_LANG; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_NIGHTMODE; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_STORAGE; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_WIFI_ONLY; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_ZOOM; +import static org.kiwix.kiwixmobile.utils.SharedPreferenceUtil.PREF_ZOOM_ENABLED; import static org.kiwix.kiwixmobile.utils.StyleUtils.dialogStyle; public class KiwixSettingsActivity extends BaseActivity { @@ -112,6 +114,10 @@ public class KiwixSettingsActivity extends BaseActivity { SettingsContract.View, SharedPreferences.OnSharedPreferenceChangeListener { + public static final String PREF_VERSION = "pref_version"; + public static final String PREF_CLEAR_ALL_HISTORY = "pref_clear_all_history"; + public static final String PREF_CLEAR_ALL_NOTES = "pref_clear_all_notes"; + public static final String PREF_CREDITS = "pref_credits"; @Inject SettingsPresenter presenter; @Inject @@ -298,6 +304,40 @@ public class KiwixSettingsActivity extends BaseActivity { .show(); } + private void showClearAllNotesDialog() { + AlertDialog.Builder builder; + if (sharedPreferenceUtil.nightMode()) { // Night Mode support + builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_Dialog_Night); + } else { + builder = new AlertDialog.Builder(getActivity()); + } + + builder.setMessage(R.string.delete_notes_confirmation_msg) + .setNegativeButton(android.R.string.cancel, null) // Do nothing for 'Cancel' button + .setPositiveButton(R.string.yes, (dialog, which) -> clearAllNotes()) + .show(); + } + + private void clearAllNotes() { + if (KiwixApplication.getInstance().isExternalStorageWritable()) { + if (ContextCompat.checkSelfPermission(getActivity(), + Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + ContextExtensionsKt.toast(getActivity(), R.string.ext_storage_permission_not_granted, + Toast.LENGTH_LONG); + return; + } + + if (FilesKt.deleteRecursively(new File(AddNoteDialog.NOTES_DIRECTORY))) { + ContextExtensionsKt.toast(getActivity(), R.string.notes_deletion_successful, + Toast.LENGTH_SHORT); + return; + } + } + ContextExtensionsKt.toast(getActivity(), R.string.notes_deletion_unsuccessful, + Toast.LENGTH_SHORT); + } + public void openCredits() { WebView view = (WebView) LayoutInflater.from(getActivity()).inflate(R.layout.credits_webview, null); @@ -318,6 +358,9 @@ public class KiwixSettingsActivity extends BaseActivity { if (preference.getKey().equalsIgnoreCase(PREF_CLEAR_ALL_HISTORY)) { clearAllHistoryDialog(); } + if (preference.getKey().equalsIgnoreCase(PREF_CLEAR_ALL_NOTES)) { + showClearAllNotesDialog(); + } if (preference.getKey().equalsIgnoreCase(PREF_CREDITS)) { openCredits(); @@ -332,15 +375,12 @@ public class KiwixSettingsActivity extends BaseActivity { public void openFolderSelect() { StorageSelectDialog dialogFragment = new StorageSelectDialog(); - dialogFragment.setOnSelectListener(storageDevice -> { - selectionCallback(storageDevice); - return Unit.INSTANCE; - }); + dialogFragment.setOnSelectListener(this::onStorageDeviceSelected); dialogFragment.show(((AppCompatActivity) getActivity()).getSupportFragmentManager(), getResources().getString(R.string.pref_storage)); } - private void selectionCallback(StorageDevice storageDevice) { + private Unit onStorageDeviceSelected(StorageDevice storageDevice) { findPreference(PREF_STORAGE).setSummary( storageCalculator.calculateAvailableSpace(storageDevice.getFile()) ); @@ -354,6 +394,7 @@ public class KiwixSettingsActivity extends BaseActivity { sharedPreferenceUtil.putPrefStorageTitle( getResources().getString(R.string.external_storage)); } + return Unit.INSTANCE; } } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/utils/Constants.java b/app/src/main/java/org/kiwix/kiwixmobile/utils/Constants.java index 1245b0d8a..11fa33044 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/utils/Constants.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/utils/Constants.java @@ -17,8 +17,6 @@ */ package org.kiwix.kiwixmobile.utils; -import android.os.Environment; - import org.kiwix.kiwixmobile.BuildConfig; public final class Constants { @@ -49,46 +47,6 @@ public final class Constants { public static final int RESULT_HISTORY_CLEARED = 1239; - // Prefs - public static final String PREF_LANG = "pref_language_chooser"; - - public static final String PREF_VERSION = "pref_version"; - - public static final String PREF_CLEAR_ALL_HISTORY = "pref_clear_all_history"; - - public static final String PREF_CREDITS = "pref_credits"; - - public static final String PREF_STORAGE = "pref_select_folder"; - - public static final String PREF_AUTONIGHTMODE = "pref_auto_nightmode"; - - public static final String PREF_NIGHTMODE = "pref_nightmode"; - - public static final String PREF_WIFI_ONLY = "pref_wifi_only"; - - public static final String PREF_KIWIX_MOBILE = "kiwix-mobile"; - - public static final String PREF_BACK_TO_TOP = "pref_backtotop"; - - public static final String PREF_HIDE_TOOLBAR = "pref_hidetoolbar"; - - public static final String PREF_ZOOM = "pref_zoom_slider"; - - public static final String PREF_ZOOM_ENABLED = "pref_zoom_enabled"; - - public static final String PREF_FULLSCREEN = "pref_fullscreen"; - - public static final String PREF_NEW_TAB_BACKGROUND = "pref_newtab_background"; - - public static final String PREF_FULL_TEXT_SEARCH = "pref_full_text_search"; - - public static final String PREF_STORAGE_TITLE = "pref_selected_title"; - - public static final String PREF_EXTERNAL_LINK_POPUP = "pref_external_link_popup"; - - public static final String PREF_IS_FIRST_RUN = "isFirstRun"; - - public static final String PREF_SHOW_INTRO = "showIntro"; // Tags public static final String TAG_FILE_SEARCHED = "searchedarticle"; @@ -138,7 +96,4 @@ public final class Constants { public static final String OLD_PROVIDER_DOMAIN = "org.kiwix.zim.base"; public static final String NEW_PROVIDER_DOMAIN = BuildConfig.APPLICATION_ID + ".zim.base"; - - // Path Constants - public static final String NOTES_DIRECTORY = Environment.getExternalStorageDirectory() + "/Kiwix/Notes/"; } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java b/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java index e3d8b6925..4435c0277 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java @@ -5,34 +5,35 @@ import android.content.SharedPreferences; import android.os.Environment; import android.preference.PreferenceManager; import io.reactivex.Flowable; -import io.reactivex.processors.BehaviorProcessor; import io.reactivex.processors.PublishProcessor; import java.util.Calendar; import javax.inject.Inject; import javax.inject.Singleton; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_AUTONIGHTMODE; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_BACK_TO_TOP; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_EXTERNAL_LINK_POPUP; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_FULLSCREEN; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_HIDE_TOOLBAR; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_IS_FIRST_RUN; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_LANG; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_NEW_TAB_BACKGROUND; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_NIGHTMODE; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_SHOW_INTRO; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_STORAGE; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_STORAGE_TITLE; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_WIFI_ONLY; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_ZOOM; -import static org.kiwix.kiwixmobile.utils.Constants.PREF_ZOOM_ENABLED; - /** * Manager for the Default Shared Preferences of the application. */ @Singleton public class SharedPreferenceUtil { + // Prefs + public static final String PREF_LANG = "pref_language_chooser"; + public static final String PREF_STORAGE = "pref_select_folder"; + public static final String PREF_AUTONIGHTMODE = "pref_auto_nightmode"; + public static final String PREF_NIGHTMODE = "pref_nightmode"; + public static final String PREF_WIFI_ONLY = "pref_wifi_only"; + public static final String PREF_KIWIX_MOBILE = "kiwix-mobile"; + public static final String PREF_BACK_TO_TOP = "pref_backtotop"; + public static final String PREF_HIDE_TOOLBAR = "pref_hidetoolbar"; + public static final String PREF_ZOOM = "pref_zoom_slider"; + public static final String PREF_ZOOM_ENABLED = "pref_zoom_enabled"; + public static final String PREF_FULLSCREEN = "pref_fullscreen"; + public static final String PREF_NEW_TAB_BACKGROUND = "pref_newtab_background"; + public static final String PREF_FULL_TEXT_SEARCH = "pref_full_text_search"; + public static final String PREF_STORAGE_TITLE = "pref_selected_title"; + public static final String PREF_EXTERNAL_LINK_POPUP = "pref_external_link_popup"; + public static final String PREF_IS_FIRST_RUN = "isFirstRun"; + public static final String PREF_SHOW_INTRO = "showIntro"; private static final String PREF_SHOW_BOOKMARKS_CURRENT_BOOK = "show_bookmarks_current_book"; private static final String PREF_SHOW_HISTORY_CURRENT_BOOK = "show_history_current_book"; private SharedPreferences sharedPreferences; @@ -59,7 +60,6 @@ public class SharedPreferenceUtil { return sharedPreferences.getBoolean(PREF_FULLSCREEN, false); } - public boolean getPrefBackToTop() { return sharedPreferences.getBoolean(PREF_BACK_TO_TOP, false); } @@ -86,7 +86,7 @@ public class SharedPreferenceUtil { public String getPrefStorage() { return sharedPreferences.getString(PREF_STORAGE, - Environment.getExternalStorageDirectory().getPath()); + Environment.getExternalStorageDirectory().getPath()); } private boolean getPrefNightMode() { @@ -127,7 +127,7 @@ public class SharedPreferenceUtil { prefStorages.onNext(storage); } - public Flowable getPrefStorages(){ + public Flowable getPrefStorages() { return prefStorages.startWith(getPrefStorage()); } @@ -153,8 +153,8 @@ public class SharedPreferenceUtil { public void setShowHistoryCurrentBook(boolean prefShowHistoryCurrentBook) { sharedPreferences.edit() - .putBoolean(PREF_SHOW_HISTORY_CURRENT_BOOK, prefShowHistoryCurrentBook) - .apply(); + .putBoolean(PREF_SHOW_HISTORY_CURRENT_BOOK, prefShowHistoryCurrentBook) + .apply(); } public boolean nightMode() { @@ -174,7 +174,7 @@ public class SharedPreferenceUtil { public void setShowBookmarksCurrentBook(boolean prefShowBookmarksFromCurrentBook) { sharedPreferences.edit() - .putBoolean(PREF_SHOW_BOOKMARKS_CURRENT_BOOK, prefShowBookmarksFromCurrentBook) - .apply(); + .putBoolean(PREF_SHOW_BOOKMARKS_CURRENT_BOOK, prefShowBookmarksFromCurrentBook) + .apply(); } } diff --git a/app/src/main/res/drawable/ic_baseline_delete_sweep_24px.xml b/app/src/main/res/drawable/ic_baseline_delete_sweep_24px.xml deleted file mode 100644 index c5495c74c..000000000 --- a/app/src/main/res/drawable/ic_baseline_delete_sweep_24px.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 28a2123c9..c5d90a8e4 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,102 +1,85 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + android:id="@+id/menu_search" + android:icon="@drawable/action_search" + android:title="@string/menu_search" + android:visible="false" + tools:visible="true" + app:showAsAction="always" /> + android:id="@+id/menu_tab_switcher" + android:title="@string/switch_tabs" + app:actionLayout="@layout/ic_tab_switcher" + app:showAsAction="always" /> + + + + + + + android:title="@string/note" + app:showAsAction="ifRoom" /> + + android:id="@+id/menu_random_article" + android:icon="@drawable/action_randomarticle" + android:title="@string/menu_random_article" + android:visible="false" + tools:visible="true" + app:showAsAction="never" /> + + android:id="@+id/menu_fullscreen" + android:title="@string/menu_full_screen" + android:visible="false" + tools:visible="true" + app:showAsAction="never" /> + android:id="@+id/menu_read_aloud" + android:title="@string/menu_read_aloud" + android:visible="false" + tools:visible="true" + app:showAsAction="never" /> + android:id="@+id/menu_host_books" + android:title="@string/menu_host_books" + app:showAsAction="never" /> + android:id="@+id/menu_help" + android:title="@string/menu_help" + app:showAsAction="never" /> + android:id="@+id/menu_settings" + android:title="@string/menu_settings" + app:showAsAction="never" /> - - - - - - - - - - - - - - + android:id="@+id/menu_support_kiwix" + android:title="@string/menu_support_kiwix" + app:showAsAction="never" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe3488a2c..31b9b72da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ Kiwi - Get Content + Library Help Home Settings @@ -237,7 +237,6 @@ Bookmarks from current book Search bookmarks - New tab Switch tabs :D Close all tabs @@ -260,7 +259,6 @@ Unknown HTTP code received Unknown HTTP code %s - Add Note Save Note Wiki Article Title @@ -272,10 +270,8 @@ Note file doesn\'t exist Share note file with: Discard unsaved changes? - Clear All Notes Delete all notes? Error: Storage permissions not granted - No notes found for deletion Entire notes folder deleted Some files not deleted @@ -308,4 +304,6 @@ Performing handshake.... Local ZIM Sharing Status + Clears all notes on all articles + Clear all notes diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 4d36dcd32..8bd718a4b 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -101,6 +101,16 @@ android:summary="@string/pref_clear_all_history_summary" android:title="@string/pref_clear_all_history_title"/> + + + + +