├── settings.gradle ├── fastlane └── metadata │ └── android │ ├── de-DE │ ├── title.txt │ ├── images │ │ ├── icon.png │ │ ├── featureGraphic.png │ │ └── phoneScreenshots │ │ │ ├── Screenshot_20230322-195258_FOSS Browser.png │ │ │ ├── Screenshot_20230322-195354_FOSS Browser.png │ │ │ ├── Screenshot_20230322-195412_FOSS Browser.png │ │ │ ├── Screenshot_20230322-195506_FOSS Browser.png │ │ │ ├── Screenshot_20230322-195534_FOSS Browser.png │ │ │ └── Screenshot_20230322-195617_FOSS Browser.png │ ├── short_description.txt │ ├── changelogs │ │ ├── 136.txt │ │ ├── 130.txt │ │ ├── 120.txt │ │ ├── 133.txt │ │ ├── 127.txt │ │ ├── 139.txt │ │ ├── 135.txt │ │ ├── 124.txt │ │ ├── 125.txt │ │ ├── 134.txt │ │ ├── 118.txt │ │ ├── 138.txt │ │ ├── 117.txt │ │ ├── 128.txt │ │ ├── 129.txt │ │ ├── 119.txt │ │ ├── 131.txt │ │ ├── 126.txt │ │ ├── 132.txt │ │ ├── 114.txt │ │ ├── 115.txt │ │ ├── 116.txt │ │ ├── 122.txt │ │ ├── 123.txt │ │ ├── 121.txt │ │ ├── 113.txt │ │ └── 137.txt │ └── full_description.txt │ └── en-US │ ├── title.txt │ ├── short_description.txt │ ├── images │ ├── icon.png │ ├── featureGraphic.png │ └── phoneScreenshots │ │ ├── Screenshot_20230322-195258_FOSS Browser.png │ │ ├── Screenshot_20230322-195354_FOSS Browser.png │ │ ├── Screenshot_20230322-195412_FOSS Browser.png │ │ ├── Screenshot_20230322-195506_FOSS Browser.png │ │ ├── Screenshot_20230322-195534_FOSS Browser.png │ │ └── Screenshot_20230322-195617_FOSS Browser.png │ ├── changelogs │ ├── 136.txt │ ├── 130.txt │ ├── 120.txt │ ├── 133.txt │ ├── 127.txt │ ├── 139.txt │ ├── 135.txt │ ├── 124.txt │ ├── 125.txt │ ├── 134.txt │ ├── 118.txt │ ├── 138.txt │ ├── 117.txt │ ├── 128.txt │ ├── 129.txt │ ├── 119.txt │ ├── 131.txt │ ├── 126.txt │ ├── 132.txt │ ├── 114.txt │ ├── 115.txt │ ├── 116.txt │ ├── 122.txt │ ├── 123.txt │ ├── 121.txt │ ├── 113.txt │ └── 137.txt │ └── full_description.txt ├── gradle.properties ├── wiki ├── ui_filter.png ├── settings_ui.png ├── ui_overview.png ├── settings_backup.png ├── settings_delete.png ├── settings_filter.png ├── ui_fast_toggle.png ├── settings_edit_list.png ├── settings_general.png ├── settings_gestures.png ├── settings_privacy.png └── settings_edit_profile.png ├── graphics ├── Zeichnung.png ├── Zeichnung_wiki.png ├── featuresGrafic.png ├── settings_template.xcf └── ic_launcher-playstore.png ├── app ├── debug │ ├── app-debug.apk │ └── output-metadata.json ├── release │ ├── app-release.apk │ └── output-metadata.json ├── src │ └── main │ │ ├── ic_launcher-playstore.png │ │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── values │ │ │ ├── ic_launcher_background.xml │ │ │ ├── styles.xml │ │ │ └── attrs.xml │ │ ├── menu │ │ │ ├── menu_list_tabs.xml │ │ │ ├── menu_list_history.xml │ │ │ ├── menu_help.xml │ │ │ ├── menu_list_start.xml │ │ │ ├── menu_list_bookmark.xml │ │ │ └── menu_bottom_overview.xml │ │ ├── drawable │ │ │ ├── bg_chip_icon_state.xml │ │ │ ├── bg_chip_state_list.xml │ │ │ ├── bg_chip_state_list_domain.xml │ │ │ ├── icon_check.xml │ │ │ ├── icon_download.xml │ │ │ ├── icon_file.xml │ │ │ ├── icon_home.xml │ │ │ ├── icon_tab_plus.xml │ │ │ ├── icon_arrow_down_gest.xml │ │ │ ├── icon_arrow_up_gest.xml │ │ │ ├── icon_profile_protected.xml │ │ │ ├── icon_bookmark.xml │ │ │ ├── icon_post.xml │ │ │ ├── icon_tab.xml │ │ │ ├── icon_delete.xml │ │ │ ├── icon_desktop.xml │ │ │ ├── icon_star.xml │ │ │ ├── icon_clipboard.xml │ │ │ ├── icon_profile_standard.xml │ │ │ ├── dialog_border.xml │ │ │ ├── icon_edit.xml │ │ │ ├── icon_image.xml │ │ │ ├── icon_open_with.xml │ │ │ ├── icon_tab_remove.xml │ │ │ ├── icon_redirect.xml │ │ │ ├── icon_popup.xml │ │ │ ├── icon_profile_trusted.xml │ │ │ ├── icon_search.xml │ │ │ ├── icon_https.xml │ │ │ ├── icon_alert.xml │ │ │ ├── icon_image_broken.xml │ │ │ ├── icon_screen.xml │ │ │ ├── icon_tab_background.xml │ │ │ ├── icon_tab_unselected.xml │ │ │ ├── icon_dots.xml │ │ │ ├── icon_menu_save.xml │ │ │ ├── icon_refresh.xml │ │ │ ├── icon_audio.xml │ │ │ ├── icon_overflow.xml │ │ │ ├── icon_link.xml │ │ │ ├── icon_adblock.xml │ │ │ ├── icon_location.xml │ │ │ ├── icon_history.xml │ │ │ ├── icon_camera.xml │ │ │ ├── icon_close.xml │ │ │ ├── icon_help.xml │ │ │ ├── icon_profile_changed.xml │ │ │ ├── icon_http.xml │ │ │ ├── icon_microphone.xml │ │ │ ├── icon_save_as.xml │ │ │ ├── icon_dom.xml │ │ │ ├── icon_paste.xml │ │ │ ├── icon_menu_share.xml │ │ │ ├── icon_savedata.xml │ │ │ ├── icon_night.xml │ │ │ ├── icon_java.xml │ │ │ ├── icon_cookie.xml │ │ │ ├── icon_web.xml │ │ │ ├── ic_launcher_monochrome.xml │ │ │ ├── icon_settings.xml │ │ │ └── icon_fingerprint.xml │ │ ├── layout │ │ │ ├── view_preference_switch.xml │ │ │ ├── custom_redirects_list.xml │ │ │ ├── dialog_edit_text.xml │ │ │ ├── custom_redirects_row.xml │ │ │ ├── activity_settings.xml │ │ │ ├── create_new_redirect.xml │ │ │ ├── item_menu.xml │ │ │ ├── activity_settings_delete.xml │ │ │ └── activity_settings_backup.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── xml │ │ │ ├── data_extraction_rules.xml │ │ │ ├── backup.xml │ │ │ ├── preference_backup.xml │ │ │ ├── preference_delete.xml │ │ │ ├── preference_setting.xml │ │ │ └── preference_general.xml │ │ ├── raw │ │ │ └── error.svg │ │ └── values-night │ │ │ └── themes.xml │ │ └── java │ │ └── de │ │ └── baumann │ │ └── browser │ │ ├── browser │ │ ├── AlbumController.java │ │ ├── BrowserController.java │ │ ├── DataURIParser.java │ │ ├── BrowserContainer.java │ │ ├── List_trusted.java │ │ ├── List_standard.java │ │ └── List_protected.java │ │ ├── view │ │ ├── RedirectsViewHolder.java │ │ ├── GridItem.java │ │ ├── NinjaToast.java │ │ ├── AdapterProfileList.java │ │ ├── AdapterCustomRedirect.java │ │ └── SwipeTouchListener.java │ │ ├── fragment │ │ ├── Fragment_settings_Filter.java │ │ ├── Fragment_settings_General.java │ │ ├── Fragment_settings_Profile.java │ │ ├── Fragment_settings_Delete.java │ │ ├── Fragment_settings_Gesture.java │ │ └── Fragment_settings_UI.java │ │ ├── objects │ │ ├── CustomRedirect.java │ │ └── CustomRedirectsHelper.java │ │ ├── unit │ │ ├── ClipboardUnit.java │ │ └── RecordUnit.java │ │ ├── ShareActivity.java │ │ ├── database │ │ ├── RecordHelper.java │ │ └── Record.java │ │ ├── activity │ │ ├── Settings_UI.java │ │ ├── Settings_Backup.java │ │ ├── Settings_Activity.java │ │ ├── Settings_Filter.java │ │ ├── Settings_General.java │ │ ├── Settings_Gesture.java │ │ ├── Settings_PrivacyActivity.java │ │ └── Settings_Profile.java │ │ └── preferences │ │ ├── ListSwitchPreference.java │ │ └── BasePreferenceFragment.java └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── crowdin.yml ├── .idea ├── vcs.xml └── gradle.xml ├── .gitignore ├── .travis.yml ├── LICENSE.md ├── .SECURITY.md ├── .github └── FUNDING.yml ├── gradlew.bat └── CODE_OF_CONDUCT.md /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/title.txt: -------------------------------------------------------------------------------- 1 | FOSS Browser -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | FOSS Browser -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | android.enableJetifier=true 2 | android.useAndroidX=true -------------------------------------------------------------------------------- /wiki/ui_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/ui_filter.png -------------------------------------------------------------------------------- /graphics/Zeichnung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/graphics/Zeichnung.png -------------------------------------------------------------------------------- /wiki/settings_ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_ui.png -------------------------------------------------------------------------------- /wiki/ui_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/ui_overview.png -------------------------------------------------------------------------------- /app/debug/app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/debug/app-debug.apk -------------------------------------------------------------------------------- /wiki/settings_backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_backup.png -------------------------------------------------------------------------------- /wiki/settings_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_delete.png -------------------------------------------------------------------------------- /wiki/settings_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_filter.png -------------------------------------------------------------------------------- /wiki/ui_fast_toggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/ui_fast_toggle.png -------------------------------------------------------------------------------- /app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/release/app-release.apk -------------------------------------------------------------------------------- /graphics/Zeichnung_wiki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/graphics/Zeichnung_wiki.png -------------------------------------------------------------------------------- /graphics/featuresGrafic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/graphics/featuresGrafic.png -------------------------------------------------------------------------------- /wiki/settings_edit_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_edit_list.png -------------------------------------------------------------------------------- /wiki/settings_general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_general.png -------------------------------------------------------------------------------- /wiki/settings_gestures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_gestures.png -------------------------------------------------------------------------------- /wiki/settings_privacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_privacy.png -------------------------------------------------------------------------------- /graphics/settings_template.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/graphics/settings_template.xcf -------------------------------------------------------------------------------- /wiki/settings_edit_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/wiki/settings_edit_profile.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /graphics/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/graphics/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | "FOSS Browser" is a fully free (as in freedom) open source Android browser. -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/short_description.txt: -------------------------------------------------------------------------------- 1 | "FOSS Browser" ist ein komplett freier (wie in Freiheit), quelloffener Browser für Android. -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /app/src/**/res/values/strings*.xml 3 | translation: /%original_path%-%two_letters_code%/%original_file_name% 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #474A00 4 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/136.txt: -------------------------------------------------------------------------------- 1 | ### v 9.5 2 | 3 | - fix: can't open URL from outside, if it was closed before 4 | - fix: Active button colors on OLED theme #1006 5 | - new: hebrew translation -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/136.txt: -------------------------------------------------------------------------------- 1 | ### v 9.5 2 | 3 | - fix: can't open URL from outside, if it was closed before 4 | - fix: Active button colors on OLED theme #1006 5 | - new: hebrew translation -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/130.txt: -------------------------------------------------------------------------------- 1 | ### v 9.0 2 | 3 | - fix: popup menu in Overview 4 | - fix: searchbar not hiding in back pressing #852 5 | - fix: edit favorites layout not scrolling #854 6 | - updated: translations -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/130.txt: -------------------------------------------------------------------------------- 1 | ### v 9.0 2 | 3 | - fix: popup menu in Overview 4 | - fix: searchbar not hiding in back pressing #852 5 | - fix: edit favorites layout not scrolling #854 6 | - updated: translations -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195258_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195258_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195354_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195354_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195412_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195412_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195506_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195506_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195534_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195534_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195617_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/Screenshot_20230322-195617_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195258_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195258_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195354_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195354_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195412_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195412_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195506_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195506_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195534_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195534_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195617_FOSS Browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/T8RIN/browser/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/Screenshot_20230322-195617_FOSS Browser.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/120.txt: -------------------------------------------------------------------------------- 1 | ### v 8.4.1 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - new: FOSS Browser in context menu of marked text #723 7 | - updated: translations -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/120.txt: -------------------------------------------------------------------------------- 1 | ### v 8.4.1 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - new: FOSS Browser in context menu of marked text #723 7 | - updated: translations -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_list_tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/browser/AlbumController.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.browser; 2 | 3 | import android.view.View; 4 | 5 | public interface AlbumController { 6 | View getAlbumView(); 7 | void activate(); 8 | void deactivate(); 9 | } 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Oct 23 22:58:08 CEST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip 7 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/133.txt: -------------------------------------------------------------------------------- 1 | ### v 9.3 2 | 3 | - fix: Half screen after orientation change #919 4 | - fix: not all menu items accessible in landscape orientation 5 | - fix: Download dialog does not decode multibyte file name #917 6 | - fix: File name is not shown in the download prompt #916 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/133.txt: -------------------------------------------------------------------------------- 1 | ### v 9.3 2 | 3 | - fix: Half screen after orientation change #919 4 | - fix: not all menu items accessible in landscape orientation 5 | - fix: Download dialog does not decode multibyte file name #917 6 | - fix: File name is not shown in the download prompt #916 -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_chip_icon_state.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_chip_state_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/127.txt: -------------------------------------------------------------------------------- 1 | v 8.8 2 | 3 | - new: Wiki integrated in settings and menus 4 | - new: notification when playing audio on background #800 5 | - new: gestures 6 | - fix: mailto and other intents not working 7 | - fix: button "reload " is hidden #803 8 | - fix: play audio in background #800 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/127.txt: -------------------------------------------------------------------------------- 1 | v 8.8 2 | 3 | - new: Wiki integrated in settings and menus 4 | - new: notification when playing audio on background #800 5 | - new: gestures 6 | - fix: mailto and other intents not working 7 | - fix: button "reload " is hidden #803 8 | - fix: play audio in background #800 -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_chip_state_list_domain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_preference_switch.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | # files for the dex VM 3 | # Java class files 4 | # generated files 5 | gen/ 6 | 7 | # Local configuration file (sdk path, etc) 8 | local.properties 9 | 10 | # Eclipse project files 11 | # Android Studio 12 | .idea/ 13 | .gradle 14 | gradle 15 | *.iml 16 | /app/debug/ 17 | /app/release/ 18 | /app/build/ 19 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/139.txt: -------------------------------------------------------------------------------- 1 | ### v 9.11 "Traven" 2 | 3 | - new: context menu in tab overview 4 | - new: icons in menus 5 | - new: delete entries from search 6 | - new: http-warning before loading 7 | - fix: layout in menus 8 | - fix: menus 9 | - fix: onReceivedHttpAuthRequest password showing #1069 10 | - fix: download names #1071 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/139.txt: -------------------------------------------------------------------------------- 1 | ### v 9.11 "Traven" 2 | 3 | - new: context menu in tab overview 4 | - new: icons in menus 5 | - new: delete entries from search 6 | - new: http-warning before loading 7 | - fix: layout in menus 8 | - fix: menus 9 | - fix: onReceivedHttpAuthRequest password showing #1069 10 | - fix: download names #1071 -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_check.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/135.txt: -------------------------------------------------------------------------------- 1 | ### v 9.4 2 | 3 | - new: "post on website" in sharing menu 4 | - new: Serbo-Croation translation 5 | - new: Support app split screen #937 6 | - fix: Restored functionality to proceed according to user selection #941 7 | - updated: translations 8 | - updated: build libraries 9 | - removed: swipe to reload -> use gestures instead -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/135.txt: -------------------------------------------------------------------------------- 1 | ### v 9.4 2 | 3 | - new: "post on website" in sharing menu 4 | - new: Serbo-Croation translation 5 | - new: Support app split screen #937 6 | - fix: Restored functionality to proceed according to user selection #941 7 | - updated: translations 8 | - updated: build libraries 9 | - removed: swipe to reload -> use gestures instead -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/124.txt: -------------------------------------------------------------------------------- 1 | ### v 8.6 2 | 3 | - new: play audio on background 4 | - new: Quick toggle to keep screen on 5 | - new: Option to keep screen awake 6 | - updated: Privacy Policy 7 | - updated: translations 8 | - improved: MaterialYou theme 9 | - improved: search in history, bookmarks, ... 10 | - improved: close open tabs dialog after making selection -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/125.txt: -------------------------------------------------------------------------------- 1 | ### v 8.6 2 | 3 | - new: play audio on background 4 | - new: Quick toggle to keep screen on 5 | - new: Option to keep screen awake 6 | - updated: Privacy Policy 7 | - updated: translations 8 | - improved: MaterialYou theme 9 | - improved: search in history, bookmarks, ... 10 | - improved: close open tabs dialog after making selection -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/124.txt: -------------------------------------------------------------------------------- 1 | ### v 8.6 2 | 3 | - new: play audio on background 4 | - new: Quick toggle to keep screen on 5 | - new: Option to keep screen awake 6 | - updated: Privacy Policy 7 | - updated: translations 8 | - improved: MaterialYou theme 9 | - improved: search in history, bookmarks, ... 10 | - improved: close open tabs dialog after making selection -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/125.txt: -------------------------------------------------------------------------------- 1 | ### v 8.6 2 | 3 | - new: play audio on background 4 | - new: Quick toggle to keep screen on 5 | - new: Option to keep screen awake 6 | - updated: Privacy Policy 7 | - updated: translations 8 | - improved: MaterialYou theme 9 | - improved: search in history, bookmarks, ... 10 | - improved: close open tabs dialog after making selection -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_list_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_download.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/view/RedirectsViewHolder.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.view; 2 | 3 | import android.view.View; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.recyclerview.widget.RecyclerView; 7 | 8 | public class RedirectsViewHolder extends RecyclerView.ViewHolder { 9 | public RedirectsViewHolder(@NonNull View view) { 10 | super(view); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/134.txt: -------------------------------------------------------------------------------- 1 | ### v 9.3 2 | 3 | - fix: Half screen after orientation change #919 4 | - fix: not all menu items accessible in landscape orientation 5 | - fix: Download dialog does not decode multibyte file name #917 6 | - fix: File name is not shown in the download prompt #916 7 | - fix: Browser crashes when switching embedded video to full screen #925 8 | - fix: Persistent swipe issues #924 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/134.txt: -------------------------------------------------------------------------------- 1 | ### v 9.3 2 | 3 | - fix: Half screen after orientation change #919 4 | - fix: not all menu items accessible in landscape orientation 5 | - fix: Download dialog does not decode multibyte file name #917 6 | - fix: File name is not shown in the download prompt #916 7 | - fix: Browser crashes when switching embedded video to full screen #925 8 | - fix: Persistent swipe issues #924 -------------------------------------------------------------------------------- /app/release/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "de.foss.browser", 8 | "variantName": "release", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "versionCode": 117, 14 | "versionName": "8.2", 15 | "outputFile": "app-release.apk" 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /app/debug/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "de.baumann.browser", 8 | "variantName": "processDebugResources", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "versionCode": 106, 14 | "versionName": "7.3", 15 | "outputFile": "app-debug.apk" 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_file.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_home.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_tab_plus.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_arrow_down_gest.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_arrow_up_gest.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/view/GridItem.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.view; 2 | 3 | public class GridItem { 4 | private final String title; 5 | private final int data; 6 | 7 | public GridItem (String title, int data) { 8 | this.title = title; 9 | this.data = data; 10 | } 11 | 12 | public String getTitle() { 13 | return title; 14 | } 15 | public int getData() { 16 | return data; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_profile_protected.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_bookmark.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_post.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/fragment/Fragment_settings_Filter.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.fragment; 2 | 3 | import android.os.Bundle; 4 | 5 | import de.baumann.browser.R; 6 | import de.baumann.browser.preferences.BasePreferenceFragment; 7 | 8 | public class Fragment_settings_Filter extends BasePreferenceFragment { 9 | @Override 10 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 11 | setPreferencesFromResource(R.xml.preference_filter, rootKey); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_desktop.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_star.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/118.txt: -------------------------------------------------------------------------------- 1 | ### v 8.3 (WIP) 2 | 3 | - fix: Swipe to reload not working sometimes #654 4 | - fix: Restoring bookmarks does not work properly #653 5 | - fix: some force closes #642 #643 6 | - fix: gestures and text-edit-scrolling collide #633 7 | - fix: Toolbar hides, but reappears if page is refreshed #660 8 | - fix: minor fixes and UIredirects webview 9 | - new: save dektopMode, Javascript, domStorage also for history items 10 | - removed: PlayStore support 11 | - updated: translations -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/118.txt: -------------------------------------------------------------------------------- 1 | ### v 8.3 (WIP) 2 | 3 | - fix: Swipe to reload not working sometimes #654 4 | - fix: Restoring bookmarks does not work properly #653 5 | - fix: some force closes #642 #643 6 | - fix: gestures and text-edit-scrolling collide #633 7 | - fix: Toolbar hides, but reappears if page is refreshed #660 8 | - fix: minor fixes and UIredirects webview 9 | - new: save dektopMode, Javascript, domStorage also for history items 10 | - removed: PlayStore support 11 | - updated: translations -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/138.txt: -------------------------------------------------------------------------------- 1 | ### v 9.10 2 | 3 | - new: Clipboard record preference thanks to @Bnyro 4 | - new: show url on link menus or when clicking menu title 5 | - new: show urls in lists 6 | - new: tab number in overview 7 | - fix: refactored settings 8 | - fix: layout issues on small devices #976 9 | - fix: Password field for protected sites shows entries #1039 10 | - fix: youtube redirects 11 | - fix: onReceivedError 12 | - fix: Settings refactor thanks to @Bnyro 13 | - fix: OLED theme issues #1052 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/138.txt: -------------------------------------------------------------------------------- 1 | ### v 9.10 2 | 3 | - new: Clipboard record preference thanks to @Bnyro 4 | - new: show url on link menus or when clicking menu title 5 | - new: show urls in lists 6 | - new: tab number in overview 7 | - fix: refactored settings 8 | - fix: layout issues on small devices #976 9 | - fix: Password field for protected sites shows entries #1039 10 | - fix: youtube redirects 11 | - fix: onReceivedError 12 | - fix: Settings refactor thanks to @Bnyro 13 | - fix: OLED theme issues #1052 -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | android: 3 | components: 4 | - tools 5 | - platform-tools 6 | - tools 7 | 8 | before_install: 9 | - yes | sdkmanager "platforms;android-27" "build-tools;27.0.3" 10 | 11 | before_cache: 12 | - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock 13 | - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ 14 | cache: 15 | directories: 16 | - $HOME/.gradle/caches/ 17 | - $HOME/.gradle/wrapper/ 18 | - $HOME/.android/build-cache 19 | script: 20 | - ./gradlew build 21 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/fragment/Fragment_settings_General.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.fragment; 2 | 3 | import android.os.Bundle; 4 | 5 | import de.baumann.browser.R; 6 | import de.baumann.browser.preferences.BasePreferenceFragment; 7 | 8 | public class Fragment_settings_General extends BasePreferenceFragment { 9 | @Override 10 | public void onCreatePreferences(Bundle savedInstanceState,String rootKey) { 11 | setPreferencesFromResource(R.xml.preference_general, rootKey); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/117.txt: -------------------------------------------------------------------------------- 1 | - fix: chip desktop, javascript, DOM should not be visible in settings when editing filter names (thanks to @woheller69) 2 | - fix: Sometimes Favicon is stored several times in database (thanks to @woheller69) 3 | - fix: permission problems 4 | - fix: download problems 5 | - new: edit startSite and history items 6 | - new: Privacy Enhancement #602 (thanks to @woheller69) 7 | - new: choose preferred theme 8 | - updated: Edit filter names (thanks to @woheller69) 9 | - updated: backup preference -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/117.txt: -------------------------------------------------------------------------------- 1 | - fix: chip desktop, javascript, DOM should not be visible in settings when editing filter names (thanks to @woheller69) 2 | - fix: Sometimes Favicon is stored several times in database (thanks to @woheller69) 3 | - fix: permission problems 4 | - fix: download problems 5 | - new: edit startSite and history items 6 | - new: Privacy Enhancement #602 (thanks to @woheller69) 7 | - new: choose preferred theme 8 | - updated: Edit filter names (thanks to @woheller69) 9 | - updated: backup preference -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/view/NinjaToast.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.view; 2 | 3 | import android.content.Context; 4 | import android.widget.Toast; 5 | 6 | 7 | public class NinjaToast { 8 | 9 | public static void show(Context context, int stringResId) { 10 | Toast.makeText(context, context.getString(stringResId), Toast.LENGTH_SHORT).show(); 11 | } 12 | 13 | public static void show(Context context, String text) { 14 | Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_clipboard.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_profile_standard.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_edit.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/128.txt: -------------------------------------------------------------------------------- 1 | ### v 8.9 2 | 3 | - fix: some webpages show half the screen #817 4 | - fix: Shortcut on the home screen #830 5 | - fix: crash on first start #829 #820 6 | - fix: Settings button does not open settings #823 7 | - fix: cannot connect to some webservices #818 8 | - fix: default user-agent is now received from installed webview 9 | - updated: translations 10 | - new: moved tab-dialog in overview 11 | - new: permanent night mode (optional) #825 12 | - new: help buttons in most important UI-elements -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/129.txt: -------------------------------------------------------------------------------- 1 | ### v 8.9 2 | 3 | - fix: some webpages show half the screen #817 4 | - fix: Shortcut on the home screen #830 5 | - fix: crash on first start #829 #820 6 | - fix: Settings button does not open settings #823 7 | - fix: cannot connect to some webservices #818 8 | - fix: default user-agent is now received from installed webview 9 | - updated: translations 10 | - new: moved tab-dialog in overview 11 | - new: permanent night mode (optional) #825 12 | - new: help buttons in most important UI-elements -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/128.txt: -------------------------------------------------------------------------------- 1 | ### v 8.9 2 | 3 | - fix: some webpages show half the screen #817 4 | - fix: Shortcut on the home screen #830 5 | - fix: crash on first start #829 #820 6 | - fix: Settings button does not open settings #823 7 | - fix: cannot connect to some webservices #818 8 | - fix: default user-agent is now received from installed webview 9 | - updated: translations 10 | - new: moved tab-dialog in overview 11 | - new: permanent night mode (optional) #825 12 | - new: help buttons in most important UI-elements -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/129.txt: -------------------------------------------------------------------------------- 1 | ### v 8.9 2 | 3 | - fix: some webpages show half the screen #817 4 | - fix: Shortcut on the home screen #830 5 | - fix: crash on first start #829 #820 6 | - fix: Settings button does not open settings #823 7 | - fix: cannot connect to some webservices #818 8 | - fix: default user-agent is now received from installed webview 9 | - updated: translations 10 | - new: moved tab-dialog in overview 11 | - new: permanent night mode (optional) #825 12 | - new: help buttons in most important UI-elements -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_open_with.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/119.txt: -------------------------------------------------------------------------------- 1 | ### v 8.4 2 | 3 | - new: camera use (thanks to @woheller69) 4 | - new: microphone use 5 | - new: webRTC support 6 | - new: DRM protected video playback (thanks to @woheller69) 7 | - new: support of encrypted backups (thanks to @woheller69) 8 | - new: profiles instead of whitelists 9 | - new: restore tabs on restart (optional) 10 | - new: restore tabs when killed by system (optional) (thanks to @woheller69) 11 | - fix: AutoComplete TextView (thanks to @woheller69) 12 | - updated: setting screens -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/119.txt: -------------------------------------------------------------------------------- 1 | ### v 8.4 2 | 3 | - new: camera use (thanks to @woheller69) 4 | - new: microphone use 5 | - new: webRTC support 6 | - new: DRM protected video playback (thanks to @woheller69) 7 | - new: support of encrypted backups (thanks to @woheller69) 8 | - new: profiles instead of whitelists 9 | - new: restore tabs on restart (optional) 10 | - new: restore tabs when killed by system (optional) (thanks to @woheller69) 11 | - fix: AutoComplete TextView (thanks to @woheller69) 12 | - updated: setting screens -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_tab_remove.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_redirect.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_popup.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_profile_trusted.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_search.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_redirects_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_https.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_alert.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_image_broken.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/131.txt: -------------------------------------------------------------------------------- 1 | ### v 9.1 2 | 3 | - fix: removed unnecessary toasts in fastToggle 4 | - fix: Browser crash on search with "%" #861 5 | - fix: progressbar visible when searching 6 | - fix: UI of FastToggleDialog #872 7 | - fix: UI of edit/save as dialog #873 8 | - fix: https warning #863 9 | - fix: Images not displayed #881 10 | - new: gesture to copy link to clipboard #868 11 | - new: copy link to clipboard in context menu #878 12 | - new: switched license to APGL 13 | - new: redirect YouTube/Instagram/Twitter links 14 | - new: show number of tabs in overview -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/131.txt: -------------------------------------------------------------------------------- 1 | ### v 9.1 2 | 3 | - fix: removed unnecessary toasts in fastToggle 4 | - fix: Browser crash on search with "%" #861 5 | - fix: progressbar visible when searching 6 | - fix: UI of FastToggleDialog #872 7 | - fix: UI of edit/save as dialog #873 8 | - fix: https warning #863 9 | - fix: Images not displayed #881 10 | - new: gesture to copy link to clipboard #868 11 | - new: copy link to clipboard in context menu #878 12 | - new: switched license to APGL 13 | - new: redirect YouTube/Instagram/Twitter links 14 | - new: show number of tabs in overview -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_tab_background.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_tab_unselected.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_dots.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_menu_save.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_refresh.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_audio.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_overflow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/126.txt: -------------------------------------------------------------------------------- 1 | ### v 8.7 2 | 3 | - fix: dark theme in settings activities 4 | - fix: night mode (webView) 5 | - new: play audio on background 6 | - new: Quick toggle to keep screen on 7 | - new: gesture settings for long pressing 8 | - new: open links in background 9 | - new: swipe through menu 10 | - updated: F-Droid (screenshots, description) 11 | - updated: Privacy Policy 12 | - updated: translations (17 languages supported!) 13 | - improved: MaterialYou theme 14 | - improved: search in history, bookmarks, ... 15 | - improved: close open tabs dialog after making selection -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/126.txt: -------------------------------------------------------------------------------- 1 | ### v 8.7 2 | 3 | - fix: dark theme in settings activities 4 | - fix: night mode (webView) 5 | - new: play audio on background 6 | - new: Quick toggle to keep screen on 7 | - new: gesture settings for long pressing 8 | - new: open links in background 9 | - new: swipe through menu 10 | - updated: F-Droid (screenshots, description) 11 | - updated: Privacy Policy 12 | - updated: translations (17 languages supported!) 13 | - improved: MaterialYou theme 14 | - improved: search in history, bookmarks, ... 15 | - improved: close open tabs dialog after making selection -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_adblock.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_location.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | This program is free software: you can redistribute it and/or modify 2 | it under the terms of the GNU Affero General Public License as published by 3 | the Free Software Foundation, either version 3 of the License, or 4 | (at your option) any later version. 5 | 6 | This program is distributed in the hope that it will be useful, 7 | but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | GNU Affero General Public License for more details: . 10 | 11 | **Used open source libraries:** 12 | 13 | "Material Design Icons" 14 | https://github.com/Templarian/MaterialDesign -------------------------------------------------------------------------------- /app/src/main/res/raw/error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_close.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/132.txt: -------------------------------------------------------------------------------- 1 | ### v 9.2 2 | 3 | - fix: crash when sharing links #883 4 | - fix: no password field on webserver authentication #891 5 | - fix: some swiping issues #899 by Lakjdf 6 | - fix: support for intent scheme URLs again #898 by Lakjdf 7 | - fix: refactored code to make it much more readable #896 by T8RIN 8 | - fix: share link 9 | - fix: Home-screen links improvment #906 10 | - fix: no password field on authentication dialog #891 11 | - updated: layout and user experience 12 | - updated: settings for night view 13 | - updated: settings for gestures 14 | - updated: settings for editing profiles #909 15 | - updated translations: *Now 21 languages are fully supported!* -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/132.txt: -------------------------------------------------------------------------------- 1 | ### v 9.2 2 | 3 | - fix: crash when sharing links #883 4 | - fix: no password field on webserver authentication #891 5 | - fix: some swiping issues #899 by Lakjdf 6 | - fix: support for intent scheme URLs again #898 by Lakjdf 7 | - fix: refactored code to make it much more readable #896 by T8RIN 8 | - fix: share link 9 | - fix: Home-screen links improvment #906 10 | - fix: no password field on authentication dialog #891 11 | - updated: layout and user experience 12 | - updated: settings for night view 13 | - updated: settings for gestures 14 | - updated: settings for editing profiles #909 15 | - updated translations: *Now 21 languages are fully supported!* -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/objects/CustomRedirect.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.objects; 2 | 3 | public class CustomRedirect { 4 | public String source; 5 | public String target; 6 | 7 | public CustomRedirect(String source, String target) { 8 | this.source = source; 9 | this.target = target; 10 | } 11 | 12 | public void setSource(String source) { 13 | this.source = source; 14 | } 15 | 16 | public String getSource() { 17 | return source; 18 | } 19 | 20 | public void setTarget(String target) { 21 | this.target = target; 22 | } 23 | 24 | public String getTarget() { 25 | return target; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_profile_changed.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/unit/ClipboardUnit.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.unit; 2 | 3 | import android.app.Activity; 4 | import android.content.ClipData; 5 | import android.content.ClipboardManager; 6 | import android.content.Context; 7 | 8 | import androidx.annotation.Nullable; 9 | 10 | public class ClipboardUnit { 11 | @Nullable 12 | public static String getPrimary(Activity activity) { 13 | ClipboardManager clipboardManager = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE); 14 | ClipData primaryClip = clipboardManager.getPrimaryClip(); 15 | if (primaryClip == null) return null; 16 | return primaryClip.getItemAt(0).getText().toString(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/browser/BrowserController.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.browser; 2 | 3 | import android.graphics.Bitmap; 4 | import android.net.Uri; 5 | import android.view.View; 6 | import android.webkit.ValueCallback; 7 | import android.webkit.WebChromeClient; 8 | 9 | public interface BrowserController { 10 | void updateProgress(int progress); 11 | void showAlbum(AlbumController albumController); 12 | void removeAlbum(AlbumController albumController); 13 | void showFileChooser(ValueCallback filePathCallback); 14 | void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback); 15 | void hideOverview(); 16 | void onHideCustomView(); 17 | Bitmap favicon (); 18 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_http.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/114.txt: -------------------------------------------------------------------------------- 1 | - new: edit bookmark-url (thanks to @woheller69) 2 | - new: Reload on swipeDown when at top of webpage (thanks to @woheller69) 3 | - new: Added GlobalPrivacyControl (thanks to @woheller69) 4 | - new: Remove device info from useragent, use prefixes like DuckDuckGo browser (thanks to @woheller69) 5 | - new: fivicons in bookmarklist (thanks to @woheller69) 6 | - new: option to select blocked content 7 | - updated: do not track (thanks to @woheller69) 8 | - updated: translations 9 | - fix: sorting of tabs in overview 10 | - fix: DOM-storage description in settings 11 | - fix: apply settings on back/forward navigation 12 | - fix: Ad-Blocking also blocks "social" media 13 | - fix: open link externally -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/115.txt: -------------------------------------------------------------------------------- 1 | - new: edit bookmark-url (thanks to @woheller69) 2 | - new: Reload on swipeDown when at top of webpage (thanks to @woheller69) 3 | - new: Added GlobalPrivacyControl (thanks to @woheller69) 4 | - new: Remove device info from useragent, use prefixes like DuckDuckGo browser (thanks to @woheller69) 5 | - new: fivicons in bookmarklist (thanks to @woheller69) 6 | - new: option to select blocked content 7 | - updated: do not track (thanks to @woheller69) 8 | - updated: translations 9 | - fix: sorting of tabs in overview 10 | - fix: DOM-storage description in settings 11 | - fix: apply settings on back/forward navigation 12 | - fix: Ad-Blocking also blocks "social" media 13 | - fix: open link externally -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/116.txt: -------------------------------------------------------------------------------- 1 | - new: edit bookmark-url (thanks to @woheller69) 2 | - new: Reload on swipeDown when at top of webpage (thanks to @woheller69) 3 | - new: Added GlobalPrivacyControl (thanks to @woheller69) 4 | - new: Remove device info from useragent, use prefixes like DuckDuckGo browser (thanks to @woheller69) 5 | - new: fivicons in bookmarklist (thanks to @woheller69) 6 | - new: option to select blocked content 7 | - updated: do not track (thanks to @woheller69) 8 | - updated: translations 9 | - fix: sorting of tabs in overview 10 | - fix: DOM-storage description in settings 11 | - fix: apply settings on back/forward navigation 12 | - fix: Ad-Blocking also blocks "social" media 13 | - fix: open link externally -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/114.txt: -------------------------------------------------------------------------------- 1 | - new: edit bookmark-url (thanks to @woheller69) 2 | - new: Reload on swipeDown when at top of webpage (thanks to @woheller69) 3 | - new: Added GlobalPrivacyControl (thanks to @woheller69) 4 | - new: Remove device info from useragent, use prefixes like DuckDuckGo browser (thanks to @woheller69) 5 | - new: fivicons in bookmarklist (thanks to @woheller69) 6 | - new: option to select blocked content 7 | - updated: do not track (thanks to @woheller69) 8 | - updated: translations 9 | - fix: sorting of tabs in overview 10 | - fix: DOM-storage description in settings 11 | - fix: apply settings on back/forward navigation 12 | - fix: Ad-Blocking also blocks "social" media 13 | - fix: open link externally -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/115.txt: -------------------------------------------------------------------------------- 1 | - new: edit bookmark-url (thanks to @woheller69) 2 | - new: Reload on swipeDown when at top of webpage (thanks to @woheller69) 3 | - new: Added GlobalPrivacyControl (thanks to @woheller69) 4 | - new: Remove device info from useragent, use prefixes like DuckDuckGo browser (thanks to @woheller69) 5 | - new: fivicons in bookmarklist (thanks to @woheller69) 6 | - new: option to select blocked content 7 | - updated: do not track (thanks to @woheller69) 8 | - updated: translations 9 | - fix: sorting of tabs in overview 10 | - fix: DOM-storage description in settings 11 | - fix: apply settings on back/forward navigation 12 | - fix: Ad-Blocking also blocks "social" media 13 | - fix: open link externally -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/116.txt: -------------------------------------------------------------------------------- 1 | - new: edit bookmark-url (thanks to @woheller69) 2 | - new: Reload on swipeDown when at top of webpage (thanks to @woheller69) 3 | - new: Added GlobalPrivacyControl (thanks to @woheller69) 4 | - new: Remove device info from useragent, use prefixes like DuckDuckGo browser (thanks to @woheller69) 5 | - new: fivicons in bookmarklist (thanks to @woheller69) 6 | - new: option to select blocked content 7 | - updated: do not track (thanks to @woheller69) 8 | - updated: translations 9 | - fix: sorting of tabs in overview 10 | - fix: DOM-storage description in settings 11 | - fix: apply settings on back/forward navigation 12 | - fix: Ad-Blocking also blocks "social" media 13 | - fix: open link externally -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_microphone.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_save_as.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_dom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_list_start.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 12 | 13 | 14 | 15 | 18 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_paste.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/122.txt: -------------------------------------------------------------------------------- 1 | v 8.5.1 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - fix: stay at night mode, when openeing bookmark 7 | - fix: close open tabs window after making selection #746 8 | - new: restart and reload tabs 9 | - new: Material You Design #726 10 | - new: OLED dark theme Feature #742 11 | - new: FOSS Browser in context menu of marked text #723 12 | - new: remember night mode per site #669 13 | - new: adding "copy link" button to download dialog #733 14 | - new: remember night mode, when opening new tabs 15 | - new: gesture: open start site 16 | - new: keep screen on 17 | - improved: set favicons (thanks to @woheller69) 18 | - updated: translations 19 | - updated: build libraries -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/123.txt: -------------------------------------------------------------------------------- 1 | v 8.5.2 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - fix: stay at night mode, when openeing bookmark 7 | - fix: close open tabs window after making selection #746 8 | - new: restart and reload tabs 9 | - new: Material You Design #726 10 | - new: OLED dark theme Feature #742 11 | - new: FOSS Browser in context menu of marked text #723 12 | - new: remember night mode per site #669 13 | - new: adding "copy link" button to download dialog #733 14 | - new: remember night mode, when opening new tabs 15 | - new: gesture: open start site 16 | - new: keep screen on 17 | - improved: set favicons (thanks to @woheller69) 18 | - updated: translations 19 | - updated: build libraries -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/122.txt: -------------------------------------------------------------------------------- 1 | v 8.5.1 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - fix: stay at night mode, when openeing bookmark 7 | - fix: close open tabs window after making selection #746 8 | - new: restart and reload tabs 9 | - new: Material You Design #726 10 | - new: OLED dark theme Feature #742 11 | - new: FOSS Browser in context menu of marked text #723 12 | - new: remember night mode per site #669 13 | - new: adding "copy link" button to download dialog #733 14 | - new: remember night mode, when opening new tabs 15 | - new: gesture: open start site 16 | - new: keep screen on 17 | - improved: set favicons (thanks to @woheller69) 18 | - updated: translations 19 | - updated: build libraries -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/123.txt: -------------------------------------------------------------------------------- 1 | v 8.5.2 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - fix: stay at night mode, when openeing bookmark 7 | - fix: close open tabs window after making selection #746 8 | - new: restart and reload tabs 9 | - new: Material You Design #726 10 | - new: OLED dark theme Feature #742 11 | - new: FOSS Browser in context menu of marked text #723 12 | - new: remember night mode per site #669 13 | - new: adding "copy link" button to download dialog #733 14 | - new: remember night mode, when opening new tabs 15 | - new: gesture: open start site 16 | - new: keep screen on 17 | - improved: set favicons (thanks to @woheller69) 18 | - updated: translations 19 | - updated: build libraries -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/121.txt: -------------------------------------------------------------------------------- 1 | ### v 8.5 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - fix: stay at night mode, when openeing bookmark 7 | - fix: close open tabs window after making selection #746 8 | - new: restart and reload tabs 9 | - new: Material You Design #726 10 | - new: OLED dark theme Feature #742 11 | - new: FOSS Browser in context menu of marked text #723 12 | - new: remember night mode per site #669 13 | - new: adding "copy link" button to download dialog #733 14 | - new: remember night mode, when opening new tabs 15 | - new: gesture: open start site 16 | - new: keep screen on 17 | - improved: set favicons (thanks to @woheller69) 18 | - updated: translations 19 | - updated: build libraries -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/121.txt: -------------------------------------------------------------------------------- 1 | ### v 8.5 2 | 3 | - fix: camera issue #729 4 | - fix: profile icon in toolbar #728 5 | - fix: cookie settings when switching tab 6 | - fix: stay at night mode, when openeing bookmark 7 | - fix: close open tabs window after making selection #746 8 | - new: restart and reload tabs 9 | - new: Material You Design #726 10 | - new: OLED dark theme Feature #742 11 | - new: FOSS Browser in context menu of marked text #723 12 | - new: remember night mode per site #669 13 | - new: adding "copy link" button to download dialog #733 14 | - new: remember night mode, when opening new tabs 15 | - new: gesture: open start site 16 | - new: keep screen on 17 | - improved: set favicons (thanks to @woheller69) 18 | - updated: translations 19 | - updated: build libraries -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/ShareActivity.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | 7 | import de.baumann.browser.activity.BrowserActivity; 8 | 9 | public class ShareActivity extends Activity { 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | Intent intent = getIntent(); 14 | String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); 15 | Intent browserIntent = new Intent(this, BrowserActivity.class); 16 | browserIntent.putExtra(android.content.Intent.EXTRA_TEXT, sharedText); 17 | browserIntent.setAction("postLink"); 18 | startActivity(browserIntent); 19 | finish(); 20 | } 21 | } -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username e.g., user1 5 | open_collective: # Replace with a single Open Collective username e.g., user1 6 | ko_fi: # Replace with a single Ko-fi username e.g., user1 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username e.g., user1 10 | issuehunt: # Replace with a single IssueHunt username e.g., user1 11 | otechie: # Replace with a single Otechie username e.g., user1 12 | custom: ['https://www.paypal.com/donate/?hosted_button_id=NP6TGYDYP9SHY'] 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_menu_share.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_list_bookmark.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 12 | 13 | 14 | 15 | 18 | 21 | 22 | 23 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/113.txt: -------------------------------------------------------------------------------- 1 | - new: toggle mobile/desktop mode (thanks to @woheller69) 2 | - new: auto update of AdBlock-hosts (thanks to @woheller69) 3 | - new: save desktop mode/javascript/DOM content settings in bookmarks (thanks to @woheller69) 4 | - new: show colored bookmark icon when editing bookmark category (thanks to @woheller69) 5 | - new: Use settings stored in bookmark when a bookmark is found in search (thanks to @woheller69) 6 | - new: Show icon source of item (start page, bookmarks, history) in search (thanks to @woheller69) 7 | - new: save form data/use autofill service in settings 8 | - updated: translations 9 | - fix: correct icon colors when importing bookmarks (thanks to @woheller69) 10 | - fix: content hidden by toolbar 11 | - fix: opening new tabs on older Android versions 12 | - fix: Dark mode not applied to all tabs 13 | - fix: toolbar input handling -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/113.txt: -------------------------------------------------------------------------------- 1 | - new: toggle mobile/desktop mode (thanks to @woheller69) 2 | - new: auto update of AdBlock-hosts (thanks to @woheller69) 3 | - new: save desktop mode/javascript/DOM content settings in bookmarks (thanks to @woheller69) 4 | - new: show colored bookmark icon when editing bookmark category (thanks to @woheller69) 5 | - new: Use settings stored in bookmark when a bookmark is found in search (thanks to @woheller69) 6 | - new: Show icon source of item (start page, bookmarks, history) in search (thanks to @woheller69) 7 | - new: save form data/use autofill service in settings 8 | - updated: translations 9 | - fix: correct icon colors when importing bookmarks (thanks to @woheller69) 10 | - fix: content hidden by toolbar 11 | - fix: opening new tabs on older Android versions 12 | - fix: Dark mode not applied to all tabs 13 | - fix: toolbar input handling -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_savedata.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_edit_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_night.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_java.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_bottom_overview.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 16 | 21 | 22 | 27 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_cookie.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/browser/DataURIParser.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.browser; 2 | 3 | import android.util.Base64; 4 | import android.webkit.MimeTypeMap; 5 | 6 | public class DataURIParser { 7 | 8 | private final String filename; 9 | private final byte[] imagedata; 10 | 11 | public DataURIParser(String url) { 12 | //Log.d("DataURIParse", url); 13 | String data = url.substring(url.indexOf(",") + 1); 14 | //Log.d("DataURIParse", data); 15 | String mimeType = url.substring(url.indexOf(":") + 1, url.indexOf(";")); 16 | //Log.d("DataURIParse", mimeType); 17 | String fileType = url.substring(url.indexOf(":") + 1, url.indexOf("/")); 18 | //Log.d("DataURIParse", fileType); 19 | String suffix = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); 20 | //Log.d("DataURIParse", suffix); 21 | filename = fileType + "." + suffix; 22 | //Log.d("DataURIParse", filename); 23 | imagedata = Base64.decode(data, Base64.DEFAULT); 24 | } 25 | 26 | public String getFilename() { 27 | return filename; 28 | } 29 | 30 | public byte[] getImagedata() { 31 | return imagedata; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/changelogs/137.txt: -------------------------------------------------------------------------------- 1 | ### v 9.6 2 | 3 | - removed: redirection for Instagram 4 | - fix: Redirect error from YouTube #991 5 | - fix: loading images fit screen width 6 | - fix: cookie manager, when going back in history 7 | - fix: buttons not reachable on some dialogs 8 | - fix: Auth-request dialog 9 | - fix: download dialog 10 | - fix: startsite is now the wiki #997 11 | - fix: crash when open downloads, while default file manager not installed 12 | - fix: issues with the file name when downloading thanks to @Bnyro 13 | - fix: kill the app on pressing quit thanks to @Bnyro thanks to @Bnyro 14 | - fix: theme settings 15 | - fix: suppress DRM notice #1019 16 | - fix: profile icons - red for attached profiles #999 17 | - fix: Youtube videos in full screen mode cropped #1015 18 | - fix: Twitter-to-Nitter redirector matches some unrelated urls #1022 19 | - fix: & not escaped in search URL #959 20 | - fix: lint issues 21 | - new: circular progress - press to stop loading 22 | - new: Swedish translation 23 | - new: material dialogs in the preferences thanks to @Bnyro 24 | - new: monochrome icon for Android 13+ thanks to @Bnyro 25 | - new: custom redirects thanks to @Bnyro 26 | - new: Custom error pages thanks to @Bnyro -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/137.txt: -------------------------------------------------------------------------------- 1 | ### v 9.6 2 | 3 | - removed: redirection for Instagram 4 | - fix: Redirect error from YouTube #991 5 | - fix: loading images fit screen width 6 | - fix: cookie manager, when going back in history 7 | - fix: buttons not reachable on some dialogs 8 | - fix: Auth-request dialog 9 | - fix: download dialog 10 | - fix: startsite is now the wiki #997 11 | - fix: crash when open downloads, while default file manager not installed 12 | - fix: issues with the file name when downloading thanks to @Bnyro 13 | - fix: kill the app on pressing quit thanks to @Bnyro thanks to @Bnyro 14 | - fix: theme settings 15 | - fix: suppress DRM notice #1019 16 | - fix: profile icons - red for attached profiles #999 17 | - fix: Youtube videos in full screen mode cropped #1015 18 | - fix: Twitter-to-Nitter redirector matches some unrelated urls #1022 19 | - fix: & not escaped in search URL #959 20 | - fix: lint issues 21 | - new: circular progress - press to stop loading 22 | - new: Swedish translation 23 | - new: material dialogs in the preferences thanks to @Bnyro 24 | - new: monochrome icon for Android 13+ thanks to @Bnyro 25 | - new: custom redirects thanks to @Bnyro 26 | - new: Custom error pages thanks to @Bnyro -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 33 5 | 6 | compileOptions { 7 | sourceCompatibility JavaVersion.VERSION_1_8 8 | targetCompatibility JavaVersion.VERSION_1_8 9 | } 10 | 11 | defaultConfig { 12 | applicationId "de.baumann.browser" 13 | minSdkVersion 24 14 | targetSdkVersion 33 15 | versionCode 139 16 | versionName "9.11" 17 | multiDexEnabled true 18 | vectorDrawables.useSupportLibrary = true 19 | } 20 | 21 | buildTypes { 22 | release { 23 | minifyEnabled false 24 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 25 | } 26 | } 27 | lint { 28 | checkReleaseBuilds false 29 | disable 'MissingTranslation' 30 | } 31 | namespace 'de.baumann.browser' 32 | 33 | return void 34 | } 35 | 36 | dependencies { 37 | implementation 'androidx.appcompat:appcompat:1.6.1' 38 | implementation 'com.google.android.material:material:1.9.0-beta01' 39 | implementation 'androidx.preference:preference:1.2.0' 40 | implementation 'androidx.legacy:legacy-preference-v14:1.0.0' 41 | implementation 'androidx.webkit:webkit:1.6.0' 42 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_redirects_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 23 | 24 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_backup.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 16 | 17 | 21 | 22 | 26 | 27 | 31 | 32 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 16 | 17 | 21 | 22 | 23 | 24 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 30 | 31 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_web.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | 28 | 31 | 32 | 35 | 36 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/browser/BrowserContainer.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.browser; 2 | 3 | import java.util.LinkedList; 4 | import java.util.List; 5 | 6 | import de.baumann.browser.view.NinjaWebView; 7 | 8 | public class BrowserContainer { 9 | private static final List list = new LinkedList<>(); 10 | 11 | public static AlbumController get(int index) { 12 | return list.get(index); 13 | } 14 | 15 | public synchronized static void add(AlbumController controller) { 16 | list.add(controller); 17 | } 18 | 19 | public synchronized static void add(AlbumController controller, int index) { 20 | list.add(index, controller); 21 | } 22 | 23 | public synchronized static void remove(AlbumController controller) { 24 | ((NinjaWebView) controller).destroy(); 25 | list.remove(controller); 26 | } 27 | 28 | public static int indexOf(AlbumController controller) { 29 | return list.indexOf(controller); 30 | } 31 | 32 | public static List list() { 33 | return list; 34 | } 35 | 36 | public static int size() { 37 | return list.size(); 38 | } 39 | 40 | public synchronized static void clear() { 41 | for (AlbumController albumController : list) { 42 | ((NinjaWebView) albumController).destroy(); 43 | } 44 | list.clear(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/database/RecordHelper.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.database; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import android.database.sqlite.SQLiteOpenHelper; 6 | 7 | import de.baumann.browser.unit.RecordUnit; 8 | 9 | class RecordHelper extends SQLiteOpenHelper { 10 | private static final String DATABASE_NAME = "Ninja4.db"; 11 | private static final int DATABASE_VERSION = 4; 12 | 13 | RecordHelper(Context context) { 14 | super(context, DATABASE_NAME, null, DATABASE_VERSION); 15 | } 16 | 17 | @Override 18 | public void onCreate(SQLiteDatabase database) { 19 | database.execSQL(RecordUnit.CREATE_HISTORY); 20 | database.execSQL(RecordUnit.CREATE_TRUSTED); 21 | database.execSQL(RecordUnit.CREATE_PROTECTED); 22 | database.execSQL(RecordUnit.CREATE_START); 23 | database.execSQL(RecordUnit.CREATE_BOOKMARK); 24 | database.execSQL(RecordUnit.CREATE_STANDARD); 25 | } 26 | 27 | // UPGRADE ATTENTION!!! 28 | @Override 29 | public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 30 | switch (oldVersion) { 31 | case 1: 32 | database.execSQL(RecordUnit.CREATE_BOOKMARK); 33 | case 2: 34 | database.execSQL(RecordUnit.CREATE_STANDARD); 35 | case 3: 36 | // database.execSQL(RecordUnit.CREATE_TAB); 37 | // we want all updates, so no break statement here... 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/view/AdapterProfileList.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.view; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ArrayAdapter; 8 | import android.widget.TextView; 9 | 10 | import androidx.annotation.NonNull; 11 | 12 | import java.util.List; 13 | 14 | import de.baumann.browser.R; 15 | 16 | public class AdapterProfileList extends ArrayAdapter { 17 | private final Context context; 18 | private final int layoutResId; 19 | private final List list; 20 | 21 | public AdapterProfileList(Context context, List list) { 22 | super(context, R.layout.item_list, list); 23 | this.context = context; 24 | this.layoutResId = R.layout.item_list; 25 | this.list = list; 26 | } 27 | 28 | @SuppressWarnings("NullableProblems") 29 | @NonNull 30 | @Override 31 | public View getView(final int position, View convertView, @NonNull ViewGroup parent) { 32 | Holder holder; 33 | View view = convertView; 34 | if (view == null) { 35 | view = LayoutInflater.from(context).inflate(layoutResId, parent, false); 36 | holder = new Holder(); 37 | holder.domain = view.findViewById(R.id.titleView); 38 | view.setTag(holder); 39 | } else { 40 | holder = (Holder) view.getTag(); 41 | } 42 | holder.domain.setText(list.get(position)); 43 | return view; 44 | } 45 | 46 | private static class Holder { 47 | TextView domain; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/res/layout/create_new_redirect.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 21 | 22 | 23 | 24 | 29 | 30 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/fragment/Fragment_settings_Profile.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.fragment; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.os.Bundle; 6 | 7 | import androidx.preference.PreferenceManager; 8 | 9 | import java.util.Objects; 10 | 11 | import de.baumann.browser.R; 12 | import de.baumann.browser.preferences.BasePreferenceFragment; 13 | 14 | public class Fragment_settings_Profile extends BasePreferenceFragment { 15 | 16 | @Override 17 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 18 | Context context = getContext(); 19 | assert context != null; 20 | 21 | SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 22 | String profile = sp.getString("profileToEdit", "profileStandard"); 23 | 24 | switch (Objects.requireNonNull(profile)) { 25 | case "profileStandard": 26 | setPreferencesFromResource(R.xml.preference_profile_standard, rootKey); 27 | PreferenceManager.setDefaultValues(context, R.xml.preference_profile_standard, false); 28 | break; 29 | case "profileTrusted": 30 | setPreferencesFromResource(R.xml.preference_profile_trusted, rootKey); 31 | PreferenceManager.setDefaultValues(context, R.xml.preference_profile_trusted, false); 32 | break; 33 | case "profileProtected": 34 | setPreferencesFromResource(R.xml.preference_profile_protected, rootKey); 35 | PreferenceManager.setDefaultValues(context, R.xml.preference_profile_protected, false); 36 | break; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/objects/CustomRedirectsHelper.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.objects; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | 6 | import androidx.preference.PreferenceManager; 7 | 8 | import org.json.JSONArray; 9 | import org.json.JSONException; 10 | import org.json.JSONObject; 11 | 12 | import java.util.ArrayList; 13 | 14 | public class CustomRedirectsHelper { 15 | 16 | public final static String CUSTOM_REDIRECTS_KEY = "customRedirects"; 17 | 18 | public static ArrayList getRedirects(SharedPreferences preferences) throws JSONException { 19 | ArrayList redirects = new ArrayList<>(); 20 | String redirectsPref = preferences.getString(CUSTOM_REDIRECTS_KEY, "[]"); 21 | 22 | JSONArray array = new JSONArray(redirectsPref); 23 | for (int i = 0; i < array.length(); i++) { 24 | JSONObject redirect = array.getJSONObject(i); 25 | String source = redirect.getString("source"); 26 | String target = redirect.getString("target"); 27 | redirects.add(new CustomRedirect(source, target)); 28 | } 29 | return redirects; 30 | } 31 | 32 | public static void saveRedirects(Context context, ArrayList redirects) throws JSONException { 33 | SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 34 | 35 | JSONArray array = new JSONArray(); 36 | for (int i = 0; i < redirects.size(); i++) { 37 | CustomRedirect redirect = redirects.get(i); 38 | JSONObject object = new JSONObject(); 39 | object.put("source", redirect.getSource()); 40 | object.put("target", redirect.getTarget()); 41 | array.put(object); 42 | } 43 | 44 | preferences.edit().putString(CUSTOM_REDIRECTS_KEY, array.toString()).apply(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_general.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 12 | 13 | 19 | 20 | 21 | 22 | 24 | 25 | 31 | 32 | 38 | 39 | 40 | 41 | 43 | 44 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/browser/List_trusted.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.browser; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import de.baumann.browser.database.RecordAction; 9 | import de.baumann.browser.unit.HelperUnit; 10 | import de.baumann.browser.unit.RecordUnit; 11 | 12 | public class List_trusted { 13 | 14 | private static final List listTrusted = new ArrayList<>(); 15 | private final Context context; 16 | 17 | public List_trusted(Context context) { 18 | this.context = context; 19 | loadDomains(context); 20 | } 21 | 22 | private synchronized static void loadDomains(Context context) { 23 | RecordAction action = new RecordAction(context); 24 | action.open(false); 25 | listTrusted.clear(); 26 | listTrusted.addAll(action.listDomains(RecordUnit.TABLE_TRUSTED)); 27 | action.close(); 28 | } 29 | 30 | public boolean isWhite(String url) { 31 | for (String domain : listTrusted) { 32 | if (url != null && HelperUnit.domain(url).equals(domain)) { 33 | return true; 34 | } 35 | } 36 | return false; 37 | } 38 | 39 | public synchronized void addDomain(String domain) { 40 | RecordAction action = new RecordAction(context); 41 | action.open(true); 42 | action.addDomain(domain, RecordUnit.TABLE_TRUSTED); 43 | action.close(); 44 | listTrusted.add(domain); 45 | } 46 | 47 | public synchronized void removeDomain(String domain) { 48 | RecordAction action = new RecordAction(context); 49 | action.open(true); 50 | action.deleteDomain(domain, RecordUnit.TABLE_TRUSTED); 51 | action.close(); 52 | listTrusted.remove(domain); 53 | } 54 | 55 | public synchronized void clearDomains() { 56 | RecordAction action = new RecordAction(context); 57 | action.open(true); 58 | action.clearTable(RecordUnit.TABLE_TRUSTED); 59 | action.close(); 60 | listTrusted.clear(); 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/browser/List_standard.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.browser; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import de.baumann.browser.database.RecordAction; 9 | import de.baumann.browser.unit.HelperUnit; 10 | import de.baumann.browser.unit.RecordUnit; 11 | 12 | public class List_standard { 13 | 14 | private static final List listStandard = new ArrayList<>(); 15 | private final Context context; 16 | 17 | public List_standard(Context context) { 18 | this.context = context; 19 | loadDomains(context); 20 | } 21 | 22 | private synchronized static void loadDomains(Context context) { 23 | RecordAction action = new RecordAction(context); 24 | action.open(false); 25 | listStandard.clear(); 26 | listStandard.addAll(action.listDomains(RecordUnit.TABLE_STANDARD)); 27 | action.close(); 28 | } 29 | 30 | public boolean isWhite(String url) { 31 | for (String domain : listStandard) { 32 | if (url != null && HelperUnit.domain(url).equals(domain)) { 33 | return true; 34 | } 35 | } 36 | return false; 37 | } 38 | 39 | public synchronized void addDomain(String domain) { 40 | RecordAction action = new RecordAction(context); 41 | action.open(true); 42 | action.addDomain(domain, RecordUnit.TABLE_STANDARD); 43 | action.close(); 44 | listStandard.add(domain); 45 | } 46 | 47 | public synchronized void removeDomain(String domain) { 48 | RecordAction action = new RecordAction(context); 49 | action.open(true); 50 | action.deleteDomain(domain, RecordUnit.TABLE_STANDARD); 51 | action.close(); 52 | listStandard.remove(domain); 53 | } 54 | 55 | public synchronized void clearDomains() { 56 | RecordAction action = new RecordAction(context); 57 | action.open(true); 58 | action.clearTable(RecordUnit.TABLE_STANDARD); 59 | action.close(); 60 | listStandard.clear(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/browser/List_protected.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.browser; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import de.baumann.browser.database.RecordAction; 9 | import de.baumann.browser.unit.HelperUnit; 10 | import de.baumann.browser.unit.RecordUnit; 11 | 12 | public class List_protected { 13 | 14 | private static final List listProtected = new ArrayList<>(); 15 | private final Context context; 16 | 17 | public List_protected(Context context) { 18 | this.context = context; 19 | loadDomains(context); 20 | } 21 | 22 | private synchronized static void loadDomains(Context context) { 23 | RecordAction action = new RecordAction(context); 24 | action.open(false); 25 | listProtected.clear(); 26 | listProtected.addAll(action.listDomains(RecordUnit.TABLE_PROTECTED)); 27 | action.close(); 28 | } 29 | 30 | public boolean isWhite(String url) { 31 | for (String domain : listProtected) { 32 | if (url != null && HelperUnit.domain(url).equals(domain)) { 33 | return true; 34 | } 35 | } 36 | return false; 37 | } 38 | 39 | public synchronized void addDomain(String domain) { 40 | RecordAction action = new RecordAction(context); 41 | action.open(true); 42 | action.addDomain(domain, RecordUnit.TABLE_PROTECTED); 43 | action.close(); 44 | listProtected.add(domain); 45 | } 46 | 47 | public synchronized void removeDomain(String domain) { 48 | RecordAction action = new RecordAction(context); 49 | action.open(true); 50 | action.deleteDomain(domain, RecordUnit.TABLE_PROTECTED); 51 | action.close(); 52 | listProtected.remove(domain); 53 | } 54 | 55 | public synchronized void clearDomains() { 56 | RecordAction action = new RecordAction(context); 57 | action.open(true); 58 | action.clearTable(RecordUnit.TABLE_PROTECTED); 59 | action.close(); 60 | listProtected.clear(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 15 | 16 | 20 | 21 | 31 | 32 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/fragment/Fragment_settings_Delete.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.fragment; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.SharedPreferences; 6 | import android.os.Bundle; 7 | 8 | import androidx.appcompat.app.AlertDialog; 9 | import androidx.preference.Preference; 10 | 11 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; 12 | 13 | import de.baumann.browser.R; 14 | import de.baumann.browser.preferences.BasePreferenceFragment; 15 | import de.baumann.browser.unit.HelperUnit; 16 | 17 | public class Fragment_settings_Delete extends BasePreferenceFragment { 18 | 19 | @Override 20 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 21 | 22 | setPreferencesFromResource(R.xml.preference_delete, rootKey); 23 | Activity activity = getActivity(); 24 | assert activity != null; 25 | Context context = getContext(); 26 | assert context != null; 27 | 28 | Preference sp_deleteDatabase = findPreference("sp_deleteDatabase"); 29 | assert sp_deleteDatabase != null; 30 | sp_deleteDatabase.setOnPreferenceClickListener(preference -> { 31 | final SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); 32 | MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity); 33 | builder.setIcon(R.drawable.icon_delete); 34 | builder.setTitle(R.string.menu_delete); 35 | builder.setMessage(R.string.hint_database); 36 | builder.setPositiveButton(R.string.app_ok, (dialog, whichButton) -> { 37 | dialog.cancel(); 38 | activity.deleteDatabase("Ninja4.db"); 39 | activity.deleteDatabase("faviconView.db"); 40 | assert sp != null; 41 | sp.edit().putInt("restart_changed", 1).apply(); 42 | activity.finish(); 43 | }); 44 | builder.setNegativeButton(R.string.app_cancel, (dialog, whichButton) -> dialog.cancel()); 45 | AlertDialog dialog = builder.create(); 46 | dialog.show(); 47 | HelperUnit.setupDialog(context, dialog); 48 | return false; 49 | }); 50 | } 51 | } -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/view/AdapterCustomRedirect.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.view; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | import android.widget.TextView; 8 | 9 | import androidx.annotation.NonNull; 10 | import androidx.recyclerview.widget.RecyclerView; 11 | 12 | import java.util.ArrayList; 13 | 14 | import de.baumann.browser.R; 15 | import de.baumann.browser.objects.CustomRedirect; 16 | 17 | public class AdapterCustomRedirect extends RecyclerView.Adapter { 18 | final private ArrayList redirects; 19 | 20 | public AdapterCustomRedirect(ArrayList redirects) { 21 | super(); 22 | this.redirects = redirects; 23 | } 24 | 25 | @NonNull 26 | @Override 27 | public RedirectsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 28 | View view = LayoutInflater.from(parent.getContext()) 29 | .inflate(R.layout.custom_redirects_row, parent, false); 30 | 31 | return new RedirectsViewHolder(view); 32 | 33 | } 34 | 35 | @Override 36 | public void onBindViewHolder(@NonNull RedirectsViewHolder holder, int position) { 37 | CustomRedirect current = redirects.get(position); 38 | TextView source = holder.itemView.findViewById(R.id.redirect_source); 39 | TextView target = holder.itemView.findViewById(R.id.redirect_target); 40 | ImageView remove = holder.itemView.findViewById(R.id.remove_redirect); 41 | source.setText(current.getSource()); 42 | target.setText(current.getTarget()); 43 | remove.setOnClickListener((iV) -> { 44 | redirects.remove(position); 45 | notifyItemRemoved(position); 46 | notifyItemRangeChanged(position, getItemCount()); 47 | }); 48 | } 49 | 50 | @Override 51 | public int getItemCount() { 52 | return redirects.size(); 53 | } 54 | 55 | public ArrayList getRedirects() { 56 | return redirects; 57 | } 58 | 59 | public void addRedirect(CustomRedirect redirect) { 60 | redirects.add(redirect); 61 | notifyItemInserted(getItemCount() - 1); 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | 22 | 23 | 24 | 25 | 28 | 29 | 33 | 34 | 38 | 39 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_fingerprint.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/database/Record.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.database; 2 | 3 | public class Record { 4 | 5 | private final int ordinal; 6 | private Boolean isDesktopMode; 7 | private Boolean isNightMode; 8 | private long iconColor; 9 | private String title; 10 | private String url; 11 | private long time; 12 | private int type; //0 History, 1 Start site, 2 Bookmark 13 | 14 | public Record() { 15 | this.title = null; 16 | this.url = null; 17 | this.time = 0L; 18 | this.ordinal = -1; 19 | this.type = -1; 20 | this.isDesktopMode = null; 21 | this.iconColor = 0L; 22 | } 23 | 24 | public Record(String title, String url, long time, int ordinal, int type, Boolean DesktopMode, Boolean NightMode, long iconColor) { 25 | this.title = title; 26 | this.url = url; 27 | this.time = time; 28 | this.ordinal = ordinal; 29 | this.type = type; 30 | this.isDesktopMode = DesktopMode; 31 | this.isNightMode = NightMode; 32 | this.iconColor = iconColor; 33 | } 34 | 35 | public long getIconColor() { 36 | return iconColor; 37 | } 38 | 39 | public void setIconColor(long iconColor) { 40 | this.iconColor = iconColor; 41 | } 42 | 43 | public Boolean getDesktopMode() { 44 | return isDesktopMode; 45 | } 46 | 47 | public void setDesktopMode(Boolean desktopMode) { 48 | isDesktopMode = desktopMode; 49 | } 50 | 51 | public Boolean getNightMode() { 52 | return isNightMode; 53 | } 54 | 55 | public void setNightMode(Boolean desktopMode) { 56 | isNightMode = desktopMode; 57 | } 58 | 59 | public String getTitle() { 60 | return title; 61 | } 62 | 63 | public void setTitle(String title) { 64 | this.title = title; 65 | } 66 | 67 | public String getURL() { 68 | return url; 69 | } 70 | 71 | public void setURL(String url) { 72 | this.url = url; 73 | } 74 | 75 | public long getTime() { 76 | return time; 77 | } 78 | 79 | public void setTime(long time) { 80 | this.time = time; 81 | } 82 | 83 | int getOrdinal() { 84 | return ordinal; 85 | } 86 | 87 | public int getType() { 88 | return type; 89 | } 90 | 91 | public void setType(int type) { 92 | this.type = type; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_UI.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.net.Uri; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.app.AppCompatDelegate; 12 | import androidx.appcompat.widget.Toolbar; 13 | import androidx.core.content.ContextCompat; 14 | 15 | import java.util.Objects; 16 | 17 | import de.baumann.browser.R; 18 | import de.baumann.browser.fragment.Fragment_settings_UI; 19 | import de.baumann.browser.unit.BrowserUnit; 20 | import de.baumann.browser.unit.HelperUnit; 21 | 22 | public class Settings_UI extends AppCompatActivity { 23 | 24 | @Override 25 | public void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 29 | Window window = this.getWindow(); 30 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 31 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 32 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 33 | 34 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 35 | HelperUnit.initTheme(this); 36 | setContentView(R.layout.activity_settings); 37 | Toolbar toolbar = findViewById(R.id.toolbar); 38 | setSupportActionBar(toolbar); 39 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 40 | 41 | getSupportFragmentManager() 42 | .beginTransaction() 43 | .replace(R.id.content_frame, new Fragment_settings_UI()) 44 | .commit(); 45 | } 46 | 47 | @Override 48 | public boolean onCreateOptionsMenu(Menu menu) { 49 | getMenuInflater().inflate(R.menu.menu_help, menu); 50 | return super.onCreateOptionsMenu(menu); 51 | } 52 | 53 | @Override 54 | public boolean onOptionsItemSelected(MenuItem menuItem) { 55 | if (menuItem.getItemId() == android.R.id.home) finish(); 56 | if (menuItem.getItemId() == R.id.menu_help) { 57 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Behavior-UI"); 58 | BrowserUnit.intentURL(this, webpage); 59 | } 60 | return true; 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_Backup.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.net.Uri; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.app.AppCompatDelegate; 12 | import androidx.appcompat.widget.Toolbar; 13 | import androidx.core.content.ContextCompat; 14 | 15 | import java.util.Objects; 16 | 17 | import de.baumann.browser.R; 18 | import de.baumann.browser.fragment.Fragment_settings_Backup; 19 | import de.baumann.browser.unit.BrowserUnit; 20 | import de.baumann.browser.unit.HelperUnit; 21 | 22 | public class Settings_Backup extends AppCompatActivity { 23 | 24 | @Override 25 | public void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 29 | Window window = this.getWindow(); 30 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 31 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 32 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 33 | 34 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 35 | HelperUnit.initTheme(this); 36 | setContentView(R.layout.activity_settings_backup); 37 | Toolbar toolbar = findViewById(R.id.toolbar); 38 | setSupportActionBar(toolbar); 39 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 40 | 41 | getSupportFragmentManager() 42 | .beginTransaction() 43 | .replace(R.id.content_frame, new Fragment_settings_Backup()) 44 | .commit(); 45 | } 46 | 47 | @Override 48 | public boolean onCreateOptionsMenu(Menu menu) { 49 | getMenuInflater().inflate(R.menu.menu_help, menu); 50 | return super.onCreateOptionsMenu(menu); 51 | } 52 | 53 | @Override 54 | public boolean onOptionsItemSelected(MenuItem menuItem) { 55 | if (menuItem.getItemId() == android.R.id.home) finish(); 56 | if (menuItem.getItemId() == R.id.menu_help) { 57 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Backup"); 58 | BrowserUnit.intentURL(this, webpage); 59 | } 60 | return true; 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_Activity.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.net.Uri; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.app.AppCompatDelegate; 12 | import androidx.appcompat.widget.Toolbar; 13 | import androidx.core.content.ContextCompat; 14 | 15 | import java.util.Objects; 16 | 17 | import de.baumann.browser.R; 18 | import de.baumann.browser.fragment.Fragment_settings; 19 | import de.baumann.browser.unit.BrowserUnit; 20 | import de.baumann.browser.unit.HelperUnit; 21 | 22 | public class Settings_Activity extends AppCompatActivity { 23 | 24 | @Override 25 | public void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 29 | Window window = this.getWindow(); 30 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 31 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 32 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 33 | 34 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 35 | HelperUnit.initTheme(this); 36 | setContentView(R.layout.activity_settings); 37 | Toolbar toolbar = findViewById(R.id.toolbar); 38 | setSupportActionBar(toolbar); 39 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 40 | 41 | getSupportFragmentManager() 42 | .beginTransaction() 43 | .replace(R.id.content_frame, new Fragment_settings()) 44 | .commit(); 45 | } 46 | 47 | @Override 48 | public boolean onCreateOptionsMenu(Menu menu) { 49 | getMenuInflater().inflate(R.menu.menu_help, menu); 50 | return super.onCreateOptionsMenu(menu); 51 | } 52 | 53 | @Override 54 | public boolean onOptionsItemSelected(MenuItem menuItem) { 55 | if (menuItem.getItemId() == android.R.id.home) finish(); 56 | else if (menuItem.getItemId() == R.id.menu_help) { 57 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Settings-(Main-screen)"); 58 | BrowserUnit.intentURL(this, webpage); 59 | } 60 | return true; 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_Filter.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.net.Uri; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.app.AppCompatDelegate; 12 | import androidx.appcompat.widget.Toolbar; 13 | import androidx.core.content.ContextCompat; 14 | 15 | import java.util.Objects; 16 | 17 | import de.baumann.browser.R; 18 | import de.baumann.browser.fragment.Fragment_settings_Filter; 19 | import de.baumann.browser.unit.BrowserUnit; 20 | import de.baumann.browser.unit.HelperUnit; 21 | 22 | public class Settings_Filter extends AppCompatActivity { 23 | 24 | @Override 25 | public void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 29 | Window window = this.getWindow(); 30 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 31 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 32 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 33 | 34 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 35 | HelperUnit.initTheme(this); 36 | setContentView(R.layout.activity_settings); 37 | Toolbar toolbar = findViewById(R.id.toolbar); 38 | setSupportActionBar(toolbar); 39 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 40 | 41 | getSupportFragmentManager() 42 | .beginTransaction() 43 | .replace(R.id.content_frame, new Fragment_settings_Filter()) 44 | .commit(); 45 | } 46 | 47 | @Override 48 | public boolean onCreateOptionsMenu(Menu menu) { 49 | getMenuInflater().inflate(R.menu.menu_help, menu); 50 | return super.onCreateOptionsMenu(menu); 51 | } 52 | 53 | @Override 54 | public boolean onOptionsItemSelected(MenuItem menuItem) { 55 | if (menuItem.getItemId() == android.R.id.home) finish(); 56 | if (menuItem.getItemId() == R.id.menu_help) { 57 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Bookmark-filter"); 58 | BrowserUnit.intentURL(this, webpage); 59 | } 60 | return true; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_General.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.net.Uri; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.app.AppCompatDelegate; 12 | import androidx.appcompat.widget.Toolbar; 13 | import androidx.core.content.ContextCompat; 14 | 15 | import java.util.Objects; 16 | 17 | import de.baumann.browser.R; 18 | import de.baumann.browser.fragment.Fragment_settings_General; 19 | import de.baumann.browser.unit.BrowserUnit; 20 | import de.baumann.browser.unit.HelperUnit; 21 | 22 | public class Settings_General extends AppCompatActivity { 23 | 24 | @Override 25 | public void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 29 | Window window = this.getWindow(); 30 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 31 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 32 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 33 | 34 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 35 | HelperUnit.initTheme(this); 36 | setContentView(R.layout.activity_settings); 37 | Toolbar toolbar = findViewById(R.id.toolbar); 38 | setSupportActionBar(toolbar); 39 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 40 | 41 | getSupportFragmentManager() 42 | .beginTransaction() 43 | .replace(R.id.content_frame, new Fragment_settings_General()) 44 | .commit(); 45 | } 46 | 47 | @Override 48 | public boolean onCreateOptionsMenu(Menu menu) { 49 | getMenuInflater().inflate(R.menu.menu_help, menu); 50 | return super.onCreateOptionsMenu(menu); 51 | } 52 | 53 | @Override 54 | public boolean onOptionsItemSelected(MenuItem menuItem) { 55 | if (menuItem.getItemId() == android.R.id.home) finish(); 56 | if (menuItem.getItemId() == R.id.menu_help) { 57 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Privacy"); 58 | BrowserUnit.intentURL(this, webpage); 59 | } 60 | return true; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_Gesture.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.net.Uri; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.app.AppCompatDelegate; 12 | import androidx.appcompat.widget.Toolbar; 13 | import androidx.core.content.ContextCompat; 14 | 15 | import java.util.Objects; 16 | 17 | import de.baumann.browser.R; 18 | import de.baumann.browser.fragment.Fragment_settings_Gesture; 19 | import de.baumann.browser.unit.BrowserUnit; 20 | import de.baumann.browser.unit.HelperUnit; 21 | 22 | public class Settings_Gesture extends AppCompatActivity { 23 | 24 | @Override 25 | public void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 29 | Window window = this.getWindow(); 30 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 31 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 32 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 33 | 34 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 35 | HelperUnit.initTheme(this); 36 | setContentView(R.layout.activity_settings); 37 | Toolbar toolbar = findViewById(R.id.toolbar); 38 | setSupportActionBar(toolbar); 39 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 40 | 41 | getSupportFragmentManager() 42 | .beginTransaction() 43 | .replace(R.id.content_frame, new Fragment_settings_Gesture()) 44 | .commit(); 45 | } 46 | 47 | @Override 48 | public boolean onCreateOptionsMenu(Menu menu) { 49 | getMenuInflater().inflate(R.menu.menu_help, menu); 50 | return super.onCreateOptionsMenu(menu); 51 | } 52 | 53 | @Override 54 | public boolean onOptionsItemSelected(MenuItem menuItem) { 55 | if (menuItem.getItemId() == android.R.id.home) finish(); 56 | if (menuItem.getItemId() == R.id.menu_help) { 57 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Gestures"); 58 | BrowserUnit.intentURL(this, webpage); 59 | } 60 | return true; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_PrivacyActivity.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.net.Uri; 4 | import android.os.Bundle; 5 | import android.view.Menu; 6 | import android.view.MenuItem; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.appcompat.app.AppCompatDelegate; 12 | import androidx.appcompat.widget.Toolbar; 13 | import androidx.core.content.ContextCompat; 14 | 15 | import java.util.Objects; 16 | 17 | import de.baumann.browser.R; 18 | import de.baumann.browser.fragment.Fragment_settings_Privacy; 19 | import de.baumann.browser.unit.BrowserUnit; 20 | import de.baumann.browser.unit.HelperUnit; 21 | 22 | public class Settings_PrivacyActivity extends AppCompatActivity { 23 | 24 | @Override 25 | public void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | 28 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 29 | Window window = this.getWindow(); 30 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 31 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 32 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 33 | 34 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 35 | HelperUnit.initTheme(this); 36 | setContentView(R.layout.activity_settings); 37 | Toolbar toolbar = findViewById(R.id.toolbar); 38 | setSupportActionBar(toolbar); 39 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 40 | 41 | getSupportFragmentManager() 42 | .beginTransaction() 43 | .replace(R.id.content_frame, new Fragment_settings_Privacy()) 44 | .commit(); 45 | } 46 | 47 | @Override 48 | public boolean onCreateOptionsMenu(Menu menu) { 49 | getMenuInflater().inflate(R.menu.menu_help, menu); 50 | return super.onCreateOptionsMenu(menu); 51 | } 52 | 53 | @Override 54 | public boolean onOptionsItemSelected(MenuItem menuItem) { 55 | if (menuItem.getItemId() == android.R.id.home) finish(); 56 | if (menuItem.getItemId() == R.id.menu_help) { 57 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Privacy"); 58 | BrowserUnit.intentURL(this, webpage); 59 | } 60 | return true; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks (No NAZIs, nowhere.) 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Attribution 36 | 37 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 38 | 39 | [homepage]: http://contributor-covenant.org 40 | [version]: http://contributor-covenant.org/version/1/4/ 41 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/unit/RecordUnit.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.unit; 2 | 3 | public class RecordUnit { 4 | 5 | /* 6 | 7 | Since FOSS Browser switched from whitelists to profiles to manage privacy settings, 8 | there is a lot of legacy code concerning the database. 9 | 10 | old whitelist -> new profile 11 | 12 | "JAVASCRIPT" whitelist -> Trusted websites 13 | "REMOTE" whitelist -> Standard websites 14 | "TABLE_PROTECTED" whitelist -> Protected websites 15 | 16 | */ 17 | 18 | public static final String TABLE_START = "GRID"; 19 | public static final String TABLE_BOOKMARK = "BOOKAMRK"; 20 | public static final String TABLE_HISTORY = "HISTORY"; 21 | 22 | public static final String TABLE_TRUSTED = "JAVASCRIPT"; 23 | public static final String TABLE_PROTECTED = "COOKIE"; 24 | public static final String TABLE_STANDARD = "REMOTE"; 25 | 26 | public static final String COLUMN_TITLE = "TITLE"; 27 | public static final String COLUMN_URL = "URL"; 28 | public static final String COLUMN_TIME = "TIME"; 29 | public static final String COLUMN_DOMAIN = "DOMAIN"; 30 | public static final String COLUMN_FILENAME = "FILENAME"; 31 | public static final String COLUMN_ORDINAL = "ORDINAL"; 32 | 33 | public static final String CREATE_BOOKMARK = "CREATE TABLE " 34 | + TABLE_BOOKMARK 35 | + " (" 36 | + " " + COLUMN_TITLE + " text," 37 | + " " + COLUMN_URL + " text," 38 | + " " + COLUMN_TIME + " integer" 39 | + ")"; 40 | 41 | public static final String CREATE_HISTORY = "CREATE TABLE " 42 | + TABLE_HISTORY 43 | + " (" 44 | + " " + COLUMN_TITLE + " text," 45 | + " " + COLUMN_URL + " text," 46 | + " " + COLUMN_TIME + " integer" 47 | + ")"; 48 | 49 | public static final String CREATE_TRUSTED = "CREATE TABLE " 50 | + TABLE_TRUSTED 51 | + " (" 52 | + " " + COLUMN_DOMAIN + " text" 53 | + ")"; 54 | 55 | public static final String CREATE_PROTECTED = "CREATE TABLE " 56 | + TABLE_PROTECTED 57 | + " (" 58 | + " " + COLUMN_DOMAIN + " text" 59 | + ")"; 60 | 61 | public static final String CREATE_STANDARD = "CREATE TABLE " 62 | + TABLE_STANDARD 63 | + " (" 64 | + " " + COLUMN_DOMAIN + " text" 65 | + ")"; 66 | 67 | public static final String CREATE_START = "CREATE TABLE " 68 | + TABLE_START 69 | + " (" 70 | + " " + COLUMN_TITLE + " text," 71 | + " " + COLUMN_URL + " text," 72 | + " " + COLUMN_FILENAME + " text," 73 | + " " + COLUMN_ORDINAL + " integer" 74 | + ")"; 75 | } -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/fragment/Fragment_settings_Gesture.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.fragment; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.os.Bundle; 6 | 7 | import androidx.preference.EditTextPreference; 8 | import androidx.preference.ListPreference; 9 | import androidx.preference.Preference; 10 | import androidx.preference.PreferenceGroup; 11 | import androidx.preference.PreferenceManager; 12 | 13 | import java.util.Objects; 14 | 15 | import de.baumann.browser.R; 16 | import de.baumann.browser.preferences.BasePreferenceFragment; 17 | 18 | public class Fragment_settings_Gesture extends BasePreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 19 | 20 | @Override 21 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 22 | 23 | setPreferencesFromResource(R.xml.preference_gesture, rootKey); 24 | Context context = getContext(); 25 | assert context != null; 26 | 27 | PreferenceManager.setDefaultValues(context, R.xml.preference_gesture, false); 28 | initSummary(getPreferenceScreen()); 29 | } 30 | 31 | private void initSummary(Preference p) { 32 | if (p instanceof PreferenceGroup) { 33 | PreferenceGroup pGrp = (PreferenceGroup) p; 34 | for (int i = 0; i < pGrp.getPreferenceCount(); i++) { 35 | initSummary(pGrp.getPreference(i)); 36 | } 37 | } else { 38 | updatePrefSummary(p); 39 | } 40 | } 41 | 42 | private void updatePrefSummary(Preference p) { 43 | if (p instanceof ListPreference) { 44 | ListPreference listPref = (ListPreference) p; 45 | p.setSummary(listPref.getEntry()); 46 | } 47 | if (p instanceof EditTextPreference) { 48 | EditTextPreference editTextPref = (EditTextPreference) p; 49 | if (Objects.requireNonNull(p.getTitle()).toString().toLowerCase().contains("password")) { 50 | p.setSummary("******"); 51 | } else { 52 | p.setSummary(editTextPref.getText()); 53 | } 54 | } 55 | } 56 | 57 | @Override 58 | public void onResume() { 59 | super.onResume(); 60 | Objects.requireNonNull(getPreferenceScreen().getSharedPreferences()).registerOnSharedPreferenceChangeListener(this); 61 | } 62 | 63 | @Override 64 | public void onPause() { 65 | super.onPause(); 66 | Objects.requireNonNull(getPreferenceScreen().getSharedPreferences()).unregisterOnSharedPreferenceChangeListener(this); 67 | } 68 | 69 | @Override 70 | public void onSharedPreferenceChanged(final SharedPreferences sp, String key) { 71 | if (key.equals("sp_gestures_use") || key.equals("sp_gesture_action")) { 72 | sp.edit().putInt("restart_changed", 1).apply(); 73 | } 74 | updatePrefSummary(findPreference(key)); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/view/SwipeTouchListener.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.view; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.view.GestureDetector; 6 | import android.view.MotionEvent; 7 | import android.view.View; 8 | import android.view.View.OnTouchListener; 9 | 10 | 11 | @SuppressWarnings("WeakerAccess") 12 | public class SwipeTouchListener implements OnTouchListener { 13 | 14 | private final GestureDetector gestureDetector; 15 | 16 | public SwipeTouchListener(Context ctx) { 17 | gestureDetector = new GestureDetector(ctx, new GestureListener()); 18 | } 19 | 20 | @SuppressLint("ClickableViewAccessibility") 21 | @Override 22 | public boolean onTouch(View v, MotionEvent event) { 23 | return gestureDetector.onTouchEvent(event); 24 | } 25 | 26 | // ↓ do not remove, needed for swipe listener of the "navigation button" 27 | public void onSwipeRight() { 28 | } 29 | 30 | public void onSwipeLeft() { 31 | } 32 | 33 | public void onSwipeTop() { 34 | } 35 | 36 | public void onSwipeBottom() { 37 | } 38 | 39 | @SuppressWarnings("NullableProblems") 40 | private final class GestureListener extends GestureDetector.SimpleOnGestureListener { 41 | 42 | private static final int SWIPE_THRESHOLD = 100; 43 | private static final int SWIPE_VELOCITY_THRESHOLD = 100; 44 | 45 | @SuppressWarnings("NullableProblems") 46 | @Override 47 | public boolean onDown(MotionEvent e) { 48 | return false; 49 | } 50 | 51 | @Override 52 | public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 53 | if (e1!=null && e2!=null) { 54 | try { 55 | float diffY = e2.getY() - e1.getY(); 56 | float diffX = e2.getX() - e1.getX(); 57 | if (Math.abs(diffX) > Math.abs(diffY)) { 58 | if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 59 | if (diffX > 0) { 60 | onSwipeRight(); 61 | } else { 62 | onSwipeLeft(); 63 | } 64 | } 65 | } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 66 | if (diffY > 0) { 67 | onSwipeBottom(); 68 | } else { 69 | onSwipeTop(); 70 | } 71 | } 72 | } catch (Exception exception) { 73 | exception.printStackTrace(); 74 | } 75 | } 76 | assert e1 != null; 77 | assert e2 != null; 78 | return super.onFling(e1, e2, velocityX, velocityY); 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | "FOSS Browser" is a fully free (as in freedom) open source Android browser: privacy-friendly with a modern user interface. - Your privacy - your data. 2 | 3 | Project Homepage with further info: https://github.com/scoute-dich/browser/ 4 | 5 | 6 | ------------------------------------------------- 7 | UI/Handling 8 | ------------------------------------------------- 9 | 10 | FOSS Browser uses the latest Material You design libraries. Following system day/night mode and a wallpaper based theme are just two features of this new library. The UI is optimized for one-hand-use. All UI-elements are at the bottom of the screen. 11 | 12 | More features: 13 | 14 | • Play audio on background. 15 | • Keep screen on. 16 | • Open links in background. 17 | • Restore tabs on restart. 18 | 19 | 20 | ------------------------------------------------- 21 | Privacy 22 | ------------------------------------------------- 23 | 24 | FOSS Browser uses profiles to protect your privacy. For each profile you can enable or disable: AdBlock, JavaScript, cookies, fingerprint protection and much more. Profiles can also be saved for domains ("github.com" ⇒ Trusted website). This saved domains always overwrite the current profile. So, for example, "github.com" will always open with the trusted profile, even if you are browsing in the protected mode. 25 | 26 | More privacy features: 27 | 28 | • Build in AdBlock, which updates automatically. You can decide which content to block. AdBlock hosts are taken from Steven Black - AbBlock hosts: https://github.com/StevenBlack/hosts. 29 | • Third-part-cookies can not be enabled. 30 | • Enable or disable Android-autofill. 31 | • Delete browser data (on app exit). 32 | • Choose between different search engines (or set a custom one). 33 | • FOSS Browser itself doesn't collect any data 34 | 35 | 36 | ------------------------------------------------- 37 | Bookmarks filter 38 | ------------------------------------------------- 39 | 40 | Organize your bookmarks with filters. You can set custom names for each filter. Long press the bookmark icon in the toolbar to get fast access to your favorite bookmarks. 41 | 42 | 43 | ------------------------------------------------- 44 | Gestures 45 | ------------------------------------------------- 46 | 47 | You can assign nearly twenty different gestures to the toolbar and the toolbar buttons. Each in four directions. You can also trigger events by long pressing the toolbar buttons. So you have up to ten different gestures to control FOSS Browser. Supported is for example: load last website, switch tab, reload, open bookmarks, ... and many more. 48 | 49 | 50 | ------------------------------------------------- 51 | Backups 52 | ------------------------------------------------- 53 | 54 | Backup all your important data (bookmarks, history, trusted websites and so on) on your SD-card. You can also back up FOSS Browser settings. Backups can even be restored on a fresh install or an other device (if you copy the backup files to the new device). -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/full_description.txt: -------------------------------------------------------------------------------- 1 | "FOSS Browser" ist ein komplett freier (wie in Freiheit), quelloffener Browser für Android: datenschutzfreundlich mit einer modernen Benutzeroberfläche. Your privacy - your data. 2 | 3 | Projektseite mit weiteren Informationen: https://github.com/scoute-dich/browser/ 4 | 5 | 6 | ------------------------------------------------- 7 | UI/Handling 8 | ------------------------------------------------- 9 | 10 | FOSS Browser uses the latest Material You design libraries. Following system day/night mode and a wallpaper based theme are just two features of this new library. The UI is optimized for one-hand-use. All UI-elements are at the bottom of the screen. 11 | 12 | More features: 13 | 14 | • Play audio on background. 15 | • Keep screen on. 16 | • Open links in background. 17 | • Restore tabs on restart. 18 | 19 | 20 | ------------------------------------------------- 21 | Privacy 22 | ------------------------------------------------- 23 | 24 | FOSS Browser uses profiles to protect your privacy. For each profile you can enable or disable: AdBlock, JavaScript, cookies, fingerprint protection and much more. Profiles can also be saved for domains ("github.com" ⇒ Trusted website). This saved domains always overwrite the current profile. So, for example, "github.com" will always open with the trusted profile, even if you are browsing in the protected mode. 25 | 26 | More privacy features: 27 | 28 | • Build in AdBlock, which updates automatically. You can decide which content to block. AdBlock hosts are taken from Steven Black - AbBlock hosts: https://github.com/StevenBlack/hosts. 29 | • Third-part-cookies can not be enabled. 30 | • Enable or disable Android-autofill. 31 | • Delete browser data (on app exit). 32 | • Choose between different search engines (or set a custom one). 33 | • FOSS Browser itself doesn't collect any data 34 | 35 | 36 | ------------------------------------------------- 37 | Bookmarks filter 38 | ------------------------------------------------- 39 | 40 | Organize your bookmarks with filters. You can set custom names for each filter. Long press the bookmark icon in the toolbar to get fast access to your favorite bookmarks. 41 | 42 | 43 | ------------------------------------------------- 44 | Gestures 45 | ------------------------------------------------- 46 | 47 | You can assign nearly twenty different gestures to the toolbar and the toolbar buttons. Each in four directions. You can also trigger events by long pressing the toolbar buttons. So you have up to ten different gestures to control FOSS Browser. Supported is for example: load last website, switch tab, reload, open bookmarks, ... and many more. 48 | 49 | 50 | ------------------------------------------------- 51 | Backups 52 | ------------------------------------------------- 53 | 54 | Backup all your important data (bookmarks, history, trusted websites and so on) on your SD-card. You can also back up FOSS Browser settings. Backups can even be restored on a fresh install or an other device (if you copy the backup files to the new device). -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/fragment/Fragment_settings_UI.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.fragment; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.os.Bundle; 6 | 7 | import androidx.preference.EditTextPreference; 8 | import androidx.preference.ListPreference; 9 | import androidx.preference.Preference; 10 | import androidx.preference.PreferenceGroup; 11 | 12 | import java.util.Objects; 13 | 14 | import de.baumann.browser.R; 15 | import de.baumann.browser.preferences.BasePreferenceFragment; 16 | 17 | public class Fragment_settings_UI extends BasePreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 18 | 19 | @Override 20 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 21 | 22 | setPreferencesFromResource(R.xml.preference_ui, rootKey); 23 | Context context = getContext(); 24 | assert context != null; 25 | initSummary(getPreferenceScreen()); 26 | } 27 | 28 | private void initSummary(Preference p) { 29 | if (p instanceof PreferenceGroup) { 30 | PreferenceGroup pGrp = (PreferenceGroup) p; 31 | for (int i = 0; i < pGrp.getPreferenceCount(); i++) { 32 | initSummary(pGrp.getPreference(i)); 33 | } 34 | } else { 35 | updatePrefSummary(p); 36 | } 37 | } 38 | 39 | private void updatePrefSummary(Preference p) { 40 | if (p instanceof ListPreference) { 41 | ListPreference listPref = (ListPreference) p; 42 | if (p.getSummaryProvider() == null) p.setSummary(listPref.getEntry()); 43 | } 44 | if (p instanceof EditTextPreference) { 45 | EditTextPreference editTextPref = (EditTextPreference) p; 46 | if (Objects.requireNonNull(p.getTitle()).toString().toLowerCase().contains("password")) { 47 | p.setSummary("******"); 48 | } else { 49 | p.setSummary(editTextPref.getText()); 50 | } 51 | } 52 | } 53 | 54 | @Override 55 | public void onSharedPreferenceChanged(final SharedPreferences sp, String key) { 56 | if (key.equals("sp_exit") || key.equals("sp_toggle") || key.equals("sp_add") || key.equals("sp_theme") 57 | || key.equals("nav_position") || key.equals("sp_hideOmni") || key.equals("start_tab") || key.equals("sp_hideSB") 58 | || key.equals("overView_place") || key.equals("overView_hide") || key.equals("hideToolbar") || key.equals("useDynamicColor")) { 59 | sp.edit().putInt("restart_changed", 1).apply(); 60 | } 61 | updatePrefSummary(findPreference(key)); 62 | } 63 | 64 | @Override 65 | public void onResume() { 66 | super.onResume(); 67 | Objects.requireNonNull(getPreferenceScreen().getSharedPreferences()).registerOnSharedPreferenceChangeListener(this); 68 | } 69 | 70 | @Override 71 | public void onPause() { 72 | super.onPause(); 73 | Objects.requireNonNull(getPreferenceScreen().getSharedPreferences()).unregisterOnSharedPreferenceChangeListener(this); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/preferences/ListSwitchPreference.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.preferences; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.content.res.TypedArray; 6 | import android.util.AttributeSet; 7 | import android.view.ViewGroup; 8 | import android.widget.CompoundButton; 9 | import android.widget.LinearLayout; 10 | 11 | import androidx.annotation.NonNull; 12 | import androidx.preference.ListPreference; 13 | import androidx.preference.PreferenceManager; 14 | import androidx.preference.PreferenceViewHolder; 15 | 16 | import com.google.android.material.materialswitch.MaterialSwitch; 17 | 18 | import de.baumann.browser.R; 19 | import de.baumann.browser.unit.HelperUnit; 20 | 21 | public class ListSwitchPreference extends ListPreference { 22 | 23 | private String ListSwitchKey; 24 | private boolean ListSwitchKeyDefaultValue; 25 | private boolean switchAttached = false; 26 | 27 | public ListSwitchPreference(Context context, AttributeSet attrs) { 28 | super(context, attrs); 29 | ListSwitchKey = null; 30 | ListSwitchKeyDefaultValue = false; 31 | TypedArray valueArray; 32 | if (attrs != null) { 33 | valueArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ListSwitchPreference, 0, 0); 34 | ListSwitchKey = valueArray.getString(R.styleable.ListSwitchPreference_listSwitchKey); 35 | ListSwitchKeyDefaultValue = valueArray.getBoolean(R.styleable.ListSwitchPreference_listSwitchKeyDefaultValue, false); 36 | valueArray.recycle(); 37 | } 38 | } 39 | 40 | @Override 41 | public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { 42 | 43 | final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 44 | final ViewGroup rootView; 45 | final MaterialSwitch onOffSwitch; 46 | final CompoundButton.OnCheckedChangeListener checkedChangeListener; 47 | super.onBindViewHolder(holder); 48 | 49 | rootView = (ViewGroup) holder.itemView; 50 | if (!switchAttached && (ListSwitchKey != null)) { 51 | 52 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 53 | LinearLayout.LayoutParams.WRAP_CONTENT, 54 | LinearLayout.LayoutParams.WRAP_CONTENT 55 | ); 56 | params.setMargins(0, 0, HelperUnit.convertDpToPixel(5f, getContext()),0); 57 | 58 | onOffSwitch = new MaterialSwitch(getContext()); 59 | onOffSwitch.setLayoutParams(params); 60 | rootView.addView(onOffSwitch); 61 | switchAttached = true; 62 | onOffSwitch.setChecked(sp.getBoolean(ListSwitchKey, ListSwitchKeyDefaultValue)); 63 | checkedChangeListener = (buttonView, isChecked) -> { 64 | if (ListSwitchKey != null) { 65 | sp.edit().putBoolean(ListSwitchKey, isChecked).apply(); 66 | } 67 | }; 68 | onOffSwitch.setOnCheckedChangeListener(checkedChangeListener); 69 | checkedChangeListener.onCheckedChanged(onOffSwitch, onOffSwitch.isChecked()); 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/activity/Settings_Profile.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.activity; 2 | 3 | import android.content.SharedPreferences; 4 | import android.net.Uri; 5 | import android.os.Bundle; 6 | import android.view.Menu; 7 | import android.view.MenuItem; 8 | import android.view.Window; 9 | import android.view.WindowManager; 10 | 11 | import androidx.appcompat.app.AppCompatActivity; 12 | import androidx.appcompat.app.AppCompatDelegate; 13 | import androidx.appcompat.widget.Toolbar; 14 | import androidx.core.content.ContextCompat; 15 | import androidx.preference.PreferenceManager; 16 | 17 | import java.util.Objects; 18 | 19 | import de.baumann.browser.R; 20 | import de.baumann.browser.fragment.Fragment_settings_Profile; 21 | import de.baumann.browser.unit.BrowserUnit; 22 | import de.baumann.browser.unit.HelperUnit; 23 | 24 | public class Settings_Profile extends AppCompatActivity { 25 | 26 | @Override 27 | public void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | 30 | if (getSupportActionBar() != null) getSupportActionBar().hide(); 31 | Window window = this.getWindow(); 32 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 33 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 34 | window.setStatusBarColor(ContextCompat.getColor(this, R.color.md_theme_light_onBackground)); 35 | 36 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 37 | HelperUnit.initTheme(this); 38 | setContentView(R.layout.activity_settings); 39 | Toolbar toolbar = findViewById(R.id.toolbar); 40 | setSupportActionBar(toolbar); 41 | Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); 42 | 43 | getSupportFragmentManager() 44 | .beginTransaction() 45 | .replace(R.id.content_frame, new Fragment_settings_Profile()) 46 | .commit(); 47 | 48 | SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 49 | String profile = sp.getString("profileToEdit", "profileStandard"); 50 | 51 | switch (Objects.requireNonNull(profile)) { 52 | case "profileStandard": 53 | setTitle(getString(R.string.setting_title_profiles_standard)); 54 | break; 55 | case "profileTrusted": 56 | setTitle(getString(R.string.setting_title_profiles_trusted)); 57 | break; 58 | case "profileProtected": 59 | setTitle(getString(R.string.setting_title_profiles_protected)); 60 | break; 61 | } 62 | } 63 | 64 | @Override 65 | public boolean onCreateOptionsMenu(Menu menu) { 66 | getMenuInflater().inflate(R.menu.menu_help, menu); 67 | return super.onCreateOptionsMenu(menu); 68 | } 69 | 70 | @Override 71 | public boolean onOptionsItemSelected(MenuItem menuItem) { 72 | if (menuItem.getItemId() == android.R.id.home) finish(); 73 | if (menuItem.getItemId() == R.id.menu_help) { 74 | Uri webpage = Uri.parse("https://github.com/scoute-dich/browser/wiki/Edit-profiles"); 75 | BrowserUnit.intentURL(this, webpage); 76 | } 77 | return true; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings_backup.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | 22 | 23 | 24 | 25 | 28 | 29 | 33 | 34 | 38 | 39 | 44 | 45 | 57 | 58 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /app/src/main/java/de/baumann/browser/preferences/BasePreferenceFragment.java: -------------------------------------------------------------------------------- 1 | package de.baumann.browser.preferences; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.annotation.Nullable; 10 | import androidx.preference.EditTextPreference; 11 | import androidx.preference.ListPreference; 12 | import androidx.preference.Preference; 13 | import androidx.preference.PreferenceFragmentCompat; 14 | 15 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; 16 | import com.google.android.material.textfield.TextInputEditText; 17 | 18 | import java.util.Arrays; 19 | import java.util.Objects; 20 | 21 | import de.baumann.browser.R; 22 | import de.baumann.browser.unit.HelperUnit; 23 | 24 | public class BasePreferenceFragment extends PreferenceFragmentCompat { 25 | @Override 26 | public void onCreatePreferences(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState, @Nullable @org.jetbrains.annotations.Nullable String rootKey) { 27 | } 28 | 29 | @Override 30 | public void onDisplayPreferenceDialog(@NonNull Preference preference) { 31 | if (preference instanceof ListPreference) { 32 | showListPreference((ListPreference) preference); 33 | } else if (preference instanceof EditTextPreference) { 34 | showEditTextPreference((EditTextPreference) preference); 35 | } else { 36 | super.onDisplayPreferenceDialog(preference); 37 | } 38 | } 39 | 40 | public void showListPreference(@NonNull ListPreference preference) { 41 | int selectionIndex = Arrays.asList(preference.getEntryValues()).indexOf(preference.getValue()); 42 | MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext()); 43 | builder.setTitle(preference.getTitle()); 44 | builder.setNegativeButton(R.string.app_cancel, null); 45 | builder.setSingleChoiceItems(preference.getEntries(), selectionIndex, (dialog, index) -> { 46 | String newValue = preference.getEntryValues()[index].toString(); 47 | if (preference.callChangeListener(newValue)) { 48 | preference.setValue(newValue); 49 | } 50 | dialog.dismiss(); 51 | }); 52 | builder.show(); 53 | } 54 | 55 | public void showEditTextPreference(@NonNull EditTextPreference preference) { 56 | View dialogView = View.inflate(getContext(), R.layout.dialog_edit_text, null); 57 | TextInputEditText input = dialogView.findViewById(R.id.textInput); 58 | input.setText(preference.getText()); 59 | 60 | MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext()); 61 | builder.setTitle(preference.getTitle()); 62 | builder.setIcon(R.drawable.icon_edit); 63 | builder.setNegativeButton(R.string.app_cancel, null); 64 | builder.setPositiveButton(R.string.app_ok, (dialog, i) -> { 65 | String newValue = Objects.requireNonNull(input.getText()).toString(); 66 | if (preference.callChangeListener(newValue)) { 67 | preference.setText(newValue); 68 | } 69 | dialog.dismiss(); 70 | }); 71 | builder.setView(dialogView); 72 | Dialog dialog = builder.create(); 73 | dialog.show(); 74 | Context context = this.getContext(); 75 | assert context != null; 76 | HelperUnit.setupDialog(context, dialog); 77 | } 78 | } 79 | --------------------------------------------------------------------------------