From 6b3f1ecc0ba1a13ab2a3d12871d4446b2f4d4576 Mon Sep 17 00:00:00 2001 From: Gregor Santner Date: Sat, 18 Dec 2021 20:48:37 +0100 Subject: [PATCH 1/6] Update translations (PR #1527) --- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fa/strings.xml | 5 +++++ app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-nb-rNO/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-no/strings.xml | 1 + app/src/main/res/values-or/strings.xml | 2 ++ app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ro/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sc/strings.xml | 3 +++ app/src/main/res/values-si/strings.xml | 2 ++ app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + 26 files changed, 34 insertions(+) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 26fb3d453..1c2915987 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -126,6 +126,7 @@ work. If not, see . إنشاء ملاحظة مستندات خاصة إبقاء الشاشة مضيئة + عدم السماح لقطات الشاشة العودة إلى المجلد السابق إعدادات التطبيق إعدادات المحرر diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 20f35729a..2db868008 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Crea una nota Documents especials Mantén la pantalla encesa + No permetre captures de pantalla Torna a la carpeta anterior Configuració de l\'aplicació Configuració de l\'editor diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d07c5a2cb..e69d29fee 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Vytvořit poznámku Speciální dokumenty Udržovat obrazovku zapnutou + Zakázat snímky obrazovky Zpět do předchozí složky Nastavení aplikace Nastavení editoru diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 8a159fbfd..af4042f59 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Opret note Specielle dokumenter Hold skærmen tændt + Tillad ikke screenshots Tilbage til tidligere mappe Programindstillinger Editorindstillinger diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 39e8acd5f..32d44a838 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Notiz erstellen Spezielle Dokumente Bildschirm nicht ausschalten + Screenshots verbieten Zurück zum vorherigen Ordner App-Einstellungen Editor-Einstellungen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9415828bc..03ad043ae 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Δημιουργία Σημείωσης Ειδικά έγγραφα Διατήρηση της οθόνης ενεργής + Απαγόρευση στιγμιότυπων οθόνης Επιστροφή στον προηγούμενο φάκελο Ρυθμίσεις εφαρμογής Ρυθμίσεις Επεξεργαστή diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 88579d292..cdaa1d44a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Crear nota Documentos especiales Mantener pantalla encendida + No permitir capturas de pantalla Atrás a la carpeta anterior Ajustes de aplicación Ajustes del editor diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 309a672c7..19c86339e 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -126,6 +126,7 @@ work. If not, see . ایجاد یادداشت مطالب ویژه روشن نگه داشتن صفحه نمایش + Disallow screenshots بازگشت به پوشه قبلی تنظیمات برنامه تنظیمات ویرایشگر @@ -428,4 +429,8 @@ work. If not, see . تمام شده مطالبقت با هر کدام مطابقت با همه + Dynamic search for notebook root + In order to follow wiki links, dynamically search for the notebook.zim file to identify the root directory for the current notebook. Check this if you use multiple zim notebooks or the notebook directory set in the app does not correspond to your zim notebook. + Format/Prefix for text shared into Markor. Follows Android\'s SimpleDateFormat rules.\n\nUse the placeholder \'%s\' (surrounded by single quotes) to position the shared text. If not specified, the shared text is appended and the format used as a prefix. + Share into - Format diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b2f5ac466..299f0d723 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Luo muistiinpano Erikoisasiakirjat Pidä näyttö päällä + Älä salli kuvakaappauksia Takaisin edelliseen kansioon Sovellusasetukset Editorin asetukset diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1771aa94f..029669950 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Nouvelle note Documents spéciaux Garder l\'écran allumé + Interdire les captures d\'écran Dossier précédent Réglages Réglages de l\'éditeur diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7324d820b..6db43df32 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Crea nota Documenti speciali Mantieni lo schermo acceso + Blocca screenshot Ritorna alla cartella precedente Impostazioni dell\'applicazione Impostazioni dell\'editor diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c6bc8ada1..dafd95aff 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -126,6 +126,7 @@ work. If not, see . ノートを作成 特別なドキュメント 画面をオンのままにする + スクリーンショットを許可しない 前のフォルダーに戻る アプリ設定 エディター設定 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 076b05543..f154e45d5 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Opprett notat Spesialdokumenter Behold skjermen påslått + Forby skjermbilder Tilbake til forrige mappe Programinnstillinger Tekstbehandlerinnstillinger diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 71ab12729..a841daf49 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Maak notitie Speciale documenten Scherm aanlaten + Schermafbeeldingen niet toestaan Terug naar vorige map App Instellingen Bewerker instellingen diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml index 1dab1a008..9d2520440 100644 --- a/app/src/main/res/values-no/strings.xml +++ b/app/src/main/res/values-no/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Opprett notat Spesielle dokumenter Behold skjermen på + Forby skjermbilder Tilbake til forrige mappe Innstillinger for app Tekstbehandler innstillinger diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 809c5754c..c94df8cf2 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -22,6 +22,7 @@ work. If not, see . ଫାଇଲ୍ ଆଗରୁ ବିଦ୍ୟମାନ ଅଛି, ନବଲିଖନ କରିବେ କି? ଫାଇଲ୍ ସିଷ୍ଟମ୍ ବ୍ରାଉଜ୍ କରନ୍ତୁ ଆଖ୍ୟା + ଖାଲି ଡିରେକ୍ଟୋରୀ ଆପଣଙ୍କ ଫୋଲ୍ଡରର ନାମ ପ୍ରବେଶ କରନ୍ତୁ ଫୋଲ୍ଡର୍ ସୃଷ୍ଟି କରନ୍ତୁ ନୂତନ ଡକ୍ୟୁମେଣ୍ଟ୍ ସୃଷ୍ଟି କରନ୍ତୁ @@ -105,6 +106,7 @@ work. If not, see . ନୋଟ୍ ସୃଷ୍ଟି କରନ୍ତୁ ବିଶେଷ ଡକ୍ୟୁମେଣ୍ଟ୍ ସ୍କ୍ରିନ୍ ସଚଳ ରଖନ୍ତୁ + ସ୍କ୍ରିନସଟ୍ ନେବା ଅଗ୍ରାହ୍ୟ କରନ୍ତୁ ପୂର୍ବ ଫୋଲ୍ଡରକୁ ଫେରନ୍ତୁ ଆପ୍ ସେଟିଂସ୍ ସମ୍ପାଦକ ସେଟିଂସ୍ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f9617f49d..104131a73 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Utwórz notatkę Specjalne dokumenty Pozostaw ekran włączony + Nie zezwalaj na zrzuty ekranu Wróć do poprzedniego folderu Ustawienia aplikacji Ustawienia edytora diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 723301776..12cc228e5 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Criar nota Documentos especiais Manter a tela ligada + Despermitir capturas de tela Retornar à pasta anterior Configurações do aplicativo Configurações do editor diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 3884867cf..43c6672e9 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Criar nota Documentos especiais Manter ecrã ligado + Despermitir capturas de tela Recuar para a pasta anterior Definições Definições do editor diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 27e86a315..084108ac0 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Creează o notă Documente speciale Păstrați ecranul pornit + Dezactivare capturi ecran Înapoi la dosarul anterior Setări aplicație Setări editor diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6df0b594f..bb51bf517 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Создать заметку Особые документы Не отключать экран + Запретить скриншоты Вернуться в предыдущую папку Настройки приложения Настройки редактора diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 713415124..917e97ca6 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Crea una nota Documentos ispetziales Mantene s\'ischermu allutu + Non permitas de sarvare ischermadas Torra a sa cartella anteposta Impostatziones de s\'aplicatzione Impostatziones de s\'editore @@ -430,4 +431,6 @@ work. If not, see . Currispondet totu Chirca dinàmica de sa raighina de sas notas Pro sighire sos ligàmenes wiki chirca in manera dinàmica su documentu notebook.zim pro identificare sa cartella de raighina pro sas notas atuales. Marca·lu si impreas prus blocos de notas zim o si sa cartella de su blocu de notas impostada in s\'aplicatzione non currispondet a su blocu de notas zim tuo. + Formadu/Prefissu pro su testu cumpartzidu in Markor. Sighit sas règulas SimpleDateFormat de Android.\n\nImprea su sinnapostu \'%s\' (inghiriadu dae virguleddas sìngulas) pro pònnere in logu su testu cumpartzidu. Si no est dislindadu su testu cumpartzidu benit postu in fundu e su formadu s\'impreat comente prefissu. + Cumpartzi in - Formadu diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 9d0979728..9ade8d917 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -51,6 +51,7 @@ work. If not, see . කිසිවක් නැත වෙනත් සම්පත් + පෙරනිමි වම දකුණ පහළ @@ -69,6 +70,7 @@ work. If not, see . කළු සුදු ප්‍රියතම + නැවත පූරණය වර්තමාන මෙවලම් වගුව diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 32cfcd57d..59c049b7b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Skapa anteckning Specialdokument Håll skärmen påslagen + Avvisa skärmdumpar Tillbaka till föregående mapp Appinställningar Redigerarinställningar diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8dbe49965..8f0cbc229 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -126,6 +126,7 @@ work. If not, see . Створити нотатку Особливі документи Не вимикати екран + Заборонити скріншоти В попередню директорію Налаштування додатку Налаштування редактора diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f59be2311..80d2e1bd6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -126,6 +126,7 @@ work. If not, see . 新建笔记 特殊文件 保持屏幕开启 + 不允许截屏 返回上一个文件夹 应用设置 编辑器设置 From ca6f4908a4c48e7115c15e8fea3b6e6123c0e0bb Mon Sep 17 00:00:00 2001 From: Harshad Vedartham Date: Fri, 24 Dec 2021 01:57:30 -0800 Subject: [PATCH 2/6] File change state indication & general improvements, by @harshad1 @gsantner (PR #1516) * Closes #1311 * Closes #1537 Co-authored-by: Gregor Santner --- .../markor/activity/DocumentActivity.java | 10 +- .../markor/activity/DocumentEditFragment.java | 227 +++++++++--------- .../activity/DocumentShareIntoFragment.java | 2 +- .../markor/activity/MainActivity.java | 89 ++++--- .../gsantner/markor/format/TextConverter.java | 2 +- .../format/markdown/MarkdownTextActions.java | 2 +- .../plaintext/PlaintextTextActions.java | 2 +- .../net/gsantner/markor/model/Document.java | 74 +++--- .../markor/ui/hleditor/Highlighter.java | 7 - .../markor/ui/hleditor/TextActions.java | 6 +- .../net/gsantner/markor/util/ShareUtil.java | 2 +- .../net/gsantner/opoc/util/FileUtils.java | 24 +- .../main/res/menu/document__edit__menu.xml | 3 +- app/src/main/res/values/styles.xml | 11 + 14 files changed, 241 insertions(+), 220 deletions(-) diff --git a/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java b/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java index 15f51f7e5..13d6493a2 100644 --- a/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java @@ -161,11 +161,7 @@ protected void onCreate(Bundle savedInstanceState) { } setSupportActionBar(_toolbar); - ActionBar ab = getSupportActionBar(); - if (ab != null) { - ab.setDisplayHomeAsUpEnabled(true); - ab.setDisplayShowTitleEnabled(false); - } + _toolbar.setOnClickListener(this::onToolbarTitleClicked); _fragManager = getSupportFragmentManager(); @@ -283,7 +279,7 @@ public void showTextEditor(@Nullable Document document, @Nullable File file, boo boolean sameDocumentRequested = false; if (currentFragment instanceof DocumentEditFragment) { String reqPath = (reqFile != null) ? reqFile.getPath() : ""; - sameDocumentRequested = reqPath.equals(((DocumentEditFragment) currentFragment).getPath()); + sameDocumentRequested = reqPath.equals(((DocumentEditFragment) currentFragment).getDocument().getPath()); } if (!sameDocumentRequested) { @@ -369,7 +365,7 @@ private GsFragmentBase getCurrentVisibleFragment() { public void setDocument(Document document) { _document = document; - _toolbarTitleText.setText(_document.getTitle()); + setDocumentTitle(_document.getTitle()); } private void onToolbarTitleClicked(View v) { diff --git a/app/src/main/java/net/gsantner/markor/activity/DocumentEditFragment.java b/app/src/main/java/net/gsantner/markor/activity/DocumentEditFragment.java index facb49194..f36b64a52 100644 --- a/app/src/main/java/net/gsantner/markor/activity/DocumentEditFragment.java +++ b/app/src/main/java/net/gsantner/markor/activity/DocumentEditFragment.java @@ -17,13 +17,13 @@ import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; -import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.text.Selection; import android.util.TypedValue; import android.view.Gravity; import android.view.Menu; @@ -135,6 +135,8 @@ public static DocumentEditFragment newInstance(File path, boolean pathIsFolder, private MarkorWebViewClient _webViewClient; private boolean _nextConvertToPrintMode = false; private long _loadModTime = 0; + private boolean _isTextChanged = false; + private MenuItem _saveMenuItem, _undoMenuItem, _redoMenuItem; public DocumentEditFragment() { super(); @@ -143,10 +145,6 @@ public DocumentEditFragment() { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - _appSettings = new AppSettings(getContext()); - if (_appSettings.getSetWebViewFulldrawing() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - WebView.enableSlowWholeDocumentDraw(); - } } @Override @@ -158,9 +156,16 @@ protected int getLayoutResId() { @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - _shareUtil = new ShareUtil(view.getContext()); + final Activity activity = getActivity(); + + _appSettings = new AppSettings(activity); + if (_appSettings.getSetWebViewFulldrawing() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + WebView.enableSlowWholeDocumentDraw(); + } + + _shareUtil = new ShareUtil(activity); - _webViewClient = new MarkorWebViewClient(getActivity()); + _webViewClient = new MarkorWebViewClient(activity); _webView.setBackgroundColor(ContextCompat.getColor(view.getContext(), _appSettings.isDarkThemeEnabled() ? R.color.dark__background : R.color.light__background)); _webView.setWebViewClient(_webViewClient); WebSettings webSettings = _webView.getSettings(); @@ -181,27 +186,24 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { if (savedInstanceState != null && savedInstanceState.containsKey(SAVESTATE_DOCUMENT)) { _document = (Document) savedInstanceState.getSerializable(SAVESTATE_DOCUMENT); } else { - _document = Document.fromArguments(getActivity(), getArguments()); + _document = Document.fromArguments(activity, getArguments()); intentLineNumber = _document.getIntentLineNumber(); } // Upon construction, the document format has been determined from extension etc // Here we replace it with the last saved format. - _document.setFormat(_appSettings.getDocumentFormat(getPath(), _document.getFormat())); + _document.setFormat(_appSettings.getDocumentFormat(_document.getPath(), _document.getFormat())); applyTextFormat(_document.getFormat()); _textFormat.getTextActions().setDocument(_document); loadDocument(); - Activity activity = getActivity(); if (activity instanceof DocumentActivity) { - DocumentActivity da = ((DocumentActivity) activity); - da.setDocumentTitle(_document.getTitle()); - da.setDocument(_document); + ((DocumentActivity) activity).setDocument(_document); } _editTextUndoRedoHelper = new TextViewUndoRedo(_hlEditor); - new ActivityUtils(getActivity()).hideSoftKeyboard().freeContextRef(); + new ActivityUtils(activity).hideSoftKeyboard().freeContextRef(); _hlEditor.clearFocus(); _hlEditor.setLineSpacing(0, _appSettings.getEditorLineSpacing()); setupAppearancePreferences(view); @@ -236,7 +238,6 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { _hlEditor.smoothMoveCursorToLine(StringUtils.getLineOffsetFromIndex(text, pos)[0]); _hlEditor.setSelection(pos); } - } } @@ -248,7 +249,7 @@ public void onResume() { _hlEditor.setGravity(_appSettings.isEditorStartEditingInCenter() ? Gravity.CENTER : Gravity.NO_GRAVITY); - if (_document != null && _document.getFile() != null) { + if (_document != null) { _document.testCreateParent(); boolean permok = _shareUtil.canWriteFile(_document.getFile(), false); if (!permok && !_document.getFile().isDirectory() && _shareUtil.canWriteFile(_document.getFile(), _document.getFile().isDirectory())) { @@ -261,7 +262,7 @@ public void onResume() { _textSdWarning.setVisibility(permok ? View.GONE : View.VISIBLE); } - if (_document != null && _document.getFile() != null && _document.getFile().getAbsolutePath().contains("mordor/1-epub-experiment.md") && getActivity() instanceof DocumentActivity) { + if (_document != null && _document.getFile().getAbsolutePath().contains("mordor/1-epub-experiment.md") && getActivity() instanceof DocumentActivity) { _hlEditor.setText(CoolExperimentalStuff.convertEpubToText(_document.getFile(), getString(R.string.page))); } @@ -281,16 +282,12 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.findItem(R.id.action_redo).setVisible(_appSettings.isEditorHistoryEnabled()); menu.findItem(R.id.action_send_debug_log).setVisible(MainActivity.IS_DEBUG_ENABLED && getActivity() instanceof DocumentActivity && !_isPreviewVisible); - final boolean canUndo = _editTextUndoRedoHelper.getCanUndo(); - final boolean canRedo = _editTextUndoRedoHelper.getCanRedo(); final boolean isExperimentalFeaturesEnabled = _appSettings.isExperimentalFeaturesEnabled(); // Undo / Redo / Save (keep visible, but deactivated and tinted grey if not executable) - Drawable drawable; - drawable = menu.findItem(R.id.action_undo).setEnabled(canUndo).setVisible(!_isPreviewVisible).getIcon(); - drawable.mutate().setAlpha(canUndo ? 255 : 40); - drawable = menu.findItem(R.id.action_redo).setEnabled(canRedo).setVisible(!_isPreviewVisible).getIcon(); - drawable.mutate().setAlpha(canRedo ? 255 : 40); + _undoMenuItem = menu.findItem(R.id.action_undo).setVisible(!_isPreviewVisible); + _redoMenuItem = menu.findItem(R.id.action_redo).setVisible(!_isPreviewVisible); + _saveMenuItem = menu.findItem(R.id.action_save).setVisible(!_isPreviewVisible); // Edit / Preview switch menu.findItem(R.id.action_edit).setVisible(_isPreviewVisible); @@ -328,26 +325,52 @@ public boolean onQueryTextChange(String text) { } }); + // Set various initial states updateMenuToggleStates(_document.getFormat()); + checkTextChangeState(); + updateUndoRedoIconStates(); + } + + private void updateUndoRedoIconStates() { + if (_editTextUndoRedoHelper == null) { + return; + } + + final boolean canUndo = _editTextUndoRedoHelper.getCanUndo(); + if (_undoMenuItem != null && _undoMenuItem.isEnabled() != canUndo) { + _undoMenuItem.setEnabled(canUndo).getIcon().mutate().setAlpha(canUndo ? 255 : 40); + } + + final boolean canRedo = _editTextUndoRedoHelper.getCanRedo(); + if (_redoMenuItem != null && _redoMenuItem.isEnabled() != canRedo) { + _redoMenuItem.setEnabled(canRedo).getIcon().mutate().setAlpha(canRedo ? 255 : 40); + } } public void loadDocument() { - final long modTime = _document.getFile().lastModified(); //Only trigger the load process if constructing or file updated + final long modTime = _document.lastModified(); if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED) || modTime > _loadModTime) { - final String content = _document.loadContent(getContext()); _loadModTime = modTime; - // Only setText if content changed - final CharSequence text = _hlEditor.getText(); - if (text == null || !content.contentEquals(text)) { + final String content = _document.loadContent(getContext()); + if (!_document.isContentSame(_hlEditor.getText())) { + + final int[] sel = StringUtils.getSelection(_hlEditor); + sel[0] = Math.min(sel[0], content.length()); + sel[1] = Math.min(sel[1], content.length()); + _hlEditor.setText(content); + + _hlEditor.setSelection(sel[0], sel[1]); // hleditor can handle invalid selections } + checkTextChangeState(); + if (_isPreviewVisible) { + setDocumentViewVisibility(true); _webViewClient.setRestoreScrollY(_webView.getScrollY()); - setDocumentViewVisibility(_isPreviewVisible); } } } @@ -357,7 +380,8 @@ public boolean onOptionsItemSelected(final MenuItem item) { if (item == null) { return true; } - _shareUtil.setContext(getActivity()); + _shareUtil.setContext(getContext()); + final Activity activity = getActivity(); final int itemId = item.getItemId(); switch (itemId) { case R.id.action_undo: { @@ -365,7 +389,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { _hlEditor.disableHighlighterAutoFormat(); _editTextUndoRedoHelper.undo(); _hlEditor.enableHighlighterAutoFormat(); - ((AppCompatActivity) getActivity()).supportInvalidateOptionsMenu(); + updateUndoRedoIconStates(); } return true; } @@ -374,7 +398,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { _hlEditor.disableHighlighterAutoFormat(); _editTextUndoRedoHelper.redo(); _hlEditor.enableHighlighterAutoFormat(); - ((AppCompatActivity) getActivity()).supportInvalidateOptionsMenu(); + updateUndoRedoIconStates(); } return true; } @@ -383,7 +407,12 @@ public boolean onOptionsItemSelected(final MenuItem item) { return true; } case R.id.action_reload: { + final long oldModTime = _loadModTime; loadDocument(); + // Use modtime to show toast if document updated + if (_loadModTime != oldModTime) { + Toast.makeText(activity, "✔", Toast.LENGTH_SHORT).show(); + } return true; } case R.id.action_preview: { @@ -417,7 +446,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { case R.id.action_share_html: case R.id.action_share_html_source: { if (saveDocument(false)) { - TextConverter converter = TextFormat.getFormat(_document.getFormat(), getActivity(), _document, _hlEditor).getConverter(); + TextConverter converter = TextFormat.getFormat(_document.getFormat(), activity, _document, _hlEditor).getConverter(); _shareUtil.shareText(converter.convertMarkup(_hlEditor.getText().toString(), _hlEditor.getContext(), false, _document.getFile()), "text/" + (item.getItemId() == R.id.action_share_html ? "html" : "plain")); } @@ -426,18 +455,11 @@ public boolean onOptionsItemSelected(final MenuItem item) { case R.id.action_share_calendar_event: { if (saveDocument(false)) { if (!_shareUtil.createCalendarAppointment(_document.getTitle(), _hlEditor.getText().toString(), null)) { - Toast.makeText(getActivity(), R.string.no_calendar_app_is_installed, Toast.LENGTH_SHORT).show(); + Toast.makeText(activity, R.string.no_calendar_app_is_installed, Toast.LENGTH_SHORT).show(); } } return true; } - case android.R.id.home: { - final Activity activity = getActivity(); - if (activity != null && saveDocument(false)) { - activity.onBackPressed(); - } - return true; - } case R.id.action_share_screenshot: case R.id.action_share_image: case R.id.action_share_pdf: { @@ -445,7 +467,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { if (saveDocument(false)) { _nextConvertToPrintMode = true; setDocumentViewVisibility(true); - Toast.makeText(getActivity(), R.string.please_wait, Toast.LENGTH_LONG).show(); + Toast.makeText(activity, R.string.please_wait, Toast.LENGTH_LONG).show(); _webView.postDelayed(() -> { if (item.getItemId() == R.id.action_share_pdf && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { _shareUtil.printOrCreatePdfFromWebview(_webView, _document, _hlEditor.getText().toString().contains("beamer\n")); @@ -465,7 +487,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { if (_document != null) { _document.setFormat(itemId); applyTextFormat(itemId); - _appSettings.setDocumentFormat(getPath(), _document.getFormat()); + _appSettings.setDocumentFormat(_document.getPath(), _document.getFormat()); } return true; } @@ -481,11 +503,11 @@ public boolean onOptionsItemSelected(final MenuItem item) { } case R.id.action_attach_color: { - new CommonTextActions(getActivity(), _hlEditor).runAction(CommonTextActions.ACTION_COLOR_PICKER); + new CommonTextActions(activity, _hlEditor).runAction(CommonTextActions.ACTION_COLOR_PICKER); return true; } case R.id.action_attach_date: { - DatetimeFormatDialog.showDatetimeFormatDialog(getActivity(), _hlEditor); + DatetimeFormatDialog.showDatetimeFormatDialog(activity, _hlEditor); return true; } case R.id.action_attach_audio: @@ -493,7 +515,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { case R.id.action_attach_image: case R.id.action_attach_link: { int actionId = (itemId == R.id.action_attach_audio ? 4 : (itemId == R.id.action_attach_image ? 2 : 3)); - AttachImageOrLinkDialog.showInsertImageOrLinkDialog(actionId, _document.getFormat(), getActivity(), _hlEditor, _document.getFile()); + AttachImageOrLinkDialog.showInsertImageOrLinkDialog(actionId, _document.getFormat(), activity, _hlEditor, _document.getFile()); return true; } @@ -508,19 +530,19 @@ public void onFsViewerSelected(String request, File file, final Integer lineNumb public void onFsViewerConfig(FilesystemViewerData.Options dopt) { dopt.titleText = R.string.select; } - }, getFragmentManager(), getActivity(), + }, getFragmentManager(), activity, input -> input != null && input.getAbsolutePath().toLowerCase().endsWith(".epub") ); return true; } case R.id.action_speed_read: { - CoolExperimentalStuff.showSpeedReadDialog(getActivity(), _hlEditor.getText().toString()); + CoolExperimentalStuff.showSpeedReadDialog(activity, _hlEditor.getText().toString()); return true; } case R.id.action_wrap_words: { wrapText = !wrapText; wrapTextSetting = wrapText; - _appSettings.setDocumentWrapState(getPath(), wrapTextSetting); + _appSettings.setDocumentWrapState(_document.getPath(), wrapTextSetting); setHorizontalScrollMode(wrapText); updateMenuToggleStates(0); return true; @@ -528,21 +550,21 @@ public void onFsViewerConfig(FilesystemViewerData.Options dopt) { case R.id.action_enable_highlighting: { highlightText = !highlightText; _hlEditor.setHighlightingEnabled(highlightText); - _appSettings.setDocumentHighlightState(getPath(), highlightText); + _appSettings.setDocumentHighlightState(_document.getPath(), highlightText); updateMenuToggleStates(0); return true; } case R.id.action_info: { - if (_document != null && _document.getFile() != null) { + if (_document != null) { saveDocument(false); // In order to have the correct info displayed FileInfoDialog.show(_document.getFile(), getFragmentManager()); } return true; } case R.id.action_set_font_size: { - SearchOrCustomTextDialogCreator.showFontSizeDialog(getActivity(), _appSettings.getDocumentFontSize(getPath()), (newSize) -> { + SearchOrCustomTextDialogCreator.showFontSizeDialog(activity, _appSettings.getDocumentFontSize(_document.getPath()), (newSize) -> { _hlEditor.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) newSize); - _appSettings.setDocumentFontSize(getPath(), newSize); + _appSettings.setDocumentFontSize(_document.getPath(), newSize); }); } default: { @@ -551,24 +573,18 @@ public void onFsViewerConfig(FilesystemViewerData.Options dopt) { } } - private long _lastChangedThreadStart = 0; - - @OnTextChanged(value = R.id.document__fragment__edit__highlighting_editor, callback = OnTextChanged.Callback.TEXT_CHANGED) + @OnTextChanged(value = R.id.document__fragment__edit__highlighting_editor, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) public void onContentEditValueChanged(CharSequence text) { - if ((_lastChangedThreadStart + HISTORY_DELTA) < System.currentTimeMillis()) { - _lastChangedThreadStart = System.currentTimeMillis(); - _hlEditor.postDelayed(() -> { - Activity activity = getActivity(); - if (activity instanceof AppCompatActivity) { - ((AppCompatActivity) activity).supportInvalidateOptionsMenu(); - } - }, HISTORY_DELTA); - } - Activity activity = getActivity(); - if (activity != null && activity instanceof AppCompatActivity) { - ((AppCompatActivity) activity).supportInvalidateOptionsMenu(); - } + checkTextChangeState(); + updateUndoRedoIconStates(); + } + public void checkTextChangeState() { + _isTextChanged = !_document.isContentSame(_hlEditor.getText()); + + if (_saveMenuItem != null && _saveMenuItem.isEnabled() != _isTextChanged) { + _saveMenuItem.setEnabled(_isTextChanged).getIcon().mutate().setAlpha(_isTextChanged ? 255 : 40); + } } public void applyTextFormat(final int textFormatId) { @@ -584,7 +600,7 @@ public void applyTextFormat(final int textFormatId) { } private void setupAppearancePreferences(View fragmentView) { - _hlEditor.setTextSize(TypedValue.COMPLEX_UNIT_SP, _appSettings.getDocumentFontSize(getPath())); + _hlEditor.setTextSize(TypedValue.COMPLEX_UNIT_SP, _appSettings.getDocumentFontSize(_document.getPath())); _hlEditor.setTypeface(FontPreferenceCompat.typeface(getContext(), _appSettings.getFontFamily(), Typeface.NORMAL)); _hlEditor.setBackgroundColor(_appSettings.getEditorBackgroundColor()); @@ -593,11 +609,10 @@ private void setupAppearancePreferences(View fragmentView) { } private void initDocState() { - final String path = getPath(); - wrapTextSetting = _appSettings.getDocumentWrapState(path); + wrapTextSetting = _appSettings.getDocumentWrapState(_document.getPath()); wrapText = isDisplayedAtMainActivity() || wrapTextSetting; - highlightText = _appSettings.getDocumentHighlightState(path, _hlEditor.getText()); + highlightText = _appSettings.getDocumentHighlightState(_document.getPath(), _hlEditor.getText()); updateMenuToggleStates(0); setHorizontalScrollMode(wrapText); @@ -651,37 +666,20 @@ public String getFragmentTag() { return FRAGMENT_TAG; } - @Override - public boolean onBackPressed() { - final boolean preview = ( - getActivity().getIntent().getBooleanExtra(DocumentActivity.EXTRA_DO_PREVIEW, false) - || _appSettings.getDocumentPreviewState(getPath()) - || _document.getFile().getName().startsWith("index.")); - if (_isPreviewVisible && !preview) { - setDocumentViewVisibility(false); - return true; - } else if (!_isPreviewVisible && preview) { - setDocumentViewVisibility(true); - return true; - } else if (_menuSearchViewForViewMode != null && !_menuSearchViewForViewMode.isIconified()) { - _menuSearchViewForViewMode.clearFocus(); - return true; - } - return false; - } - // Save the file // Only supports java.io.File. TODO: Android Content public boolean saveDocument(boolean forceSaveEmpty) { - if (isAdded() && _hlEditor != null && _hlEditor.getText() != null) { + // Document is written iff content has changed + // _isTextChanged implies _document != null && _hlEditor != null && _hlEditor.getText() != null + if (_isTextChanged && isAdded()) { - if (_document != null && _document.getFile() != null) { - _appSettings.setLastEditPosition(_document.getFile(), _hlEditor.getSelectionStart()); - _appSettings.setDocumentPreviewState(getPath(), _isPreviewVisible); - } + _appSettings.setLastEditPosition(_document.getFile(), _hlEditor.getSelectionStart()); - updateLauncherWidgets(); - return _document.saveContent(getContext(), _hlEditor.getText().toString(), _shareUtil, forceSaveEmpty); + if (_document.saveContent(getContext(), _hlEditor.getText().toString(), _shareUtil, forceSaveEmpty)) { + updateLauncherWidgets(); + checkTextChangeState(); + return true; + } } return false; } @@ -704,8 +702,9 @@ public void onSaveInstanceState(@NonNull Bundle outState) { @Override public void onPause() { saveDocument(false); - if (_document != null && _document.getFile() != null) { + if (_document != null) { _appSettings.addRecentDocument(_document.getFile()); + _appSettings.setDocumentPreviewState(_document.getPath(), _isPreviewVisible); } super.onPause(); } @@ -719,6 +718,12 @@ private void updateLauncherWidgets() { @Override public void setUserVisibleHint(boolean isVisibleToUser) { + // This function can be called _outside_ the normal lifecycle! + // Do nothing if the fragment is not at least created! + if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.CREATED)) { + return; + } + super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isDisplayedAtMainActivity()) { loadDocument(); @@ -739,10 +744,10 @@ public void setUserVisibleHint(boolean isVisibleToUser) { @Override public void onFragmentFirstTimeVisible() { - final boolean initPreview = _appSettings.getDocumentPreviewState(getPath()); + final boolean initPreview = _appSettings.getDocumentPreviewState(_document.getPath()); if (_savedInstanceState == null || !_savedInstanceState.containsKey(SAVESTATE_CURSOR_POS) && _hlEditor.length() > 0) { int lastPos; - if (_document != null && _document.getFile() != null && (lastPos = _appSettings.getLastEditPositionChar(_document.getFile())) >= 0 && lastPos <= _hlEditor.length()) { + if (_document != null && (lastPos = _appSettings.getLastEditPositionChar(_document.getFile())) >= 0 && lastPos <= _hlEditor.length()) { if (!initPreview) { _hlEditor.requestFocus(); } @@ -757,23 +762,25 @@ public void onFragmentFirstTimeVisible() { } public void setDocumentViewVisibility(boolean show) { + final Activity activity = getActivity(); if (!show) { _webViewClient.setRestoreScrollY(_webView.getScrollY()); - } - if (show) { + } else { _textFormat.getConverter().convertMarkupShowInWebView(_document, _hlEditor.getText().toString(), _webView, _nextConvertToPrintMode); - new ActivityUtils(getActivity()).hideSoftKeyboard().freeContextRef(); + new ActivityUtils(activity).hideSoftKeyboard().freeContextRef(); _hlEditor.clearFocus(); - _hlEditor.postDelayed(() -> new ActivityUtils(getActivity()).hideSoftKeyboard().freeContextRef(), 300); + _hlEditor.postDelayed(() -> new ActivityUtils(activity).hideSoftKeyboard().freeContextRef(), 300); } + _nextConvertToPrintMode = false; _webView.setAlpha(0); _webView.setVisibility(show ? View.VISIBLE : View.GONE); if (show) { _webView.animate().setDuration(150).alpha(1.0f).setListener(null); } + _isPreviewVisible = show; - ((AppCompatActivity) getActivity()).supportInvalidateOptionsMenu(); + ((AppCompatActivity) activity).supportInvalidateOptionsMenu(); } final View.OnLongClickListener _longClickToTopOrBottom = new View.OnLongClickListener() { @@ -805,10 +812,6 @@ public Document getDocument() { return _document; } - public String getPath() { - return Document.getPath(_document); - } - public WebView getWebview() { return _webView; } diff --git a/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java b/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java index e0b762a98..1f42ad9c9 100644 --- a/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java +++ b/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java @@ -281,7 +281,7 @@ private void showInDocumentActivity(Document document) { if (getActivity() instanceof DocumentActivity) { DocumentActivity a = (DocumentActivity) getActivity(); a.setDocument(document); - a.showTextEditor(document, null, false, _appSettings.getDocumentPreviewState(Document.getPath(document)), null); + a.showTextEditor(document, null, false, _appSettings.getDocumentPreviewState(document.getPath()), null); } } diff --git a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java index ff4c365e4..f4b9543d1 100644 --- a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java @@ -79,7 +79,6 @@ public class MainActivity extends MarkorBaseActivity implements FilesystemViewer private SectionsPagerAdapter _viewPagerAdapter; private boolean _doubleBackToExitPressedOnce; - private MenuItem _lastBottomMenuItem; private AppSettings _appSettings; private ActivityUtils _contextUtils; @@ -136,11 +135,7 @@ protected void onCreate(Bundle savedInstanceState) { (new ActivityUtils(this)).applySpecialLaunchersVisibility(_appSettings.isSpecialFileLaunchersEnabled()); - _bottomNav.postDelayed(() -> { - if (_appSettings.getAppStartupTab() != R.id.nav_notebook) { - _bottomNav.setSelectedItemId(_appSettings.getAppStartupTab()); - } - }, 1); + _bottomNav.postDelayed(() -> _bottomNav.setSelectedItemId(_appSettings.getAppStartupTab()), 10); } private void optShowRate() { @@ -168,7 +163,7 @@ public boolean onOptionsItemSelected(MenuItem item) { AppSettings as = new AppSettings(this); switch (item.getItemId()) { case R.id.action_preview: { - File f = _bottomNav.getSelectedItemId() == R.id.nav_quicknote ? as.getQuickNoteFile() : as.getTodoFile(); + final File f = _bottomNav.getSelectedItemId() == R.id.nav_quicknote ? as.getQuickNoteFile() : as.getTodoFile(); DocumentActivity.launch(MainActivity.this, f, false, true, null, null); return true; } @@ -331,38 +326,12 @@ public void onBackPressed() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { - updateFabVisibility(item.getItemId() == R.id.nav_notebook); - PermissionChecker permc = new PermissionChecker(this); - - switch (item.getItemId()) { - case R.id.nav_notebook: { - _viewPager.setCurrentItem(0); - _toolbar.setTitle(getFileBrowserTitle()); - return true; - } + _viewPager.setCurrentItem(tabIdToPos(item.getItemId())); + return true; + } - case R.id.nav_todo: { - permc.doIfExtStoragePermissionGranted(); // cannot prevent bottom tab selection - restoreDefaultToolbar(); - _viewPager.setCurrentItem(1); - _toolbar.setTitle(R.string.todo); - return true; - } - case R.id.nav_quicknote: { - permc.doIfExtStoragePermissionGranted(); // cannot prevent bottom tab selection - restoreDefaultToolbar(); - _viewPager.setCurrentItem(2); - _toolbar.setTitle(R.string.quicknote); - return true; - } - case R.id.nav_more: { - restoreDefaultToolbar(); - _viewPager.setCurrentItem(3); - _toolbar.setTitle(R.string.more); - return true; - } - } - return false; + public void setMainTitle(final String title) { + _toolbar.setTitle(title); } public void updateFabVisibility(boolean visible) { @@ -382,17 +351,41 @@ public String getFileBrowserTitle() { return title; } + public int tabIdToPos(final int id) { + if (id == R.id.nav_notebook) return 0; + if (id == R.id.nav_todo) return 1; + if (id == R.id.nav_quicknote) return 2; + if (id == R.id.nav_more) return 3; + return 0; + } + + public int getCurrentPos() { + return _viewPager.getCurrentItem(); + } + + public String getPosTitle(final int pos) { + if (pos == 0) return getFileBrowserTitle(); + if (pos == 1) return getString(R.string.todo); + if (pos == 2) return getString(R.string.quicknote); + if (pos == 3) return getString(R.string.more); + return ""; + } + @OnPageChange(value = R.id.main__view_pager_container, callback = OnPageChange.Callback.PAGE_SELECTED) public void onViewPagerPageSelected(int pos) { - Menu menu = _bottomNav.getMenu(); - PermissionChecker permc = new PermissionChecker(this); - (_lastBottomMenuItem != null ? _lastBottomMenuItem : menu.getItem(0)).setChecked(false); - _lastBottomMenuItem = menu.getItem(pos).setChecked(true); - updateFabVisibility(pos == 0); - _toolbar.setTitle(new String[]{getFileBrowserTitle(), getString(R.string.todo), getString(R.string.quicknote), getString(R.string.more)}[pos]); + _bottomNav.getMenu().getItem(pos).setChecked(true); + + updateFabVisibility(pos == tabIdToPos(R.id.nav_notebook)); + + setMainTitle(getPosTitle(pos)); - if (pos > 0 && pos < 3) { - permc.doIfExtStoragePermissionGranted(); // cannot prevent bottom tab selection + if (pos != tabIdToPos(R.id.nav_notebook)) { + restoreDefaultToolbar(); + } + + if (pos == tabIdToPos(R.id.nav_quicknote) || pos == tabIdToPos(R.id.nav_todo)) { + // cannot prevent bottom tab selection + new PermissionChecker(this).doIfExtStoragePermissionGranted(); } } @@ -422,7 +415,9 @@ public void onFsViewerConfig(FilesystemViewerData.Options dopt) { public void onFsViewerDoUiUpdate(FilesystemViewerAdapter adapter) { if (adapter != null && adapter.getCurrentFolder() != null && !TextUtils.isEmpty(adapter.getCurrentFolder().getName())) { _appSettings.setFileBrowserLastBrowsedFolder(adapter.getCurrentFolder()); - _toolbar.setTitle(adapter.areItemsSelected() ? "" : getFileBrowserTitle()); + if (getCurrentPos() == tabIdToPos(R.id.nav_notebook)) { + _toolbar.setTitle(adapter.areItemsSelected() ? "" : getFileBrowserTitle()); + } invalidateOptionsMenu(); } } diff --git a/app/src/main/java/net/gsantner/markor/format/TextConverter.java b/app/src/main/java/net/gsantner/markor/format/TextConverter.java index 969ab758f..4dcfabc17 100644 --- a/app/src/main/java/net/gsantner/markor/format/TextConverter.java +++ b/app/src/main/java/net/gsantner/markor/format/TextConverter.java @@ -84,7 +84,7 @@ public String convertMarkupShowInWebView(Document document, String content, WebV } String baseFolder = new AppSettings(context).getNotebookDirectoryAsStr(); - if (document.getFile() != null && document.getFile().getParentFile() != null) { + if (document.getFile().getParentFile() != null) { baseFolder = document.getFile().getParent(); } baseFolder = "file://" + baseFolder + "/"; diff --git a/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextActions.java b/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextActions.java index e82f849ba..e08101b61 100644 --- a/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextActions.java +++ b/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextActions.java @@ -232,7 +232,7 @@ public boolean onLongClick(View view) { case R.string.tmaid_common_indent: { SearchOrCustomTextDialogCreator.showIndentSizeDialog(_activity, _indent, (size) -> { _indent = Integer.parseInt(size); - _appSettings.setDocumentIndentSize(getPath(), _indent); + _appSettings.setDocumentIndentSize(_document.getPath(), _indent); }); return true; } diff --git a/app/src/main/java/net/gsantner/markor/format/plaintext/PlaintextTextActions.java b/app/src/main/java/net/gsantner/markor/format/plaintext/PlaintextTextActions.java index abb73ced0..c2468bc5e 100644 --- a/app/src/main/java/net/gsantner/markor/format/plaintext/PlaintextTextActions.java +++ b/app/src/main/java/net/gsantner/markor/format/plaintext/PlaintextTextActions.java @@ -100,7 +100,7 @@ public boolean onLongClick(View v) { case R.string.tmaid_common_indent: { SearchOrCustomTextDialogCreator.showIndentSizeDialog(_activity, _indent, (size) -> { _indent = Integer.parseInt(size); - _appSettings.setDocumentIndentSize(getPath(), _indent); + _appSettings.setDocumentIndentSize(_document.getPath(), _indent); }); return true; } diff --git a/app/src/main/java/net/gsantner/markor/model/Document.java b/app/src/main/java/net/gsantner/markor/model/Document.java index 3330da3cf..c3ac456b0 100644 --- a/app/src/main/java/net/gsantner/markor/model/Document.java +++ b/app/src/main/java/net/gsantner/markor/model/Document.java @@ -13,6 +13,7 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.text.TextUtils; import android.util.Log; @@ -29,8 +30,11 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.Serializable; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.attribute.BasicFileAttributes; import java.security.SecureRandom; import java.util.Locale; @@ -50,11 +54,15 @@ public class Document implements Serializable { private final String _fileExtension; private int _format = TextFormat.FORMAT_UNKNOWN; private String _title = ""; + private String _path = ""; private long _modTime = 0; private int _intentLineNumber = -1; - private String _lastHash = null; - public Document(File file) { + // Used to check if string changed + private long _lastHash = 0; + private int _lastLength = -1; + + public Document(@NonNull final File file) { _file = file; final String name = _file.getName(); final int doti = name.lastIndexOf("."); @@ -65,9 +73,10 @@ public Document(File file) { _fileExtension = name.substring(doti).toLowerCase(); _title = name.substring(0, doti); } + _path = _file.getAbsolutePath(); // Set initial format - final String fnlower = getFile().getName().toLowerCase(); + final String fnlower = _file.getName().toLowerCase(); if (TextFormat.CONVERTER_TODOTXT.isFileOutOfThisFormat(fnlower)) { setFormat(TextFormat.FORMAT_TODOTXT); } else if (TextFormat.CONVERTER_KEYVALUE.isFileOutOfThisFormat(fnlower)) { @@ -82,21 +91,21 @@ public Document(File file) { } public String getPath() { - return getPath(this); + return _path; } - public static String getPath(final Document document) { - if (document != null) { - final File file = document.getFile(); - if (file != null) { - return file.getAbsolutePath(); - } - } - return null; + public @NonNull File getFile() { + return _file; } - public File getFile() { - return _file; + public long lastModified() { + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + return Files.readAttributes(_file.toPath(), BasicFileAttributes.class).lastModifiedTime().toMillis(); + } + } catch (IOException ignored) { + } + return _file.lastModified(); } public String getTitle() { @@ -108,7 +117,7 @@ public void setTitle(String title) { } public String getName() { - return getFile().getName(); + return _file.getName(); } public int getIntentLineNumber() { @@ -119,7 +128,7 @@ public int getIntentLineNumber() { public boolean equals(Object obj) { if (obj instanceof Document) { Document other = ((Document) obj); - return equalsc(getFile(), other.getFile()) + return equalsc(_file, other._file) && equalsc(getTitle(), other.getTitle()) && (getFormat() == other.getFormat()); } @@ -147,7 +156,7 @@ public static boolean isEncrypted(File file) { } public boolean isEncrypted() { - return isEncrypted(getFile()); + return isEncrypted(_file); } // Try several fallbacks to get a valid file @@ -192,28 +201,37 @@ public static Document fromArguments(Context context, Bundle arguments) { return document; } + private void setContentHash(final CharSequence s) { + _lastLength = s.length(); + _lastHash = FileUtils.crc32(s.toString().getBytes()); + } + + public boolean isContentSame(final CharSequence s) { + return s != null && s.length() == _lastLength && _lastHash == (FileUtils.crc32(s.toString().getBytes())); + } + public synchronized String loadContent(final Context context) { String content; final char[] pw; if (isEncrypted() && (pw = getPasswordWithWarning(context)) != null) { try { - final byte[] encryptedContext = FileUtils.readCloseStreamWithSize(new FileInputStream(getFile()), (int) getFile().length()); + final byte[] encryptedContext = FileUtils.readCloseStreamWithSize(new FileInputStream(_file), (int) _file.length()); if (encryptedContext.length > JavaPasswordbasedCryption.Version.NAME_LENGTH) { content = JavaPasswordbasedCryption.getDecryptedText(encryptedContext, pw); } else { content = new String(encryptedContext, StandardCharsets.UTF_8); } } catch (FileNotFoundException e) { - Log.e(Document.class.getName(), "loadDocument: File " + getFile() + " not found."); + Log.e(Document.class.getName(), "loadDocument: File " + _file + " not found."); content = ""; } catch (JavaPasswordbasedCryption.EncryptionFailedException | IllegalArgumentException e) { Toast.makeText(context, R.string.could_not_decrypt_file_content_wrong_password_or_is_the_file_maybe_not_encrypted, Toast.LENGTH_LONG).show(); - Log.e(Document.class.getName(), "loadDocument: decrypt failed for File " + getFile() + ". " + e.getMessage(), e); + Log.e(Document.class.getName(), "loadDocument: decrypt failed for File " + _file + ". " + e.getMessage(), e); content = ""; } } else { - content = FileUtils.readTextFileFast(getFile()); + content = FileUtils.readTextFileFast(_file); } if (MainActivity.IS_DEBUG_ENABLED) { @@ -227,8 +245,8 @@ public synchronized String loadContent(final Context context) { } // Also set hash and time on load - should prevent unnecessary saves - _lastHash = FileUtils.sha512sum(content.getBytes()); - _modTime = _file.lastModified(); + setContentHash(content); + _modTime = lastModified(); return content; } @@ -272,10 +290,8 @@ public synchronized boolean saveContent(final Context context, final String cont } shareUtil = shareUtil != null ? shareUtil : new ShareUtil(context); - final String newHash = FileUtils.sha512sum(content.getBytes()); - // Don't write same content if base file not changed - if (newHash != null && newHash.equals(_lastHash) && _modTime >= _file.lastModified()) { + if (isContentSame(content) && _modTime >= lastModified()) { return true; } @@ -299,7 +315,7 @@ public synchronized boolean saveContent(final Context context, final String cont }); success = true; } else { - success = FileUtils.writeFile(getFile(), contentAsBytes); + success = FileUtils.writeFile(_file, contentAsBytes); } } catch (JavaPasswordbasedCryption.EncryptionFailedException e) { Log.e(Document.class.getName(), "writeContent: encrypt failed for File " + getPath() + ". " + e.getMessage(), e); @@ -308,8 +324,8 @@ public synchronized boolean saveContent(final Context context, final String cont } if (success) { - _lastHash = newHash; - _modTime = _file.lastModified(); + setContentHash(content); + _modTime = lastModified(); } return success; diff --git a/app/src/main/java/net/gsantner/markor/ui/hleditor/Highlighter.java b/app/src/main/java/net/gsantner/markor/ui/hleditor/Highlighter.java index 09f1f9faf..efa31eaaa 100644 --- a/app/src/main/java/net/gsantner/markor/ui/hleditor/Highlighter.java +++ b/app/src/main/java/net/gsantner/markor/ui/hleditor/Highlighter.java @@ -112,13 +112,6 @@ public void generalHighlightRun(final Spannable spannable) { } } - protected String getFilepath() { - if (_document != null && _document.getFile() != null) { - return _document.getFile().getAbsolutePath(); - } - return ""; - } - public AppSettings getAppSettings() { return _appSettings; } diff --git a/app/src/main/java/net/gsantner/markor/ui/hleditor/TextActions.java b/app/src/main/java/net/gsantner/markor/ui/hleditor/TextActions.java index e177740dd..646fbcac7 100644 --- a/app/src/main/java/net/gsantner/markor/ui/hleditor/TextActions.java +++ b/app/src/main/java/net/gsantner/markor/ui/hleditor/TextActions.java @@ -70,11 +70,7 @@ public TextActions(Activity activity, Document document) { _context = activity != null ? activity : _hlEditor.getContext(); _appSettings = new AppSettings(_context); _textActionSidePadding = (int) (_appSettings.getEditorTextActionItemPadding() * _context.getResources().getDisplayMetrics().density); - _indent = _appSettings.getDocumentIndentSize(getPath()); - } - - public String getPath() { - return Document.getPath(_document); + _indent = _appSettings.getDocumentIndentSize(_document.getPath()); } /** diff --git a/app/src/main/java/net/gsantner/markor/util/ShareUtil.java b/app/src/main/java/net/gsantner/markor/util/ShareUtil.java index dbb201b47..53e40300b 100644 --- a/app/src/main/java/net/gsantner/markor/util/ShareUtil.java +++ b/app/src/main/java/net/gsantner/markor/util/ShareUtil.java @@ -34,7 +34,7 @@ public void createLauncherDesktopShortcut(Document document) { // This is only allowed to call when direct file access is possible!! // So basically only for java.io.File Objects. Virtual files, or content:// // in private/restricted space won't work - because of missing permission grant when re-launching - if (document != null && document.getFile() != null && !TextUtils.isEmpty(document.getTitle())) { + if (document != null && !TextUtils.isEmpty(document.getTitle())) { Intent shortcutIntent = new Intent(_context, OpenEditorFromShortcutOrWidgetActivity.class) .setData(Uri.fromFile(document.getFile())); super.createLauncherDesktopShortcut(shortcutIntent, R.drawable.ic_launcher, document.getTitle()); diff --git a/app/src/main/java/net/gsantner/opoc/util/FileUtils.java b/app/src/main/java/net/gsantner/opoc/util/FileUtils.java index 98ba1ef34..a99976c5a 100644 --- a/app/src/main/java/net/gsantner/opoc/util/FileUtils.java +++ b/app/src/main/java/net/gsantner/opoc/util/FileUtils.java @@ -31,11 +31,13 @@ import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Pattern; +import java.util.zip.CRC32; @SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "deprecation", "TryFinallyCanBeTryWithResources"}) public class FileUtils { @@ -504,18 +506,28 @@ public static File join(File file, String... childSegments) { return file; } - public static String sha512sum(final byte[] bytes) { + private static String hash(final byte[] data, final String alg) { try { - final StringBuilder sb = new StringBuilder(); - for (final byte b : MessageDigest.getInstance("SHA-512").digest(bytes)) { - sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); - } - return sb.toString(); + return Arrays.toString(MessageDigest.getInstance(alg).digest(data)); } catch (NoSuchAlgorithmException e) { return null; } } + public static String md5(final byte[] data) { + return hash(data, "MD5"); + } + + public static String sha512(final byte[] data) { + return hash(data, "SHA-512"); + } + + public static long crc32(final byte[] data) { + final CRC32 alg = new CRC32(); + alg.update(data); + return alg.getValue(); + } + // Return true if the target file exists, false if there is an issue with the file or it's parent directories public static boolean fileExists(final File checkFile) { File[] files; diff --git a/app/src/main/res/menu/document__edit__menu.xml b/app/src/main/res/menu/document__edit__menu.xml index e2a7697ad..1e86cc811 100644 --- a/app/src/main/res/menu/document__edit__menu.xml +++ b/app/src/main/res/menu/document__edit__menu.xml @@ -98,8 +98,7 @@ android:id="@+id/action_save" android:icon="@drawable/ic_save_black_24dp" android:title="@string/save" - app:showAsAction="never" /> - + app:showAsAction="always" /> @color/primary_dark @color/primary_dark @style/AppTheme.PreferenceTheme + @style/ActionButtonStyle @@ -71,4 +73,13 @@ + From 37cda64d02145c17bd71358cdc45c11387d2ae55 Mon Sep 17 00:00:00 2001 From: Gregor Santner Date: Fri, 24 Dec 2021 10:58:03 +0100 Subject: [PATCH 3/6] Update translations (PR #1534) --- app/src/main/res/values-iw/strings.xml | 103 +++++++++++++++++++++ app/src/main/res/values-zh-rCN/strings.xml | 4 +- 2 files changed, 105 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 91aa919a9..9304d236b 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -149,6 +149,8 @@ work. If not, see . אף אחד אחר קובץ ריק + סיום עמוד (עבור PDF או הדפסה) + קו תחתון האם להוסיף קו תחתון מתחת לקוד הקסאדצימלי בהתאם לצבע הוסף שורה מתחת לקוד צבע הקסאדצימלי הכנס את התאריך הנוכחי בתחילת מטלה חדשה @@ -168,6 +170,9 @@ work. If not, see . כפתור מיוחד דף מעלה (דף מעלה) דף מטה (דף מטה) + הזז טקסט שורה אחת למעלה + הזז טקסט שורה אחת למטֿה + שורה חדשה תחילת שורה (מיקום בית) סוף שורה (מיקום סוף) תחילת מסמך @@ -175,6 +180,9 @@ work. If not, see . בחר הכל (Ctrl+A) התחל בתחתית בעת טעינת קובץ, מקם את הסמן בסופו + מקף (-) + כוכבית (*) + פלוס (+) Markor יכול לערוך קבצים מקומיים, המנותקים מהרשת בלבד ואינו תומך בסיירי קבצים שאינם מביאים נתיב מלא אל הקובץ. הערה: אפליקציות סנכרון יכולות לשים קבצים בתיקיות שרירותיות, לפתוח אותם באמצעות שינוי תיקיית המסמכים של Markor בהתאם, או במנהל קבצים אחר. הגדר בהגדרות האפליקציה @@ -186,6 +194,8 @@ work. If not, see . עליון תחתית מרכז + ריווח פעולות טקסט + רווח אופקי בין כפטורי פעולות טקסט מרכז טקסט ערוך טקסט במרכז המסך לוח גזירים @@ -226,6 +236,8 @@ work. If not, see . מתמטיקה תוכן עניינים שונות + פעולת טקסט + פעולות טקסט העדף תצוגה לא מותקנת אפליקציית לוח שנה! מסמכים בשימוש נפוץ @@ -268,6 +280,7 @@ work. If not, see . אחסון פנימי שחור לבן + הצג מצב תצוגה מצב עריכה הטמע אחסון @@ -275,9 +288,99 @@ work. If not, see . מועדף מועדפים המתן + תיקייה לאתחול אפליקציה רוחב טאב כמות הרווחים להצגת טאב הצג בקבצים אחרונים טען מחדש + גלישת שורות פתח תמיד עם אפליקציה זו + תבנית + שליחה לוג לפטרון בעיות + הדפסה / PDF + כותרות מוגדלות + נוכחי + הקלט שמע + צרף + העתק קובץ + עמוד + כלים + קריאה + קרא + טבלה + כמה עמודות? לחיצה ארוכה על כפטור הטבלה תיצור טבלה (הכנס כותרת), לחיצה קצרה תוסיף שורה. + דוגמא לטבלה בMarkdown + מחיקת שורות + רשימה לא ממוספרת + רשימה ממוספרת + רשימת משימות + פתח קישור + בחירת צבע + תאריך ושעה + דלג למטה + צטט + כותרת + כותרת 1‏ + כותרת 2‏ + כותרת 3‏ + כותרת 4‏ + כותרת 5‏ + כותרת 6‏ + הדגשה + נטוי + מסומן + מחוק בקו + קוד מוטבע + קו אופקי + סמן כבוצע/לא-בוצע + צבע קישור + הוספת קונטקסט + הוספת פרוייקט + העבר משימות שבוצעו לארכיון + מיין לפי + צור קובץ או תיקייה + בחר פורמאט + נבחר + חזרה + הרחב/קפל + חיוני + צרף מזהה משתמש ייחודי למשימות חדשות + סידור פעולות + הצג או הסתר פעולה + טען הגדרות ברירת מחדל + גרור + נוצר + סיסמה להצפנת קבצים + לא הוגדרה סיסמא, לא ניתן להצפין/לפענח. +גש להגדרות -> כללי -> סיסמא +בכדי להגדיר סיסמא. + הצפן קובץ + כשל בהצפנה קובץ. הקובץ לא נשמר. + כשל בפיענוח קובץ. האם הזנתם סיסמא שגויה? האם הקובץ הוצפן באמצעות AES של מרקור? + סיסמא כבר מוגדרת. הגדרת סיסמא חדשה תדרוס את הקיימת והנכם עלולים לאבד גישה לקבצים במידה ולא תזכרו את הסיסמא. + תא קוד + הוספת תאריך סיום + הוסף תאריך סיום עבור מטלות שבוצעו, בעט סימונים + פורמאט תיאור קובץ + פורמאט עבור התיאור עבור כל קובץ במעיין הקבצים. מבוסס על כללי SimpleDateForm של אנדרויד, עם תוספת של FS עבור גודל קובץ. השאר ריק בכדי להשתמש בפורמאט ברירת המחדל המקומי שלך. + +ערך לדוגמא: +FS yyyy MMM dd hh:mm:ss aa +תוצאה: +30KB 2020 Mar 20 11:24:52 PM + טוען ערך ברירת מחדל + הגדרות קובץ + חיפוש / החלפה + חפש + החלף ב + החלף (1) + החלף הכל + התאמות + עיין לפי פרוייקט + עיין לפי קונטקסט + הזן פרוייקטים + הזן קונטקסטים + עיין ברשימת משימות + עיין לפי עדיפות + עיין לפי תאריך גמר diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 80d2e1bd6..1feae21e7 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -327,7 +327,7 @@ work. If not, see . 实验功能 工具 正在读取 - 只读 + 读取 表格 需要多少列?长按表格按钮来新建一个表格 (插入表头) ,短按以添加一行。 Markdown 表格示例 @@ -349,7 +349,7 @@ work. If not, see . 6 级标题 粗体 斜体 - 高亮 + 高亮的 删除线 行内代码 水平线 From 190410b69585ba062283fae0d4f554e10574e65e Mon Sep 17 00:00:00 2001 From: Gregor Santner Date: Fri, 24 Dec 2021 11:08:43 +0100 Subject: [PATCH 4/6] Markdown: soft wrap lines with link, by @gsantner, closes #1536 --- .../gsantner/markor/format/markdown/MarkdownTextConverter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextConverter.java b/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextConverter.java index d6b33ace7..875b3b087 100644 --- a/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextConverter.java +++ b/app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextConverter.java @@ -82,6 +82,7 @@ public class MarkdownTextConverter extends TextConverter { public static final String CSS_BLOCKQUOTE_VERTICAL_LINE = CSS_S + "blockquote{padding:0px 14px;border-" + TOKEN_TEXT_DIRECTION + ":3.5px solid #dddddd;margin:4px 0}" + CSS_E; public static final String CSS_LIST_TASK_NO_BULLET = CSS_S + ".task-list-item { list-style-type:none; text-indent: -1.4em; }" + CSS_E; public static final String CSS_GITLAB_VIDEO_CAPTION = CSS_S + ".video-container > p { margin: 0; }" + CSS_E; + public static final String CSS_LINK_SOFT_WRAP_AUTOBREAK_LINES = CSS_S + "p > a { word-break:break-all; }" + CSS_E; public static final String CSS_TOC_STYLE = CSS_S + ".markor-table-of-contents { border: 1px solid " + TOKEN_BW_INVERSE_OF_THEME + "; border-radius: 2px; } .markor-table-of-contents > h1 { padding-left: 14px; margin-bottom: -8px; border-bottom: 1px solid " + TOKEN_BW_INVERSE_OF_THEME + "; } .markor-table-of-contents-list li { margin-left: -12px; } .markor-table-of-contents-list a { text-decoration: none; }" + CSS_E; public static final String CSS_PRESENTATION_BEAMER = "" + CSS_S + "img { max-width: 100%; } a:visited, a:link, a:hover, a:focus, a:active { color:inherit; } table { border-collapse: collapse; width: 100%; } table, th, td { padding: 5px; } body { font-family: Helvetica, Arial, Freesans, clean, sans-serif; padding:0 0 0 0; margin:auto; max-width:42em; } h1, h2, h3, h4, h5, h6 { font-weight: bold; } h1 { font-size: 28px; border-bottom: 2px solid; border-bottom-color: inherit; } h2 { font-size: 24px; border-bottom: 2px solid; border-bottom-color: inherit; } h3 { font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 14px; } h6 { font-size: 14px; } p, blockquote, ul, ol, dl, li, table, pre { margin: 15px 0; } code { margin: 0 2px; padding: 0 5px; } pre { line-height: 1.25em; overflow: auto; padding: 6px 10px; } pre > code { border: 0; margin: 0; padding: 0; } code { font-family: monospace; } img { max-width: 100%; } .slide { display: flex; width: 297mm; height: 166mm; margin: 0 auto 20px auto; padding: 0; align-items: center; border: 1px solid " + TOKEN_BW_INVERSE_OF_THEME + "; } .slide_body { display: block; width: 260mm; height: 155mm; margin: auto; overflow: hidden; } .slide_body:empty { display: none; } .slide:empty{ display: none; } @media print { body { margin: 0; padding: 0; } .slide { page-break-after: always; margin: 0; padding: 0; width: 297mm; min-height: 200mm; height: 200mm; max-height: 200mm; border: none; overflow: hidden; border: 0; } } *:not(span){ unicode-bidi: plaintext; } .slide_title > *{ text-align: center; border-bottom: 0px; font-size: 450%; } .slide_title > h1 { font-size: 550%; } .slide_body:not(.slide_title) > * { font-size: 200%; } .slide_body:not(.slide_title) > h1 { font-size: 350%; } .slide_body:not(.slide_title) > h2 { font-size: 310%; } img[alt*='imghcenter'] { display:block; margin-left: auto; margin-right: auto; } img[alt*='imgbig'] { object-fit: cover; min-height: 100%; min-width: 70%; } .slide_body:not(.slide_title) > h3 { font-size: 280%; }" + CSS_E; @@ -157,7 +158,7 @@ public String convertMarkup(String markup, Context context, boolean isExportInLi .set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "header_no_underline"); // Prepare head and javascript calls - head += CSS_HEADER_UNDERLINE + CSS_H1_H2_UNDERLINE + CSS_BLOCKQUOTE_VERTICAL_LINE + CSS_GITLAB_VIDEO_CAPTION + CSS_LIST_TASK_NO_BULLET; + head += CSS_HEADER_UNDERLINE + CSS_H1_H2_UNDERLINE + CSS_BLOCKQUOTE_VERTICAL_LINE + CSS_GITLAB_VIDEO_CAPTION + CSS_LIST_TASK_NO_BULLET + CSS_LINK_SOFT_WRAP_AUTOBREAK_LINES; // Presentations final boolean enablePresentationBeamer = markup.contains("\nclass:beamer") || markup.contains("\nclass: beamer"); From c6a4fbe4d8fb555c06660f42f050cd044cef523e Mon Sep 17 00:00:00 2001 From: Gregor Santner Date: Fri, 24 Dec 2021 12:31:08 +0100 Subject: [PATCH 5/6] Directly show view mode in mainactivity (ToDo, QuickNote), by @gsantner --- .../gsantner/markor/activity/MainActivity.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java index f4b9543d1..0880ec9ef 100644 --- a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java @@ -160,20 +160,11 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); - AppSettings as = new AppSettings(this); - switch (item.getItemId()) { - case R.id.action_preview: { - final File f = _bottomNav.getSelectedItemId() == R.id.nav_quicknote ? as.getQuickNoteFile() : as.getTodoFile(); - DocumentActivity.launch(MainActivity.this, f, false, true, null, null); - return true; - } - case R.id.action_settings: { - new ActivityUtils(this).animateToActivity(SettingsActivity.class, false, null); - return true; - } + if (item.getItemId() == R.id.action_settings) { + new ActivityUtils(this).animateToActivity(SettingsActivity.class, false, null); + return true; } return false; - } @Override From acb073aa61d0cc7d691c994ff2bda2213e45512b Mon Sep 17 00:00:00 2001 From: Gregor Santner Date: Fri, 24 Dec 2021 12:35:06 +0100 Subject: [PATCH 6/6] Document menu: Swap search<->save button position, by @gsantner --- app/src/main/res/menu/document__edit__menu.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/menu/document__edit__menu.xml b/app/src/main/res/menu/document__edit__menu.xml index 1e86cc811..769c02872 100644 --- a/app/src/main/res/menu/document__edit__menu.xml +++ b/app/src/main/res/menu/document__edit__menu.xml @@ -81,6 +81,12 @@ android:title="@string/edit_mode" app:showAsAction="always" /> + + - -