├── .gitignore ├── .gitlab-ci.yml ├── CHANGELOG.md ├── LICENSE ├── QuickNote.iml ├── README.md ├── app ├── .gitignore ├── Copy of app (conflict from 02-02-2016 at 09h31).iml ├── Copy of app (conflict from 02-13-2016 at 18h32).iml ├── Copy of app (conflict from 02-18-2016 at 22h16).iml ├── Copy of app (conflict from 02-22-2016 at 21h30).iml ├── apk │ ├── app-debugv19.apk │ ├── app-releasev19.apk │ ├── app-releasev20.apk │ ├── app-releasev21.apk │ └── app-releasev23.apk ├── app-release.apk ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── Copy of AndroidManifest (conflict from 02-18-2016 at 22h17).xml │ ├── assets │ ├── CHANGELOG.md │ ├── editor │ │ ├── browsers │ │ │ ├── browser.js │ │ │ └── browser.js.js │ │ ├── builder-effective-config.yaml │ │ ├── css │ │ │ ├── black │ │ │ │ ├── design-browser.css │ │ │ │ ├── design-common.css │ │ │ │ ├── design-editor.css │ │ │ │ ├── metadata.json │ │ │ │ └── preview.png │ │ │ ├── carnet │ │ │ │ ├── metadata.json │ │ │ │ └── preview.png │ │ │ ├── dark │ │ │ │ ├── design-dark-browser.css │ │ │ │ ├── design-dark-common.css │ │ │ │ ├── design-dark-editor.css │ │ │ │ ├── metadata.json │ │ │ │ └── preview.png │ │ │ ├── design-browser.css │ │ │ ├── design-common.css │ │ │ ├── design-editor.css │ │ │ └── yaru │ │ │ │ ├── design-browser.css │ │ │ │ ├── design-common.css │ │ │ │ ├── design-editor.css │ │ │ │ ├── metadata.json │ │ │ │ └── preview.png │ │ ├── firstlaunch │ │ │ ├── slide.css │ │ │ ├── slide.html │ │ │ └── slide.js │ │ ├── fonts │ │ │ ├── material-icons.woff2 │ │ │ └── ubuntu.woff2 │ │ ├── i18n │ │ │ ├── ar.json │ │ │ ├── cs.json │ │ │ ├── de.json │ │ │ ├── en.json │ │ │ ├── eo.json │ │ │ ├── es.json │ │ │ ├── eu.json │ │ │ ├── fa.json │ │ │ ├── fr.json │ │ │ ├── gl.json │ │ │ ├── he.json │ │ │ ├── it.json │ │ │ ├── ko.json │ │ │ ├── nl.json │ │ │ ├── pl.json │ │ │ ├── ru.json │ │ │ ├── sk.json │ │ │ ├── sv.json │ │ │ ├── tot.json │ │ │ ├── tr.json │ │ │ └── zh_Hans.json │ │ ├── img │ │ │ ├── 512x512.png │ │ │ ├── bike.png │ │ │ ├── directory.png │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_white.png │ │ │ ├── sync.svg │ │ │ └── ui.png │ │ ├── index.html │ │ ├── libs │ │ │ ├── Countable.js │ │ │ ├── date.js │ │ │ ├── dialog-polyfill.css │ │ │ ├── dialog-polyfill.js │ │ │ ├── fullscreen.js │ │ │ ├── hammer.min.js │ │ │ ├── imgViewer.js │ │ │ ├── jquery-ui.css │ │ │ ├── jquery-ui.min.js │ │ │ ├── jquery.hammer.js │ │ │ ├── jquery.min.js │ │ │ ├── jquery.mobile-min.js │ │ │ ├── jquery.mousewheel.min.js │ │ │ ├── jquery.ui.touch-punch.min.js │ │ │ ├── jquery.webkitresize.js │ │ │ ├── jquery_i18n │ │ │ │ ├── CLDRPluralRuleParser.js │ │ │ │ ├── cli.js │ │ │ │ ├── jquery.i18n.emitter.bidi.js │ │ │ │ ├── jquery.i18n.emitter.js │ │ │ │ ├── jquery.i18n.fallbacks.js │ │ │ │ ├── jquery.i18n.js │ │ │ │ ├── jquery.i18n.language.js │ │ │ │ ├── jquery.i18n.messagestore.js │ │ │ │ └── jquery.i18n.parser.js │ │ │ ├── jscolor.js │ │ │ ├── jszip-utils.min.js │ │ │ ├── jszip.min.js │ │ │ ├── masonry-hybrid.js │ │ │ ├── masonry.js │ │ │ ├── material-datetime-picker.css │ │ │ ├── material-datetime-picker.js │ │ │ ├── material-icons.css │ │ │ ├── material.indigo-pink.min.css │ │ │ ├── material.js │ │ │ ├── mdl_drawer_drag.js │ │ │ ├── moment.js │ │ │ ├── polyfill.css │ │ │ ├── polyfill.js │ │ │ ├── recorder │ │ │ │ ├── decoderWorker.min.js │ │ │ │ ├── decoderWorker.min.wasm │ │ │ │ ├── encoderWorker.min.js │ │ │ │ ├── encoderWorker.min.wasm │ │ │ │ ├── recorder.min.js │ │ │ │ └── waveWorker.min.js │ │ │ ├── rome.standalone.js │ │ │ ├── simplecolorpicker │ │ │ │ ├── css │ │ │ │ │ └── simple-color-picker.styl │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── simple-color-picker.css │ │ │ ├── underscore.js │ │ │ └── wavesurfer.min.js │ │ ├── main.js │ │ ├── reader │ │ │ ├── css │ │ │ │ ├── recorder.css │ │ │ │ ├── reminders.css │ │ │ │ └── todolist.css │ │ │ ├── reader.html │ │ │ ├── reader.js │ │ │ └── reader.js.js │ │ ├── settings.html │ │ └── settings │ │ │ └── settings.js │ ├── index.html │ ├── jquery.min.js │ └── reader │ │ ├── browsers │ │ ├── browser.js │ │ ├── design.css │ │ ├── file-browser.js │ │ ├── note.js │ │ ├── note_card_view.js │ │ └── search.js │ │ ├── compatibility │ │ ├── android │ │ │ ├── android_recorder.js │ │ │ ├── archiver.js │ │ │ ├── file-opener.js │ │ │ ├── fs.js │ │ │ ├── keywords_db_manager.js │ │ │ ├── mkdirp.js │ │ │ ├── note-opener.js │ │ │ └── path.js │ │ ├── compatibility-browser.js │ │ ├── compatibility-editor.js │ │ ├── compatibility-exporter.js │ │ ├── compatibility-importer.js │ │ ├── compatibility.js │ │ ├── compatibitlity-settings.js │ │ ├── electron │ │ │ ├── request_builder.js │ │ │ └── store.js │ │ ├── file-opener.js │ │ └── nextcloud │ │ │ ├── fullscreen.js │ │ │ ├── nc14-header.css │ │ │ ├── nc14.css │ │ │ ├── nc16.css │ │ │ ├── owncloud.css │ │ │ ├── reader_fullscreen.js │ │ │ └── store.js │ │ ├── css │ │ ├── black │ │ │ ├── design-browser.css │ │ │ ├── design-common.css │ │ │ ├── design-editor.css │ │ │ ├── metadata.json │ │ │ └── preview.png │ │ ├── carnet │ │ │ ├── metadata.json │ │ │ └── preview.png │ │ ├── dark │ │ │ ├── design-dark-browser.css │ │ │ ├── design-dark-common.css │ │ │ ├── design-dark-editor.css │ │ │ ├── metadata.json │ │ │ └── preview.png │ │ ├── design-browser.css │ │ ├── design-common.css │ │ ├── design-editor.css │ │ └── yaru │ │ │ ├── design-browser.css │ │ │ ├── design-common.css │ │ │ ├── design-editor.css │ │ │ ├── metadata.json │ │ │ └── preview.png │ │ ├── exporter │ │ ├── exporter.css │ │ ├── exporter.html │ │ └── exporter.js │ │ ├── fonts │ │ ├── material-icons.woff2 │ │ └── ubuntu.woff2 │ │ ├── i18n │ │ ├── ar.json │ │ ├── cs.json │ │ ├── de.json │ │ ├── en.json │ │ ├── eo.json │ │ ├── es.json │ │ ├── eu.json │ │ ├── fa.json │ │ ├── fr.json │ │ ├── gl.json │ │ ├── he.json │ │ ├── it.json │ │ ├── ko.json │ │ ├── nl.json │ │ ├── pl.json │ │ ├── ru.json │ │ ├── sk.json │ │ ├── sv.json │ │ ├── tot.json │ │ ├── tr.json │ │ └── zh_Hans.json │ │ ├── img │ │ ├── 512x512.png │ │ ├── bike.png │ │ ├── directory.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_white.png │ │ ├── sync.svg │ │ └── ui.png │ │ ├── importer │ │ ├── carnet-converter.js │ │ ├── google-converter.js │ │ ├── importer.html │ │ └── importer.js │ │ ├── keywords │ │ └── keywords_db_manager.js │ │ ├── libs │ │ ├── date.js │ │ ├── dialog-polyfill.css │ │ ├── dialog-polyfill.js │ │ ├── jquery.min.js │ │ ├── jquery.ui.touch-punch.min.js │ │ ├── jquery_i18n │ │ │ ├── CLDRPluralRuleParser.js │ │ │ ├── cli.js │ │ │ ├── jquery.i18n.emitter.bidi.js │ │ │ ├── jquery.i18n.emitter.js │ │ │ ├── jquery.i18n.fallbacks.js │ │ │ ├── jquery.i18n.js │ │ │ ├── jquery.i18n.language.js │ │ │ ├── jquery.i18n.messagestore.js │ │ │ └── jquery.i18n.parser.js │ │ ├── jszip-utils.min.js │ │ ├── jszip.min.js │ │ ├── masonry-hybrid.js │ │ ├── masonry.js │ │ ├── material-icons.css │ │ ├── material.indigo-pink.min.css │ │ ├── material.js │ │ ├── moment.js │ │ ├── polyfill.css │ │ ├── polyfill.js │ │ └── underscore.js │ │ ├── reader │ │ ├── assets │ │ │ └── scripts │ │ │ │ └── jquery-ui.min.js │ │ ├── carnet-recorder.js │ │ ├── css │ │ │ ├── recorder.css │ │ │ ├── reminders.css │ │ │ └── todolist.css │ │ ├── libs │ │ │ ├── Countable.js │ │ │ ├── hammer.min.js │ │ │ ├── imgViewer.js │ │ │ ├── jquery-ui.css │ │ │ ├── jquery-ui.min.js │ │ │ ├── jquery.hammer.js │ │ │ ├── jquery.min.js │ │ │ ├── jquery.mobile-min.js │ │ │ ├── jquery.mousewheel.min.js │ │ │ ├── jquery.ui.touch-punch.min.js │ │ │ ├── jquery.webkitresize.js │ │ │ ├── jscolor.js │ │ │ ├── material-datetime-picker.css │ │ │ ├── material-datetime-picker.js │ │ │ ├── recorder │ │ │ │ ├── decoderWorker.min.js │ │ │ │ ├── decoderWorker.min.wasm │ │ │ │ ├── encoderWorker.min.js │ │ │ │ ├── encoderWorker.min.wasm │ │ │ │ ├── recorder.min.js │ │ │ │ └── waveWorker.min.js │ │ │ ├── rome.standalone.js │ │ │ ├── simplecolorpicker │ │ │ │ ├── css │ │ │ │ │ └── simple-color-picker.styl │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.js │ │ │ │ └── simple-color-picker.css │ │ │ └── wavesurfer.min.js │ │ ├── reader.html │ │ ├── reader.js │ │ ├── reminders.js │ │ └── todolist.js │ │ ├── requests │ │ └── request_builder.js │ │ └── utils │ │ ├── file_utils.js │ │ ├── folder-picker-preload.js │ │ ├── folder-picker.html │ │ ├── folder-picker.js │ │ ├── mdl_drawer_drag.js │ │ └── utils.js │ ├── ic_launcher-web.png │ ├── java │ └── com │ │ └── spisoft │ │ └── quicknote │ │ ├── AudioService.java │ │ ├── BootReceiver.kt │ │ ├── ChangelogActivity.kt │ │ ├── FileManagerService.java │ │ ├── FileReaderActivity.kt │ │ ├── FloatingFragment.java │ │ ├── FloatingService.java │ │ ├── HelpAuthorizeFloatingWindowActivity.java │ │ ├── HomeReceiver.java │ │ ├── KeywordsDialog.java │ │ ├── KeywordsListAdapter.java │ │ ├── KeywordsLoader.java │ │ ├── ListingEngine.java │ │ ├── MainActivity.java │ │ ├── MainFragment.java │ │ ├── MyApplication.java │ │ ├── Note.java │ │ ├── PasswordDialog.java │ │ ├── PreferenceHelper.java │ │ ├── RecordingActivity.java │ │ ├── SettingsActivity.java │ │ ├── SettingsActivityFragment.java │ │ ├── StorageDialog.java │ │ ├── WebBasedActivity.kt │ │ ├── browser │ │ ├── BrowserAdapter.java │ │ ├── BrowserFragment.java │ │ ├── KeywordNotesFragment.java │ │ ├── NoteAdapter.java │ │ ├── NoteInfoRetriever.java │ │ ├── NoteInfoSearchHelper.java │ │ ├── NoteListFragment.java │ │ ├── NoteThumbnailEngine.java │ │ ├── PasteBin.java │ │ ├── PasteDialog.java │ │ ├── PermissionChecker.java │ │ ├── RecentNoteListFragment.java │ │ ├── RenameDialog.java │ │ ├── SearchAsyncTask.java │ │ ├── SearchFragment.java │ │ └── WebBasedView.kt │ │ ├── databases │ │ ├── CacheBuilderIntentService.java │ │ ├── CacheManager.java │ │ ├── DBMergerService.java │ │ ├── Database.kt │ │ ├── KeywordsHelper.java │ │ ├── NoteExporter.kt │ │ ├── NoteManager.java │ │ ├── OldRecentHelper.java │ │ ├── RecentHelper.java │ │ └── page │ │ │ ├── Page.java │ │ │ └── PageManager.java │ │ ├── editor │ │ ├── BlankFragment.java │ │ ├── BubbleLayout.java │ │ ├── BubbleManager.java │ │ ├── EditorActivity.java │ │ ├── EditorView.java │ │ ├── FakeFragmentManager.java │ │ ├── FalseDialogBuilder.java │ │ ├── FloatingWindow.java │ │ ├── ImageActivity.kt │ │ ├── MyWebView.java │ │ ├── ShareEditorActivity.java │ │ └── recorder │ │ │ └── AudioRecorderJS.kt │ │ ├── indexer │ │ ├── IndexDatabase.java │ │ ├── IndexerDBHelper.java │ │ ├── IndexerProvider.java │ │ └── IndexerService.java │ │ ├── intro │ │ ├── ChooseInstanceFragment.java │ │ ├── DisableOptimizationFragment.java │ │ ├── HelpActivity.java │ │ ├── SayHiFragment.java │ │ ├── SelectNextcloudProviderFragment.java │ │ ├── SynchroIntroductionFragment.java │ │ └── WelcomeIntroductionFragment.java │ │ ├── notes_lister │ │ ├── LatestNotesLister.kt │ │ ├── NotesLister.kt │ │ └── PathNotesLister.kt │ │ ├── reminders │ │ ├── NotificationPublisher.kt │ │ └── RemindersManager.kt │ │ ├── server │ │ └── HttpServer.java │ │ ├── serviceactivities │ │ └── CropWrapperActivity.java │ │ ├── synchro │ │ ├── AccountConfigActivity.java │ │ └── AccountConfigActivityFragment.java │ │ ├── updater │ │ ├── ChangelogFragment.java │ │ ├── EditorUpdater.java │ │ ├── Updater.java │ │ └── UpdaterActivity.java │ │ ├── utils │ │ ├── CustomOrientationEventListener.java │ │ ├── FileUtils.java │ │ ├── PictureUtils.java │ │ ├── PinView.java │ │ ├── SerialExecutor.java │ │ ├── SpiDebugUtils.java │ │ ├── Utils.java │ │ ├── WebActivity.kt │ │ ├── WebFragment.kt │ │ ├── ZipUtils.java │ │ └── search │ │ │ └── NIOGrep.java │ │ └── widget │ │ ├── ListRemoteViewsFactory.kt │ │ ├── ListWidgetProvider.kt │ │ ├── ListWidgetService.kt │ │ ├── SimpleWidgetProvider.kt │ │ └── WidgetProvider.kt │ └── res │ ├── anim │ ├── fade_in.xml │ └── fade_out.xml │ ├── drawable-mdpi │ ├── camera_shot.png │ ├── directory.png │ ├── flash_off.png │ ├── flash_on.png │ ├── icon_status.png │ ├── threedots.png │ └── threedots_white.png │ ├── drawable-nodpi │ ├── appwidget_preview_list.png │ └── appwidget_preview_simple.png │ ├── drawable-v21 │ ├── action_button_border.xml │ ├── card_background.xml │ ├── card_border.xml │ ├── grey_ripple.xml │ └── transparent_ripple.xml │ ├── drawable-xhdpi │ ├── camera_black.png │ ├── camera_white.png │ ├── drive.png │ ├── ic_create_new_folder_black.png │ ├── ic_create_new_folder_white.png │ ├── ic_launcher.png │ ├── ic_note_add_black.png │ ├── ic_note_add_white.png │ ├── mic_black.png │ ├── mic_white.png │ ├── pause_black.png │ ├── pause_white.png │ ├── play_black.png │ ├── play_white.png │ ├── sort_black.png │ ├── sort_white.png │ ├── sync_black.png │ ├── sync_black_disabled.png │ ├── sync_white.png │ └── sync_white_disabled.png │ ├── drawable │ ├── action_button_border.xml │ ├── bg_card.xml │ ├── blue_ripple_selector.xml │ ├── bubble_background.xml │ ├── card_background.xml │ ├── card_border.xml │ ├── display_grid.xml │ ├── display_line.xml │ ├── grey_ripple.xml │ ├── keyword_item_bg.xml │ ├── line_card_background.xml │ ├── line_card_border.xml │ ├── rotating_sync_black.xml │ ├── rotating_sync_white.xml │ └── transparent_ripple.xml │ ├── layout │ ├── activity_account_config.xml │ ├── activity_changelog.xml │ ├── activity_editor.xml │ ├── activity_help.xml │ ├── activity_help_authorize_floating_window.xml │ ├── activity_image.xml │ ├── activity_main.xml │ ├── activity_settings.xml │ ├── activity_updater.xml │ ├── activity_web.xml │ ├── activity_web_based.xml │ ├── audio_layout.xml │ ├── bubble_layout.xml │ ├── content_account_config.xml │ ├── false_dialog_layout.xml │ ├── floating_note.xml │ ├── fragment_account_config.xml │ ├── fragment_changelog.xml │ ├── fragment_choose_instance.xml │ ├── fragment_disable_battery_optimization_introduction.xml │ ├── fragment_keywords_dialog.xml │ ├── fragment_main.xml │ ├── fragment_sayhi_introduction.xml │ ├── fragment_settings.xml │ ├── fragment_synchro_introduction.xml │ ├── fragment_synchro_nextcloud_provider.xml │ ├── fragment_web.xml │ ├── fragment_welcome_introduction.xml │ ├── grid_folder_layout.xml │ ├── grid_note_layout.xml │ ├── instance_item.xml │ ├── keyword.xml │ ├── keyword_item.xml │ ├── line_note_layout.xml │ ├── my_bubble.xml │ ├── my_navigation_drawer.xml │ ├── note_layout_widget.xml │ ├── note_recycler_layout.xml │ ├── pin_layout.xml │ ├── progress_layout.xml │ ├── storage_dialog_layout.xml │ ├── todolist_item.xml │ ├── url_layout.xml │ ├── widget_layout.xml │ ├── widget_layout_list.xml │ └── widget_layout_toolbar.xml │ ├── loud_white_noise.mp3 │ ├── menu │ ├── menu_help_authorize_floating_window.xml │ ├── menu_main.xml │ └── menu_settings.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── values-ar │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-eo │ └── strings.xml │ ├── values-es │ ├── arrays.xml │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-gl │ └── strings.xml │ ├── values-he │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-ko │ └── strings.xml │ ├── values-land │ └── dimen.xml │ ├── values-nl │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-sk │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-sw600dp-land │ └── dimen.xml │ ├── values-tr │ └── strings.xml │ ├── values-v21 │ └── styles.xml │ ├── values-w820dp │ └── dimens.xml │ ├── values-xlarge-land │ └── dimen.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values │ ├── arrays.xml │ ├── attrs.xml │ ├── attrs_editor_view.xml │ ├── colors.xml │ ├── dimen.xml │ ├── dimens.xml │ ├── ic_launcher_background.xml │ ├── strings.xml │ ├── styles.xml │ └── themes.xml │ └── xml │ ├── appwidget_list.xml │ ├── appwidget_simple.xml │ ├── empty_pref.xml │ ├── network_security_config.xml │ └── pref_general.xml ├── build.gradle ├── documentation └── disable_optimization │ └── disable_optimization.md ├── github.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── makeAndDeploy.sh ├── metadata └── en-US │ ├── changelogs │ └── 23.txt │ ├── full_description.txt │ ├── images │ ├── icon.png │ └── phoneScreenshots │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ └── 4.png │ ├── short_description.txt │ ├── title.txt │ └── video.txt ├── quickdoc-release.apk ├── settings.gradle └── to_stable_branch.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.ap_ 3 | 4 | app/app.iml 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # IntelliJ 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/dictionaries 41 | .idea/libraries 42 | .idea 43 | 44 | # Keystore files 45 | # Uncomment the following line if you do not want to check your keystore files in. 46 | #*.jks 47 | 48 | # External native build folder generated in Android Studio 2.2 and later 49 | .externalNativeBuild 50 | 51 | # Google Services (e.g. APIs or Firebase) 52 | google-services.json 53 | 54 | # Freeline 55 | freeline.py 56 | freeline/ 57 | freeline_project_description.json 58 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | app/src/main/assets/CHANGELOG.md -------------------------------------------------------------------------------- /QuickNote.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CarnetAndroid 2 | 3 | [État de la traduction](https://weblate.lostpod.me/engage/carnethtml/?utm_source=widget) 4 | 5 | Android version of Carnet 6 | 7 | For feature request, see [Carnet Documentation](../../../CarnetDocumentation) for github or 8 | Framagit 9 | 10 | What is Carnet ? 11 | 12 | Documentation about Carnet is available here 13 | 14 | 15 | [Get it on Google Play](https://play.google.com/store/apps/details?id=com.spisoft.quicknote) 16 | [Get it on F-Droid](https://f-droid.org/app/com.spisoft.quicknote) 17 | 18 | 19 | 20 | # Building Carnet 21 | 22 | ``` 23 | mkdir Carnet 24 | cd Carnet 25 | git clone git@github.com:CarnetApp/CarnetAndroid.git 26 | git clone git@github.com:CarnetApp/Sync.git 27 | git clone git@github.com:CarnetApp/GoogleSync.git 28 | cd CarnetAndroid 29 | ./gradlew build 30 | ``` 31 | 32 | 33 | Even for Android, Carnet editor is written in html / Css / JS, from the CarnetElectron repository 34 | So update with the latest editor 35 | ``` 36 | cd Carnet 37 | git clone git@github.com:PhieF/CarnetElectron.git 38 | cd CarnetElectron 39 | npm install --only=dev 40 | bash compile.sh android ../CarnetAndroid/ 41 | ``` 42 | 43 | This will build and copy every JS html css files needed by the android app 44 | 45 | 46 | ## Help 47 | 48 | You can help with translations on the dedicated platform 49 | 50 | [Weblate](https://weblate.lostpod.me) 51 | 52 | [État de la traduction](https://weblate.lostpod.me/engage/carnethtml/?utm_source=widget) 53 | 54 | ## Thanks 55 | 56 | https://github.com/PhieF/CarnetDocumentation/blob/master/THANKS.md 57 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # IntelliJ 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/assetWizardSettings.xml 41 | .idea/dictionaries 42 | .idea/libraries 43 | .idea/caches 44 | 45 | # Keystore files 46 | # Uncomment the following line if you do not want to check your keystore files in. 47 | #*.jks 48 | 49 | # External native build folder generated in Android Studio 2.2 and later 50 | .externalNativeBuild 51 | 52 | # Google Services (e.g. APIs or Firebase) 53 | google-services.json 54 | 55 | # Freeline 56 | freeline.py 57 | freeline/ 58 | freeline_project_description.json 59 | 60 | # fastlane 61 | fastlane/report.xml 62 | fastlane/Preview.html 63 | fastlane/screenshots 64 | fastlane/test_output 65 | fastlane/readme.md 66 | -------------------------------------------------------------------------------- /app/apk/app-debugv19.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/apk/app-debugv19.apk -------------------------------------------------------------------------------- /app/apk/app-releasev19.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/apk/app-releasev19.apk -------------------------------------------------------------------------------- /app/apk/app-releasev20.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/apk/app-releasev20.apk -------------------------------------------------------------------------------- /app/apk/app-releasev21.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/apk/app-releasev21.apk -------------------------------------------------------------------------------- /app/apk/app-releasev23.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/apk/app-releasev23.apk -------------------------------------------------------------------------------- /app/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/app-release.apk -------------------------------------------------------------------------------- /app/src/main/assets/editor/builder-effective-config.yaml: -------------------------------------------------------------------------------- 1 | directories: 2 | output: dist 3 | buildResources: build 4 | appId: org.spisoft.carnet 5 | dmg: 6 | contents: 7 | - x: 110 8 | 'y': 150 9 | - x: 240 10 | 'y': 150 11 | type: link 12 | path: /Applications 13 | mac: 14 | category: public.app-category.productivity 15 | target: 16 | - dmg 17 | - zip 18 | linux: 19 | category: Office 20 | icon: build/icon.png 21 | target: 22 | - target: AppImage 23 | arch: 24 | - ia32 25 | - x64 26 | - target: snap 27 | snap: 28 | confinement: strict 29 | grade: stable 30 | description: |- 31 | Carnet is a powerful note taking app which purpose is not only to write your shopping list but can also be used to write longer texts, stories, etc. Carnet is available on Android and Linux, also on your web browser with full compatibility with Windows, Mac and Linux, with sync capabilities (not mandatory) 32 | 33 | '''Features''' 34 | 35 | * Complete editor : bold/italic/underline/color/highlight 36 | * Import from Google Keep (only on desktop, then sync on mobile) 37 | * Insert images / review 38 | * Open HTML format 39 | * Organize with folders and choose root storage folder depending on your needs 40 | * Keywords 41 | * Quickly see your recent notes 42 | * Search amount your notes 43 | * Protect the app with a pin code (won't encrypt notes) on android 44 | * Statistics : words/sentences/characters 45 | * Sync with NextCloud 46 | * Record audio 47 | * Online editor as a NextCloud App 48 | summary: Powerful note taking app with sync, online editor and android app 49 | win: 50 | target: squirrel 51 | icon: build/icon.ico 52 | files: [] 53 | electronVersion: 22.0.3 54 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/black/design-browser.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | --grid-bg: #000000; 4 | --note-text-color: white; 5 | --note-bg: #000000; 6 | --note-bg-hover: #1e212b; 7 | --loading-view-bg:#000000; 8 | --fab-button-bg: #000000; 9 | --fab-color:white; 10 | --drag-bar-bg: rgb(36, 46, 100); 11 | --note-shadow: 0 0px 0px 2px #27326e; 12 | --note-shadow-hover: 0 0px 0px 2px rgb(86, 99, 173); 13 | --editor-container-bg: rgba(0, 0, 0, 0.5); 14 | --editor-container-border: #27326e; 15 | --editor-container-border-color: #27326e; 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/black/design-common.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --header-bg:#000000; 3 | --header-text-color:white; 4 | --drawer-bg: #000000; 5 | --drawer-text-color:white; 6 | --dialog-bg: #000000; 7 | --dialog-text-color: white; 8 | --body-bg: #000000; 9 | --drawer-text-button-hover:#2f3341; 10 | --scroll-bar-fg:#242424; 11 | } 12 | 13 | .mdl-layout__drawer { 14 | border-right: 0px; 15 | } 16 | 17 | 18 | .mdl-layout__drawer .mdl-navigation .mdl-navigation__link { 19 | color:white; 20 | } 21 | 22 | .mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled{ 23 | color:rgb(175, 175, 175); 24 | } 25 | 26 | .keyword { 27 | color:white; 28 | } 29 | 30 | .mdl-button{ 31 | color:white; 32 | } 33 | .mdl-textfield__label{ 34 | color: white !important; 35 | } 36 | 37 | .mdl-textfield__label:after { 38 | background-color: white; 39 | } 40 | .mdl-dialog__content { 41 | color:rgba(255, 255, 255, .54); 42 | } 43 | 44 | .mdl-button--fab { 45 | 46 | background: rgba(158, 158, 158, .8); 47 | } 48 | .mdl-button--fab:hover { 49 | 50 | background: rgba(158, 158, 158, .9); 51 | } 52 | 53 | .mdl-radio__outer-circle { 54 | border: 2px solid white; 55 | } 56 | 57 | :root{ 58 | --note-none: #000000; 59 | --note-red: rgb(78, 40, 40); 60 | --note-orange: rgb(68, 44, 28); 61 | --note-yellow: rgb(70, 59, 26); 62 | --note-green: rgb(37, 59, 42); 63 | --note-teal: rgb(5, 66, 63); 64 | --note-blue: rgb(37, 52, 63); 65 | --note-violet: rgb(65, 57, 83); 66 | --note-purple: rgb(62, 43, 68); 67 | --note-pink: rgb(63, 26, 47); 68 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/black/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Black", 3 | "browser": [ 4 | "design-common.css", 5 | "design-browser.css" 6 | ], 7 | "editor": [ 8 | "design-common.css", 9 | "design-editor.css" 10 | ], 11 | "settings": [ 12 | "design-common.css" 13 | ] 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/black/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/css/black/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/carnet/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Carnet", 3 | "browser": [], 4 | "editor": [], 5 | "settings": [] 6 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/carnet/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/css/carnet/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/dark/design-dark-browser.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | --grid-bg: #22252f; 4 | --note-text-color: white; 5 | --note-bg: #2f3341; 6 | --note-bg-hover: #2f3341; 7 | --loading-view-bg:#22252f; 8 | --fab-button-bg: #2f3341; 9 | --fab-color:white; 10 | --drag-bar-bg: rgb(36, 46, 100); 11 | --note-shadow: 0 0px 0px 2px rgba(168, 168, 168, 0.14); 12 | --note-shadow-hover: 0 0px 0px 2px rgb(86, 99, 173); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/dark/design-dark-common.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --header-bg:#22252f; 3 | --header-text-color:white; 4 | --drawer-bg: #22252f; 5 | --drawer-text-color:white; 6 | --dialog-bg: #22252f; 7 | --dialog-text-color: white; 8 | --body-bg: #393c44; 9 | --drawer-text-button-hover:#2f3341; 10 | --scroll-bar-fg:#353535; 11 | } 12 | 13 | .mdl-layout__drawer { 14 | border-right: 0px; 15 | } 16 | 17 | 18 | .mdl-layout__drawer .mdl-navigation .mdl-navigation__link { 19 | color:white; 20 | } 21 | 22 | .mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled{ 23 | color:rgb(175, 175, 175); 24 | } 25 | 26 | .keyword { 27 | color:white; 28 | background: #4d4d4d; 29 | } 30 | 31 | .mdl-button{ 32 | color:white; 33 | } 34 | .mdl-textfield__label{ 35 | color: white !important; 36 | } 37 | 38 | .mdl-textfield__label:after { 39 | background-color: white; 40 | } 41 | .mdl-dialog__content { 42 | color:rgba(255, 255, 255, .54); 43 | } 44 | 45 | .mdl-button--fab { 46 | 47 | background: rgba(158, 158, 158, .8); 48 | } 49 | .mdl-button--fab:hover { 50 | 51 | background: rgba(158, 158, 158, .9); 52 | } 53 | 54 | .mdl-radio__outer-circle { 55 | border: 2px solid white; 56 | } 57 | 58 | 59 | 60 | :root{ 61 | --note-none: #2f3341; 62 | --note-red: rgb(78, 40, 40); 63 | --note-orange: rgb(68, 44, 28); 64 | --note-yellow: rgb(70, 59, 26); 65 | --note-green: rgb(37, 59, 42); 66 | --note-teal: rgb(5, 66, 63); 67 | --note-blue: rgb(37, 52, 63); 68 | --note-violet: rgb(65, 57, 83); 69 | --note-purple: rgb(62, 43, 68); 70 | --note-pink: rgb(63, 26, 47); 71 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/dark/design-dark-editor.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --main-text-color:white; 3 | --header-bg: #171a20; 4 | --background-todolist-item: rgba(255, 255, 255, 0.05); 5 | } 6 | .mdl-data-table { 7 | color: var(--main-text-color); 8 | background: var(--header-bg); 9 | } 10 | .mdl-layout__drawer, 11 | .toolbar { 12 | background-color: #171a20 !important; 13 | } 14 | 15 | #center, 16 | .mdl-layout__content { 17 | background-color: #1e222b !important; 18 | } 19 | 20 | .headerbar-button { 21 | color: white; 22 | } 23 | 24 | #header-carnet i{ 25 | color:white; 26 | } 27 | 28 | .mdl-layout-spacer { 29 | /*display: none;*/ 30 | order: -1; 31 | } 32 | 33 | .todo-list .mdl-checkbox.is-checked .mdl-checkbox__tick-outline { 34 | background: rgba(255, 255, 255, 0.2)url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); 35 | } 36 | 37 | .mdl-data-table tbody tr.is-selected { 38 | background-color: #171a20 !important; 39 | } 40 | .mdl-checkbox.is-checked .mdl-checkbox__tick-outline { 41 | mask:unset; 42 | } 43 | 44 | .mdl-data-table tbody tr:hover, .mdl-data-table tbody tr:active, .mdl-data-table tbody tr:focus { 45 | background-color: #171a20; 46 | } 47 | 48 | .mdl-menu__outline { 49 | background: #171a20; 50 | } 51 | .mdl-menu__item { 52 | color:white; 53 | } 54 | 55 | .mdl-menu__item:hover, .mdl-menu__item:active, .mdl-menu__item:focus { 56 | background-color: black; 57 | } 58 | 59 | #note-color input[type="radio"]:checked + label span{ 60 | border: 1px solid white; 61 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/dark/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dark", 3 | "browser": [ 4 | "design-dark-common.css", 5 | "design-dark-browser.css" 6 | ], 7 | "editor": [ 8 | "design-dark-common.css", 9 | "design-dark-editor.css" 10 | ], 11 | "settings": [ 12 | "design-dark-common.css" 13 | ] 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/dark/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/css/dark/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/yaru/design-common.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --header-bg:#2c2c2c; 3 | --header-text-color:white; 4 | --drawer-bg:#3e3e3e; 5 | --drawer-text-color:white; 6 | --dialog-bg: #000000; 7 | --dialog-text-color: white; 8 | --body-bg: #000000; 9 | --drawer-text-button-hover:#2f3341; 10 | --scroll-bar-fg:#242424; 11 | } 12 | 13 | .mdl-layout__drawer { 14 | border-right: 0px; 15 | } 16 | 17 | 18 | .mdl-layout__drawer .mdl-navigation .mdl-navigation__link { 19 | color:white; 20 | } 21 | 22 | .mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled{ 23 | color:rgb(175, 175, 175); 24 | } 25 | 26 | .keyword { 27 | color:white; 28 | } 29 | 30 | .mdl-button{ 31 | color:white; 32 | } 33 | .mdl-textfield__label{ 34 | color: white !important; 35 | } 36 | 37 | .mdl-textfield__label:after { 38 | background-color: white; 39 | } 40 | .mdl-dialog__content { 41 | color:rgba(255, 255, 255, .54); 42 | } 43 | 44 | .mdl-button--fab { 45 | 46 | background: rgba(158, 158, 158, .8); 47 | } 48 | .mdl-button--fab:hover { 49 | 50 | background: rgba(158, 158, 158, .9); 51 | } 52 | 53 | .mdl-radio__outer-circle { 54 | border: 2px solid white; 55 | } 56 | 57 | 58 | :root{ 59 | --note-none: #000000; 60 | --note-red: rgb(78, 40, 40); 61 | --note-orange: rgb(68, 44, 28); 62 | --note-yellow: rgb(70, 59, 26); 63 | --note-green: rgb(37, 59, 42); 64 | --note-teal: rgb(5, 66, 63); 65 | --note-blue: rgb(37, 52, 63); 66 | --note-violet: rgb(65, 57, 83); 67 | --note-purple: rgb(62, 43, 68); 68 | --note-pink: rgb(63, 26, 47); 69 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/yaru/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Yaru", 3 | "browser": [ 4 | "design-common.css", 5 | "design-browser.css" 6 | ], 7 | "editor": [ 8 | "design-common.css", 9 | "design-editor.css" 10 | ], 11 | "settings": [ 12 | "design-common.css" 13 | ] 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/css/yaru/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/css/yaru/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/firstlaunch/slide.css: -------------------------------------------------------------------------------- 1 | /* Slideshow container */ 2 | 3 | body { 4 | padding: 0%; 5 | background: #2f4686; 6 | } 7 | 8 | .slideshow-container { 9 | max-width: 1000px; 10 | height: 100%; 11 | color: white; 12 | margin: 0px; 13 | } 14 | 15 | /* Hide the images by default */ 16 | 17 | .mySlides { 18 | height: 300px; 19 | display: none; 20 | } 21 | 22 | /* Next & previous buttons */ 23 | 24 | .prev, 25 | .next { 26 | cursor: pointer; 27 | position: absolute; 28 | bottom: 0; 29 | width: auto; 30 | padding: 16px; 31 | color: white; 32 | font-weight: bold; 33 | font-size: 18px; 34 | transition: 0.6s ease; 35 | border-radius: 0 3px 3px 0; 36 | } 37 | 38 | /* Position the "next button" to the right */ 39 | 40 | .next { 41 | right: 0; 42 | border-radius: 3px 0 0 3px; 43 | } 44 | 45 | /* On hover, add a black background color with a little bit see-through */ 46 | 47 | .prev:hover, 48 | .next:hover { 49 | background-color: rgba(0, 0, 0, 0.8); 50 | } 51 | 52 | /* The dots/bullets/indicators */ 53 | 54 | .dot { 55 | cursor: pointer; 56 | height: 15px; 57 | width: 15px; 58 | margin: 0 2px; 59 | background-color: #bbb; 60 | border-radius: 50%; 61 | display: inline-block; 62 | transition: background-color 0.6s ease; 63 | } 64 | 65 | .active, 66 | .dot:hover { 67 | background-color: #717171; 68 | } 69 | 70 | /* Fading animation */ 71 | 72 | .fade { 73 | -webkit-animation-name: fade; 74 | -webkit-animation-duration: 1.5s; 75 | animation-name: fade; 76 | animation-duration: 1.5s; 77 | } 78 | 79 | @-webkit-keyframes fade { 80 | from { 81 | opacity: .4 82 | } 83 | to { 84 | opacity: 1 85 | } 86 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/firstlaunch/slide.js: -------------------------------------------------------------------------------- 1 | var Slides = function (elem, onEnd) { 2 | this.elem = elem; 3 | this.slideIndex = 1; 4 | this.onEnd = onEnd; 5 | const slides = this; 6 | this.elem.getElementsByClassName("next")[0].onclick = function () { 7 | slides.plusSlides(1); 8 | } 9 | this.currentSlide(1); 10 | } 11 | 12 | 13 | 14 | // Next/previous controls 15 | Slides.prototype.plusSlides = function (n) { 16 | this.showSlides(slideIndex += n); 17 | } 18 | 19 | // Thumbnail image controls 20 | Slides.prototype.currentSlide = function (n) { 21 | this.showSlides(slideIndex = n); 22 | } 23 | 24 | Slides.prototype.showSlides = function (n) { 25 | var i; 26 | var slides = this.elem.getElementsByClassName("mySlides"); 27 | var dots = this.elem.getElementsByClassName("dot"); 28 | if (n > slides.length) { 29 | this.onEnd(); 30 | return; 31 | } 32 | if (n < 1) { 33 | slideIndex = slides.length 34 | } 35 | for (i = 0; i < slides.length; i++) { 36 | slides[i].style.display = "none"; 37 | } 38 | for (i = 0; i < dots.length; i++) { 39 | dots[i].className = dots[i].className.replace(" active", ""); 40 | } 41 | slides[slideIndex - 1].style.display = "block"; 42 | dots[slideIndex - 1].className += " active"; 43 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/fonts/material-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/fonts/material-icons.woff2 -------------------------------------------------------------------------------- /app/src/main/assets/editor/fonts/ubuntu.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/fonts/ubuntu.woff2 -------------------------------------------------------------------------------- /app/src/main/assets/editor/i18n/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "", 3 | "recent": "", 4 | "browser": "", 5 | "settings": "", 6 | "keywords": "", 7 | "welcome": "", 8 | "discover_carnet": "", 9 | "modern": "", 10 | "modern_subtext": "", 11 | "synchronize": "", 12 | "synchronize_subtext": "", 13 | "next": "", 14 | "cancel": "", 15 | "note_list_empty": "", 16 | "pin": "", 17 | "archive": "", 18 | "unarchive": "", 19 | "delete": "", 20 | "ok": "", 21 | "rename": "", 22 | "rename_or_move": "", 23 | "donation_message": "", 24 | "fake_note_1": "", 25 | "fake_note_2": "", 26 | "fake_note_3": "", 27 | "fake_note_4": "", 28 | "fake_note_5": "", 29 | "fake_note_6": "", 30 | "fake_note_todo_item_1": "", 31 | "fake_note_todo_item_2": "", 32 | "fake_notes_warning": "", 33 | "statistics": "", 34 | "sentences": "", 35 | "words": "", 36 | "characters": "", 37 | "keyword": "", 38 | "format": "", 39 | "edit": "", 40 | "media": "", 41 | "tools": "", 42 | "file": "", 43 | "note_name": "", 44 | "export": "", 45 | "exit": "", 46 | "add_a_keyword": "", 47 | "back_to_text": "", 48 | "file_photo": "", 49 | "recording": "", 50 | "copy": "", 51 | "paste": "", 52 | "select_all": "", 53 | "todo_list": "", 54 | "print": "", 55 | "print_title": "", 56 | "print_modification_date": "", 57 | "print_creation_date": "", 58 | "error_save": "", 59 | "not_yet_implemented": "", 60 | "open": "", 61 | "date_time": "", 62 | "media_empty_text": "" 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/img/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/img/512x512.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/img/bike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/img/bike.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/img/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/img/directory.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/img/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/img/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/img/ic_launcher_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/img/ic_launcher_white.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/img/sync.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/img/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/img/ui.png -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/dialog-polyfill.css: -------------------------------------------------------------------------------- 1 | dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | width: -moz-fit-content; 5 | width: -webkit-fit-content; 6 | width: fit-content; 7 | height: -moz-fit-content; 8 | height: -webkit-fit-content; 9 | height: fit-content; 10 | margin: auto; 11 | border: solid; 12 | padding: 1em; 13 | background: white; 14 | color: black; 15 | display: block; 16 | } 17 | 18 | dialog:not([open]) { 19 | display: none; 20 | } 21 | 22 | dialog + .backdrop { 23 | position: fixed; 24 | top: 0; right: 0; bottom: 0; left: 0; 25 | background: rgba(0,0,0,0.1); 26 | } 27 | 28 | ._dialog_overlay { 29 | position: fixed; 30 | top: 0; right: 0; bottom: 0; left: 0; 31 | } 32 | 33 | dialog.fixed { 34 | position: fixed; 35 | top: 50%; 36 | transform: translate(0, -50%); 37 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/fullscreen.js: -------------------------------------------------------------------------------- 1 | { 2 | 3 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/jquery.hammer.js: -------------------------------------------------------------------------------- 1 | (function(factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | define(['jquery', 'hammerjs'], factory); 4 | } else if (typeof exports === 'object') { 5 | factory(require('jquery'), require('hammerjs')); 6 | } else { 7 | factory(jQuery, Hammer); 8 | } 9 | }(function($, Hammer) { 10 | function hammerify(el, options) { 11 | var $el = $(el); 12 | if(!$el.data("hammer")) { 13 | $el.data("hammer", new Hammer($el[0], options)); 14 | } 15 | } 16 | 17 | $.fn.hammer = function(options) { 18 | return this.each(function() { 19 | hammerify(this, options); 20 | }); 21 | }; 22 | 23 | // extend the emit method to also trigger jQuery events 24 | Hammer.Manager.prototype.emit = (function(originalEmit) { 25 | return function(type, data) { 26 | originalEmit.call(this, type, data); 27 | $(this.element).trigger({ 28 | type: type, 29 | gesture: data 30 | }); 31 | }; 32 | })(Hammer.Manager.prototype.emit); 33 | })); -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/jquery.ui.touch-punch.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Touch Punch 0.2.3 3 | * 4 | * Copyright 2011–2014, Dave Furfero 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * 7 | * Depends: 8 | * jquery.ui.widget.js 9 | * jquery.ui.mouse.js 10 | */ 11 | !function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/jquery_i18n/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var parser = require(__dirname + '/CLDRPluralRuleParser.js'); 4 | if (process.argv.length < 3) { 5 | console.log("Please provide the rule and a number to test"); 6 | console.log("Example:"); 7 | console.log("cldrpluraltuleparser 'v = 0 and n != 0..10 and n % 10 = 0' 20"); 8 | } else { 9 | var result = parser(process.argv[2], process.argv[3]); 10 | console.log(result); 11 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/jszip-utils.min.js: -------------------------------------------------------------------------------- 1 | !function (e) { "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.JSZipUtils = e() : "undefined" != typeof global ? global.JSZipUtils = e() : "undefined" != typeof self && (self.JSZipUtils = e()) }(function () { return function o(i, f, u) { function s(n, e) { if (!f[n]) { if (!i[n]) { var t = "function" == typeof require && require; if (!e && t) return t(n, !0); if (a) return a(n, !0); throw new Error("Cannot find module '" + n + "'") } var r = f[n] = { exports: {} }; i[n][0].call(r.exports, function (e) { var t = i[n][1][e]; return s(t || e) }, r, r.exports, o, i, f, u) } return f[n].exports } for (var a = "function" == typeof require && require, e = 0; e < u.length; e++)s(u[e]); return s }({ 1: [function (e, t, n) { "use strict"; var u = {}; function r() { try { return new window.XMLHttpRequest } catch (e) { } } u._getBinaryFromXHR = function (e) { return e.response || e.responseText }; var s = "undefined" != typeof window && window.ActiveXObject ? function () { return r() || function () { try { return new window.ActiveXObject("Microsoft.XMLHTTP") } catch (e) { } }() } : r; u.getBinaryContent = function (t, n) { var e, r, o, i; "function" == typeof (n = n || {}) ? (i = n, n = {}) : "function" == typeof n.callback && (i = n.callback), i || "undefined" == typeof Promise ? (r = function (e) { i(null, e) }, o = function (e) { i(e, null) }) : e = new Promise(function (e, t) { r = e, o = t }); try { var f = s(); f.open("GET", t, !0), "responseType" in f && (f.responseType = "arraybuffer"), f.overrideMimeType && f.overrideMimeType("text/plain; charset=x-user-defined"), f.onreadystatechange = function (e) { if (4 === f.readyState) if (200 === f.status || 0 === f.status) try { r(u._getBinaryFromXHR(f)) } catch (e) { o(new Error(e)) } else o(new Error("Ajax error for " + t + " : " + this.status + " " + this.statusText)) }, n.progress && (f.onprogress = function (e) { n.progress({ path: t, originalEvent: e, percent: e.loaded / e.total * 100, loaded: e.loaded, total: e.total }) }), f.send() } catch (e) { o(new Error(e), null) } return e }, t.exports = u }, {}] }, {}, [1])(1) }); -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/material-icons.css: -------------------------------------------------------------------------------- 1 | /* fallback */ 2 | 3 | @font-face { 4 | font-family: 'Material Icons'; 5 | font-style: normal; 6 | font-weight: 400; 7 | src: url(../fonts/material-icons.woff2) format('woff2'); 8 | } 9 | 10 | .material-icons { 11 | font-family: 'Material Icons'; 12 | font-weight: normal; 13 | font-style: normal; 14 | font-size: 24px; 15 | line-height: 1; 16 | letter-spacing: normal; 17 | text-transform: none; 18 | display: inline-block; 19 | white-space: nowrap; 20 | word-wrap: normal; 21 | direction: ltr; 22 | -moz-font-feature-settings: 'liga'; 23 | -moz-osx-font-smoothing: grayscale; 24 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/polyfill.css: -------------------------------------------------------------------------------- 1 | dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | width: -moz-fit-content; 5 | width: -webkit-fit-content; 6 | width: fit-content; 7 | height: -moz-fit-content; 8 | height: -webkit-fit-content; 9 | height: fit-content; 10 | margin: auto; 11 | border: solid; 12 | padding: 1em; 13 | background: white; 14 | color: black; 15 | display: block; 16 | } 17 | 18 | dialog:not([open]) { 19 | display: none; 20 | } 21 | 22 | dialog + .backdrop { 23 | position: fixed; 24 | top: 0; right: 0; bottom: 0; left: 0; 25 | background: rgba(0,0,0,0.1); 26 | } 27 | 28 | ._dialog_overlay { 29 | position: fixed; 30 | top: 0; right: 0; bottom: 0; left: 0; 31 | } 32 | 33 | dialog.fixed { 34 | position: fixed; 35 | top: 50%; 36 | transform: translate(0, -50%); 37 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/recorder/decoderWorker.min.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/libs/recorder/decoderWorker.min.wasm -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/recorder/encoderWorker.min.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/editor/libs/recorder/encoderWorker.min.wasm -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/simplecolorpicker/css/simple-color-picker.styl: -------------------------------------------------------------------------------- 1 | pickerHueWidth = 20px 2 | 3 | .Scp 4 | user-select none 5 | position relative 6 | 7 | .Scp-saturation 8 | position relative 9 | height 100% 10 | background linear-gradient(to right, #FFFFFF, #FF0000); 11 | float left 12 | margin-right 5px 13 | 14 | .Scp-brightness 15 | width 100% 16 | height 100% 17 | background linear-gradient(rgba(255, 255, 255, 0), rgba(0, 0, 0, 1)); 18 | 19 | .Scp-sbSelector 20 | border 2px solid white 21 | position absolute 22 | width 14px 23 | height 14px 24 | background white 25 | border-radius 10px 26 | top -7px 27 | left -7px 28 | box-sizing border-box 29 | z-index 10 30 | 31 | .Scp-hue 32 | width pickerHueWidth 33 | height 100% 34 | position relative 35 | float left 36 | background linear-gradient(rgb(255, 0, 0) 0%, rgb(255, 0, 255) 17%, rgb(0, 0, 255) 34%, rgb(0, 255, 255) 50%, rgb(0, 255, 0) 67%, rgb(255, 255, 0) 84%, rgb(255, 0, 0) 100%) 37 | 38 | .Scp-hSelector 39 | position absolute 40 | background white 41 | border-bottom 1px solid black 42 | right -3px 43 | width 10px 44 | height 2px 45 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/simplecolorpicker/index.d.ts: -------------------------------------------------------------------------------- 1 | export interface ColorPickerOptions { 2 | color?: string | number; 3 | background?: string | number; 4 | el?: HTMLElement; 5 | width?: number; 6 | height?: number; 7 | } 8 | 9 | export interface ColorPicker { 10 | new (options?: ColorPickerOptions): ColorPicker; 11 | 12 | appendTo(domElement: HTMLElement): void; 13 | 14 | remove(): void; 15 | 16 | setColor(color: string | number): void; 17 | 18 | setSize(width: number, height: number): void; 19 | 20 | setBackgroundColor(color: string | number): void; 21 | 22 | setNoBackground(): void; 23 | 24 | onChange(callback: Function): void; 25 | 26 | getColor(): string | number; 27 | 28 | getHexString(): string; 29 | 30 | getHexNumber(): number; 31 | 32 | getRGB(): { r: number, g: number, b: number }; 33 | 34 | getHSV(): { h: number, s: number, v: number }; 35 | 36 | isDark(): boolean; 37 | 38 | isLight(): boolean; 39 | } 40 | 41 | export var ColorPicker: ColorPicker; 42 | 43 | export default ColorPicker; 44 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/libs/simplecolorpicker/simple-color-picker.css: -------------------------------------------------------------------------------- 1 | .Scp { 2 | -webkit-user-select: none; 3 | -moz-user-select: none; 4 | -ms-user-select: none; 5 | user-select: none; 6 | position: relative; 7 | } 8 | .Scp-saturation { 9 | height: 100%; 10 | background: -webkit-linear-gradient(left, #fff, #f00); 11 | background: linear-gradient(to right, #fff, #f00); 12 | margin-right: 5px; 13 | display: inline-block; 14 | } 15 | .Scp-brightness { 16 | width: 100%; 17 | height: 100%; 18 | background: -webkit-linear-gradient(rgba(255,255,255,0), #000); 19 | background: linear-gradient(rgba(255,255,255,0), #000); 20 | } 21 | .Scp-sbSelector { 22 | border: 2px solid #fff; 23 | position: absolute; 24 | width: 14px; 25 | height: 14px; 26 | background: #fff; 27 | border-radius: 10px; 28 | top: -7px; 29 | left: -7px; 30 | box-sizing: border-box; 31 | z-index: 10; 32 | } 33 | .Scp-hue { 34 | width: 20px; 35 | height: 100%; 36 | display: inline-block; 37 | background: -webkit-linear-gradient(#f00 0%, #f0f 17%, #00f 34%, #0ff 50%, #0f0 67%, #ff0 84%, #f00 100%); 38 | background: linear-gradient(#f00 0%, #f0f 17%, #00f 34%, #0ff 50%, #0f0 67%, #ff0 84%, #f00 100%); 39 | } 40 | .Scp-hSelector { 41 | position: absolute; 42 | background: #fff; 43 | border-bottom: 1px solid #000; 44 | right: -3px; 45 | width: 10px; 46 | height: 2px; 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/assets/editor/reader/css/recorder.css: -------------------------------------------------------------------------------- 1 | #analyser { 2 | height: 128px; 3 | display: block; 4 | } 5 | 6 | #waveform { 7 | display: none; 8 | } 9 | 10 | #recorder-container { 11 | padding: 10px; 12 | width: 350px; 13 | max-width: calc(100% - 30px); 14 | } 15 | #recorder-file-buttons{ 16 | float:right; 17 | } 18 | #total-time{ 19 | float: right; 20 | margin-top:8px; 21 | } -------------------------------------------------------------------------------- /app/src/main/assets/editor/reader/css/reminders.css: -------------------------------------------------------------------------------- 1 | .reminder-item .hour{ 2 | display: block; 3 | font-size:18px; 4 | } 5 | .reminder-item{ 6 | padding-bottom:10px; 7 | padding-top:10px; 8 | 9 | } 10 | .reminder-calendar-picker .c-datepicker__header-day,.reminder-date-picker .c-datepicker__toggle{ 11 | display:none; 12 | } 13 | .reminder-date-picker{ 14 | min-height: 354px !important; 15 | } 16 | .reminder-date-picker .c-datepicker__header{ 17 | display:none; 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/assets/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/browsers/note.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var Note = function Note(title, text, path, metadata, previews) { 4 | var needsRefresh = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; 5 | var media = arguments.length > 6 ? arguments[6] : undefined; 6 | var fromCache = arguments.length > 7 ? arguments[7] : undefined; 7 | this.title = title; 8 | this.text = text; 9 | this.path = path; 10 | this.previews = previews; 11 | this.media = media; 12 | this.fromCache = fromCache; 13 | this.needsRefresh = needsRefresh; 14 | if (metadata == undefined) { 15 | this.metadata = new NoteMetadata(); 16 | this.metadata.creation_date = Date.now(); 17 | this.metadata.last_modification_date = this.metadata.creation_date; 18 | } else this.metadata = metadata; 19 | }; 20 | var NoteMetadata = function NoteMetadata() { 21 | this.creation_date = ""; 22 | this.last_modification_date = ""; 23 | this.keywords = []; 24 | this.rating = -1; 25 | this.color = "none"; 26 | }; 27 | if (typeof exports !== 'undefined') exports.Note = Note; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/android/archiver.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var ArchiverCompatibility = function ArchiverCompatibility() {}; 4 | ArchiverCompatibility.create = function (type, ktkl) { 5 | return new Archive(); 6 | }; 7 | var Archive = function Archive() {}; 8 | function generateUID() { 9 | // I generate the UID from two parts here 10 | // to ensure the random number provide enough bits. 11 | var firstPart = Math.random() * 46656 | 0; 12 | var secondPart = Math.random() * 46656 | 0; 13 | firstPart = ("000" + firstPart.toString(36)).slice(-3); 14 | secondPart = ("000" + secondPart.toString(36)).slice(-3); 15 | return firstPart + secondPart; 16 | } 17 | ArchiverCompatibility.callbacks = []; 18 | Archive.prototype.pipe = function (output) { 19 | this.output = output; 20 | }; 21 | Archive.prototype.directory = function (dir) { 22 | this.dir = dir; 23 | return this; 24 | }; 25 | Archive.prototype.finalize = function () { 26 | var uid = generateUID(); 27 | console.log("close is" + this.output.close); 28 | ArchiverCompatibility.callbacks[uid] = this.output.close; 29 | app.zipDir(this.dir, this.output.path, uid); 30 | }; 31 | ArchiverCompatibility.finalizeResult = function (callback) { 32 | console.log(ArchiverCompatibility.callbacks[callback]); 33 | ArchiverCompatibility.callbacks[callback](); 34 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/android/file-opener.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function generateUID() { 4 | // I generate the UID from two parts here 5 | // to ensure the random number provide enough bits. 6 | var firstPart = Math.random() * 46656 | 0; 7 | var secondPart = Math.random() * 46656 | 0; 8 | firstPart = ("000" + firstPart.toString(36)).slice(-3); 9 | secondPart = ("000" + secondPart.toString(36)).slice(-3); 10 | return firstPart + secondPart; 11 | } 12 | var FileOpener = function FileOpener() {}; 13 | FileOpener.callbacks = []; 14 | FileOpener.selectFile = function (callback) { 15 | var uid = generateUID(); 16 | FileOpener.callbacks[uid] = callback; 17 | app.selectFile(uid); 18 | }; 19 | FileOpener.selectFileResult = function (callback, path) { 20 | var paths = []; 21 | paths.push(path); 22 | FileOpener.callbacks[callback](paths); 23 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/android/keywords_db_manager.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var KeywordDBManagerCompatibility = function KeywordDBManagerCompatibility() {}; 4 | function generateUID() { 5 | // I generate the UID from two parts here 6 | // to ensure the random number provide enough bits. 7 | var firstPart = Math.random() * 46656 | 0; 8 | var secondPart = Math.random() * 46656 | 0; 9 | firstPart = ("000" + firstPart.toString(36)).slice(-3); 10 | secondPart = ("000" + secondPart.toString(36)).slice(-3); 11 | return firstPart + secondPart; 12 | } 13 | KeywordDBManagerCompatibility.callbacks = []; 14 | KeywordDBManagerCompatibility.KeywordsDBManager = function (path) {}; 15 | KeywordDBManagerCompatibility.KeywordsDBManager.prototype.addToDB = function (word, path) { 16 | app.addKeyword(word, path); 17 | }; 18 | KeywordDBManagerCompatibility.KeywordsDBManager.prototype.removeFromDB = function (word, path) { 19 | app.removeKeyword(word, path); 20 | }; 21 | KeywordDBManagerCompatibility.KeywordsDBManager.prototype.getFlatenDB = function (callback) { 22 | var uid = generateUID(); 23 | KeywordDBManagerCompatibility.callbacks[uid] = callback; 24 | app.getFlatenKeywordsDB(uid); 25 | }; 26 | KeywordDBManagerCompatibility.getFlatenDBResult = function (callback, dataStr) { 27 | var data = JSON.parse(dataStr); 28 | KeywordDBManagerCompatibility.callbacks[callback](false, data); 29 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/android/mkdirp.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var MKDirPCompatibility = function MKDirPCompatibility() {}; 4 | MKDirPCompatibility.sync = function (path) { 5 | app.mkdirs(path); 6 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/android/note-opener.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var NoteOpenerResultReceiver = function NoteOpenerResultReceiver() {}; 4 | NoteOpenerResultReceiver.callbacks = []; 5 | NoteOpenerResultReceiver.generateUID = function () { 6 | // I generate the UID from two parts here 7 | // to ensure the random number provide enough bits. 8 | var firstPart = Math.random() * 46656 | 0; 9 | var secondPart = Math.random() * 46656 | 0; 10 | firstPart = ("000" + firstPart.toString(36)).slice(-3); 11 | secondPart = ("000" + secondPart.toString(36)).slice(-3); 12 | return firstPart + secondPart; 13 | }; 14 | NoteOpener.prototype.extractTo = function (path, callback) { 15 | //extract + read 16 | var uid = NoteOpenerResultReceiver.generateUID(); 17 | NoteOpenerResultReceiver.callbacks[uid] = callback; 18 | app.extractTo(this.note.path, path, uid); 19 | }; 20 | NoteOpenerResultReceiver.extractResult = function (callback, error) { 21 | NoteOpenerResultReceiver.callbacks[callback](error); 22 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/android/path.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // Copyright Joyent, Inc. and other Node contributors. 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a 6 | // copy of this software and associated documentation files (the 7 | // "Software"), to deal in the Software without restriction, including 8 | // without limitation the rights to use, copy, modify, merge, publish, 9 | // distribute, sublicense, and/or sell copies of the Software, and to permit 10 | // persons to whom the Software is furnished to do so, subject to the 11 | // following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included 14 | // in all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 19 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 20 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22 | // USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | var PathCompatibility = function PathCompatibility() {}; 24 | var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; 25 | PathCompatibility.dirname = function (path) { 26 | var result = posixSplitPath(path), 27 | root = result[0], 28 | dir = result[1]; 29 | if (!root && !dir) { 30 | // No dirname whatsoever 31 | return '.'; 32 | } 33 | if (dir) { 34 | // It has a dirname, strip trailing slash 35 | dir = dir.substr(0, dir.length - 1); 36 | } 37 | return root + dir; 38 | }; 39 | function posixSplitPath(filename) { 40 | return splitPathRe.exec(filename).slice(1); 41 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/electron/store.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var ElectronStore = function ElectronStore() { 4 | var Store = require('electron-store'); 5 | this.store = new Store(); 6 | }; 7 | ElectronStore.prototype.get = function (key) { 8 | return this.store.get(key); 9 | }; 10 | ElectronStore.prototype.set = function (key, value) { 11 | this.store.set(key, value); 12 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/file-opener.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var FileOpener = function FileOpener() {}; 4 | FileOpener.selectFile = function (callback) { 5 | var electrong = require('electron'); 6 | var dialog = electrong.remote.dialog; 7 | dialog.showOpenDialog(electrong.remote.getCurrentWindow(), { 8 | properties: ['openFile'] 9 | }, callback); 10 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/nextcloud/fullscreen.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | { 4 | var token = document.getElementById("token").innerHTML; 5 | $(document).on('ajaxSend', function (elm, xhr, settings) { 6 | if (settings.crossDomain === false) { 7 | xhr.setRequestHeader('requesttoken', token); 8 | xhr.setRequestHeader('OCS-APIREQUEST', 'true'); 9 | } 10 | }); 11 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/nextcloud/nc14-header.css: -------------------------------------------------------------------------------- 1 | .mdl-layout__container { 2 | height: calc(100% - 50px) !important; 3 | } 4 | 5 | #writer-iframe { 6 | top: 50px; 7 | height: calc(100% - 50px) !important; 8 | } 9 | 10 | #editor-container { 11 | top: 50px; 12 | height: 100% !important; 13 | } 14 | #loading-view { 15 | top: 50px !important; 16 | height: calc(100% - 50px) !important; 17 | } 18 | 19 | @media screen and (min-width: 1400px) { 20 | #loading-view { 21 | top: 70px !important; 22 | height: calc(100% - 90px) !important; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/nextcloud/nc14.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/compatibility/nextcloud/nc14.css -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/nextcloud/nc16.css: -------------------------------------------------------------------------------- 1 | #right-bar #settings ul li a { 2 | display: inline-flex; 3 | align-items: center; 4 | height: 44px; 5 | color: var(--color-main-text); 6 | padding: 10px 12px; 7 | box-sizing: border-box; 8 | opacity: 0.7; 9 | white-space: nowrap; 10 | position: relative; 11 | width: 100%; 12 | } 13 | 14 | #right-bar > div > .menu { 15 | background-color: var(--color-main-background); 16 | filter: drop-shadow(0 1px 5px var(--color-box-shadow)); 17 | border-radius: 0 0 var(--border-radius) var(--border-radius); 18 | box-sizing: border-box; 19 | z-index: 2000; 20 | position: absolute; 21 | max-width: 350px; 22 | max-height: 330px; 23 | right: 5px; 24 | top: 50px; 25 | margin: 0; 26 | -webkit-overflow-scrolling: touch; 27 | } 28 | 29 | #right-bar> div > .menu.settings-menu > ul li a:hover { 30 | opacity: 1; 31 | box-shadow: inset 4px 0 var(--color-primary); 32 | } 33 | 34 | #right-bar > div > .menu.settings-menu > ul li a img{ 35 | opacity: 0.7; 36 | margin-right: 10px; 37 | height: 16px; 38 | width: 16px; 39 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/nextcloud/owncloud.css: -------------------------------------------------------------------------------- 1 | @media screen and (min-width: 1400px) { 2 | #editor-container { 3 | 4 | height: calc( 100% - 80px) !important; 5 | } 6 | 7 | } 8 | #editor-container { 9 | 10 | top:unset !important; 11 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/nextcloud/reader_fullscreen.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var header = document.getElementById("header"); 4 | header.parentNode.removeChild(header); 5 | document.getElementById("content-wrapper").style.paddingTop = "0px"; 6 | var ex = document.getElementById("expanddiv"); 7 | ex.style.top = "55px"; 8 | ex.style.position = "absolute"; -------------------------------------------------------------------------------- /app/src/main/assets/reader/compatibility/nextcloud/store.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var NextcloudStore = function NextcloudStore() {}; 4 | NextcloudStore.prototype.get = function (key) { 5 | var item = localStorage.getItem(key); 6 | if (item == null) return undefined; 7 | return item; 8 | }; 9 | NextcloudStore.prototype.set = function (key, value) { 10 | localStorage.setItem(key, value); 11 | }; -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/black/design-browser.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | --grid-bg: #000000; 4 | --note-text-color: white; 5 | --note-bg: #000000; 6 | --note-bg-hover: #1e212b; 7 | --loading-view-bg:#000000; 8 | --fab-button-bg: #000000; 9 | --fab-color:white; 10 | --drag-bar-bg: rgb(36, 46, 100); 11 | --note-shadow: 0 0px 0px 2px #27326e; 12 | --note-shadow-hover: 0 0px 0px 2px rgb(86, 99, 173); 13 | --editor-container-bg: rgba(0, 0, 0, 0.5); 14 | --editor-container-border: #27326e; 15 | --editor-container-border-color: #27326e; 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/black/design-common.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --header-bg:#000000; 3 | --header-text-color:white; 4 | --drawer-bg: #000000; 5 | --drawer-text-color:white; 6 | --dialog-bg: #000000; 7 | --dialog-text-color: white; 8 | --body-bg: #000000; 9 | --drawer-text-button-hover:#2f3341; 10 | --scroll-bar-fg:#242424; 11 | } 12 | 13 | .mdl-layout__drawer { 14 | border-right: 0px; 15 | } 16 | 17 | 18 | .mdl-layout__drawer .mdl-navigation .mdl-navigation__link { 19 | color:white; 20 | } 21 | 22 | .mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled{ 23 | color:rgb(175, 175, 175); 24 | } 25 | 26 | .keyword { 27 | color:white; 28 | } 29 | 30 | .mdl-button{ 31 | color:white; 32 | } 33 | .mdl-textfield__label{ 34 | color: white !important; 35 | } 36 | 37 | .mdl-textfield__label:after { 38 | background-color: white; 39 | } 40 | .mdl-dialog__content { 41 | color:rgba(255, 255, 255, .54); 42 | } 43 | 44 | .mdl-button--fab { 45 | 46 | background: rgba(158, 158, 158, .8); 47 | } 48 | .mdl-button--fab:hover { 49 | 50 | background: rgba(158, 158, 158, .9); 51 | } 52 | 53 | .mdl-radio__outer-circle { 54 | border: 2px solid white; 55 | } 56 | 57 | :root{ 58 | --note-none: #000000; 59 | --note-red: rgb(78, 40, 40); 60 | --note-orange: rgb(68, 44, 28); 61 | --note-yellow: rgb(70, 59, 26); 62 | --note-green: rgb(37, 59, 42); 63 | --note-teal: rgb(5, 66, 63); 64 | --note-blue: rgb(37, 52, 63); 65 | --note-violet: rgb(65, 57, 83); 66 | --note-purple: rgb(62, 43, 68); 67 | --note-pink: rgb(63, 26, 47); 68 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/black/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Black", 3 | "browser": [ 4 | "design-common.css", 5 | "design-browser.css" 6 | ], 7 | "editor": [ 8 | "design-common.css", 9 | "design-editor.css" 10 | ], 11 | "settings": [ 12 | "design-common.css" 13 | ] 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/black/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/css/black/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/carnet/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Carnet", 3 | "browser": [], 4 | "editor": [], 5 | "settings": [] 6 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/carnet/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/css/carnet/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/dark/design-dark-browser.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | --grid-bg: #22252f; 4 | --note-text-color: white; 5 | --note-bg: #2f3341; 6 | --note-bg-hover: #2f3341; 7 | --loading-view-bg:#22252f; 8 | --fab-button-bg: #2f3341; 9 | --fab-color:white; 10 | --drag-bar-bg: rgb(36, 46, 100); 11 | --note-shadow: 0 0px 0px 2px rgba(168, 168, 168, 0.14); 12 | --note-shadow-hover: 0 0px 0px 2px rgb(86, 99, 173); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/dark/design-dark-common.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --header-bg:#22252f; 3 | --header-text-color:white; 4 | --drawer-bg: #22252f; 5 | --drawer-text-color:white; 6 | --dialog-bg: #22252f; 7 | --dialog-text-color: white; 8 | --body-bg: #393c44; 9 | --drawer-text-button-hover:#2f3341; 10 | --scroll-bar-fg:#353535; 11 | } 12 | 13 | .mdl-layout__drawer { 14 | border-right: 0px; 15 | } 16 | 17 | 18 | .mdl-layout__drawer .mdl-navigation .mdl-navigation__link { 19 | color:white; 20 | } 21 | 22 | .mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled{ 23 | color:rgb(175, 175, 175); 24 | } 25 | 26 | .keyword { 27 | color:white; 28 | background: #4d4d4d; 29 | } 30 | 31 | .mdl-button{ 32 | color:white; 33 | } 34 | .mdl-textfield__label{ 35 | color: white !important; 36 | } 37 | 38 | .mdl-textfield__label:after { 39 | background-color: white; 40 | } 41 | .mdl-dialog__content { 42 | color:rgba(255, 255, 255, .54); 43 | } 44 | 45 | .mdl-button--fab { 46 | 47 | background: rgba(158, 158, 158, .8); 48 | } 49 | .mdl-button--fab:hover { 50 | 51 | background: rgba(158, 158, 158, .9); 52 | } 53 | 54 | .mdl-radio__outer-circle { 55 | border: 2px solid white; 56 | } 57 | 58 | 59 | 60 | :root{ 61 | --note-none: #2f3341; 62 | --note-red: rgb(78, 40, 40); 63 | --note-orange: rgb(68, 44, 28); 64 | --note-yellow: rgb(70, 59, 26); 65 | --note-green: rgb(37, 59, 42); 66 | --note-teal: rgb(5, 66, 63); 67 | --note-blue: rgb(37, 52, 63); 68 | --note-violet: rgb(65, 57, 83); 69 | --note-purple: rgb(62, 43, 68); 70 | --note-pink: rgb(63, 26, 47); 71 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/dark/design-dark-editor.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --main-text-color:white; 3 | --header-bg: #171a20; 4 | --background-todolist-item: rgba(255, 255, 255, 0.05); 5 | } 6 | .mdl-data-table { 7 | color: var(--main-text-color); 8 | background: var(--header-bg); 9 | } 10 | .mdl-layout__drawer, 11 | .toolbar { 12 | background-color: #171a20 !important; 13 | } 14 | 15 | #center, 16 | .mdl-layout__content { 17 | background-color: #1e222b !important; 18 | } 19 | 20 | .headerbar-button { 21 | color: white; 22 | } 23 | 24 | #header-carnet i{ 25 | color:white; 26 | } 27 | 28 | .mdl-layout-spacer { 29 | /*display: none;*/ 30 | order: -1; 31 | } 32 | 33 | .todo-list .mdl-checkbox.is-checked .mdl-checkbox__tick-outline { 34 | background: rgba(255, 255, 255, 0.2)url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); 35 | } 36 | 37 | .mdl-data-table tbody tr.is-selected { 38 | background-color: #171a20 !important; 39 | } 40 | .mdl-checkbox.is-checked .mdl-checkbox__tick-outline { 41 | mask:unset; 42 | } 43 | 44 | .mdl-data-table tbody tr:hover, .mdl-data-table tbody tr:active, .mdl-data-table tbody tr:focus { 45 | background-color: #171a20; 46 | } 47 | 48 | .mdl-menu__outline { 49 | background: #171a20; 50 | } 51 | .mdl-menu__item { 52 | color:white; 53 | } 54 | 55 | .mdl-menu__item:hover, .mdl-menu__item:active, .mdl-menu__item:focus { 56 | background-color: black; 57 | } 58 | 59 | #note-color input[type="radio"]:checked + label span{ 60 | border: 1px solid white; 61 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/dark/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dark", 3 | "browser": [ 4 | "design-dark-common.css", 5 | "design-dark-browser.css" 6 | ], 7 | "editor": [ 8 | "design-dark-common.css", 9 | "design-dark-editor.css" 10 | ], 11 | "settings": [ 12 | "design-dark-common.css" 13 | ] 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/dark/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/css/dark/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/yaru/design-common.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --header-bg:#2c2c2c; 3 | --header-text-color:white; 4 | --drawer-bg:#3e3e3e; 5 | --drawer-text-color:white; 6 | --dialog-bg: #000000; 7 | --dialog-text-color: white; 8 | --body-bg: #000000; 9 | --drawer-text-button-hover:#2f3341; 10 | --scroll-bar-fg:#242424; 11 | } 12 | 13 | .mdl-layout__drawer { 14 | border-right: 0px; 15 | } 16 | 17 | 18 | .mdl-layout__drawer .mdl-navigation .mdl-navigation__link { 19 | color:white; 20 | } 21 | 22 | .mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled{ 23 | color:rgb(175, 175, 175); 24 | } 25 | 26 | .keyword { 27 | color:white; 28 | } 29 | 30 | .mdl-button{ 31 | color:white; 32 | } 33 | .mdl-textfield__label{ 34 | color: white !important; 35 | } 36 | 37 | .mdl-textfield__label:after { 38 | background-color: white; 39 | } 40 | .mdl-dialog__content { 41 | color:rgba(255, 255, 255, .54); 42 | } 43 | 44 | .mdl-button--fab { 45 | 46 | background: rgba(158, 158, 158, .8); 47 | } 48 | .mdl-button--fab:hover { 49 | 50 | background: rgba(158, 158, 158, .9); 51 | } 52 | 53 | .mdl-radio__outer-circle { 54 | border: 2px solid white; 55 | } 56 | 57 | 58 | :root{ 59 | --note-none: #000000; 60 | --note-red: rgb(78, 40, 40); 61 | --note-orange: rgb(68, 44, 28); 62 | --note-yellow: rgb(70, 59, 26); 63 | --note-green: rgb(37, 59, 42); 64 | --note-teal: rgb(5, 66, 63); 65 | --note-blue: rgb(37, 52, 63); 66 | --note-violet: rgb(65, 57, 83); 67 | --note-purple: rgb(62, 43, 68); 68 | --note-pink: rgb(63, 26, 47); 69 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/yaru/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Yaru", 3 | "browser": [ 4 | "design-common.css", 5 | "design-browser.css" 6 | ], 7 | "editor": [ 8 | "design-common.css", 9 | "design-editor.css" 10 | ], 11 | "settings": [ 12 | "design-common.css" 13 | ] 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/css/yaru/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/css/yaru/preview.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/exporter/exporter.css: -------------------------------------------------------------------------------- 1 | body {} 2 | 3 | #inside { 4 | background: white; 5 | padding: 20px; 6 | 7 | } 8 | 9 | #button-container { 10 | position: fixed; 11 | bottom: 10px; 12 | right: 10px; 13 | } 14 | 15 | #loading{ 16 | position: fixed; 17 | left: 0; 18 | top: 0; 19 | height: 100%; 20 | width: 100%; 21 | z-index: 10; 22 | display: none; 23 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/fonts/material-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/fonts/material-icons.woff2 -------------------------------------------------------------------------------- /app/src/main/assets/reader/fonts/ubuntu.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/fonts/ubuntu.woff2 -------------------------------------------------------------------------------- /app/src/main/assets/reader/i18n/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "", 3 | "recent": "", 4 | "browser": "", 5 | "settings": "", 6 | "keywords": "", 7 | "welcome": "", 8 | "discover_carnet": "", 9 | "modern": "", 10 | "modern_subtext": "", 11 | "synchronize": "", 12 | "synchronize_subtext": "", 13 | "next": "", 14 | "cancel": "", 15 | "note_list_empty": "", 16 | "pin": "", 17 | "archive": "", 18 | "unarchive": "", 19 | "delete": "", 20 | "ok": "", 21 | "rename": "", 22 | "rename_or_move": "", 23 | "donation_message": "", 24 | "fake_note_1": "", 25 | "fake_note_2": "", 26 | "fake_note_3": "", 27 | "fake_note_4": "", 28 | "fake_note_5": "", 29 | "fake_note_6": "", 30 | "fake_note_todo_item_1": "", 31 | "fake_note_todo_item_2": "", 32 | "fake_notes_warning": "", 33 | "statistics": "", 34 | "sentences": "", 35 | "words": "", 36 | "characters": "", 37 | "keyword": "", 38 | "format": "", 39 | "edit": "", 40 | "media": "", 41 | "tools": "", 42 | "file": "", 43 | "note_name": "", 44 | "export": "", 45 | "exit": "", 46 | "add_a_keyword": "", 47 | "back_to_text": "", 48 | "file_photo": "", 49 | "recording": "", 50 | "copy": "", 51 | "paste": "", 52 | "select_all": "", 53 | "todo_list": "", 54 | "print": "", 55 | "print_title": "", 56 | "print_modification_date": "", 57 | "print_creation_date": "", 58 | "error_save": "", 59 | "not_yet_implemented": "", 60 | "open": "", 61 | "date_time": "", 62 | "media_empty_text": "" 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/img/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/img/512x512.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/img/bike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/img/bike.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/img/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/img/directory.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/img/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/img/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/img/ic_launcher_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/img/ic_launcher_white.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/img/sync.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/img/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/img/ui.png -------------------------------------------------------------------------------- /app/src/main/assets/reader/libs/dialog-polyfill.css: -------------------------------------------------------------------------------- 1 | dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | width: -moz-fit-content; 5 | width: -webkit-fit-content; 6 | width: fit-content; 7 | height: -moz-fit-content; 8 | height: -webkit-fit-content; 9 | height: fit-content; 10 | margin: auto; 11 | border: solid; 12 | padding: 1em; 13 | background: white; 14 | color: black; 15 | display: block; 16 | } 17 | 18 | dialog:not([open]) { 19 | display: none; 20 | } 21 | 22 | dialog + .backdrop { 23 | position: fixed; 24 | top: 0; right: 0; bottom: 0; left: 0; 25 | background: rgba(0,0,0,0.1); 26 | } 27 | 28 | ._dialog_overlay { 29 | position: fixed; 30 | top: 0; right: 0; bottom: 0; left: 0; 31 | } 32 | 33 | dialog.fixed { 34 | position: fixed; 35 | top: 50%; 36 | transform: translate(0, -50%); 37 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/libs/jquery.ui.touch-punch.min.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /*! 4 | * jQuery UI Touch Punch 0.2.3 5 | * 6 | * Copyright 2011–2014, Dave Furfero 7 | * Dual licensed under the MIT or GPL Version 2 licenses. 8 | * 9 | * Depends: 10 | * jquery.ui.widget.js 11 | * jquery.ui.mouse.js 12 | */ 13 | !function (a) { 14 | function f(a, b) { 15 | if (!(a.originalEvent.touches.length > 1)) { 16 | a.preventDefault(); 17 | var c = a.originalEvent.changedTouches[0], 18 | d = document.createEvent("MouseEvents"); 19 | d.initMouseEvent(b, !0, !0, window, 1, c.screenX, c.screenY, c.clientX, c.clientY, !1, !1, !1, !1, 0, null), a.target.dispatchEvent(d); 20 | } 21 | } 22 | if (a.support.touch = "ontouchend" in document, a.support.touch) { 23 | var e, 24 | b = a.ui.mouse.prototype, 25 | c = b._mouseInit, 26 | d = b._mouseDestroy; 27 | b._touchStart = function (a) { 28 | var b = this; 29 | !e && b._mouseCapture(a.originalEvent.changedTouches[0]) && (e = !0, b._touchMoved = !1, f(a, "mouseover"), f(a, "mousemove"), f(a, "mousedown")); 30 | }, b._touchMove = function (a) { 31 | e && (this._touchMoved = !0, f(a, "mousemove")); 32 | }, b._touchEnd = function (a) { 33 | e && (f(a, "mouseup"), f(a, "mouseout"), this._touchMoved || f(a, "click"), e = !1); 34 | }, b._mouseInit = function () { 35 | var b = this; 36 | b.element.bind({ 37 | touchstart: a.proxy(b, "_touchStart"), 38 | touchmove: a.proxy(b, "_touchMove"), 39 | touchend: a.proxy(b, "_touchEnd") 40 | }), c.call(b); 41 | }, b._mouseDestroy = function () { 42 | var b = this; 43 | b.element.unbind({ 44 | touchstart: a.proxy(b, "_touchStart"), 45 | touchmove: a.proxy(b, "_touchMove"), 46 | touchend: a.proxy(b, "_touchEnd") 47 | }), d.call(b); 48 | }; 49 | } 50 | }(jQuery); -------------------------------------------------------------------------------- /app/src/main/assets/reader/libs/jquery_i18n/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | "use strict"; 3 | 4 | var parser = require(__dirname + '/CLDRPluralRuleParser.js'); 5 | if (process.argv.length < 3) { 6 | console.log("Please provide the rule and a number to test"); 7 | console.log("Example:"); 8 | console.log("cldrpluraltuleparser 'v = 0 and n != 0..10 and n % 10 = 0' 20"); 9 | } else { 10 | var result = parser(process.argv[2], process.argv[3]); 11 | console.log(result); 12 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/libs/material-icons.css: -------------------------------------------------------------------------------- 1 | /* fallback */ 2 | 3 | @font-face { 4 | font-family: 'Material Icons'; 5 | font-style: normal; 6 | font-weight: 400; 7 | src: url(../fonts/material-icons.woff2) format('woff2'); 8 | } 9 | 10 | .material-icons { 11 | font-family: 'Material Icons'; 12 | font-weight: normal; 13 | font-style: normal; 14 | font-size: 24px; 15 | line-height: 1; 16 | letter-spacing: normal; 17 | text-transform: none; 18 | display: inline-block; 19 | white-space: nowrap; 20 | word-wrap: normal; 21 | direction: ltr; 22 | -moz-font-feature-settings: 'liga'; 23 | -moz-osx-font-smoothing: grayscale; 24 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/libs/polyfill.css: -------------------------------------------------------------------------------- 1 | dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | width: -moz-fit-content; 5 | width: -webkit-fit-content; 6 | width: fit-content; 7 | height: -moz-fit-content; 8 | height: -webkit-fit-content; 9 | height: fit-content; 10 | margin: auto; 11 | border: solid; 12 | padding: 1em; 13 | background: white; 14 | color: black; 15 | display: block; 16 | } 17 | 18 | dialog:not([open]) { 19 | display: none; 20 | } 21 | 22 | dialog + .backdrop { 23 | position: fixed; 24 | top: 0; right: 0; bottom: 0; left: 0; 25 | background: rgba(0,0,0,0.1); 26 | } 27 | 28 | ._dialog_overlay { 29 | position: fixed; 30 | top: 0; right: 0; bottom: 0; left: 0; 31 | } 32 | 33 | dialog.fixed { 34 | position: fixed; 35 | top: 50%; 36 | transform: translate(0, -50%); 37 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/css/recorder.css: -------------------------------------------------------------------------------- 1 | #analyser { 2 | height: 128px; 3 | display: block; 4 | } 5 | 6 | #waveform { 7 | display: none; 8 | } 9 | 10 | #recorder-container { 11 | padding: 10px; 12 | width: 350px; 13 | max-width: calc(100% - 30px); 14 | } 15 | #recorder-file-buttons{ 16 | float:right; 17 | } 18 | #total-time{ 19 | float: right; 20 | margin-top:8px; 21 | } -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/css/reminders.css: -------------------------------------------------------------------------------- 1 | .reminder-item .hour{ 2 | display: block; 3 | font-size:18px; 4 | } 5 | .reminder-item{ 6 | padding-bottom:10px; 7 | padding-top:10px; 8 | 9 | } 10 | .reminder-calendar-picker .c-datepicker__header-day,.reminder-date-picker .c-datepicker__toggle{ 11 | display:none; 12 | } 13 | .reminder-date-picker{ 14 | min-height: 354px !important; 15 | } 16 | .reminder-date-picker .c-datepicker__header{ 17 | display:none; 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/libs/jquery.hammer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } 4 | (function (factory) { 5 | if (typeof define === 'function' && define.amd) { 6 | define(['jquery', 'hammerjs'], factory); 7 | } else if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object') { 8 | factory(require('jquery'), require('hammerjs')); 9 | } else { 10 | factory(jQuery, Hammer); 11 | } 12 | })(function ($, Hammer) { 13 | function hammerify(el, options) { 14 | var $el = $(el); 15 | if (!$el.data("hammer")) { 16 | $el.data("hammer", new Hammer($el[0], options)); 17 | } 18 | } 19 | $.fn.hammer = function (options) { 20 | return this.each(function () { 21 | hammerify(this, options); 22 | }); 23 | }; 24 | 25 | // extend the emit method to also trigger jQuery events 26 | Hammer.Manager.prototype.emit = function (originalEmit) { 27 | return function (type, data) { 28 | originalEmit.call(this, type, data); 29 | $(this.element).trigger({ 30 | type: type, 31 | gesture: data 32 | }); 33 | }; 34 | }(Hammer.Manager.prototype.emit); 35 | }); -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/libs/jquery.ui.touch-punch.min.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /*! 4 | * jQuery UI Touch Punch 0.2.3 5 | * 6 | * Copyright 2011–2014, Dave Furfero 7 | * Dual licensed under the MIT or GPL Version 2 licenses. 8 | * 9 | * Depends: 10 | * jquery.ui.widget.js 11 | * jquery.ui.mouse.js 12 | */ 13 | !function (a) { 14 | function f(a, b) { 15 | if (!(a.originalEvent.touches.length > 1)) { 16 | a.preventDefault(); 17 | var c = a.originalEvent.changedTouches[0], 18 | d = document.createEvent("MouseEvents"); 19 | d.initMouseEvent(b, !0, !0, window, 1, c.screenX, c.screenY, c.clientX, c.clientY, !1, !1, !1, !1, 0, null), a.target.dispatchEvent(d); 20 | } 21 | } 22 | if (a.support.touch = "ontouchend" in document, a.support.touch) { 23 | var e, 24 | b = a.ui.mouse.prototype, 25 | c = b._mouseInit, 26 | d = b._mouseDestroy; 27 | b._touchStart = function (a) { 28 | var b = this; 29 | !e && b._mouseCapture(a.originalEvent.changedTouches[0]) && (e = !0, b._touchMoved = !1, f(a, "mouseover"), f(a, "mousemove"), f(a, "mousedown")); 30 | }, b._touchMove = function (a) { 31 | e && (this._touchMoved = !0, f(a, "mousemove")); 32 | }, b._touchEnd = function (a) { 33 | e && (f(a, "mouseup"), f(a, "mouseout"), this._touchMoved || f(a, "click"), e = !1); 34 | }, b._mouseInit = function () { 35 | var b = this; 36 | b.element.bind({ 37 | touchstart: a.proxy(b, "_touchStart"), 38 | touchmove: a.proxy(b, "_touchMove"), 39 | touchend: a.proxy(b, "_touchEnd") 40 | }), c.call(b); 41 | }, b._mouseDestroy = function () { 42 | var b = this; 43 | b.element.unbind({ 44 | touchstart: a.proxy(b, "_touchStart"), 45 | touchmove: a.proxy(b, "_touchMove"), 46 | touchend: a.proxy(b, "_touchEnd") 47 | }), d.call(b); 48 | }; 49 | } 50 | }(jQuery); -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/libs/recorder/decoderWorker.min.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/reader/libs/recorder/decoderWorker.min.wasm -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/libs/recorder/encoderWorker.min.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/assets/reader/reader/libs/recorder/encoderWorker.min.wasm -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/libs/simplecolorpicker/css/simple-color-picker.styl: -------------------------------------------------------------------------------- 1 | pickerHueWidth = 20px 2 | 3 | .Scp 4 | user-select none 5 | position relative 6 | 7 | .Scp-saturation 8 | position relative 9 | height 100% 10 | background linear-gradient(to right, #FFFFFF, #FF0000); 11 | float left 12 | margin-right 5px 13 | 14 | .Scp-brightness 15 | width 100% 16 | height 100% 17 | background linear-gradient(rgba(255, 255, 255, 0), rgba(0, 0, 0, 1)); 18 | 19 | .Scp-sbSelector 20 | border 2px solid white 21 | position absolute 22 | width 14px 23 | height 14px 24 | background white 25 | border-radius 10px 26 | top -7px 27 | left -7px 28 | box-sizing border-box 29 | z-index 10 30 | 31 | .Scp-hue 32 | width pickerHueWidth 33 | height 100% 34 | position relative 35 | float left 36 | background linear-gradient(rgb(255, 0, 0) 0%, rgb(255, 0, 255) 17%, rgb(0, 0, 255) 34%, rgb(0, 255, 255) 50%, rgb(0, 255, 0) 67%, rgb(255, 255, 0) 84%, rgb(255, 0, 0) 100%) 37 | 38 | .Scp-hSelector 39 | position absolute 40 | background white 41 | border-bottom 1px solid black 42 | right -3px 43 | width 10px 44 | height 2px 45 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/libs/simplecolorpicker/index.d.ts: -------------------------------------------------------------------------------- 1 | export interface ColorPickerOptions { 2 | color?: string | number; 3 | background?: string | number; 4 | el?: HTMLElement; 5 | width?: number; 6 | height?: number; 7 | } 8 | 9 | export interface ColorPicker { 10 | new (options?: ColorPickerOptions): ColorPicker; 11 | 12 | appendTo(domElement: HTMLElement): void; 13 | 14 | remove(): void; 15 | 16 | setColor(color: string | number): void; 17 | 18 | setSize(width: number, height: number): void; 19 | 20 | setBackgroundColor(color: string | number): void; 21 | 22 | setNoBackground(): void; 23 | 24 | onChange(callback: Function): void; 25 | 26 | getColor(): string | number; 27 | 28 | getHexString(): string; 29 | 30 | getHexNumber(): number; 31 | 32 | getRGB(): { r: number, g: number, b: number }; 33 | 34 | getHSV(): { h: number, s: number, v: number }; 35 | 36 | isDark(): boolean; 37 | 38 | isLight(): boolean; 39 | } 40 | 41 | export var ColorPicker: ColorPicker; 42 | 43 | export default ColorPicker; 44 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/reader/libs/simplecolorpicker/simple-color-picker.css: -------------------------------------------------------------------------------- 1 | .Scp { 2 | -webkit-user-select: none; 3 | -moz-user-select: none; 4 | -ms-user-select: none; 5 | user-select: none; 6 | position: relative; 7 | } 8 | .Scp-saturation { 9 | height: 100%; 10 | background: -webkit-linear-gradient(left, #fff, #f00); 11 | background: linear-gradient(to right, #fff, #f00); 12 | margin-right: 5px; 13 | display: inline-block; 14 | } 15 | .Scp-brightness { 16 | width: 100%; 17 | height: 100%; 18 | background: -webkit-linear-gradient(rgba(255,255,255,0), #000); 19 | background: linear-gradient(rgba(255,255,255,0), #000); 20 | } 21 | .Scp-sbSelector { 22 | border: 2px solid #fff; 23 | position: absolute; 24 | width: 14px; 25 | height: 14px; 26 | background: #fff; 27 | border-radius: 10px; 28 | top: -7px; 29 | left: -7px; 30 | box-sizing: border-box; 31 | z-index: 10; 32 | } 33 | .Scp-hue { 34 | width: 20px; 35 | height: 100%; 36 | display: inline-block; 37 | background: -webkit-linear-gradient(#f00 0%, #f0f 17%, #00f 34%, #0ff 50%, #0f0 67%, #ff0 84%, #f00 100%); 38 | background: linear-gradient(#f00 0%, #f0f 17%, #00f 34%, #0ff 50%, #0f0 67%, #ff0 84%, #f00 100%); 39 | } 40 | .Scp-hSelector { 41 | position: absolute; 42 | background: #fff; 43 | border-bottom: 1px solid #000; 44 | right: -3px; 45 | width: 10px; 46 | height: 2px; 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/assets/reader/utils/folder-picker-preload.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _require = require('electron'), 4 | ipcRenderer = _require.ipcRenderer; 5 | setInterval(function () { 6 | ipcRenderer.sendToHost('ping'); 7 | }, 1000); -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/BootReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.spisoft.quicknote.reminders.RemindersManager 7 | import com.spisoft.sync.synchro.SynchroService 8 | 9 | class BootReceiver : BroadcastReceiver() { 10 | 11 | override fun onReceive(context: Context, intent: Intent) { 12 | // This method is called when the BroadcastReceiver is receiving an Intent broadcast. 13 | RemindersManager.getInstance(context)!!.onBoot() 14 | try { 15 | SynchroService.startIfNeeded(context) 16 | } catch(ex:IllegalStateException){ 17 | 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/ChangelogActivity.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | 6 | class ChangelogActivity : AppCompatActivity() { 7 | 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | setContentView(R.layout.activity_changelog) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/FileReaderActivity.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | 6 | class FileReaderActivity : AppCompatActivity() { 7 | 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | setContentView(R.layout.activity_changelog) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/FloatingFragment.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | 6 | /** 7 | * Created by alexandre on 18/02/16. 8 | */ 9 | public interface FloatingFragment { 10 | public View getView(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/HomeReceiver.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | /** 8 | * Created by alexandre on 11/02/16. 9 | */ 10 | public class HomeReceiver extends BroadcastReceiver { 11 | @Override 12 | public void onReceive(Context context, Intent intent) { 13 | if(FloatingService.sService!=null){ 14 | FloatingService.sService.requestMinimize(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/KeywordsDialog.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | import android.database.Cursor; 4 | import android.os.Bundle; 5 | import androidx.fragment.app.DialogFragment; 6 | import androidx.loader.app.LoaderManager; 7 | import androidx.loader.content.Loader; 8 | import androidx.cursoradapter.widget.CursorAdapter; 9 | import android.view.LayoutInflater; 10 | import android.view.View; 11 | import android.view.ViewGroup; 12 | import android.widget.ListView; 13 | 14 | /** 15 | * Created by phoenamandre on 09/07/17. 16 | */ 17 | 18 | public class KeywordsDialog extends DialogFragment implements LoaderManager.LoaderCallbacks{ 19 | public static final String NOTE_KEY = "note_key"; 20 | private ListView mListView; 21 | private CursorAdapter mAdapter; 22 | private Note mNote; 23 | 24 | @Override 25 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 26 | Bundle savedInstanceState) { 27 | View v = inflater.inflate(R.layout.fragment_keywords_dialog, container, false); 28 | 29 | mNote = (Note)getArguments().getSerializable(NOTE_KEY); 30 | getDialog().setTitle(""); 31 | mListView = (ListView)v.findViewById(R.id.listView); 32 | return v; 33 | } 34 | 35 | @Override 36 | public Loader onCreateLoader(int id, Bundle args) { 37 | return new KeywordsLoader(getContext()); 38 | } 39 | 40 | @Override 41 | public void onLoadFinished(Loader loader, Object data) { 42 | mAdapter = new KeywordsListAdapter(getContext(), (Cursor)data); 43 | mListView.setAdapter(mAdapter); 44 | } 45 | 46 | @Override 47 | public void onLoaderReset(Loader loader) { 48 | 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/KeywordsListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | import android.content.Context; 4 | import android.database.Cursor; 5 | import androidx.cursoradapter.widget.CursorAdapter; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | 11 | import com.spisoft.quicknote.R; 12 | import com.spisoft.quicknote.indexer.IndexDatabase; 13 | 14 | /** 15 | * Created by alexandre on 10/07/17. 16 | */ 17 | 18 | public class KeywordsListAdapter extends CursorAdapter{ 19 | private int mKeywordIndex; 20 | 21 | public KeywordsListAdapter(Context context, Cursor c) { 22 | super(context, c, true); 23 | mKeywordIndex = c.getColumnIndex(IndexDatabase.KEY_KEYWORD); 24 | } 25 | 26 | @Override 27 | public View newView(Context context, Cursor cursor, ViewGroup parent) { 28 | return LayoutInflater.from(context).inflate(R.layout.keyword_item, parent, false); 29 | } 30 | 31 | @Override 32 | public void bindView(View view, Context context, Cursor cursor) { 33 | ((TextView)view.findViewById(R.id.textView)).setText(cursor.getString(mKeywordIndex)); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/KeywordsLoader.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | import android.content.Context; 4 | import androidx.loader.content.CursorLoader; 5 | 6 | import com.spisoft.quicknote.indexer.IndexDatabase; 7 | import com.spisoft.quicknote.indexer.IndexerProvider; 8 | 9 | /** 10 | * Created by phoenamandre on 09/07/17. 11 | */ 12 | 13 | public class KeywordsLoader extends CursorLoader { 14 | public KeywordsLoader(Context context) { 15 | super(context); 16 | setUri(IndexerProvider.getKeywordsUri()); 17 | setProjection(IndexDatabase.COLUMNS); 18 | setSelection("DISTINCT("+IndexDatabase.KEY_KEYWORD+")"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/ListingEngine.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | import android.os.Handler; 4 | 5 | import java.io.File; 6 | import java.util.ArrayList; 7 | import java.util.Collections; 8 | import java.util.List; 9 | 10 | /** 11 | * Created by phoenamandre on 07/02/16. 12 | */ 13 | public class ListingEngine { 14 | 15 | private final File mUri; 16 | private final ListingListener mListener; 17 | private String mExt; 18 | private boolean mOnlyDirectory; 19 | private Handler mHandler = new Handler(); 20 | public interface ListingListener{ 21 | public void onFileList(List list); 22 | } 23 | 24 | 25 | 26 | public ListingEngine(File uri, ListingListener listener){ 27 | mListener = listener; 28 | mUri = uri; 29 | } 30 | public void setFilter(boolean onlyDirectories, String ext){ 31 | mExt = ext; 32 | mOnlyDirectory = onlyDirectories; 33 | } 34 | public void list(){ 35 | new Thread(){ 36 | public void run(){ 37 | File file = mUri; 38 | File[] files = file.listFiles(); 39 | final List fileList = new ArrayList<>(); 40 | if(files!=null){ 41 | for (File f : files){ 42 | 43 | if(!mOnlyDirectory||f.isDirectory()) { 44 | if(f.isDirectory()||mExt==null||mExt.isEmpty()|| f.getName().endsWith("."+mExt)) 45 | fileList.add(f); 46 | 47 | } 48 | 49 | } 50 | } 51 | Collections.sort(fileList); 52 | mHandler.post(new Runnable() { 53 | @Override 54 | public void run() { 55 | mListener.onFileList(fileList); 56 | } 57 | }); 58 | 59 | } 60 | }.start(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/RecordingActivity.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | /** 4 | * Created by alexandre on 05/07/17. 5 | */ 6 | 7 | public class RecordingActivity { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote; 2 | 3 | import androidx.annotation.NonNull; 4 | import androidx.appcompat.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.view.Menu; 7 | import android.view.MenuItem; 8 | 9 | import com.spisoft.quicknote.browser.PermissionChecker; 10 | 11 | public class SettingsActivity extends AppCompatActivity { 12 | 13 | private PermissionChecker mPermissionChecker; 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_settings); 19 | } 20 | 21 | 22 | @Override 23 | public boolean onCreateOptionsMenu(Menu menu) { 24 | // Inflate the menu; this adds items to the action bar if it is present. 25 | getMenuInflater().inflate(R.menu.menu_settings, menu); 26 | return true; 27 | } 28 | 29 | @Override 30 | public boolean onOptionsItemSelected(MenuItem item) { 31 | // Handle action bar item clicks here. The action bar will 32 | // automatically handle clicks on the Home/Up button, so long 33 | // as you specify a parent activity in AndroidManifest.xml. 34 | int id = item.getItemId(); 35 | 36 | //noinspection SimplifiableIfStatement 37 | if (id == R.id.action_settings) { 38 | return true; 39 | } 40 | 41 | return super.onOptionsItemSelected(item); 42 | } 43 | 44 | @Override 45 | public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){ 46 | mPermissionChecker.onRequestPermissionsResult(requestCode, permissions, grantResults); 47 | } 48 | 49 | public void getStoragePermission(PermissionChecker.PermissionCallback callback) { 50 | mPermissionChecker = new PermissionChecker(); 51 | mPermissionChecker.checkAndRequestPermission(this,callback); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/WebBasedActivity.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | 6 | class WebBasedActivity : AppCompatActivity() { 7 | 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | setContentView(R.layout.activity_web_based) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/browser/PasteBin.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.browser; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * Created by alexandre on 12/05/16. 8 | */ 9 | public class PasteBin { 10 | private static ArrayList sPastebin = new ArrayList<>(); 11 | public synchronized static void addObject(Object object){ 12 | sPastebin.add(object); 13 | } 14 | public synchronized static void addObjects(List objects){ 15 | sPastebin.addAll(objects); 16 | } 17 | public synchronized static void clear(){ 18 | sPastebin.clear(); 19 | } 20 | 21 | public synchronized static ArrayList getPasteBin(){ 22 | return new ArrayList<>(sPastebin); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/browser/PasteDialog.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.browser; 2 | 3 | import android.content.Context; 4 | import androidx.appcompat.app.AlertDialog; 5 | 6 | import com.spisoft.quicknote.R; 7 | 8 | /** 9 | * Created by alexandre on 12/05/16. 10 | */ 11 | public class PasteDialog extends AlertDialog { 12 | private final Context mContext; 13 | 14 | public PasteDialog(Context context) { 15 | super(context); 16 | mContext = context; 17 | setTitle(R.string.file_operation_in_progress); 18 | setMessage(mContext.getResources().getString(R.string.please_wait)); 19 | setCancelable(false); 20 | setCanceledOnTouchOutside(false); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/browser/WebBasedView.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.browser 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | 6 | import com.spisoft.quicknote.editor.EditorView 7 | 8 | class WebBasedView : EditorView { 9 | constructor(context: Context) : super(context) {} 10 | 11 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} 12 | 13 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 14 | 15 | fun getUrl(): String { 16 | return "/reader/index.html" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/databases/Database.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.databases 2 | 3 | import android.content.Context 4 | import android.database.sqlite.SQLiteDatabase 5 | import android.database.sqlite.SQLiteOpenHelper 6 | import com.spisoft.quicknote.reminders.RemindersManager 7 | 8 | class Database(private val mContext: Context) { 9 | private var mDatabaseHelper: DatabaseHelper? = null 10 | public val lock = Object(); 11 | 12 | fun open(): SQLiteDatabase { 13 | if (mDatabaseHelper == null) 14 | mDatabaseHelper = DatabaseHelper(mContext) 15 | return mDatabaseHelper!!.writableDatabase 16 | } 17 | 18 | fun close() { 19 | mDatabaseHelper!!.close() 20 | } 21 | 22 | private inner class DatabaseHelper internal constructor(context: Context) : SQLiteOpenHelper(context, Database.DATABASE_NAME, null, Database.DATABASE_VERSION) { 23 | override fun onCreate(db: SQLiteDatabase) { 24 | db.execSQL(RemindersManager.CREATE_TABLE) 25 | } 26 | override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { 27 | 28 | } 29 | } 30 | 31 | companion object { 32 | val DATABASE_NAME = "Carnet" 33 | val DATABASE_VERSION = 1 34 | var sDatabase: Database? = null 35 | var lock = Any() 36 | fun getInstance(context: Context): Database? { 37 | if (sDatabase == null) 38 | sDatabase = Database(context) 39 | return sDatabase 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/databases/page/Page.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.databases.page; 2 | 3 | import org.json.JSONException; 4 | import org.json.JSONObject; 5 | 6 | /** 7 | * Created by alexandre on 17/10/16. 8 | */ 9 | 10 | public class Page { 11 | public static final int TYPE_HTML= 0; 12 | public static final int TYPE_IMG = 1; 13 | public int type; 14 | public String relativePath; 15 | public String thumbnail; 16 | 17 | 18 | private static final String JSON_TYPE = "type"; 19 | private static final String JSON_RELATIVE_PATH = "relativePath"; 20 | private static final String JSON_THUMBNAIL = "thumbnail"; 21 | 22 | public Page(int type, String relativePath, String thumbnail) { 23 | this.type = type; 24 | this.relativePath = relativePath; 25 | this.thumbnail = thumbnail; 26 | } 27 | 28 | public String toJson() { 29 | StringBuilder sb = new StringBuilder(); 30 | sb.append("{"); 31 | sb.append(JSONObject.quote(JSON_TYPE)); 32 | sb.append(":"); 33 | sb.append(type); 34 | sb.append(","); 35 | if(thumbnail!=null) { 36 | sb.append(JSONObject.quote(JSON_THUMBNAIL)); 37 | sb.append(":"); 38 | sb.append(thumbnail); 39 | sb.append(","); 40 | } 41 | sb.append(JSONObject.quote(JSON_RELATIVE_PATH)); 42 | sb.append(":"); 43 | sb.append(JSONObject.quote(relativePath)); 44 | sb.append("}"); 45 | return sb.toString(); 46 | } 47 | 48 | public static Page fromJsonObject(JSONObject jsonObject) throws JSONException { 49 | Page page = new Page(jsonObject.getInt(JSON_TYPE), jsonObject.getString(JSON_RELATIVE_PATH), jsonObject.has(JSON_THUMBNAIL)?jsonObject.getString(JSON_THUMBNAIL):null); 50 | return page; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/databases/page/PageManager.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.databases.page; 2 | 3 | import com.spisoft.quicknote.Note; 4 | 5 | import org.json.JSONObject; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | /** 11 | * Created by alexandre on 17/10/16. 12 | */ 13 | 14 | public class PageManager { 15 | 16 | private final Note mNote; 17 | private final ArrayList mPageList; 18 | private final static String PAGE_INIT_NAME = "page"; 19 | 20 | public PageManager(Note note){ 21 | mNote = note; 22 | mPageList = new ArrayList<>(); 23 | } 24 | 25 | public Page getPage(int i){ 26 | return mPageList.get(i); 27 | } 28 | 29 | public List getPageList(){ 30 | return mPageList; 31 | } 32 | 33 | public void addPage(Page page){ 34 | mPageList.add(page); 35 | } 36 | 37 | public Page createBlankPage(){ 38 | int i = 1; 39 | boolean shouldContinue = true; 40 | while(shouldContinue){ 41 | shouldContinue = false; 42 | for (Page page : mPageList){ 43 | if(page.relativePath.equals(PAGE_INIT_NAME+i+".html")){ 44 | shouldContinue=true; 45 | i++; 46 | break; 47 | } 48 | } 49 | } 50 | Page page = new Page(Page.TYPE_HTML,PAGE_INIT_NAME+i+".html",null); 51 | return page; 52 | } 53 | 54 | public String toJson(){ 55 | StringBuilder sb = new StringBuilder(); 56 | sb.append("{"); 57 | sb.append(JSONObject.quote("pages")); 58 | sb.append(":"); 59 | sb.append("["); 60 | for(int i = 0; i < mPageList.size(); i++){ 61 | sb.append(mPageList.get(i).toJson()); 62 | if(i { 10 | val latest = RecentHelper.getInstance(context).cachedLatestNotes 11 | for (i in latest.indices) { 12 | val curNote = latest[i] 13 | val note = CacheManager.getInstance(context)[curNote.path] 14 | if (note != null) { 15 | note.isPinned = curNote.isPinned 16 | latest[i] = note 17 | } 18 | } 19 | return ArrayList(latest) 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/notes_lister/NotesLister.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.notes_lister 2 | 3 | import android.content.Context 4 | import com.spisoft.quicknote.Note 5 | 6 | interface NotesLister { 7 | 8 | fun getNotes():List; 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/notes_lister/PathNotesLister.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.notes_lister 2 | 3 | import android.content.Context 4 | import com.spisoft.quicknote.Note 5 | import com.spisoft.quicknote.PreferenceHelper 6 | import com.spisoft.quicknote.databases.CacheManager 7 | import java.io.File 8 | import java.util.* 9 | 10 | class PathNotesLister(private val path: String, private val context:Context, private val includeDirectories:Boolean):NotesLister { 11 | override fun getNotes():List { 12 | val avoidDbFolder = path == PreferenceHelper.getRootPath(context) 13 | val file = File(path) 14 | val ret: MutableList = ArrayList() 15 | val dir: MutableList = ArrayList() 16 | val notes: MutableList = ArrayList() 17 | if (file.exists()) { 18 | val files: Array = file.listFiles() 19 | if (files != null) { 20 | for (file1 in files) { 21 | if (file1.name.startsWith(".") || avoidDbFolder && file1.name == "quickdoc") continue 22 | if (file1.name.endsWith(".sqd")) { 23 | var note = CacheManager.getInstance(context)[file1.absolutePath] 24 | if (note == null) { 25 | note = Note(file1.absolutePath) 26 | } 27 | notes.add(note) 28 | } else if (file1.isDirectory && includeDirectories) dir.add(file1) 29 | } 30 | } 31 | ret.addAll(dir) 32 | ret.addAll(notes) 33 | } 34 | return ret; 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/reminders/NotificationPublisher.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.reminders 2 | 3 | 4 | import android.app.Notification 5 | import android.app.NotificationChannel 6 | import android.app.NotificationManager 7 | import android.content.BroadcastReceiver 8 | import android.content.Context 9 | import android.content.Intent 10 | import android.os.Build 11 | import com.spisoft.sync.Log 12 | 13 | class NotificationPublisher : BroadcastReceiver() { 14 | val TAG = "NotificationPublisher" 15 | override fun onReceive(context: Context, intent: Intent) { 16 | 17 | val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager 18 | val notification = intent.getParcelableExtra(NOTIFICATION) 19 | val path = intent.getStringExtra(NOTE_PATH) 20 | val id = intent.getIntExtra(NOTIFICATION_ID, 4) 21 | if(notification != null) { 22 | notificationManager.notify(id, notification) 23 | if(path != null) 24 | RemindersManager.getInstance(context)!!.onNotified(path) 25 | } 26 | 27 | Log.d(TAG, "notification "+(notification == null)) 28 | Log.d(TAG, "notification id "+id) 29 | 30 | } 31 | 32 | companion object { 33 | 34 | var NOTIFICATION_ID = "notification-id" 35 | var NOTIFICATION = "notification" 36 | var NOTE_PATH = "note_path" 37 | val CHANNEL_ID: String = "channel_id" 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/synchro/AccountConfigActivity.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.synchro; 2 | 3 | import android.os.Bundle; 4 | import com.google.android.material.floatingactionbutton.FloatingActionButton; 5 | import com.google.android.material.snackbar.Snackbar; 6 | import androidx.appcompat.app.AppCompatActivity; 7 | import androidx.appcompat.widget.Toolbar; 8 | import android.view.View; 9 | 10 | import com.spisoft.quicknote.R; 11 | 12 | public class AccountConfigActivity extends AppCompatActivity { 13 | public static final String EXTRA_ACCOUNT_ID = "account_id"; 14 | public static final String EXTRA_ACCOUNT_TYPE = "account_type"; 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_account_config); 19 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 20 | setSupportActionBar(toolbar); 21 | 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/updater/ChangelogFragment.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.updater; 2 | 3 | 4 | import android.content.res.AssetManager; 5 | import android.os.AsyncTask; 6 | import android.os.Bundle; 7 | import androidx.fragment.app.Fragment; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.TextView; 12 | 13 | import com.spisoft.quicknote.R; 14 | import com.spisoft.quicknote.utils.FileUtils; 15 | 16 | import java.io.IOException; 17 | import java.io.InputStream; 18 | import java.io.OutputStream; 19 | 20 | /** 21 | * A simple {@link Fragment} subclass. 22 | */ 23 | public class ChangelogFragment extends Fragment { 24 | 25 | 26 | private TextView mChangelogView; 27 | 28 | public ChangelogFragment() { 29 | // Required empty public constructor 30 | } 31 | 32 | 33 | @Override 34 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 35 | Bundle savedInstanceState) { 36 | // Inflate the layout for this fragment 37 | return inflater.inflate(R.layout.fragment_changelog, container, false); 38 | } 39 | 40 | public void onViewCreated(View view, Bundle savedInstanceState) { 41 | super.onViewCreated(view, savedInstanceState); 42 | mChangelogView = view.findViewById(R.id.changelog); 43 | new AsyncTask(){ 44 | 45 | @Override 46 | protected String doInBackground(Void... voids) { 47 | AssetManager assetManager = getContext().getAssets(); 48 | 49 | InputStream in = null; 50 | OutputStream out = null; 51 | try { 52 | in = assetManager.open("CHANGELOG.md"); 53 | return FileUtils.readInputStream(in); 54 | 55 | } catch (IOException e) { 56 | e.printStackTrace(); 57 | } 58 | 59 | return null; 60 | } 61 | protected void onPostExecute(String result) { 62 | mChangelogView.setText(result); 63 | } 64 | }.execute(); 65 | } 66 | 67 | 68 | public void setOnTouchListener(final View.OnTouchListener onTouchListener) { 69 | mChangelogView.setOnTouchListener(onTouchListener); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/updater/Updater.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.updater; 2 | 3 | import android.content.Context; 4 | 5 | public interface Updater { 6 | 7 | public void update(Context ct, int oldVersion, int newVersion); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/utils/SerialExecutor.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.utils; 2 | 3 | import android.os.AsyncTask; 4 | 5 | import java.util.ArrayDeque; 6 | import java.util.concurrent.Executor; 7 | 8 | /** 9 | * Created by alexandre on 05/02/16. 10 | */ 11 | public class SerialExecutor implements Executor { 12 | final ArrayDeque mTasks = new ArrayDeque(); 13 | Runnable mActive; 14 | 15 | public SerialExecutor(){ 16 | 17 | } 18 | public synchronized void execute(final Runnable r) { 19 | mTasks.offer(new Runnable() { 20 | public void run() { 21 | try { 22 | r.run(); 23 | } finally { 24 | scheduleNext(); 25 | } 26 | } 27 | }); 28 | if (mActive == null) { 29 | scheduleNext(); 30 | } 31 | } 32 | 33 | protected synchronized void scheduleNext() { 34 | if ((mActive = mTasks.poll()) != null) { 35 | 36 | AsyncTask.THREAD_POOL_EXECUTOR.execute(mActive); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/utils/SpiDebugUtils.java: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.utils; 2 | 3 | /** 4 | * Created by phoenamandre on 03/04/16. 5 | */ 6 | public class SpiDebugUtils { 7 | public static final boolean IS_TEST_MODE = false; 8 | public static int testCount = 0; 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/utils/WebActivity.kt: -------------------------------------------------------------------------------- 1 | package com.spisoft.quicknote.utils 2 | 3 | import android.content.Intent 4 | import androidx.appcompat.app.AppCompatActivity 5 | import android.os.Bundle 6 | import com.spisoft.quicknote.R 7 | import com.spisoft.quicknote.editor.EditorView 8 | 9 | class WebActivity : AppCompatActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_web) 14 | val webFragment = WebFragment.newInstance(intent.getStringExtra(WebFragment.ARG_URL)!!) 15 | supportFragmentManager.beginTransaction().replace(R.id.root, webFragment).commit(); 16 | } 17 | override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 18 | super.onActivityResult(requestCode, resultCode, data) 19 | for (fragment in supportFragmentManager.fragments) { 20 | fragment.onActivityResult(requestCode, resultCode, data) 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/widget/ListWidgetService.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013-2020 Federico Iosue (federico@iosue.it) 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.spisoft.quicknote.widget 18 | 19 | import android.content.Intent 20 | import android.widget.RemoteViewsService 21 | 22 | class ListWidgetService : RemoteViewsService() { 23 | override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { 24 | return ListRemoteViewsFactory(this.application, intent) 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/spisoft/quicknote/widget/SimpleWidgetProvider.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013-2020 Federico Iosue (federico@iosue.it) 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.spisoft.quicknote.widget 18 | 19 | import android.app.PendingIntent 20 | import android.content.Context 21 | import android.util.SparseArray 22 | import android.widget.RemoteViews 23 | import com.spisoft.quicknote.R 24 | 25 | class SimpleWidgetProvider : WidgetProvider() { 26 | override fun getRemoteViews(context: Context?, widgetId: Int, pendingIntentsMap: SparseArray): RemoteViews? { 27 | val views = RemoteViews(context?.packageName, R.layout.widget_layout); 28 | views.setOnClickPendingIntent(R.id.list, pendingIntentsMap.get(R.id.list)) 29 | views.setOnClickPendingIntent(R.id.add, pendingIntentsMap.get(R.id.add)) 30 | views.setOnClickPendingIntent(R.id.record, pendingIntentsMap.get(R.id.record)) 31 | 32 | return views 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/camera_shot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-mdpi/camera_shot.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-mdpi/directory.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/flash_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-mdpi/flash_off.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/flash_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-mdpi/flash_on.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/icon_status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-mdpi/icon_status.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/threedots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-mdpi/threedots.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/threedots_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-mdpi/threedots_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/appwidget_preview_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-nodpi/appwidget_preview_list.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/appwidget_preview_simple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-nodpi/appwidget_preview_simple.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/action_button_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/card_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/card_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/grey_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/transparent_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/camera_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/camera_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/camera_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/camera_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/drive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/drive.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_create_new_folder_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/ic_create_new_folder_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_create_new_folder_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/ic_create_new_folder_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_note_add_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/ic_note_add_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_note_add_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/ic_note_add_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/mic_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/mic_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/mic_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/mic_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/pause_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/pause_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/pause_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/pause_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/play_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/play_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/play_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/play_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/sort_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/sort_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/sort_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/sort_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/sync_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/sync_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/sync_black_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/sync_black_disabled.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/sync_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/sync_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/sync_white_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarnetApp/CarnetAndroid/f0d75c0d89e1b2c847c178923fac37d82525c30a/app/src/main/res/drawable-xhdpi/sync_white_disabled.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/action_button_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_card.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/blue_ripple_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bubble_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/card_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/card_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/display_grid.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/display_line.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/grey_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyword_item_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/line_card_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/line_card_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_account_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_changelog.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 18 | 19 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_editor.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_help.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_help_authorize_floating_window.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 16 | 17 | 26 | 29 | 30 |