diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..a6ea871
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,950 @@
+# Changelog
+
+## [6.1.4] - 2024-10-27
+
+- Renew web server TLS certificate
+- Update Android gradle plugin
+
+Special thanks to masudscloud for its bug report.
+
+## [6.1.3] - 2024-07-06
+
+- Fix mongoose web server
+- Update translations
+
+Special thanks to mbangi for its bug report.
+
+## [6.1.2] - 2024-06-17
+
+- Fix VPN restart on network interface change
+- Fix crash when update is instantly download
+- Update mongoose web server
+- Update third party libraries
+- Update Android gradle plugin
+- Update translations
+
+Special thanks to @Fs00 and @gallegonovato for their bug reports.
+
+## [6.1.1] - 2023-06-20
+
+- Improve adaptive launcher icon
+- Update AndroidX libraries
+- Update third party libraries
+- Update libsu
+- Update mongoose web server
+- Update Android gradle plugin
+- Update build tools
+- Update translations
+
+Special thanks to AzusaHana for its contribution.
+
+## [6.1.0] - 2023-03-26
+
+- Add adaptive launcher icon
+- Add POST_NOTIFCATIONS runtime permission support
+- Improve settings UI
+- Update target SDK to Android 13
+- Update libsu
+- Update mongoose web server
+- Update AndroidX libraries
+- Update third party libraries
+- Update Android gradle plugin
+- Update NDK
+
+## [6.0.3] - 2022-07-25
+
+- Improve hosts source cache to reduce bandwidth usage
+- Improve GitHub API usage to reduce bandwidth usage
+- Update AndroidX libraries
+- Update translations
+
+Special thanks to yoshimo for its bug report.
+
+## [6.0.2] - 2022-06-16
+
+*This version is a pre-release*
+
+- Fix wizard ad-block method check
+- Update translations
+
+Special thanks to Dandu32, ipdev and zhmstar0310 for their bug reports.
+
+## [6.0.1] - 2022-06-03
+
+*This version is a pre-release*
+
+- Improve screen rotation handling on home screen
+- Update libsu
+- Update mongoose web server
+- Update Android gradle plugin
+- Update third party libraries
+- Update translations
+
+Special thanks to kubalav and zgfg for their bug reports.
+
+## [6.0.0] - 2022-05-18
+
+*This version is a pre-release*
+
+- Add a new VPN ad-blocker implementation
+- Add initial DOH (DNS Over HTTPS) support
+- Add VPN connection monitor, heartbeat and throttler to improve reliability
+- Add long press action to copy hostname from user lists and DNS log to clipboard
+- Fix VPN state on network connectivity change and lost
+- Fix VPN restart when system kills it
+- Fix wrong DNS read on VPN restart
+- Fix VPN unwanted restart while paused
+- Fix crash on application update unknown size
+- Improve VPN user control reliability
+- Update logging system
+- Update libsu
+- Update Android gradle plugin
+- Update AndroidX libraries
+- Update NDK
+- Update third party libraries
+
+## [5.12.1] - 2022-05-14
+
+- Fix hosts file install on Android 13
+
+Special thanks to AAGaming00 and KieronQuinn for their bug reports.
+
+## [5.12.0] - 2022-02-28
+
+- Implement key-value pairs backup service support
+- Improve VPN application exclusion UI
+- Update AndroidX libraries
+- Update mongoose web server
+- Update translations
+- Update gradle
+- Update build tools
+
+## [5.11.0] - 2021-12-20
+
+- Improve home screen with icon color and decoration
+- Improve settings UI elements
+- Improve search filter performance in hosts list
+- Improve resource clean up after parsing hosts source
+- Improve logs with Timber
+- Improve button descriptions
+- Update Android gradle plugin
+- Update AndroidX libraries
+- Update third party libraries
+- Update mongoose web server
+- Update translations
+
+Special thanks to brijrajparmar27 for its contribution.
+
+## [5.10.0] - 2021-12-01
+
+- Fix connectivity change detection in VPN mode
+- Update mongoose web server
+- Update target SDK to Android 12
+- Update dependencies
+- Update translations
+
+Special thanks to 8asuj6m2 for its contribution.
+
+## [5.9.0] - 2021-11-05
+
+- Improve update activity to add support links and open from notification
+- Update web server certificate to comply with maximum validity time
+- Update dependencies
+- Update Android gradle plugin
+- Update NDK
+
+Special thanks to rany2 for its bug report.
+
+## [5.8.0] - 2021-08-08
+
+- Improve command receiver for task automation
+- Update mongoose web server
+- Update dependencies
+- Update Android gradle plugin
+- Update translations
+
+Special thanks to Faedelity for its bug report.
+
+## [5.7.0] - 2021-06-27
+
+- Add quick settings tile to toggle ad-blocking
+- Fix crash on TLS and timeout issue during source update
+- Fix backup not listed for restoration on older devices
+- Update dependencies
+- Update translations
+
+Special thanks to gwolf2u, opusforlife2, Vstory for their bug reports.
+
+## [5.6.0] - 2021-04-30
+
+- Improve navigation by moving DNS logs to home screen
+- Improve DNS logs usage by explaining usage and limitation
+- Update dependencies
+- Update translations
+
+## [5.5.1] - 2021-04-02
+
+- Add redirection validation
+- Improve application update screen
+- Update Android gradle plugin
+- Update NDK
+- Update dependencies
+- Fix VPN crash when the only system DNS server available uses IPv6 and IPv6 is disabled from settings
+- Remove html-textview dependency and jcenter repository
+
+Special thanks to FrostbiterTy, SapphireExile, zgfg for their bug reports.
+
+## [5.5.0] - 2021-03-17
+
+- Add allow list support
+- Improve source edition UI
+- Improve source update check
+- Improve animations
+- Update mongoose web server
+- Update dependencies
+- Fix web server TLS issue
+
+Special thanks to gallegonovato, jawz101 and zgfg for their bug reports.
+
+## [5.4.0] - 2021-02-28
+
+- Add VPN monitor option to prevent disconnection
+- Update source update status indicator
+- Update Android gradle plugin
+- Update Sentry DSN to support older TLS versions
+- Update mongoose web server
+- Update dependencies
+- Fix welcome screen telemetry preference
+- Fix VPN authorization check at startup
+
+Special thanks to BearTM, elvissteinjr, ipdev99, patkarmandar, RobBeyer for their bug reports.
+
+## [5.3.0] - 2021-01-17
+
+- Add new unique source parser with parallel processing
+- Add an option to disable app update check at startup
+- Fix crash with source file when SAF permission is removed
+- Fix metered status vpn on Android 11
+
+Special thanks to andy356, fusionneur and sr1canskhsia for their bug reports.
+
+## [5.2.1] - 2021-01-06
+
+- Fix F-Droid store detection
+
+Special thanks to TheLonelyGhost, bdtipsntricks, faraz-b bege10, Nathan-Nesbitt and gallegonovato for their bug reports.
+
+## [5.2.0] - 2021-01-03
+
+- Add beta channel opt-in preferences
+- Update mongoose to latest stable version and rewrite web server
+- Update source parser to prevent stack overflow
+- Update dependencies
+- Update build tools
+- Update NDK
+- Update translations
+
+## [5.1.0] - 2020-11-12
+
+- Add application update UI
+- Add F-Droid apk support to built-in updater
+- Add custom hosts file parser for big hosts file (1M+ entries, way slower but memory friendly)
+- Fix VPN app exclusion on Android 11
+- Update AndroidX and Sentry dependencies
+- Update translations
+
+Special thanks to spiou, drothenberger and gallegonovato for their bug reports.
+
+## [5.0.10] - 2020-10-10
+
+*This version is a pre-release*
+
+- Fix online modification date for unavailable source
+- Prevent missing url at source creation
+- Prevent invalid source url to be restored
+- Fix web server certificate install on Android 11
+
+Special thanks to zgfg, ipdev99 and ingenium13 for their bug reports.
+
+## [5.0.9] - 2020-09-13
+
+*This version is a pre-release*
+
+- Fix no hosts to block from 4.x to 5.x migration
+- Fix wrong source type in source edition UI
+- Update AndroidX dependencies
+- Update mongoose web server
+
+Special thanks to auanasgheps, lukjod, ridobe, sacrificialpawn for their bug reports.
+
+## [5.0.8] - 2020-08-30
+
+*This version is a pre-release*
+
+- Fix source not updated on automatic update
+- Fix user list not sync until source update
+- Update hosts source creation to disable allowed hosts by default
+- Update AndroidX dependencies
+
+Special thanks to jeanrivera for its bug report.
+
+## [5.0.7] - 2020-08-16
+
+*This version is a pre-release*
+
+- Add hosts sources Storage Access Framework support
+- Add hosts sources label and host counter
+- Improve host sources list and edition UI
+- Improve allowed and redirected hosts settings by applying them per source
+- Fix file based hosts sources not installed due to missing permission
+- Update AndroidX dependencies
+
+Special thanks to zgfg for its bug report.
+
+## [5.0.6] - 2020-08-02
+
+*This version is a pre-release*
+
+- Fix crash on domain enable/disable action
+- Fix source not applied if disabled and enabled back
+- Update target SDK to Android 11
+
+Special thanks to ipdev99 and zgfg for their bug reports.
+
+## [5.0.5] - 2020-06-28
+
+*This version is a pre-release*
+
+- Improve hosts source server handling with future time
+- Improve hosts update by skipping already up-to-date sources
+- Fix hosts source disable action
+- Fix hosts list apply notification from non-user changes
+- Fix user excluded application settings
+- Remove navigation bar color customization
+- Update AndroidX dependencies and NDK version
+
+Special thanks to CobalTitan, ipdev99, zgfg and sunmybun for their bug reports.
+
+## [4.3.5] - 2020-06-27
+
+- Fix project Fastlane description for F-Droid store
+
+Special thanks to linsui and IzzySoft for their bug reports and Vankog for translations.
+
+## [5.0.4] - 2020-05-24
+
+*This version is a pre-release*
+
+- Improve overall host list computation
+- Add host redirected feature in VPN ad blocking
+- Remove WRITE_EXTERNAL_STORAGE permission (use Storage Access Framework instead)
+- Fix duplicate entries in generated hosts file
+- Fix allowed hosts settings in VPN ad blocking
+- Fix backup not exported as sdcard not writable
+- Fix source update period task preference
+- Fix host list paging
+
+Special thanks to holysnipz, ipdev99, QingKongBaiYu, and zgfg for their bug reports.
+
+## [5.0.3] - 2020-05-10
+
+*This version is a pre-release*
+
+- Add TLS support for web server
+- Add web server status in preferences
+- Add option to install self signed certificate
+- Add option to display app icon instead of blank page
+- Add full timezone support for source date
+- Add workaround for negative source update time when server time is not accurate
+- Add follow system dark theme mode
+- Fix user host list lost on source update
+- Fix import failed toast
+- Fix web server not start on install
+- Fix duplicate host entry on backup import
+- Update mongoose server
+- Update translations
+
+Special thanks to saltylemondrops, zgfg, ipdev99 and mickrussom for their bug reports.
+
+## [5.0.2] - 2020-04-25
+
+*This version is a pre-release*
+
+- Fix timezone issues with source modification date
+- Fix domain not removed when sources are disabled
+- Fix inverted host and ip while generating hosts file
+- Fix periodical hosts update check initialization
+- Improve overall search feature in list UI
+- Improve last online modification date after retrieval
+- Fix install snackbar not hiding
+- Fix potential deadlock in VPN
+- Add missing text on successful VPN update
+- Update translations
+
+Special thanks to damoasda for its contribution, Vankog for all translations he merged and Ps24u and dhacke for theirs bug reports.
+
+## [4.3.4] - 2020-04-25
+
+- Fix crash in tcpdump log view on Lollipop
+- Fix timezone issues with source modification date
+- Fix NDK version
+
+Special thanks to Ps24u and Indranil012 for their bug reports.
+
+## [5.0.1] - 2020-04-15
+
+*This version is a pre-release*
+
+- Fix redirect label from home screen
+- Fix preference screen duplication on screen orientation change
+- Improve hosts list readability
+- Update dependencies
+- Fix ndk configuration
+
+Special thanks to TacoTheDank for its contribution and rmw98 and Luniz2k1 for its bug reports.
+
+## [4.3.3] - 2020-04-10
+
+hpHosts service is down.
+If you are looking for a replacement, give a try at [StevenBlack's one](https://github.com/StevenBlack/hosts).
+
+- Replace hpHosts default hosts file by StevenBlack hosts file
+- Improve tcpdump icons
+- Update translations
+
+Special thanks to damoasda its contribution and gallegonovato for its bug report.
+
+## [5.0.0] - 2020-04-07
+
+*This version is a pre-release*
+
+- Add new home screen
+ - Provides all main controls from one screen
+ - Displays currently blocked, allowed and redirected domains
+ - Displays current hosts sources status and control to force apply
+- Add non root ad-blocking feature
+ - Uses a builtin local VPN to filter DNS request to blocked domains
+ - Based on the work of [dns66 by julian-klode](https://github.com/julian-klode/dns66/issues/39)
+ - Allows to excluded system applications and per user applications
+- Add builtin updater with changelog display
+- Add feature to quickly pause and resume ad-blocking
+- Add wizard screen for first run setup
+- Add feature to display and filter all blocked, allowed, redirect domains
+- Improve preferences screen
+- Add broadcast receiver to control ad-blocking from third party applications
+- Update Android target to Android 10
+- Improve root and shell support
+- Split translation files to easier understand their context
+- Add GitHub action test and build tasks
+
+## [4.3.2] - 2019-12-29
+
+- Fix GitLab source hosting
+- Update translations
+
+## [4.3.1] - 2019-12-21
+
+- Update help to include Magisk systemless module for read-only system partition
+- Update translations
+
+## [4.3.0] - 2019-11-01
+
+- Fix root not requested
+- Improve support for systemless hosts Magisk module
+- Update translations
+
+## [4.2.9] - 2019-08-31
+
+- Improve hosts file parsing
+- Improve hosts file install error message (add more details than _not enough space_)
+- Fix menu drawer translation issue
+- Update translations
+- Remove the start (opt-in only) telemetry messages
+
+## [4.2.8] - 2019-07-28
+
+- Fix TravisCI build issues
+- Update translations
+
+## [4.2.7] - 2019-07-04
+
+- Revert Android gradle plugin to fix F-Droid build issue
+
+## [4.2.6] - 2019-06-23
+
+- Improve backup feature (user lists and hosts source using JSON format)
+- Fix F-Droid build issue
+- Update translations
+
+Special thanks to RichyHBM its contribution and andy356 for its bug report.
+
+## [4.2.5] - 2019-06-06
+
+- Add Gist and GitLab hosting support for hosts file
+- Add option to set default IPv6 redirection
+- Improve reboot command
+- Improve UI for overlays
+- Update translations
+
+Special thanks to MSF-Jarvis and Ralayax for their contributions
+
+## [4.2.4] - 2019-03-23
+
+- Add dedicated no root error message
+- Fix connection requirement for automatic update
+- Fix crash on TCP dump views when root access is denied
+- Fix icon resources and colors
+- Improve exception reporting
+- Update translations
+- Update Android X dependencies
+- Update Android Gradle plugin and NDK versions
+
+## [4.2.3] - 2019-03-02
+
+- Fix update check on disabled sources
+- Fix cropped label on home screen
+- Prevent app installation on external storage (can't launch tcpdump or web server binary)
+- Update work manager and material dependencies
+
+## [4.2.2] - 2019-02-16
+
+- Improve Material Theming
+- Update build tools
+
+## [4.2.1] - 2019-02-03
+
+- Fix two buttons line when text too long
+
+## [4.2.0] - 2019-02-02
+
+- Add hosts source download cache
+- Add snackbar notification to update host from DNS request listing
+- Update UI from Material Design to Material Theming
+- Update gradle, plugins and dependencies
+- Fix crash parsing not defined host source last modified date
+- Fix native modules build script (required for F-Droid build server)
+- Fix Transifex issues
+
+## [4.1.0] - 2018-12-13
+
+- Add [telemetry feature](https://github.com/AdAway/AdAway/wiki/Telemetry)
+- Add snackbar notification to update host when editing hosts sources or lists
+- Update translations and fix english locale issues
+
+## [4.0.12] - 2018-11-21
+
+- Fix issue when getting last modified date on file:// hosts source
+- Fix excluded hostnames from source due to parser failure
+
+Special thanks to DiamondJohn and Vankog for theirs helpful bug reports.
+
+## [4.0.11] - 2018.11.06
+
+- Update translations from Transifex
+- Fix crash using file:// protocol for hosts source
+- Fix redirect list import
+
+Special thanks to ipdev, ktmom and shaqman89 for theirs helpful bug reports and Vankog for the locales update.
+
+## [4.0.10] - 2018.10.14
+
+- Last update time now works with GitHub hosted files (on https://raw.githubusercontent.com/ domain)
+- Fix infinite "update available" status when at least one host source failed to download
+- Fix hosts not installed by the background update service
+- Fix hosts source update time when reverting to default hosts file
+- Fix "download failed" status when no host source enabled
+- Fix a bunch of translation issues
+
+Special thanks to Alain-Olivier and Vankog for theirs contributions and MarcAnt01 for its helpful bug report.
+
+## [4.0.9] - 2018.09.26
+
+- Fix missing reboot and error dialog when installing and checking for hosts update
+- Block http hosts source for security
+- Add project and support links to the menu
+- Fix missing notification channel for Oreo and later
+- Fix host name validation to add more complex domain name in black/white lists
+- Improve HTTP client connection pool
+- Add new internal architecture for hosts installation
+- Fix Indonesian locale code
+- Clean up a lot a unused resource (texts and graphics)
+- Clean up help from unrelated help elements
+- Update gradle itself, plugin, ndk and dependencies versions
+
+Special thanks to adem4ik TacoTheDank and @Vankog for theirs contributions and towlie, ipdev for theirs helpful bug reports.
+
+## [4.0.8] - 2018.08.22
+
+- Add option to dismiss welcome card
+- Improve hosts update status
+- Change background job dependency from Evernote Android Job to Jetpack Work manager
+- Update translations
+
+## [4.0.7] - 2018.08.08
+
+- Fix host lists import
+- Fix default DNS requests when no log entry
+- Update translations from Transifex
+
+Special thanks to Vankog for the translation update and GuardianUSMC and DiamondJohn for the bug reports.
+
+## [4.0.6] - 2018.08.05
+
+- Add web server status (icon and text) in the home card UI
+- Fix black and while list inversion bug
+
+## [4.0.5] - 2018.07.02
+
+- Change database to room:
+ - Add migration from previous database
+- Update hosts source UI:
+ - New animations
+ - Dialogs validate user data so you do no more loose your input if format is wrong
+- New DNS logging UI:
+ - Add new sort feature:
+ - by name (old behavior)
+ - by top level domain name (group entries by DNS so google.com, ads.google.com and www.google.com appears next to each other)
+ - New controls and animations:
+ - Block, allow or redirect from the directly from DNS logs
+ - Currently set up domains (in your lists UI) will be displayed accordingly
+ - Swipe to refresh!
+- Update build tools, target SDK (28) and dependencies
+
+## [4.0.4] - 2018.06.03
+
+- A new light (white) theme
+- A new adware UI (using LiveData and ViewModel for the 1st time!)
+- A fix for the overlapping status texts in the home screen
+
+## [4.0.3] - 2018.05.20
+
+- Fix tcpdump failed to start after being stopped
+
+## [4.0.2] - 2018.05.09
+
+- Add adaptive launcher icons (8+)
+- Add adaptive app shortcut (7.1+)
+- Add new hosts content screen
+- Fix application title not restored on configuration change
+- Fix screen change when opening hosts file
+
+## [4.0.1] - 2018.05.07
+
+- Fix redirection IP and custom target dialogs in preferences
+- Fix multiple lines in home card hedear.
+
+## [4.0.0] - 2018.05.06
+
+This version is a major update.
+First, There is a new design:
+
+- The home is now card based (webserver card is added if enabled)
+- The navigation menu is now an humbugger menu
+- The hosts source UI is updated (floating add button, actionbar edition)
+- Your lists UI is updated (bottom navigation bar, same controls add, edit, remove like hosts sources)
+- Permission request at runtime to access storage to import or export your list
+- All other views are updated to use the latest support libraries
+
+And a lot of changes under the hood including:
+
+- Oreo support
+- Battery improvement and host update fix
+- Better support of root and systemless mode
+
+## [3.3] - 2018.03.05
+- Add support for ChainFire's SuperSU "bind sbin" systemless mode - by PerfectSlayer
+- Improve systemless activation error handling - by PerfectSlayer
+- Improve su location detection - by tstaylor7
+- Update Mongoose webserver - by MrRobinson
+- Replace CyanogenMod references by LineageOS - by experience7
+- Update translations - by Mattter, mission712, ThomasSmallert and muzena
+- Fix translation attributes - by Vankog
+- Fix Magisk 15.x support - by pec0ra
+
+## [3.2]
+- Systemless root support - extensive work by PerfectSlayer
+- Improvements to root mounter - by sanjay900
+- Translations updates
+- Various updates for support on Android 7.x
+
+## [3.1.2]
+- Update hosts-file.net source to use https
+- Translations updates
+
+## [3.1.1]
+- Minor bugfixes
+- Update mongoose internal webserver to 6.4 release
+- Translations updates
+- Update pgl.yoyo.org default source to use https
+- Add generated timestamp into header of hosts file
+
+## [3.1]
+- Add 64bit arch which allows tcpdump to run on those devices
+- Adjust scan adware list and stop it from crashing
+- Update libpcap to 1.7.4 release
+- Update tcpdump to 4.7.4 release
+- Update mongoose internal webserver to 6.0 release and add IPv6 support
+- Add enable IPv6 option which adds ::1 to all hosts entries
+- Improve building hosts file speed by up to 2.5x
+- RevertService uses Target hosts file preference
+- Updates to support Android 6.0 SDK (23)
+
+## [3.0.2]
+- Disable autocorrect/autocomplete for hosts input on whilelist and redirection inputs
+- Allow two pane layout as long as min of 600dp width available regardless of orientation
+- Add material colored status icons
+- Adjust asset layout per latest development guidelines
+- Minor other adjustments
+
+## [3.0.1]
+- Make some text fields single line - by Phoenix09
+- Make daily update time randomized within a range
+- Minor fixes
+- Adjust hosts-file.net default source URL
+
+## [3.0]
+This release has mainly been done by 0-kaladin.
+
+- Min Android version increased to Android 4.1 to support Position Independent Executables (PIE)
+- Material design
+
+## [2.9.2]
+This release has mainly been done by Dāvis Mošenkovs.
+
+- Added Trove library for high performance collections
+- Adware scan improvements
+- Separate whitelisting and redirections options - "Allow whitelisting" defaults to checked; "Allow redirections" defaults to state of "Allow redirections and whitelisting" (or unchecked on new installations)
+- Fix tcpdump logging upon file deletion
+- Fix possible crash on DB update
+- Fix AdAway's default hosts source
+
+## [2.9.1]
+- Fixing regression bugs
+
+## [2.9]
+This release has mainly been done by Dāvis Mošenkovs, thanks!
+
+- Workaround for Android 4.4 (see Help)
+- Fixed Hide reboot dialog setting being ignored after symlink creation
+- Fix crashes
+- Change AdAway's default hosts source to https
+
+## [2.8.1]
+- Fix mobile hosts source
+
+## [2.8]
+- Higher timeout for root commands
+- New version of RootCommands library (If you experience problems install busybox, AdAway will then use it!)
+- Remove unused billing permission
+
+## [2.7]
+- Reduce apk size by switching from HtmlSpanner to HtmlTextView library
+
+## [2.6]
+- Improve build for F-Droid
+
+## [2.5]
+- Fix URLs in-app
+
+## [2.4]
+- Fix Remounter for Android 4.3
+- Fix auto update on ethernet connection
+
+## [2.3]
+- AdAway was removed from Google Play!
+- Because http://www.ismeh.com/HOSTS is down, a alternative source has been added
+
+## [2.2]
+- Introduce SUPERUSER permission for new Superuser app
+- Allow backups of AdAway (for Carbon)
+- Logo reworked thanks to Alin Ţoţea-Radu
+
+## [2.1]
+- Allow whitelist entries from hosts sources if enabled in preferences
+- Fixed missing menu entry for hosts sources on tablets
+- Webserver on boot should work more reliable
+- Webserver should not be killed on low memory
+
+## [2.0]
+IF YOU HAVE PROBLEMS WITH 2.0: Please uninstall and then reinstall AdAway!
+- New library for root access: RootCommands
+- Tcpdump and Webserver now included for ARM, x86, MIPS (Please test and report problems!)
+- Google forced me to remove the possibility to donate via Flattr and PayPal
+- Hopefully fixes DNS logging for Android 4.1
+
+## [1.37]
+- Skip unreachable hosts sources and show number of successful sources
+- Fix for crash on donations screen (Android 4.1)
+- Fix crash on help screen (Android 4.1)
+- Bind local webserver https only to localhost (thanks to Stebalien for finding that bug)
+
+## [1.36]
+- Help and About screens reworked
+- Simple scanner for bad Adware apps like Airpush Notifications (derived from open source Airpush-Detector, thanks!)
+
+## [1.35]
+- New method for background update checking
+- AdAway will now reschedule the update check to execute it when the Internet connection is established
+- New preference to update only when on Wifi
+- AdAway now allows empty hosts sources for people who only want to maintain their own lists
+
+## [1.34]
+- In-app PayPal donations are now possible
+- Disabled hardware acceleration on ICS, caused black screens and glitches on some custom roms
+
+## [1.33]
+- Fixed rare problems on some devices regarding remounting /system as read/write
+
+## [1.32]
+- Fixes crashes with 1.31
+
+## [1.31]
+- Check for APN proxy
+
+## [1.30]
+- Design improvements for Android 4
+- Layout fixes for "Your Lists"
+
+## [1.29]
+- Languages updated
+- Fixed copying when no cp command is available
+
+## [1.28]
+- Now works on devices without cp command
+- New debug setting
+
+## [1.27]
+- No longer needs busybox
+- Fixed problems with reverting
+- Method to restart Android changed
+
+## [1.26]
+- Usability improvements: Buttons will now be disabled while applying, reverting is improved
+- Faster due to improved hosts parsing
+- Now including tcpdump
+
+## [1.25]
+- Better tcpdump integration
+- Wildcard characters * and ? can be used in your whitelist
+- Updated translations
+- Fixes stuck on applying hopefully
+
+## [1.24]
+- Tcpdump DNS request logging
+- Preference to allow redirection rules from Hosts Sources
+- New hosts source for mobile ads: http://www.ismeh.com/HOSTS
+- Webserver binary now updates correctly from old AdAway versions
+
+## [1.23]
+- Fix for import/export
+
+## [1.22]
+- More notification and status bug fixes
+- Fixed preference bug causing automatic update to be enabled
+- Fixed color of notifications
+- Fixed a crash under Android 3.2
+
+## [1.21]
+- Fixed staying notification when update was failing
+- Hopefully fixes webserver crashes
+
+## [1.20]
+- Fixed staying notification
+
+## [1.19]
+- Automatic updating in background can be enabled in preferences
+- New method for checking for symlink, should fix some problems
+- Fixes for exporting entries
+- Fixes for donation screen, when no Google Android Market is available
+
+## [1.18]
+- Local webserver now answers with blank page instead of 404 error page
+- Import and Export of Your Lists
+- Bug fix for symlink check
+- Last entry in hosts file is now working (missed new line at end of hosts file)
+- Fixes for daily update check
+- Allow hostnames without TLD ending
+
+## [1.17]
+- Fix for translation problems
+
+## [1.16]
+- Translations: German, French, Spanish
+ Thanks to all contributors!
+- Better check for symlink
+- Newer version of web server mongoose
+- Better handling of AdAway database
+- Fixed "Not enough space available" bug
+- Fixed problem with applying
+
+## [1.15]
+- Added permission for Google Android Market donations
+
+## [1.14]
+- Force close on open hosts file fixed
+- Donations with Google Android Market added
+
+## [1.13]
+- Webserver now hears on all local IP address (0.0.0.0)
+- Custom target can be set in preferences, for example to /data/etc/hosts
+- Hosts file can be opened from menu
+
+## [1.12]
+- Delayed starting of webserver on boot
+- Disabled debug logging
+
+## [1.11]
+- Fixed bugs in layout
+
+## [1.10]
+- Webserver is now a preference, disabled by default
+- Fixed daily update again. Should schedule now correctly
+- Fixed crash on Android 3.0 and 3.1 in Your Lists
+- Fixed preferences on Android 3.x
+- Fixed rotation bug on Android 3.x
+
+## [1.09]
+- New design for tablet sizes
+- New hosts source: http://pgl.yoyo.org/adservers
+- fixed crash on Android 3 Honeycomb
+- Fix for daily update check
+- Removed hosts source sysctl.org because of false positives
+
+## [1.08]
+- AdAway got a redesign
+- AdAway ships with a webserver, that listens on localhost
+- Dates of all hosts sources are saved and can be seen in Hosts sources
+- Preference to hide reboot question dialog
+- Help page with information about AdAway
+- Added new hosts source sysctl.org
+- Daily update check can be enabled in preferences
+- Should now work on roms which doesn't symlink busybox commands
+
+## [1.07]
+- AdAway can now create a symlink
+- better error handling
+- No update check on orientation change
+
+## [1.06]
+- hosts file target can be choosen
+- Donation button
+- Fixed SQLite bug occuring on Android 2.1
+
+## [1.05]
+- Update Check implemented
+- Fixed bug when changing orientation of device while downloading
+- better error handling when downloading
+- Fixed localhost entry again
+
+## [1.04]
+- Implemented Redirection List
+- Fixed Layout bugs
+
+## [1.03]
+- Implemented Blacklist and Whitelist
+
+## [1.02]
+- Fixed localhost entry
+
+## [1.01]
+- Fixed permissions on /system/etc/hosts
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..d8f6545
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+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, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+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.
+
+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.
+
+## Scope
+
+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.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at report [at] adaway.org. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..e8d2c90
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,169 @@
+# Contributing to AdAway
+
+:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
+
+The following is a set of guidelines for contributing to AdAway.
+These are mostly guidelines, not rules.
+It will help you to understand the project, find answers, deal with the source code and interact with maitainers.
+The project is open to any kind of contribution so feel free to share your ideas and participate to the development.
+
+#### Table of contents
+
+[I don't want to read this whole thing, I just have a question!!!](#i-dont-want-to-read-this-whole-thing-i-just-have-a-question)
+
+[What should I know before I get started?](#what-should-i-know-before-i-get-started)
+* [Discovering the project structure](#discovering-the-project-structure)
+* [Building the project](#building-the-project)
+
+[How can I contribute?](#how-can-i-contribute)
+* [Reporting bugs](#reporting-bugs)
+* [Suggesting enhancements](#suggesting-enhancements)
+* [Translating to your language](#translating-to-your-language)
+* [Your first code contribution](#your-first-code-contribution)
+
+[Styleguides](#styleguides)
+* [Git commit messages](#git-commit-messages)
+* [Java styleguide](#java-styleguide)
+* [XML styleguide](#xml-styleguide)
+
+[Additional notes](#additional-notes)
+* [tcpdump and webserver modules](#tcpdump-and-webserver-modules)
+
+## I don't want to read this whole thing I just have a question!!!
+
+> **Note:** Please don't file an issue to ask a question. You'll get faster results by using the resources below.
+
+We have a dedicated forum with a welcoming community and a wiki to answer your questions:
+
+* [Check the common issues and solutions on the wiki](https://github.com/AdAway/AdAway/wiki/Solutions)
+* [Read and post on the dedicated developer forum](https://forum.xda-developers.com/showthread.php?t=2190753)
+
+## What should I know before I get started?
+
+### Discovering the project structure
+
+The AdAway source code is an Android project organized in modules.
+There are four main modules:
+* `app`: The Android application itself
+* `tcpdump`: A module dedicated to build the `pcap` library and the `tcpdump` binary
+* `webserver`: A module dedicated to build a simple HTTP server binary based on `mongoose`
+* `libraries/RootCommands`: A vendorize Android library to run root shell commands
+
+The three last modules are independent and used by the `app` module.
+Modularizing the application allows for faster build times and simplier maintainance.
+
+### Building the project
+
+Building the project will require the latest versions of the Android SDK (Software Development Kit) and NDK (Native Development kit).
+They can easily be installed or updated using [Android Studio](https://developer.android.com/studio/).
+
+#### Building with Gradle
+1. Ensure you have Android SDK and NDK installed.
+If not:
+ * Option 1: [Install Android Studio](https://developer.android.com/studio/index.html) or,
+ * Option 2: Install command line tools, build tools and ndk bundle with sdk manager:
+ `tools/bin/sdkmanager "build-tools;x.y.z" ndk-bundle` where `x.y.z` is the latest version
+2. Export `ANDROID_HOME` environment variable pointing to your Android SDK:
+`export ANDROID_HOME=/path/to/your/sdk`
+3. Launch a build:
+`./gradlew assembleRelease`
+
+The first full build of the apk can take a lot of time, about 20 minutes, whereas an incremental build of the `app` module takes less than a dozen seconds.
+
+#### Running on an emulator
+
+In order to test the application on an emulator, disable [the root check in the Constants source file](https://github.com/AdAway/AdAway/blob/c90336cb9b062220540317bc6c7cfedb19927c63/app/src/main/java/org/adaway/util/Constants.java#L28).
+
+## How can I contribute?
+
+### Reporting bugs
+
+> **Note:** Before submitting a bug report, please use [the GitHub search on Issues page](https://github.com/AdAway/AdAway/issues) to check if there is already similar reports.
+
+#### How do I submit a (good) bug report?
+
+* **Use a clear and descriptive title** for the issue to identify the problem.
+* **Describe the exact steps which reproduce the problem** in the most detailed way possible.
+* **Provide specific examples to demonstrate the steps**.
+Include hosts sources or domains you use, web pages URL you test.
+* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
+* **Explain which behavior you expected to see instead and why.**
+* **If you're reporting that AdAway crashed**, include a logcat.
+Use `adb logcat` if you have developer settings enabled on your device or use any application like [CatLog](https://play.google.com/store/apps/details?id=com.nolanlawson.logcat) to save logs.
+Include the crash report in the issue in a [code block](https://help.github.com/articles/markdown-basics/#multiple-lines), a [file attachment](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests/), or put it in a [gist](https://gist.github.com/) and provide link to it.
+* **Specify which version of AdAway you're using.**
+You can get the exact version by opening in-app help and checking the _About_ tab.
+* **Specify the Android version and the ROM you're using.**
+You can also include any root or customization related information like _Magisk_ or _SuperSU_ version and _Xposed_ modules is installed.
+
+
+### Suggesting enhancements
+
+#### How do I submit a (good) enhancement suggestion?
+
+Enhancement suggestions are welcome.
+After refining your idea or discussing it on the [development forum](https://forum.xda-developers.com/showthread.php?t=2190753), create an issue and provide the following information:
+
+* **Use a clear and descriptive title** for the issue to identify the suggestion.
+* **Provide a step-by-step description of the suggested enhancement** in the most detailed way possible, including specific examples.
+* **Describe the current behavior** and **explain which behavior you expected to see instead** and why.
+* **Explain why this enhancement would be useful** to most users.
+
+### Translating to your language
+
+Translations are also welcome.
+Moreover, they do not require a development environment, only a web browser.
+So if you want to complete or edit your language support for the application, check [the translation guide](TRANSLATING.md).
+
+### Your first code contribution
+
+Unsure where to begin contributing?
+ You can start by looking through these `good first issue` and `help wanted` issues:
+
+* [Good first issues](https://github.com/AdAway/AdAway/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) - issues which should only require a few lines of code, and a test or two.
+* [Help wanted issues](https://github.com/AdAway/AdAway/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) - issues which should be a bit more involved than `beginner` issues.
+
+Both issue lists are sorted by total number of comments. While not perfect, the number of comments is a reasonable way of determining the impact a given change will have.
+
+## Style guidelines
+
+### Git commit messages
+
+* Use the present tense ("Add feature" not "Added feature")
+* Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
+* Limit the first line to 80 characters or less
+* Reference issues and pull requests liberally after the first line
+
+### Java style guidelines
+* Indentation: 4 spaces, no tabs
+* Maximum line width for code and comments: 100
+* Opening braces don't go on their own line
+* Field names: Non-public, non-static fields start with m.
+* Acronyms are words: Treat acronyms as words in names, yielding !XmlHttpRequest, getUrl(), etc.
+
+See https://source.android.com/source/code-style.html
+
+### XML style guidelines
+* No maximum line width
+* Split multiple attributes each on a new line
+* Indent using spaces with Indention size 4
+
+## Additional notes
+
+### `tcpdump` and `webserver` modules
+
+#### Origin
+
+Forked from the following sources and slightly modified to compile:
+
+* dnsmasq: https://github.com/CyanogenMod/android_external_dnsmasq
+* libpcap: https://github.com/the-tcpdump-group/libpcap/tree/libpcap-1.7.4
+* tcpdump: https://github.com/the-tcpdump-group/tcpdump/tree/tcpdump-4.7.4
+
+#### Changes
+
+Please review the following commits for the changes made to the sources above in order for them to compile in this project:
+
+* Commit: https://github.com/AdAway/AdAway/commit/1f4ccb3cec3758757341ad90813506fc2a8fdf7b
+* Commit: https://github.com/AdAway/AdAway/commit/289df896c0ac4f96bd862e8a5054f1011ec07cac
+* Commit: https://github.com/AdAway/AdAway/commit/08da0745b0732b94221c0f5746160fef8126fd99
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
index 53c4640..65070b2 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,119 @@
-# adaway
+#  AdAway
-Android Ad Blocker
\ No newline at end of file
+[](https://github.com/AdAway/AdAway/actions/workflows/android-ci.yml)
+[](https://sonarcloud.io/project/overview?id=org.adaway)
+[](https://github.com/AdAway/AdAway/releases)
+[](https://github.com/sponsors/PerfectSlayer)
+[](/LICENSE.md)
+
+AdAway is an open source ad blocker for Android using the hosts file and local vpn.
+
+[](metadata/en-US/phoneScreenshots/screenshot1.png)
+[](metadata/en-US/phoneScreenshots/screenshot2.png)
+[](metadata/en-US/phoneScreenshots/screenshot3.png)
+[](metadata/en-US/phoneScreenshots/screenshot4.png)
+[](metadata/en-US/phoneScreenshots/screenshot5.png)
+
+For more information visit https://adaway.org
+
+## Installing
+
+There are two kinds of release:
+* The preview builds: on the bleeding edge of development - for testers or adventurous
+* The stable builds: ready for every day usage - for end users
+
+### Preview builds
+
+**Requirements:** Android 8 _Oreo_ or above
+
+For users with bugs, there may be preview builds available from the [XDA development thread](https://forum.xda-developers.com/showthread.php?t=2190753) and [AdAway official website](https://app.adaway.org/beta.apk).
+It is recommended to try those builds to see if your issue is resolved before creating an issue.
+The preview builds may contain bug fixes or new features for new android versions.
+
+[](https://app.adaway.org/beta.apk)
+[](https://forum.xda-developers.com/showthread.php?t=2190753)
+
+### Stable builds
+
+**Requirements:**
+* Android Android 8 _Oreo_ or above
+
+After preview builds have been tested by the more technical or responsive community within the forums, we will then post the stable build to F-Droid.
+
+[](https://app.adaway.org/adaway.apk)
+[](https://f-droid.org/app/org.adaway)
+
+For devices older than Android 8 _Oreo_, use the version 4 of AdAway.
+
+## Get Host File Sources
+
+See the [Wiki](https://github.com/AdAway/AdAway/wiki), in particular the page [HostsSources](https://github.com/AdAway/AdAway/wiki/HostsSources) for an assorted list of sources you can use in AdAway.
+Add the ones you like to the AdAway "Hosts sources" section.
+
+## Getting Help
+
+You can post [Issues](https://github.com/AdAway/AdAway/issues) here or obtain more detailed community support via the [XDA developer thread](http://forum.xda-developers.com/showthread.php?t=2190753).
+
+## Contributing
+
+You want to be involved in the project? Welcome onboard!
+Check [the contributing guide](CONTRIBUTING.md) to learn how to report bugs, suggest features and make you first code contribution :+1:
+
+If you are looking for translating the application in your language, [the translating guide](TRANSLATING.md) is for you.
+
+## Project Status
+
+AdAway is actively developed by:
+* Bruce Bujon ([@PerfectSlayer](https://github.com/PerfectSlayer)) - Developer
+[PayPal](https://paypal.me/BruceBUJON) | [GitHub Sponsorship](https://github.com/sponsors/PerfectSlayer)
+* Daniel Mönch ([@Vankog](https://github.com/Vankog)) - Translations
+* Jawz101 ([@jawz101](https://github.com/jawz101)) - Hosts list
+* Anxhelo Lushka ([@AnXh3L0](https://github.com/AnXh3L0)) - Web site
+
+We do not forget the past maintainers:
+* Dāvis Mošenkovs ([@DavisNT](https://github.com/DavisNT)) - Developer
+[Paypal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=5GUHNXYE58RZS&lc=US&item_name=AdAway%20Donation&no_note=0&no_shipping=1)
+* [@0-kaladin](https://github.com/0-kaladin) - Developer and XDA OP
+* Sanjay Govind ([@sanjay900](https://github.com/sanjay900)) - Developer
+
+And we thank a lot to the original author:
+* Dominik Schürmann ([@dschuermann](https://github.com/dschuermann)) - Original developer
+[Paypal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=android%40schuermann.eu&lc=US&item_name=AdAway%20Donation&no_note=0&no_shipping=1¤cy_code=EUR) | [Flattr](https://flattr.com/thing/369138/AdAway-Ad-blocker-for-Android) | BTC: `173kZxbkKuvnF5fa5b7t21kqU5XfEvvwTs`
+
+## Permissions
+
+AdAway requires the following permissions:
+
+* `INTERNET` to download hosts files and application updates. It can send bug reports and telemetry [if the user wants to (opt-in only)](https://github.com/AdAway/AdAway/wiki/Telemetry)
+* `ACCESS_NETWORK_STATE` to restart VPN on network connection change
+* `RECEIVE_BOOT_COMPLETED` to start the VPN on boot
+* `FOREGROUND_SERVICE` to run the VPN service in foreground
+* `POST_NOTIFICATIONS` to post notifications about hosts source update, application update and VPN controls. All notifications can be enabled or disabled independently.
+* `REQUEST_INSTALL_PACKAGES` to update the application using the builtin updater
+* `QUERY_ALL_PACKAGES` to let the user pick the applications to exclude from VPN
+
+## Licenses
+
+AdAway is licensed under the GPLv3+.
+The file LICENSE includes the full license text.
+For more details, check [the license notes](LICENSE.md).
diff --git a/RELEASING.md b/RELEASING.md
new file mode 100644
index 0000000..be4cea1
--- /dev/null
+++ b/RELEASING.md
@@ -0,0 +1,92 @@
+# Releasing
+
+## 1. Checking bugs and technical debt
+
+### Lint checks
+
+Android development tools provide linter to check common errors.
+Use `./gradlew :app:lint` to run the linter and produce (human readable) reports as HTML file located at `app/build/reports/lint-results.html`.
+
+> [!IMPORTANT]
+> Check no new warning was introduced before releasing.
+
+### SonarCloud analysis
+
+The AdAway application source code is [analyzed by SonarCloud](https://sonarcloud.io/dashboard?id=org.adaway) to find bugs, code smells and compute technical debt.
+While the overall score may be not perfect, each new release should not increase it.
+
+> [!IMPORTANT]
+> Check no new bug nor debt was introduced before releasing.
+
+## 2. Updating application version
+
+Each version has its own number that follows the [Semantic Versioning](https://semver.org/) principle (starting from version 4).
+
+> [!IMPORTANT]
+> Update application version name (`appName`) and code (`appCode`) from the `gradle/libs.versions.toml` catalog file.
+
+## 3. Updating the changelog
+
+The AdAway project provides [a global changelog](CHANGELOG.md).
+
+> [!IMPORTANT]
+> Update the changelog to let users know what is inside each new version before releasing it.
+
+## 4. Building release APK
+
+The release apk must be built using the `release` flavor (not `debug`).
+Check the [contributing guide for building instructions](CONTRIBUTING.md#building-the-project).
+
+> [!IMPORTANT]
+> Rename to release apk file to follow the format: `AdAway--.apk`
+
+Example: _AdAway-6.1.2-20220817.apk_ for the version 6.1.2 built the 08/17/22.
+
+## 5. Distributing release
+
+Before sharing the any release, remember to test it.
+Release variant apk does not behave like debug variant.
+Same goes for real device versus emulator.
+
+> [!IMPORTANT]
+> Final tests should be done with release apk variant on real device.
+
+Once tested, releases are posted on XDA development thread using the following template:
+```
+Hi all,
+
+
+
+[U][SIZE="4"]Changelog:[/SIZE][/U]
+[LIST]
+[*] Item 1
+[*] Item 2
+[*] ...
+[*] Item n
+[/LIST]
+
+[U][SIZE="4"]Thanks:[/SIZE][/U]
+
+Special thanks to for theirs contributions and for theirs helpful bug reports.
+
+[U][SIZE="4"]Download:[/SIZE][/U]
+
+[URL="https://app.adaway.org/adaway.apk"]AdAway [/URL]
+```
+
+### Beta releases
+
+The beta releases are only announced in the XDA development thread.
+
+### Stable releases
+
+The stable releases are distributed through [GitHub releases](https://github.com/AdAway/AdAway/releases) and [F-Droid store](https://f-droid.org/packages/org.adaway/) and are posted of the first post of XDA development thread.
+Once ready, create and push a tag on GitHub repository using `vX.Y.Z` format (or `vX.Y.Zb` for pre-releases).
+To publish the application in GitHub:
+
+* Create a new version based on this tag,
+* Copy the changelog part related to the version as description of the release,
+* Upload apk binary to the release.
+
+Pushing a tag will publish the application to F-Droid store.
+It might takes some days to update but if it does not, build logs are available at the following address: `https://monitor.f-droid.org/builds/log/org.adaway/`.
diff --git a/Resources/XDADevelopers.png b/Resources/XDADevelopers.png
new file mode 100644
index 0000000..5779f68
Binary files /dev/null and b/Resources/XDADevelopers.png differ
diff --git a/Resources/adaway_screenshot.png b/Resources/adaway_screenshot.png
new file mode 100644
index 0000000..6ac4018
Binary files /dev/null and b/Resources/adaway_screenshot.png differ
diff --git a/Resources/certificate/generate.sh b/Resources/certificate/generate.sh
new file mode 100644
index 0000000..93f8d39
--- /dev/null
+++ b/Resources/certificate/generate.sh
@@ -0,0 +1,9 @@
+rm localhost.*
+
+# Add compatibility for MINGW
+kernel=$(uname -s)
+if [[ $kernel == MINGW* ]]; then
+ export MSYS_NO_PATHCONV=1
+fi
+
+openssl req -x509 -out localhost.crt -keyout localhost.key -newkey rsa:2048 -nodes -sha256 -days 1126 -subj /CN=localhost -extensions EXT -config ssl.conf
diff --git a/Resources/certificate/ssl.conf b/Resources/certificate/ssl.conf
new file mode 100644
index 0000000..43f3242
--- /dev/null
+++ b/Resources/certificate/ssl.conf
@@ -0,0 +1,15 @@
+[dn]
+CN=localhost
+[req]
+distinguished_name = dn
+[EXT]
+subjectAltName=@alternate_names
+keyUsage=digitalSignature
+extendedKeyUsage=serverAuth
+basicConstraints=CA:true
+[alternate_names]
+DNS.1=localhost
+DNS.2=*.doubleclick.net
+DNS.3=*.g.doubleclick.net
+IP.1=127.0.0.1
+
diff --git a/Resources/device-2013-06-19-105150.png b/Resources/device-2013-06-19-105150.png
new file mode 100644
index 0000000..901a87f
Binary files /dev/null and b/Resources/device-2013-06-19-105150.png differ
diff --git a/Resources/device-2013-06-19-105158.png b/Resources/device-2013-06-19-105158.png
new file mode 100644
index 0000000..b5ede4d
Binary files /dev/null and b/Resources/device-2013-06-19-105158.png differ
diff --git a/Resources/device-2013-06-19-105215.png b/Resources/device-2013-06-19-105215.png
new file mode 100644
index 0000000..e49c07e
Binary files /dev/null and b/Resources/device-2013-06-19-105215.png differ
diff --git a/Resources/download_fdroid.png b/Resources/download_fdroid.png
new file mode 100644
index 0000000..90014d6
Binary files /dev/null and b/Resources/download_fdroid.png differ
diff --git a/Resources/download_google_play.png b/Resources/download_google_play.png
new file mode 100644
index 0000000..a46bf35
Binary files /dev/null and b/Resources/download_google_play.png differ
diff --git a/Resources/get-it-on-adaway.png b/Resources/get-it-on-adaway.png
new file mode 100644
index 0000000..60ed3b0
Binary files /dev/null and b/Resources/get-it-on-adaway.png differ
diff --git a/Resources/get-it-on-fdroid.png b/Resources/get-it-on-fdroid.png
new file mode 100644
index 0000000..afa603c
Binary files /dev/null and b/Resources/get-it-on-fdroid.png differ
diff --git a/Resources/icon.svg b/Resources/icon.svg
new file mode 100644
index 0000000..a9c275b
--- /dev/null
+++ b/Resources/icon.svg
@@ -0,0 +1,112 @@
+
+
+
+
diff --git a/Resources/icon.xcf b/Resources/icon.xcf
new file mode 100644
index 0000000..3fb64d5
Binary files /dev/null and b/Resources/icon.xcf differ
diff --git a/Resources/icon_background.png b/Resources/icon_background.png
new file mode 100644
index 0000000..2da2675
Binary files /dev/null and b/Resources/icon_background.png differ
diff --git a/Resources/icon_background.xcf b/Resources/icon_background.xcf
new file mode 100644
index 0000000..355a16e
Binary files /dev/null and b/Resources/icon_background.xcf differ
diff --git a/Resources/icon_foreground.png b/Resources/icon_foreground.png
new file mode 100644
index 0000000..20bf443
Binary files /dev/null and b/Resources/icon_foreground.png differ
diff --git a/Resources/icon_foreground.xcf b/Resources/icon_foreground.xcf
new file mode 100644
index 0000000..738db0b
Binary files /dev/null and b/Resources/icon_foreground.xcf differ
diff --git a/Resources/icon_old.svg b/Resources/icon_old.svg
new file mode 100644
index 0000000..8c60fe1
--- /dev/null
+++ b/Resources/icon_old.svg
@@ -0,0 +1,356 @@
+
+
+
+
diff --git a/Resources/logo_googlecode.png b/Resources/logo_googlecode.png
new file mode 100644
index 0000000..eb6e199
Binary files /dev/null and b/Resources/logo_googlecode.png differ
diff --git a/Resources/logo_market.png b/Resources/logo_market.png
new file mode 100644
index 0000000..3c358e3
Binary files /dev/null and b/Resources/logo_market.png differ
diff --git a/Resources/paypal_donate_button.gif b/Resources/paypal_donate_button.gif
new file mode 100644
index 0000000..43cef69
Binary files /dev/null and b/Resources/paypal_donate_button.gif differ
diff --git a/Resources/screenshot1.png b/Resources/screenshot1.png
new file mode 100644
index 0000000..c1e809f
Binary files /dev/null and b/Resources/screenshot1.png differ
diff --git a/Resources/screenshot2.png b/Resources/screenshot2.png
new file mode 100644
index 0000000..fefdbfb
Binary files /dev/null and b/Resources/screenshot2.png differ
diff --git a/Resources/screenshot3.png b/Resources/screenshot3.png
new file mode 100644
index 0000000..deb4ca5
Binary files /dev/null and b/Resources/screenshot3.png differ
diff --git a/Resources/screenshot4.png b/Resources/screenshot4.png
new file mode 100644
index 0000000..a16ba75
Binary files /dev/null and b/Resources/screenshot4.png differ
diff --git a/Resources/screenshot5.png b/Resources/screenshot5.png
new file mode 100644
index 0000000..157745a
Binary files /dev/null and b/Resources/screenshot5.png differ
diff --git a/Resources/screenshot6.png b/Resources/screenshot6.png
new file mode 100644
index 0000000..93ee3b4
Binary files /dev/null and b/Resources/screenshot6.png differ
diff --git a/Resources/status_bar_icon.svg b/Resources/status_bar_icon.svg
new file mode 100644
index 0000000..b8c89b9
--- /dev/null
+++ b/Resources/status_bar_icon.svg
@@ -0,0 +1,358 @@
+
+
+
+
diff --git a/Resources/symlink_hosts_to_data.zip b/Resources/symlink_hosts_to_data.zip
new file mode 100644
index 0000000..53d5255
Binary files /dev/null and b/Resources/symlink_hosts_to_data.zip differ
diff --git a/Resources/tasker/1-create-tasks.jpg b/Resources/tasker/1-create-tasks.jpg
new file mode 100644
index 0000000..b4d40ed
Binary files /dev/null and b/Resources/tasker/1-create-tasks.jpg differ
diff --git a/Resources/tasker/2-enable-adblock-task.jpg b/Resources/tasker/2-enable-adblock-task.jpg
new file mode 100644
index 0000000..41325ed
Binary files /dev/null and b/Resources/tasker/2-enable-adblock-task.jpg differ
diff --git a/Resources/tasker/3-enable-adblock-task-details1.jpg b/Resources/tasker/3-enable-adblock-task-details1.jpg
new file mode 100644
index 0000000..651eddb
Binary files /dev/null and b/Resources/tasker/3-enable-adblock-task-details1.jpg differ
diff --git a/Resources/tasker/4-enable-adblock-task-details2.jpg b/Resources/tasker/4-enable-adblock-task-details2.jpg
new file mode 100644
index 0000000..2f5cd5c
Binary files /dev/null and b/Resources/tasker/4-enable-adblock-task-details2.jpg differ
diff --git a/Resources/tasker/5-disable-adblock-task.jpg b/Resources/tasker/5-disable-adblock-task.jpg
new file mode 100644
index 0000000..e6ad84a
Binary files /dev/null and b/Resources/tasker/5-disable-adblock-task.jpg differ
diff --git a/Resources/tasker/6-disable-adblock-task-details1.jpg b/Resources/tasker/6-disable-adblock-task-details1.jpg
new file mode 100644
index 0000000..90263b8
Binary files /dev/null and b/Resources/tasker/6-disable-adblock-task-details1.jpg differ
diff --git a/Resources/tasker/7-disable-adblock-task-details2.jpg b/Resources/tasker/7-disable-adblock-task-details2.jpg
new file mode 100644
index 0000000..d28911e
Binary files /dev/null and b/Resources/tasker/7-disable-adblock-task-details2.jpg differ
diff --git a/Resources/test-webserver.sh b/Resources/test-webserver.sh
new file mode 100644
index 0000000..8622857
--- /dev/null
+++ b/Resources/test-webserver.sh
@@ -0,0 +1,16 @@
+#
+# Launch web server from a root shell.
+#
+
+APP_FOLDER=$(find /data/app -type d -name "org.adaway-*")
+LIB_FOLDER="${APP_FOLDER}/lib/arm64"
+WEBSERVER_EXEC="$LIB_FOLDER/libwebserver_exec.so"
+WEBSERVER_ARGS="--resources /data/user/0/org.adaway/files/webserver --debug"
+
+if [ ! -e $WEBSERVER_EXEC ]; then
+ echo "Web server exec not found" >&2
+ exit 1
+fi
+
+echo "Running LD_LIBRARY_PATH=$LIB_FOLDER $WEBSERVER_EXEC $WEBSERVER_ARGS"
+LD_LIBRARY_PATH=$LIB_FOLDER $WEBSERVER_EXEC $WEBSERVER_ARGS
diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md
new file mode 100644
index 0000000..3d80b5c
--- /dev/null
+++ b/THIRD_PARTY_LICENSES.md
@@ -0,0 +1,78 @@
+# Licenses
+
+AdAway is licensed under the GPLv3+.
+The file [LICENSE.md](LICENSE.md) includes the full license text.
+
+## AdAway Application
+
+AdAway is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+AdAway is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with AdAway.
+If not, see .
+
+## Third-Party Libraries
+
+* Android Jetpack
+ https://developer.android.com/jetpack/
+ Apache License v2
+
+* DNS66
+ https://github.com/julian-klode/dns66
+ GPLv3
+
+* dnsjava
+ https://github.com/dnsjava/dnsjava
+ BSD-3-Clause License
+
+* Guava
+ https://github.com/google/guava
+ Apache License v2
+
+* libsu
+ https://github.com/topjohnwu/libsu
+ Apache License v2
+
+* Material Components for Android
+ https://github.com/material-components/material-components-android
+ Apache License v2
+
+* Mongoose Webserver
+ https://github.com/cesanta/mongoose
+ GPLv2 License
+
+* OkHttp
+ https://github.com/square/okhttp
+ Apache License v2
+
+* Openssl
+ https://www.openssl.org/
+ [OpenSSL license](https://www.openssl.org/source/license-openssl-ssleay.txt)
+
+* Pcap4J
+ https://github.com/kaitoy/pcap4j
+ MIT License
+
+* Sentry Java
+ https://github.com/getsentry/sentry-java
+ BSD 3-Clause License
+
+* SLF4J
+ https://www.slf4j.org/
+ MIT License
+
+* Tcpdump/Libpcap
+ https://www.tcpdump.org/
+ BSD 3-Clause License
+
+## Images
+
+* icon.svg, banner.svg
+ AdAway by Dominik Schürmann
+ New version by Alin Ţoţea-Radu
+ GPLv3
+
+* Menu Icons
+ Original Android Icons
diff --git a/TRANSLATING.md b/TRANSLATING.md
new file mode 100644
index 0000000..c156ee8
--- /dev/null
+++ b/TRANSLATING.md
@@ -0,0 +1,39 @@
+# Translating to your language
+
+You can help us with your translation efforts!
+
+Please have a look at ticket No. [AdAway/AdAway#1050](https://github.com/AdAway/AdAway/issues/1050) for more detailed information, questions and discussions!
+We apreciate new contributors and translations are perfect for getting started with contributing at Github in general.
+
+Here is the gist:
+Translations are managed via the **transifex.com website**! (and Transifex' website alone, that is)
+
+Unfortunately, we cannot merge translations via Github directly. Please follow the steps below instead.
+Sorry, but this causes some major synchronization issues if not followed. We have to consolidate many contributions by translators and sync them up to the latest state. That is just not possible via Github.
+
+1. Please go to **https://www.transifex.com/free-software-for-android/adaway/**
+1. Login or create a new account (you can conveniently login via Github as well)
+1. Enroll into the language you want to contribute to or even submit a request for a new language.
+ * Please keep in mind that we want to stick to the basic languages where possible (e.g. `sr` for Serbian).
+ Please refrain to request regional localizations (like `sr_RS`).
+1. In your language section, you can browse all available resources and start **translating strings right in your browser**.
+ * You don't have to download anything. Just click "Translate". The downloads are meant for more advanced use cases.
+
+## Here are some tips for using Transifex:
+* Make sure to have an eye on the **"Suggestions", "History", "Context" and "Glossary" tabs** on every entry.
+ * Mind translation efforts that were already done or suggested.
+ Basically, »*stand on the shoulders of giants*« where possible.
+ * Sometimes source strings change only marginally, but their translations get cleared anyway.
+ You can easily **recover their previous translations** by looking at the "Suggestions" tab. Just make sure they really fit the new source text and edit the translation if needed.
+* Help us validate translations by **reviewing others'**.
+* Some strings contain **placeholders** - like for HTML tags or numbers.
+You can click on them to add them or use keyboard shortcuts (see the page settings for an overview).
+* You can point out issues to the Translation Organizers via the **"Comments" tab** or just start a discussion.
+* Don't forget to save your work!
+* Please don't create any Translation Pull Request here on Github.
+ * We will integrate your contributions from time to time into the code by exporting from Transifex directly. No need to provide any files from your side. ;-)
+* For more information about how to use Transifex, see https://docs.transifex.com/
+
+
+We will add all Transifex translations from time to time to the app.
+For our Translation Organizers: You can use the CLI tool for this to retrieve translated resources from the Transifex server and add them to the Github repo. (See https://docs.transifex.com/client/ for more details about the client tool.)
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..e1d831c
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,36 @@
+#Android specific
+bin
+gen
+obj
+libs/armeabi
+libs/armeabi-v7a
+libs/arm64-v8a
+libs/mips
+libs/mips64
+libs/x86
+libs/x86_64
+local.properties
+release.properties
+ant.properties
+*.class
+*.apk
+
+#Gradle
+.gradle
+build
+gradle.properties
+
+#Maven
+target
+pom.xml.*
+
+#Eclipse
+.project
+.classpath
+.settings
+.metadata
+
+#IntelliJ IDEA
+.idea
+*.iml
+/.externalNativeBuild/
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..b6c549e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,149 @@
+plugins {
+ id 'com.android.application'
+}
+
+boolean keyStoreDefined = project.hasProperty('signingStoreLocation') &&
+ project.hasProperty('signingStorePassword') &&
+ project.hasProperty('signingKeyAlias') &&
+ project.hasProperty('signingKeyPassword')
+
+repositories {
+ maven {
+ url 'https://jitpack.io'
+ }
+}
+
+android {
+ compileSdk 34
+ ndkVersion '25.2.9519653'
+ namespace 'org.adaway'
+
+ defaultConfig {
+ minSdk 26
+ targetSdk 33
+ versionCode libs.versions.appCode.get() as int
+ versionName libs.versions.appName.get()
+
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments = [
+ "room.schemaLocation": "$projectDir/schemas".toString(),
+ "room.incremental" : "true"
+ ]
+ }
+ }
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ /*
+ * To sign release build, create file gradle.properties in ~/.gradle/ with this content:
+ *
+ * signingStoreLocation=/home/key.store
+ * signingStorePassword=xxx
+ * signingKeyAlias=alias
+ * signingKeyPassword=xxx
+ */
+ if (keyStoreDefined) {
+ println "Found signature properties in gradle.properties. Build will be signed."
+
+ signingConfigs {
+ release {
+ storeFile file(signingStoreLocation)
+ storePassword signingStorePassword
+ keyAlias signingKeyAlias
+ keyPassword signingKeyPassword
+ }
+ }
+
+ buildTypes.debug.signingConfig = signingConfigs.release
+ buildTypes.release.signingConfig = signingConfigs.release
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+
+ buildFeatures {
+ viewBinding true
+ }
+
+ packagingOptions {
+ jniLibs {
+ useLegacyPackaging = true
+ }
+ }
+
+ buildTypes {
+// debug {
+// shrinkResources false
+// minifyEnabled false
+// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+// }
+ release {
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ // Do not abort build if lint finds errors
+ lint {
+ disable 'MissingTranslation'
+ }
+}
+
+dependencies {
+ // Native modules
+ implementation project(':tcpdump')
+ implementation project(':webserver')
+
+ // AndroidX components
+ implementation 'androidx.appcompat:appcompat:1.7.0'
+ implementation 'androidx.cardview:cardview:1.0.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation 'androidx.fragment:fragment:1.8.1'
+ // "fragment-ktx" is not used but was added to fix the following dependency error:
+ // Duplicate class androidx.lifecycle.ViewModelLazy found in modules lifecycle-viewmodel-2.5.0-runtime (androidx.lifecycle:lifecycle-viewmodel:2.5.0) and lifecycle-viewmodel-ktx-2.3.1-runtime
+ implementation 'androidx.fragment:fragment-ktx:1.8.1'
+ implementation 'androidx.paging:paging-runtime:3.3.0'
+ implementation 'androidx.preference:preference:1.2.1'
+ implementation 'androidx.recyclerview:recyclerview:1.3.2'
+ implementation 'androidx.room:room-runtime:2.6.1'
+ implementation 'androidx.room:room-paging:2.6.1'
+ annotationProcessor 'androidx.room:room-compiler:2.6.1'
+ implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
+ implementation 'androidx.work:work-runtime:2.8.1'
+ implementation 'com.google.android.material:material:1.9.0'
+
+ // Collections related
+ implementation libs.guava
+ // Network related
+ implementation libs.okhttp3.okhttp
+ // Logging related
+ implementation libs.timber
+ if (keyStoreDefined) {
+ implementation project(':sentrystub')
+ } else {
+ implementation platform('io.sentry:sentry-bom:7.8.0')
+ implementation('io.sentry:sentry-android')
+ implementation('io.sentry:sentry-android-fragment')
+ implementation('io.sentry:sentry-android-timber')
+ }
+
+ // Root related
+ implementation libs.libsu
+
+ // VPN related
+ implementation libs.bundles.pcap4j
+ implementation libs.dnsjava
+ implementation libs.slf4j.android
+ implementation libs.okhttp.dnsoverhttps
+
+ // Test related
+ testImplementation libs.junit
+ testImplementation libs.json
+ androidTestImplementation libs.bundles.androidx.test
+ androidTestImplementation libs.junit
+}
diff --git a/app/lint.xml b/app/lint.xml
new file mode 100644
index 0000000..c9b3b56
--- /dev/null
+++ b/app/lint.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..9e595c1
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,38 @@
+-keep public class * extends android.content.ContentProvider
+
+# Temporary fix for androidx preference fragement reference
+# See https://issuetracker.google.com/issues/145316223
+-keep public class org.adaway.ui.prefs.PrefsBackupRestoreFragment
+-keep public class org.adaway.ui.prefs.PrefsRootFragment
+-keep public class org.adaway.ui.prefs.PrefsUpdateFragment
+-keep public class org.adaway.ui.prefs.PrefsVpnFragment
+
+-keepclassmembers class io.sentry.Sentry {
+ public static final boolean STUB;
+}
+
+-dontobfuscate
+
+### Android Jetpack ###
+-dontwarn com.google.**
+
+### Sentry ###
+-dontwarn io.sentry.**
+
+### OkHttp ###
+# JSR 305 annotations are for embedding nullability information.
+-dontwarn javax.annotation.**
+# A resource is loaded with a relative path so the package of this class must be preserved.
+-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
+# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
+-dontwarn org.codehaus.mojo.animal_sniffer.*
+# OkHttp platform used only on JVM and when Conscrypt dependency is available.
+-dontwarn okhttp3.internal.platform.ConscryptPlatform
+# Generated rules from R8
+-dontwarn org.bouncycastle.jsse.**
+-dontwarn org.conscrypt.**
+-dontwarn org.openjsse.**
+
+### dnsjava ###
+-dontwarn lombok.Generated
+-dontwarn sun.net.spi.nameservice.NameServiceDescriptor
diff --git a/app/schemas/org.adaway.db.AppDatabase/1.json b/app/schemas/org.adaway.db.AppDatabase/1.json
new file mode 100644
index 0000000..730547f
--- /dev/null
+++ b/app/schemas/org.adaway.db.AppDatabase/1.json
@@ -0,0 +1,90 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 1,
+ "identityHash": "5175df445bc75bbbb5ea672750d7b425",
+ "entities": [
+ {
+ "tableName": "hosts_sources",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER, PRIMARY KEY(`url`))",
+ "fields": [
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastLocalModification",
+ "columnName": "last_modified_local",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastOnlineModification",
+ "columnName": "last_modified_online",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "url"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "hosts_lists",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, PRIMARY KEY(`host`))",
+ "fields": [
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "host"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"5175df445bc75bbbb5ea672750d7b425\")"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/org.adaway.db.AppDatabase/2.json b/app/schemas/org.adaway.db.AppDatabase/2.json
new file mode 100644
index 0000000..27a6560
--- /dev/null
+++ b/app/schemas/org.adaway.db.AppDatabase/2.json
@@ -0,0 +1,146 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 2,
+ "identityHash": "e9b86296a34de1d881f8530fdf2c535d",
+ "entities": [
+ {
+ "tableName": "hosts_sources",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastLocalModification",
+ "columnName": "last_modified_local",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastOnlineModification",
+ "columnName": "last_modified_online",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_sources_url",
+ "unique": true,
+ "columnNames": [
+ "url"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hosts_sources_url` ON `${TABLE_NAME}` (`url`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "hosts_lists",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, `source_id` INTEGER NOT NULL, FOREIGN KEY(`source_id`) REFERENCES `hosts_sources`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sourceId",
+ "columnName": "source_id",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_lists_host",
+ "unique": true,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hosts_lists_host` ON `${TABLE_NAME}` (`host`)"
+ },
+ {
+ "name": "index_hosts_lists_source_id",
+ "unique": false,
+ "columnNames": [
+ "source_id"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_source_id` ON `${TABLE_NAME}` (`source_id`)"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "table": "hosts_sources",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "source_id"
+ ],
+ "referencedColumns": [
+ "id"
+ ]
+ }
+ ]
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e9b86296a34de1d881f8530fdf2c535d')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/org.adaway.db.AppDatabase/3.json b/app/schemas/org.adaway.db.AppDatabase/3.json
new file mode 100644
index 0000000..070e8d9
--- /dev/null
+++ b/app/schemas/org.adaway.db.AppDatabase/3.json
@@ -0,0 +1,151 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 3,
+ "identityHash": "ace31b365ff79d4497319c74157538d7",
+ "entities": [
+ {
+ "tableName": "hosts_sources",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastLocalModification",
+ "columnName": "last_modified_local",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastOnlineModification",
+ "columnName": "last_modified_online",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_sources_url",
+ "unique": true,
+ "columnNames": [
+ "url"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hosts_sources_url` ON `${TABLE_NAME}` (`url`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "hosts_lists",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, `source_id` INTEGER NOT NULL, FOREIGN KEY(`source_id`) REFERENCES `hosts_sources`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sourceId",
+ "columnName": "source_id",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_lists_host",
+ "unique": false,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_host` ON `${TABLE_NAME}` (`host`)"
+ },
+ {
+ "name": "index_hosts_lists_source_id",
+ "unique": false,
+ "columnNames": [
+ "source_id"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_source_id` ON `${TABLE_NAME}` (`source_id`)"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "table": "hosts_sources",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "source_id"
+ ],
+ "referencedColumns": [
+ "id"
+ ]
+ }
+ ]
+ }
+ ],
+ "views": [
+ {
+ "viewName": "host_entries",
+ "createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT `host`, `type`, `redirection` FROM `hosts_lists` WHERE `enabled` = 1 AND ((`type` = 0 AND `host` NOT LIKE (SELECT `host` FROM `hosts_lists` WHERE `enabled` = 1 and `type` = 1)) OR `type` = 2) ORDER BY `host` ASC, `type` DESC, `redirection` ASC"
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ace31b365ff79d4497319c74157538d7')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/org.adaway.db.AppDatabase/4.json b/app/schemas/org.adaway.db.AppDatabase/4.json
new file mode 100644
index 0000000..3a90484
--- /dev/null
+++ b/app/schemas/org.adaway.db.AppDatabase/4.json
@@ -0,0 +1,187 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 4,
+ "identityHash": "80b1c1d47fbd109a4f052817c9faf980",
+ "entities": [
+ {
+ "tableName": "hosts_sources",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "localModificationDate",
+ "columnName": "last_modified_local",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "onlineModificationDate",
+ "columnName": "last_modified_online",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_sources_url",
+ "unique": true,
+ "columnNames": [
+ "url"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hosts_sources_url` ON `${TABLE_NAME}` (`url`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "hosts_lists",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, `source_id` INTEGER NOT NULL, FOREIGN KEY(`source_id`) REFERENCES `hosts_sources`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sourceId",
+ "columnName": "source_id",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_lists_host",
+ "unique": false,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_host` ON `${TABLE_NAME}` (`host`)"
+ },
+ {
+ "name": "index_hosts_lists_source_id",
+ "unique": false,
+ "columnNames": [
+ "source_id"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_source_id` ON `${TABLE_NAME}` (`source_id`)"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "table": "hosts_sources",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "source_id"
+ ],
+ "referencedColumns": [
+ "id"
+ ]
+ }
+ ]
+ },
+ {
+ "tableName": "host_entries",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `type` INTEGER NOT NULL, `redirection` TEXT, PRIMARY KEY(`host`))",
+ "fields": [
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "host"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [
+ {
+ "name": "index_host_entries_host",
+ "unique": true,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_host_entries_host` ON `${TABLE_NAME}` (`host`)"
+ }
+ ],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '80b1c1d47fbd109a4f052817c9faf980')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/org.adaway.db.AppDatabase/5.json b/app/schemas/org.adaway.db.AppDatabase/5.json
new file mode 100644
index 0000000..5ec1659
--- /dev/null
+++ b/app/schemas/org.adaway.db.AppDatabase/5.json
@@ -0,0 +1,187 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 5,
+ "identityHash": "80b1c1d47fbd109a4f052817c9faf980",
+ "entities": [
+ {
+ "tableName": "hosts_sources",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "localModificationDate",
+ "columnName": "last_modified_local",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "onlineModificationDate",
+ "columnName": "last_modified_online",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_sources_url",
+ "unique": true,
+ "columnNames": [
+ "url"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hosts_sources_url` ON `${TABLE_NAME}` (`url`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "hosts_lists",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, `source_id` INTEGER NOT NULL, FOREIGN KEY(`source_id`) REFERENCES `hosts_sources`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sourceId",
+ "columnName": "source_id",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_lists_host",
+ "unique": false,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_host` ON `${TABLE_NAME}` (`host`)"
+ },
+ {
+ "name": "index_hosts_lists_source_id",
+ "unique": false,
+ "columnNames": [
+ "source_id"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_source_id` ON `${TABLE_NAME}` (`source_id`)"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "table": "hosts_sources",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "source_id"
+ ],
+ "referencedColumns": [
+ "id"
+ ]
+ }
+ ]
+ },
+ {
+ "tableName": "host_entries",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `type` INTEGER NOT NULL, `redirection` TEXT, PRIMARY KEY(`host`))",
+ "fields": [
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "host"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [
+ {
+ "name": "index_host_entries_host",
+ "unique": true,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_host_entries_host` ON `${TABLE_NAME}` (`host`)"
+ }
+ ],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '80b1c1d47fbd109a4f052817c9faf980')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/org.adaway.db.AppDatabase/6.json b/app/schemas/org.adaway.db.AppDatabase/6.json
new file mode 100644
index 0000000..112de3d
--- /dev/null
+++ b/app/schemas/org.adaway.db.AppDatabase/6.json
@@ -0,0 +1,211 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 6,
+ "identityHash": "c53f309b3cbcdeda90c9f22573023ac2",
+ "entities": [
+ {
+ "tableName": "hosts_sources",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `label` TEXT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `allowEnabled` INTEGER NOT NULL, `redirectEnabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER, `size` INTEGER NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "label",
+ "columnName": "label",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "allowEnabled",
+ "columnName": "allowEnabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirectEnabled",
+ "columnName": "redirectEnabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "localModificationDate",
+ "columnName": "last_modified_local",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "onlineModificationDate",
+ "columnName": "last_modified_online",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "size",
+ "columnName": "size",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_sources_url",
+ "unique": true,
+ "columnNames": [
+ "url"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hosts_sources_url` ON `${TABLE_NAME}` (`url`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "hosts_lists",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, `source_id` INTEGER NOT NULL, FOREIGN KEY(`source_id`) REFERENCES `hosts_sources`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sourceId",
+ "columnName": "source_id",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_lists_host",
+ "unique": false,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_host` ON `${TABLE_NAME}` (`host`)"
+ },
+ {
+ "name": "index_hosts_lists_source_id",
+ "unique": false,
+ "columnNames": [
+ "source_id"
+ ],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_source_id` ON `${TABLE_NAME}` (`source_id`)"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "table": "hosts_sources",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "source_id"
+ ],
+ "referencedColumns": [
+ "id"
+ ]
+ }
+ ]
+ },
+ {
+ "tableName": "host_entries",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `type` INTEGER NOT NULL, `redirection` TEXT, PRIMARY KEY(`host`))",
+ "fields": [
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "host"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [
+ {
+ "name": "index_host_entries_host",
+ "unique": true,
+ "columnNames": [
+ "host"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_host_entries_host` ON `${TABLE_NAME}` (`host`)"
+ }
+ ],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c53f309b3cbcdeda90c9f22573023ac2')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/org.adaway.db.AppDatabase/7.json b/app/schemas/org.adaway.db.AppDatabase/7.json
new file mode 100644
index 0000000..4775b2c
--- /dev/null
+++ b/app/schemas/org.adaway.db.AppDatabase/7.json
@@ -0,0 +1,221 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 7,
+ "identityHash": "dccd6211bcef97caed75ea42d7df1b32",
+ "entities": [
+ {
+ "tableName": "hosts_sources",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `label` TEXT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `allowEnabled` INTEGER NOT NULL, `redirectEnabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER, `entityTag` TEXT, `size` INTEGER NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "label",
+ "columnName": "label",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "allowEnabled",
+ "columnName": "allowEnabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirectEnabled",
+ "columnName": "redirectEnabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "localModificationDate",
+ "columnName": "last_modified_local",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "onlineModificationDate",
+ "columnName": "last_modified_online",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "entityTag",
+ "columnName": "entityTag",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "size",
+ "columnName": "size",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_sources_url",
+ "unique": true,
+ "columnNames": [
+ "url"
+ ],
+ "orders": [],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hosts_sources_url` ON `${TABLE_NAME}` (`url`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "hosts_lists",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, `source_id` INTEGER NOT NULL, FOREIGN KEY(`source_id`) REFERENCES `hosts_sources`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "enabled",
+ "columnName": "enabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sourceId",
+ "columnName": "source_id",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [
+ {
+ "name": "index_hosts_lists_host",
+ "unique": false,
+ "columnNames": [
+ "host"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_host` ON `${TABLE_NAME}` (`host`)"
+ },
+ {
+ "name": "index_hosts_lists_source_id",
+ "unique": false,
+ "columnNames": [
+ "source_id"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_hosts_lists_source_id` ON `${TABLE_NAME}` (`source_id`)"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "table": "hosts_sources",
+ "onDelete": "CASCADE",
+ "onUpdate": "CASCADE",
+ "columns": [
+ "source_id"
+ ],
+ "referencedColumns": [
+ "id"
+ ]
+ }
+ ]
+ },
+ {
+ "tableName": "host_entries",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `type` INTEGER NOT NULL, `redirection` TEXT, PRIMARY KEY(`host`))",
+ "fields": [
+ {
+ "fieldPath": "host",
+ "columnName": "host",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "redirection",
+ "columnName": "redirection",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "host"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [
+ {
+ "name": "index_host_entries_host",
+ "unique": true,
+ "columnNames": [
+ "host"
+ ],
+ "orders": [],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_host_entries_host` ON `${TABLE_NAME}` (`host`)"
+ }
+ ],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'dccd6211bcef97caed75ea42d7df1b32')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/src/androidTest/java/org/adaway/db/DbTest.java b/app/src/androidTest/java/org/adaway/db/DbTest.java
new file mode 100644
index 0000000..39b7210
--- /dev/null
+++ b/app/src/androidTest/java/org/adaway/db/DbTest.java
@@ -0,0 +1,151 @@
+package org.adaway.db;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_URL;
+import static org.adaway.db.entity.ListType.ALLOWED;
+import static org.adaway.db.entity.ListType.BLOCKED;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+import static org.junit.Assert.fail;
+
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.Observer;
+import androidx.room.Room;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.adaway.db.dao.HostEntryDao;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.HostsSource;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * This class is a base class for testing database feature.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@RunWith(AndroidJUnit4.class)
+public abstract class DbTest {
+ protected static final int EXTERNAL_SOURCE_ID = 2;
+ @Rule
+ public TestRule rule = new InstantTaskExecutorRule();
+ protected AppDatabase db;
+ protected HostsSourceDao hostsSourceDao;
+ protected HostListItemDao hostListItemDao;
+ protected HostEntryDao hostEntryDao;
+ protected LiveData blockedHostCount;
+ protected LiveData allowedHostCount;
+ protected LiveData redirectedHostCount;
+ protected HostsSource externalHostSource;
+
+ protected static T getOrAwaitValue(final LiveData liveData) throws InterruptedException {
+ final Object[] data = new Object[1];
+ final CountDownLatch latch = new CountDownLatch(1);
+ Observer observer = new Observer() {
+ @Override
+ public void onChanged(@Nullable T o) {
+ data[0] = o;
+ latch.countDown();
+ liveData.removeObserver(this);
+ }
+ };
+ liveData.observeForever(observer);
+ if (!latch.await(2, TimeUnit.SECONDS)) {
+ fail("Failed to get LiveData value in time");
+ }
+ //noinspection unchecked
+ return (T) data[0];
+ }
+
+ @Before
+ public void init() {
+ createDb();
+ loadDao();
+ createSources();
+ }
+
+ protected void createDb() {
+ Context context = ApplicationProvider.getApplicationContext();
+ this.db = Room.inMemoryDatabaseBuilder(context, AppDatabase.class)
+ .allowMainThreadQueries()
+ .build();
+ }
+
+ protected void loadDao() {
+ this.hostsSourceDao = this.db.hostsSourceDao();
+ this.hostListItemDao = this.db.hostsListItemDao();
+ this.hostEntryDao = this.db.hostEntryDao();
+ this.blockedHostCount = this.hostListItemDao.getBlockedHostCount();
+ this.allowedHostCount = this.hostListItemDao.getAllowedHostCount();
+ this.redirectedHostCount = this.hostListItemDao.getRedirectHostCount();
+ }
+
+ protected void createSources() {
+ // Insert at least user source and external source to allow duplicate hosts to be inserted
+ insertSource(USER_SOURCE_ID, USER_SOURCE_URL);
+ insertSource(EXTERNAL_SOURCE_ID, "https://adaway.org/hosts.txt");
+ this.externalHostSource = getSourceFromId(EXTERNAL_SOURCE_ID);
+ }
+
+ @After
+ public void closeDb() {
+ this.db.close();
+ }
+
+ protected void insertSource(int id, String url) {
+ HostsSource source = new HostsSource();
+ source.setId(id);
+ source.setLabel(url);
+ source.setUrl(url);
+ source.setEnabled(true);
+ this.hostsSourceDao.insert(source);
+ }
+
+ protected void insertBlockedHost(String host, int sourceId) {
+ HostListItem item = new HostListItem();
+ item.setType(BLOCKED);
+ item.setHost(host);
+ item.setEnabled(true);
+ item.setSourceId(sourceId);
+ this.hostListItemDao.insert(item);
+ }
+
+ protected void insertAllowedHost(String host, int sourceId) {
+ HostListItem item = new HostListItem();
+ item.setType(ALLOWED);
+ item.setHost(host);
+ item.setEnabled(true);
+ item.setSourceId(sourceId);
+ this.hostListItemDao.insert(item);
+ }
+
+ protected void insertRedirectedHost(String host, String redirection, int sourceId) {
+ HostListItem item = new HostListItem();
+ item.setType(REDIRECTED);
+ item.setHost(host);
+ item.setEnabled(true);
+ item.setRedirection(redirection);
+ item.setSourceId(sourceId);
+ this.hostListItemDao.insert(item);
+ }
+
+ protected HostsSource getSourceFromId(int id) {
+ return this.hostsSourceDao.getAll()
+ .stream()
+ .filter(hostsSource -> hostsSource.getId() == id)
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/app/src/androidTest/java/org/adaway/db/HostDbTest.java b/app/src/androidTest/java/org/adaway/db/HostDbTest.java
new file mode 100644
index 0000000..5c1bd44
--- /dev/null
+++ b/app/src/androidTest/java/org/adaway/db/HostDbTest.java
@@ -0,0 +1,90 @@
+package org.adaway.db;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.adaway.db.entity.HostEntry;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * This class tests {@link org.adaway.db.entity.HostListItem} database manipulations.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class HostDbTest extends DbTest {
+ @Test
+ public void testEmptyByDefault() throws InterruptedException {
+ assertEquals(0, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(0, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(0, getOrAwaitValue(this.redirectedHostCount).intValue());
+ assertEquals(0, this.hostEntryDao.getAll().size());
+ }
+
+ @Test
+ public void testInsertThenDeleteHosts() throws InterruptedException {
+ // Insert blocked hosts
+ insertBlockedHost("advertising.apple.com", USER_SOURCE_ID);
+ insertBlockedHost("an.facebook.com", USER_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Check inserting
+ assertEquals(2, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(0, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(0, getOrAwaitValue(this.redirectedHostCount).intValue());
+ assertEquals(2, this.hostEntryDao.getAll().size());
+ // Remove block hosts
+ this.hostListItemDao.deleteUserFromHost("advertising.apple.com");
+ this.hostEntryDao.sync();
+ // Check deletion
+ assertEquals(1, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(0, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(0, getOrAwaitValue(this.redirectedHostCount).intValue());
+ assertEquals(1, this.hostEntryDao.getAll().size());
+ }
+
+ @Test
+ public void testDuplicateBlockedHosts() throws InterruptedException {
+ insertBlockedHost("advertising.apple.com", USER_SOURCE_ID);
+ insertBlockedHost("advertising.apple.com", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ assertEquals(1, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(1, this.hostEntryDao.getAll().size());
+ }
+
+ @Test
+ public void testDuplicateAllowedHosts() throws InterruptedException {
+ insertAllowedHost("adaway.org", USER_SOURCE_ID);
+ insertAllowedHost("adaway.org", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ assertEquals(1, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(0, this.hostEntryDao.getAll().size());
+ }
+
+ @Test
+ public void testDuplicateRedirectedHosts() throws InterruptedException {
+ insertRedirectedHost("github.com", "1.1.1.1", USER_SOURCE_ID);
+ insertRedirectedHost("github.com", "2.2.2.2", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ assertEquals(1, getOrAwaitValue(this.redirectedHostCount).intValue());
+ assertEquals(1, this.hostEntryDao.getAll().size());
+ }
+
+ @Test
+ public void testRedirectionPriority() throws InterruptedException {
+ // Insert two redirects for the same host
+ insertRedirectedHost("adaway.org", "1.1.1.1", USER_SOURCE_ID);
+ insertRedirectedHost("adaway.org", "2.2.2.2", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted redirected hosts
+ assertEquals(1, getOrAwaitValue(this.redirectedHostCount).intValue());
+ // Test inserted redirect
+ List entries = this.hostEntryDao.getAll();
+ assertEquals(1, entries.size());
+ // Test user redirect is applied in priority
+ HostEntry entry = this.hostEntryDao.getEntry("adaway.org");
+ assertNotNull(entry);
+ assertEquals("1.1.1.1", entry.getRedirection());
+ }
+}
diff --git a/app/src/androidTest/java/org/adaway/db/SourceDbTest.java b/app/src/androidTest/java/org/adaway/db/SourceDbTest.java
new file mode 100644
index 0000000..075ba1e
--- /dev/null
+++ b/app/src/androidTest/java/org/adaway/db/SourceDbTest.java
@@ -0,0 +1,113 @@
+package org.adaway.db;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+import static org.junit.Assert.assertEquals;
+
+import org.adaway.db.entity.HostsSource;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * This class tests {@link HostsSource} database manipulations.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class SourceDbTest extends DbTest {
+ @Test
+ public void testSourceCount() {
+ // Test only external source is found
+ List sources = this.hostsSourceDao.getAll();
+ assertEquals(1, sources.size());
+ assertEquals("https://adaway.org/hosts.txt", sources.get(0).getUrl());
+ }
+
+ @Test
+ public void testSourceDeletion() throws InterruptedException {
+ // Insert blocked hosts
+ insertBlockedHost("bingads.microsoft.com", EXTERNAL_SOURCE_ID);
+ insertBlockedHost("ads.yahoo.com", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted blocked hosts
+ assertEquals(2, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(2, this.hostEntryDao.getAll().size());
+ // Delete source
+ this.hostsSourceDao.delete(this.externalHostSource);
+ this.hostEntryDao.sync();
+ List sources = this.hostsSourceDao.getAll();
+ assertEquals(0, sources.size());
+ // Check related hosts cleaning
+ assertEquals(0, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(0, this.hostEntryDao.getAll().size());
+
+ }
+
+ @Test
+ public void testBlockedHostsFromDisabledSource() throws InterruptedException {
+ // Insert blocked hosts
+ insertBlockedHost("advertising.apple.com", USER_SOURCE_ID);
+ insertBlockedHost("an.facebook.com", USER_SOURCE_ID);
+ insertBlockedHost("ads.google.com", USER_SOURCE_ID);
+ insertBlockedHost("bingads.microsoft.com", EXTERNAL_SOURCE_ID);
+ insertBlockedHost("ads.yahoo.com", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted blocked hosts
+ assertEquals(5, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(5, this.hostEntryDao.getAll().size());
+ // Disabled external source
+ this.hostsSourceDao.toggleEnabled(this.externalHostSource);
+ this.hostEntryDao.sync();
+ assertEquals(3, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(3, this.hostEntryDao.getAll().size());
+ // Re-enable external source
+ this.hostsSourceDao.toggleEnabled(this.externalHostSource);
+ this.hostEntryDao.sync();
+ assertEquals(5, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(5, this.hostEntryDao.getAll().size());
+ }
+
+ @Test
+ public void testAllowedHostsFromDisabledSource() throws InterruptedException {
+ // Insert blocked and allowed host
+ insertBlockedHost("adaway.org", USER_SOURCE_ID);
+ insertAllowedHost("adaway.org", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted blocked hosts
+ assertEquals(1, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(1, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(0, this.hostEntryDao.getAll().size());
+ // Disabled a source
+ this.hostsSourceDao.toggleEnabled(this.externalHostSource);
+ this.hostEntryDao.sync();
+ assertEquals(1, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(0, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(1, this.hostEntryDao.getAll().size());
+ // Re-enable a source
+ this.hostsSourceDao.toggleEnabled(this.externalHostSource);
+ this.hostEntryDao.sync();
+ assertEquals(1, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(1, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(0, this.hostEntryDao.getAll().size());
+ }
+
+ @Test
+ public void testRedirectedHostsFromDisabledSource() throws InterruptedException {
+ // Insert redirected hosts
+ insertRedirectedHost("github.com", "1.1.1.1", USER_SOURCE_ID);
+ insertRedirectedHost("github.com", "2.2.2.2", EXTERNAL_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted blocked hosts
+ assertEquals(1, getOrAwaitValue(this.redirectedHostCount).intValue());
+ assertEquals(1, this.hostEntryDao.getAll().size());
+ // Disabled a source
+ this.hostsSourceDao.toggleEnabled(this.externalHostSource);
+ this.hostEntryDao.sync();
+ assertEquals(1, getOrAwaitValue(this.redirectedHostCount).intValue());
+ assertEquals(1, this.hostEntryDao.getAll().size());
+ // Re-enable a source
+ this.hostsSourceDao.toggleEnabled(this.externalHostSource);
+ this.hostEntryDao.sync();
+ assertEquals(1, getOrAwaitValue(this.redirectedHostCount).intValue());
+ assertEquals(1, this.hostEntryDao.getAll().size());
+ }
+}
diff --git a/app/src/androidTest/java/org/adaway/db/UserListTest.java b/app/src/androidTest/java/org/adaway/db/UserListTest.java
new file mode 100644
index 0000000..4bbb2e6
--- /dev/null
+++ b/app/src/androidTest/java/org/adaway/db/UserListTest.java
@@ -0,0 +1,157 @@
+package org.adaway.db;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+import static org.adaway.db.entity.ListType.ALLOWED;
+import static org.adaway.db.entity.ListType.BLOCKED;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.adaway.db.entity.HostEntry;
+import org.junit.Test;
+
+/**
+ * This class the user lists use case where user can freely add blocked, allowed and redirected hosts.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class UserListTest extends DbTest {
+ @Test
+ public void testUserList() throws InterruptedException {
+ testUserBlockedHosts();
+ testUserAllowedHosts();
+ testUserRedirectedHosts();
+ }
+
+ protected void testUserBlockedHosts() throws InterruptedException {
+ // Insert blocked hosts
+ insertBlockedHost("advertising.apple.com", USER_SOURCE_ID);
+ insertBlockedHost("an.facebook.com", USER_SOURCE_ID);
+ insertBlockedHost("ads.google.com", USER_SOURCE_ID);
+ insertBlockedHost("bingads.microsoft.com", USER_SOURCE_ID);
+ insertBlockedHost("ads.yahoo.com", USER_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted blocked hosts
+ assertEquals(5, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(5, this.hostEntryDao.getAll().size());
+ // Test each host type
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("advertising.apple.com"));
+ HostEntry entry = this.hostEntryDao.getEntry("advertising.apple.com");
+ assertNotNull(entry);
+ assertEquals("advertising.apple.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("an.facebook.com"));
+ entry = this.hostEntryDao.getEntry("an.facebook.com");
+ assertNotNull(entry);
+ assertEquals("an.facebook.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("ads.google.com"));
+ entry = this.hostEntryDao.getEntry("ads.google.com");
+ assertNotNull(entry);
+ assertEquals("ads.google.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("bingads.microsoft.com"));
+ entry = this.hostEntryDao.getEntry("bingads.microsoft.com");
+ assertNotNull(entry);
+ assertEquals("bingads.microsoft.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("ads.yahoo.com"));
+ entry = this.hostEntryDao.getEntry("ads.yahoo.com");
+ assertNotNull(entry);
+ assertEquals("ads.yahoo.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ }
+
+ protected void testUserAllowedHosts() throws InterruptedException {
+ // Insert allowed hosts
+ insertAllowedHost("*.google.com", USER_SOURCE_ID);
+ insertAllowedHost("ads.yahoo.com", USER_SOURCE_ID);
+ insertAllowedHost("adaway.org", USER_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted allowed hosts
+ assertEquals(3, getOrAwaitValue(this.allowedHostCount).intValue());
+ // Test overall list
+ assertEquals(5, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(3, this.hostEntryDao.getAll().size());
+ // Test each host type
+ assertEquals(ALLOWED, this.hostEntryDao.getTypeForHost("adaway.org"));
+ HostEntry entry = this.hostEntryDao.getEntry("adaway.org");
+ assertNull(entry);
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("advertising.apple.com"));
+ entry = this.hostEntryDao.getEntry("advertising.apple.com");
+ assertNotNull(entry);
+ assertEquals("advertising.apple.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("an.facebook.com"));
+ entry = this.hostEntryDao.getEntry("an.facebook.com");
+ assertNotNull(entry);
+ assertEquals("an.facebook.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ assertEquals(ALLOWED, this.hostEntryDao.getTypeForHost("ads.google.com"));
+ entry = this.hostEntryDao.getEntry("ads.google.com");
+ assertNull(entry);
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("bingads.microsoft.com"));
+ entry = this.hostEntryDao.getEntry("bingads.microsoft.com");
+ assertNotNull(entry);
+ assertEquals("bingads.microsoft.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+ assertEquals(ALLOWED, this.hostEntryDao.getTypeForHost("ads.yahoo.com"));
+ entry = this.hostEntryDao.getEntry("ads.yahoo.com");
+ assertNull(entry);
+
+ }
+
+ protected void testUserRedirectedHosts() throws InterruptedException {
+ // Insert redirected hosts
+ insertRedirectedHost("ads.yahoo.com", "1.2.3.4", USER_SOURCE_ID);
+ insertRedirectedHost("github.com", "1.2.3.4", USER_SOURCE_ID);
+ this.hostEntryDao.sync();
+ // Test inserted redirected hosts
+ assertEquals(2, getOrAwaitValue(this.redirectedHostCount).intValue());
+ // Test overall list
+ assertEquals(5, getOrAwaitValue(this.blockedHostCount).intValue());
+ assertEquals(3, getOrAwaitValue(this.allowedHostCount).intValue());
+ assertEquals(5, this.hostEntryDao.getAll().size()); // 3 blocked, 2 redirected
+ // Test each host type
+ assertEquals(ALLOWED, this.hostEntryDao.getTypeForHost("adaway.org"));
+ HostEntry entry = this.hostEntryDao.getEntry("adaway.org");
+ assertNull(entry);
+
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("advertising.apple.com"));
+ entry = this.hostEntryDao.getEntry("advertising.apple.com");
+ assertNotNull(entry);
+ assertEquals("advertising.apple.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("an.facebook.com"));
+ entry = this.hostEntryDao.getEntry("an.facebook.com");
+ assertNotNull(entry);
+ assertEquals("an.facebook.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+
+ assertEquals(REDIRECTED, this.hostEntryDao.getTypeForHost("github.com"));
+ entry = this.hostEntryDao.getEntry("github.com");
+ assertNotNull(entry);
+ assertEquals("github.com", entry.getHost());
+ assertEquals(REDIRECTED, entry.getType());
+ assertEquals("1.2.3.4", entry.getRedirection());
+
+ assertEquals(ALLOWED, this.hostEntryDao.getTypeForHost("ads.google.com"));
+ entry = this.hostEntryDao.getEntry("ads.google.com");
+ assertNull(entry);
+
+ assertEquals(BLOCKED, this.hostEntryDao.getTypeForHost("bingads.microsoft.com"));
+ entry = this.hostEntryDao.getEntry("bingads.microsoft.com");
+ assertNotNull(entry);
+ assertEquals("bingads.microsoft.com", entry.getHost());
+ assertEquals(BLOCKED, entry.getType());
+
+ assertEquals(REDIRECTED, this.hostEntryDao.getTypeForHost("ads.yahoo.com"));
+ entry = this.hostEntryDao.getEntry("ads.yahoo.com");
+ assertNotNull(entry);
+ assertEquals("ads.yahoo.com", entry.getHost());
+ assertEquals(REDIRECTED, entry.getType());
+ assertEquals("1.2.3.4", entry.getRedirection());
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..14530b4
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/assets/icon.svg b/app/src/main/assets/icon.svg
new file mode 100644
index 0000000..198a5f1
--- /dev/null
+++ b/app/src/main/assets/icon.svg
@@ -0,0 +1,113 @@
+
+
+
+
diff --git a/app/src/main/assets/localhost-2410.crt b/app/src/main/assets/localhost-2410.crt
new file mode 100644
index 0000000..c39068c
--- /dev/null
+++ b/app/src/main/assets/localhost-2410.crt
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDTTCCAjWgAwIBAgIUR9ZJhU2vy/hB7LChIPgUuBEzqkQwDQYJKoZIhvcNAQEL
+BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI0MTAyNzA2NTEwNVoXDTI3MTEy
+NzA2NTEwNVowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAoVNvAzvXCjH07lgGTwBRMOFNuvsIBzi5rtJw8EQI1+np
+h8jZjGmTq759VoqsRSrzPSb8W4XNmGlg8gm0nRN9VJXE9IccWQmpbl61MG6zu9Ae
+/RZ8iAuydztn16/sOVQMT3Y0dXl3Fz9VtSEAMWZG9iATlVuugShLbod+Smw3mQow
+2Z6Mfg6u4vpPCLG13Hdilv+UGs19dUKlFJdsz2M/gsk0vIlyhaFc9PcyzKJG4Tk2
+XZOHEWMj7VjmEMZoUogihi9EWPLpBoi86dIWBBQfhu9HTwzl1BE33TMtYLPdKdxD
+9I9QPg59wbquiVYZ3sPVISdks4qmg4NgzBJVB/tWhQIDAQABo4GWMIGTMEIGA1Ud
+EQQ7MDmCCWxvY2FsaG9zdIIRKi5kb3VibGVjbGljay5uZXSCEyouZy5kb3VibGVj
+bGljay5uZXSHBH8AAAEwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMB
+MAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFPyh/TOOyMqOumAhxn1Jsyb09CQ3MA0G
+CSqGSIb3DQEBCwUAA4IBAQAdxRNksyLjIwVaKjmC+Yx87zKw8bSmH2mm85KJ0Y7z
+uoWLdiw5Lc7/uZoXEl4KGJEnAXb83lo2042WCn49bOhAtYv7tOBTvTGhCHCZ6p7u
+Lk+dN8eOkfKgIpKv+tyt0y+Dl+K9m0TegBqky03xf+gjfMaNctwkxxl7Ls4CR9Lz
+Bufvt1HxJkmSILmTy8ByJPG5ePN6By4YiEwg9h2Hdx7zEqAKkgHvr4Yn/c4GzDQ+
+UZZW9NCIsKkaV32UfpCSodlpc+xeayX8jxZW2GnXs31IjJd4KuNfK5g7ZuOIZN0S
+iKvTwJkScrfvLlmbCqEJ7Nu4l/XR+5EAy21YNlV+mo7D
+-----END CERTIFICATE-----
diff --git a/app/src/main/assets/localhost-2410.key b/app/src/main/assets/localhost-2410.key
new file mode 100644
index 0000000..cc6250f
--- /dev/null
+++ b/app/src/main/assets/localhost-2410.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChU28DO9cKMfTu
+WAZPAFEw4U26+wgHOLmu0nDwRAjX6emHyNmMaZOrvn1WiqxFKvM9Jvxbhc2YaWDy
+CbSdE31UlcT0hxxZCaluXrUwbrO70B79FnyIC7J3O2fXr+w5VAxPdjR1eXcXP1W1
+IQAxZkb2IBOVW66BKEtuh35KbDeZCjDZnox+Dq7i+k8IsbXcd2KW/5QazX11QqUU
+l2zPYz+CyTS8iXKFoVz09zLMokbhOTZdk4cRYyPtWOYQxmhSiCKGL0RY8ukGiLzp
+0hYEFB+G70dPDOXUETfdMy1gs90p3EP0j1A+Dn3Buq6JVhnew9UhJ2SziqaDg2DM
+ElUH+1aFAgMBAAECggEAErRYPjE9dP6mzc2h6Z35S+gLeZ7qZt/yU20t0AWrWtFR
+lL86Tffdub9ry9FnONvKePAguUHRvRaWuWlbqgyc7uYwgEN8C2y92sCbVGK5bxCp
+zyFAzgtBJWbbWtwYUOtIRBxJ58buAmGC/+20FoYruxSsAJixKmNwH4ARKfLTHWis
+bwzULTA4fhmvPgv+DWg7rxOTZP+7Jl5xFQnj4lXQaTt44B9DQF7ArtVjwHJWGbAN
+muc4Ij/2lzD1EFNv9hXRvPjnhdN8WuDXZ52BTNj3ZXEYYyjw6Mvy7Qtsiz4FovpT
+UvIsQgUyvkyukKX+8rQb+JAcfZQHnfXFSoZyIJ/KDwKBgQDQAY7L6o/ZwQ2FjyyN
+K0Zu4oozQh1VM6C8eGtOsa6b+1y1d3RQg0JYb4ay1KwyFAUVnDSx/dNVg8LxVbL+
+st0EAUYmyNtozAerkAAdbYLr/mDKM4pYp9OzamqJYaUVXDa70zEOe/Q86a4KKa8l
+mr6jfd2+OHhBjFfc/UWfZKWAiwKBgQDGjJXM8KvFIqkBnNqcy1NhhtUUAwzV9oye
+HsagZBiTDXeCq2FUOJRh1474az+X12PTCDHNobvhGwz+eYe8yfDmILE9RmjbtCwO
+YzTFuEyzFxG4aWAVV9/u+qWu8LQFeXRVOyztNFmIXqWaaCg0tahaVKI0dukMk+/1
+M4b/fGzXLwKBgCBxfcJUjadbMy63zC0gqNW2w/OGxmh5qwJ6jdIyaJevtyAex6ef
+MYP1sT7HaSxObxSVzqpMeuAFsyxNP6P2Zf6v7C80ePR5jmC2Dy6H3DnO7W3caCG3
+249Kc9+FuWgBgA//utEViFzP3fN72PO2lTGO+j0nNaqTp0iywF9CJYZNAoGAXo/k
+ZKgXVxuL3K3E3Lpl6uQZpZ9SRLFZBZHozcj+f0MBsWVIRKFx4iuU9zG1Ju85pu+X
+MLWf0rVcefKNuFeBeUkGwQVAuarU9MFBCA4f0YfiM69USLYCfEI6GNihFJ5kzpcR
+baPqJG3Xd3O1+myuUt9OJaiglBH9Tg4NdK7g85cCgYAYL3r9a8LosXGwtqiahX9o
+Hyu/lRrKDH6yvUN2YeHN10pyY8rkdLAZ6E6imgxHqA8n8AibhkoaGpTrBlKRgP1/
+MMjeqy3C3hYjBQdfs+Vv6YtsufhegHs84/tgDxyfkWcljeXg2GoZvPQxANNZe8QE
+JTaivHj2kiF8ZakITrXT+A==
+-----END PRIVATE KEY-----
diff --git a/app/src/main/assets/test.html b/app/src/main/assets/test.html
new file mode 100644
index 0000000..9ed02ca
--- /dev/null
+++ b/app/src/main/assets/test.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Web server test page
+
+
+
Web server works fine
+
+
If you can see this page, that means the web server is working fine and its certificate is installed.
+
+
\ No newline at end of file
diff --git a/app/src/main/icon-web.png b/app/src/main/icon-web.png
new file mode 100644
index 0000000..efbe973
Binary files /dev/null and b/app/src/main/icon-web.png differ
diff --git a/app/src/main/java/org/adaway/AdAwayApplication.java b/app/src/main/java/org/adaway/AdAwayApplication.java
new file mode 100644
index 0000000..2e8671f
--- /dev/null
+++ b/app/src/main/java/org/adaway/AdAwayApplication.java
@@ -0,0 +1,76 @@
+package org.adaway;
+
+import android.app.Application;
+
+import org.adaway.helper.NotificationHelper;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.source.SourceModel;
+import org.adaway.model.update.UpdateModel;
+import org.adaway.util.log.ApplicationLog;
+
+/**
+ * This class is a custom {@link Application} for AdAway app.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class AdAwayApplication extends Application {
+ /**
+ * The common source model for the whole application.
+ */
+ private SourceModel sourceModel;
+ /**
+ * The common ad block model for the whole application.
+ */
+ private AdBlockModel adBlockModel;
+ /**
+ * The common update model for the whole application.
+ */
+ private UpdateModel updateModel;
+
+ @Override
+ public void onCreate() {
+ // Delegate application creation
+ super.onCreate();
+ // Initialize logging
+ ApplicationLog.init(this);
+ // Create notification channels
+ NotificationHelper.createNotificationChannels(this);
+ // Create models
+ this.sourceModel = new SourceModel(this);
+ this.updateModel = new UpdateModel(this);
+ }
+
+ /**
+ * Get the source model.
+ *
+ * @return The common source model for the whole application.
+ */
+ public SourceModel getSourceModel() {
+ return this.sourceModel;
+ }
+
+ /**
+ * Get the ad block model.
+ *
+ * @return The common ad block model for the whole application.
+ */
+ public AdBlockModel getAdBlockModel() {
+ // Check cached model
+ AdBlockMethod method = PreferenceHelper.getAdBlockMethod(this);
+ if (this.adBlockModel == null || this.adBlockModel.getMethod() != method) {
+ this.adBlockModel = AdBlockModel.build(this, method);
+ }
+ return this.adBlockModel;
+ }
+
+ /**
+ * Get the update model.
+ *
+ * @return Teh common update model for the whole application.
+ */
+ public UpdateModel getUpdateModel() {
+ return this.updateModel;
+ }
+}
diff --git a/app/src/main/java/org/adaway/broadcast/BootReceiver.java b/app/src/main/java/org/adaway/broadcast/BootReceiver.java
new file mode 100644
index 0000000..cc0ba35
--- /dev/null
+++ b/app/src/main/java/org/adaway/broadcast/BootReceiver.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.broadcast;
+
+import static android.content.Intent.ACTION_BOOT_COMPLETED;
+import static org.adaway.model.adblocking.AdBlockMethod.ROOT;
+import static org.adaway.model.adblocking.AdBlockMethod.VPN;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.util.WebServerUtils;
+import org.adaway.vpn.VpnServiceControls;
+
+import timber.log.Timber;
+
+/**
+ * This broadcast receiver is executed after boot.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class BootReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
+ Timber.d("BootReceiver invoked.");
+ AdBlockMethod adBlockMethod = PreferenceHelper.getAdBlockMethod(context);
+ // Start web server on boot if enabled in preferences
+ if (adBlockMethod == ROOT && PreferenceHelper.getWebServerEnabled(context)) {
+ WebServerUtils.startWebServer(context);
+ }
+ if (adBlockMethod == VPN && PreferenceHelper.getVpnServiceOnBoot(context)) {
+ // Ensure VPN is prepared
+ Intent prepareIntent = android.net.VpnService.prepare(context);
+ if (prepareIntent != null) {
+ context.startActivity(prepareIntent);
+ }
+ // Start VPN service if enabled in preferences
+ VpnServiceControls.start(context);
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/broadcast/Command.java b/app/src/main/java/org/adaway/broadcast/Command.java
new file mode 100644
index 0000000..a3a541a
--- /dev/null
+++ b/app/src/main/java/org/adaway/broadcast/Command.java
@@ -0,0 +1,57 @@
+package org.adaway.broadcast;
+
+import android.content.Intent;
+
+import timber.log.Timber;
+
+/**
+ * This enumerate lists the commands of {@link CommandReceiver}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public enum Command {
+ /**
+ * Start the ad-blocking.
+ */
+ START,
+ /**
+ * Stop the ad-blocking.
+ */
+ STOP,
+ /**
+ * Unknown command.
+ */
+ UNKNOWN;
+
+ private static final String INTENT_EXTRA_COMMAND = "COMMAND";
+
+ /**
+ * Read command from intent.
+ *
+ * @param intent The intent to read command from.
+ * @return The read intent.
+ */
+ public static Command readFromIntent(Intent intent) {
+ Command command = UNKNOWN;
+ if (intent != null && intent.hasExtra(INTENT_EXTRA_COMMAND)) {
+ String commandName = intent.getStringExtra(INTENT_EXTRA_COMMAND);
+ if (commandName != null) {
+ try {
+ command = Command.valueOf(commandName);
+ } catch (IllegalArgumentException e) {
+ Timber.w("Failed to read command named %s.", commandName);
+ }
+ }
+ }
+ return command;
+ }
+
+ /**
+ * Append command to intent.
+ *
+ * @param intent The intent to append command to.
+ */
+ public void appendToIntent(Intent intent) {
+ intent.putExtra(INTENT_EXTRA_COMMAND, name());
+ }
+}
diff --git a/app/src/main/java/org/adaway/broadcast/CommandReceiver.java b/app/src/main/java/org/adaway/broadcast/CommandReceiver.java
new file mode 100644
index 0000000..7588474
--- /dev/null
+++ b/app/src/main/java/org/adaway/broadcast/CommandReceiver.java
@@ -0,0 +1,53 @@
+package org.adaway.broadcast;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.error.HostErrorException;
+import org.adaway.util.AppExecutors;
+
+import timber.log.Timber;
+
+/**
+ * This broadcast receiver listens to commands from broadcast.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class CommandReceiver extends BroadcastReceiver {
+ /**
+ * This action allows to send commands to the application. See {@link Command} for extra values.
+ */
+ public static final String SEND_COMMAND_ACTION = "org.adaway.action.SEND_COMMAND";
+ private static final AppExecutors EXECUTORS = AppExecutors.getInstance();
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (SEND_COMMAND_ACTION.equals(intent.getAction())) {
+ AdBlockModel adBlockModel = ((AdAwayApplication) context.getApplicationContext()).getAdBlockModel();
+ Command command = Command.readFromIntent(intent);
+ Timber.i("CommandReceiver invoked with command %s.", command);
+ EXECUTORS.diskIO().execute(() -> executeCommand(adBlockModel, command));
+ }
+ }
+
+ private void executeCommand(AdBlockModel adBlockModel, Command command) {
+ try {
+ switch (command) {
+ case START:
+ adBlockModel.apply();
+ break;
+ case STOP:
+ adBlockModel.revert();
+ break;
+ case UNKNOWN:
+ Timber.i("Failed to run an unsupported command.");
+ break;
+ }
+ } catch (HostErrorException e) {
+ Timber.w(e, "Failed to apply ad block command " + command + ".");
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/broadcast/UpdateReceiver.java b/app/src/main/java/org/adaway/broadcast/UpdateReceiver.java
new file mode 100644
index 0000000..9951438
--- /dev/null
+++ b/app/src/main/java/org/adaway/broadcast/UpdateReceiver.java
@@ -0,0 +1,28 @@
+package org.adaway.broadcast;
+
+import static android.content.Intent.ACTION_MY_PACKAGE_REPLACED;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import org.adaway.AdAwayApplication;
+
+import timber.log.Timber;
+
+/**
+ * This broadcast receiver is executed at application update.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class UpdateReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())) {
+ AdAwayApplication application = (AdAwayApplication) context.getApplicationContext();
+ String versionName = application.getUpdateModel().getVersionName();
+ Timber.d("UpdateReceiver invoked");
+ Timber.i("Application update to version %s", versionName);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/db/AppDatabase.java b/app/src/main/java/org/adaway/db/AppDatabase.java
new file mode 100644
index 0000000..2a5fbea
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/AppDatabase.java
@@ -0,0 +1,134 @@
+package org.adaway.db;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.room.Database;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
+import androidx.room.TypeConverters;
+import androidx.sqlite.db.SupportSQLiteDatabase;
+
+import org.adaway.R;
+import org.adaway.db.converter.ListTypeConverter;
+import org.adaway.db.converter.ZonedDateTimeConverter;
+import org.adaway.db.dao.HostEntryDao;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.db.entity.HostEntry;
+import org.adaway.util.AppExecutors;
+
+import static org.adaway.db.Migrations.MIGRATION_1_2;
+import static org.adaway.db.Migrations.MIGRATION_2_3;
+import static org.adaway.db.Migrations.MIGRATION_3_4;
+import static org.adaway.db.Migrations.MIGRATION_4_5;
+import static org.adaway.db.Migrations.MIGRATION_5_6;
+import static org.adaway.db.Migrations.MIGRATION_6_7;
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_URL;
+
+/**
+ * This class is the application database based on Room.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@Database(entities = {HostsSource.class, HostListItem.class, HostEntry.class}, version = 7)
+@TypeConverters({ListTypeConverter.class, ZonedDateTimeConverter.class})
+public abstract class AppDatabase extends RoomDatabase {
+ /**
+ * The database singleton instance.
+ */
+ private static volatile AppDatabase instance;
+
+ /**
+ * Get the database instance.
+ *
+ * @param context The application context.
+ * @return The database instance.
+ */
+ public static AppDatabase getInstance(Context context) {
+ if (instance == null) {
+ synchronized (AppDatabase.class) {
+ if (instance == null) {
+ instance = Room.databaseBuilder(
+ context.getApplicationContext(),
+ AppDatabase.class,
+ "app.db"
+ ).addCallback(new Callback() {
+ @Override
+ public void onCreate(@NonNull SupportSQLiteDatabase db) {
+ AppExecutors.getInstance().diskIO().execute(
+ () -> AppDatabase.initialize(context, instance)
+ );
+ }
+ }).addMigrations(
+ MIGRATION_1_2,
+ MIGRATION_2_3,
+ MIGRATION_3_4,
+ MIGRATION_4_5,
+ MIGRATION_5_6,
+ MIGRATION_6_7
+ ).build();
+ }
+ }
+ }
+ return instance;
+ }
+
+ /**
+ * Initialize the database content.
+ */
+ private static void initialize(Context context, AppDatabase database) {
+ // Check if there is no hosts source
+ HostsSourceDao hostsSourceDao = database.hostsSourceDao();
+ if (!hostsSourceDao.getAll().isEmpty()) {
+ return;
+ }
+ // User list
+ HostsSource userSource = new HostsSource();
+ userSource.setLabel(context.getString(R.string.hosts_user_source));
+ userSource.setId(USER_SOURCE_ID);
+ userSource.setUrl(USER_SOURCE_URL);
+ userSource.setAllowEnabled(true);
+ userSource.setRedirectEnabled(true);
+ hostsSourceDao.insert(userSource);
+ // AdAway official
+ HostsSource source1 = new HostsSource();
+ source1.setLabel(context.getString(R.string.hosts_adaway_source));
+ source1.setUrl("https://adaway.org/hosts.txt");
+ hostsSourceDao.insert(source1);
+ // StevenBlack
+ HostsSource source2 = new HostsSource();
+ source2.setLabel(context.getString(R.string.hosts_stevenblack_source));
+ source2.setUrl("https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts");
+ hostsSourceDao.insert(source2);
+ // Pete Lowe
+ HostsSource source3 = new HostsSource();
+ source3.setLabel(context.getString(R.string.hosts_peterlowe_source));
+ source3.setUrl("https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext");
+ hostsSourceDao.insert(source3);
+ }
+
+ /**
+ * Get the hosts source DAO.
+ *
+ * @return The hosts source DAO.
+ */
+ public abstract HostsSourceDao hostsSourceDao();
+
+ /**
+ * Get the hosts list item DAO.
+ *
+ * @return The hosts list item DAO.
+ */
+ public abstract HostListItemDao hostsListItemDao();
+
+ /**
+ * Get the hosts entry DAO.
+ *
+ * @return The hosts entry DAO.
+ */
+ public abstract HostEntryDao hostEntryDao();
+}
diff --git a/app/src/main/java/org/adaway/db/Migrations.java b/app/src/main/java/org/adaway/db/Migrations.java
new file mode 100644
index 0000000..69c0b36
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/Migrations.java
@@ -0,0 +1,123 @@
+package org.adaway.db;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_URL;
+
+import androidx.annotation.NonNull;
+import androidx.room.migration.Migration;
+import androidx.sqlite.db.SupportSQLiteDatabase;
+
+/**
+ * This class declares database schema migrations.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+final class Migrations {
+ /**
+ * Private constructor of utility class.
+ */
+ private Migrations() {
+
+ }
+
+ /**
+ * The migration script from v1 to v2.
+ */
+ static final Migration MIGRATION_1_2 = new Migration(1, 2) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ // Add hosts sources id column and migrate data
+ database.execSQL("CREATE TABLE `hosts_sources_new` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `enabled` INTEGER NOT NULL, `last_modified_local` INTEGER, `last_modified_online` INTEGER)");
+ database.execSQL("INSERT INTO `hosts_sources_new` (`id`, `url`, `enabled`) VALUES (" + USER_SOURCE_ID + ", '" + USER_SOURCE_URL + "', 1)");
+ database.execSQL("INSERT INTO `hosts_sources_new` (`url`, `enabled`, `last_modified_local`, `last_modified_online`) SELECT `url`, `enabled`, `last_modified_local`, `last_modified_online` FROM `hosts_sources`");
+ database.execSQL("DROP TABLE `hosts_sources`");
+ database.execSQL("ALTER TABLE `hosts_sources_new` RENAME TO `hosts_sources`");
+ // Add hosts list source id and migrate data
+ database.execSQL("CREATE TABLE `hosts_lists_new` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `host` TEXT NOT NULL, `type` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `redirection` TEXT, `source_id` INTEGER NOT NULL, FOREIGN KEY(`source_id`) REFERENCES `hosts_sources`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )");
+ database.execSQL("INSERT INTO `hosts_lists_new` (`host`, `type`, `enabled`, `redirection`, `source_id`) SELECT `host`, `type`, `enabled`, `redirection`, " + USER_SOURCE_ID + " FROM `hosts_lists`");
+ database.execSQL("DROP TABLE `hosts_lists`");
+ database.execSQL("ALTER TABLE `hosts_lists_new` RENAME TO `hosts_lists`");
+ // Create index
+ database.execSQL("CREATE UNIQUE INDEX `index_hosts_sources_url` ON `hosts_sources` (`url`)");
+ database.execSQL("CREATE UNIQUE INDEX `index_hosts_lists_host` ON `hosts_lists` (`host`)");
+ database.execSQL("CREATE INDEX `index_hosts_lists_source_id` ON `hosts_lists` (`source_id`)");
+ }
+ };
+ /**
+ * The migration script from v2 to v3.
+ */
+ static final Migration MIGRATION_2_3 = new Migration(2, 3) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ database.execSQL("CREATE VIEW `host_entries` AS SELECT `host`, `type`, `redirection` FROM `hosts_lists` WHERE `enabled` = 1 AND ((`type` = 0 AND `host` NOT LIKE (SELECT `host` FROM `hosts_lists` WHERE `enabled` = 1 and `type` = 1)) OR `type` = 2) ORDER BY `host` ASC, `type` DESC, `redirection` ASC");
+ }
+ };
+
+ /**
+ * Migration script from v3 to v4.
+ */
+ static final Migration MIGRATION_3_4 = new Migration(3, 4) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ // Remove unique constraint to hosts_lists.host column
+ database.execSQL("DROP INDEX `index_hosts_lists_host`");
+ database.execSQL("CREATE INDEX `index_hosts_lists_host` ON `hosts_lists` (`host`)");
+ // Update host_entries view
+ database.execSQL("DROP VIEW `host_entries`");
+ database.execSQL("CREATE VIEW `host_entries` AS SELECT `host`, `type`, `redirection` FROM `hosts_lists` WHERE `enabled` = 1 AND ((`type` = 0 AND `host` NOT LIKE (SELECT `host` FROM `hosts_lists` WHERE `enabled` = 1 and `type` = 1)) OR `type` = 2) GROUP BY `host` ORDER BY `host` ASC, `type` DESC, `redirection` ASC");
+ }
+ };
+
+ /**
+ * Migration script from v4 to v5.
+ */
+ static final Migration MIGRATION_4_5 = new Migration(4, 5) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ // Remove host_entries view
+ database.execSQL("DROP VIEW `host_entries`");
+ // Create new host_entries table
+ database.execSQL("CREATE TABLE IF NOT EXISTS `host_entries` (`host` TEXT NOT NULL, `type` INTEGER NOT NULL, `redirection` TEXT, PRIMARY KEY(`host`))");
+ database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_host_entries_host` ON `host_entries` (`host`)");
+ }
+ };
+
+ /**
+ * Migration script from v5 to v6.
+ */
+ static final Migration MIGRATION_5_6 = new Migration(5, 6) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ // Update hosts_sources table
+ database.execSQL("ALTER TABLE `hosts_sources` ADD `label` TEXT NOT NULL DEFAULT \"\"");
+ database.execSQL("ALTER TABLE `hosts_sources` ADD `allowEnabled` INTEGER NOT NULL DEFAULT 0");
+ database.execSQL("ALTER TABLE `hosts_sources` ADD `redirectEnabled` INTEGER NOT NULL DEFAULT 0");
+ database.execSQL("ALTER TABLE `hosts_sources` ADD `size` INTEGER NOT NULL DEFAULT 0");
+ // Set default values to new source attributes
+ database.execSQL("UPDATE `hosts_sources` SET `label` = `url`");
+ // Update user hosts list
+ database.execSQL("UPDATE `hosts_sources` SET `url` = \"content://org.adaway/user/hosts\", `allowEnabled` = 1, `redirectEnabled` = 1 WHERE `url` = \"file://app/user/hosts\"");
+ // Update default hosts source label
+ database.execSQL("UPDATE `hosts_sources` SET `label` = \"AdAway official hosts\" WHERE `url` = \"https://adaway.org/hosts.txt\"");
+ database.execSQL("UPDATE `hosts_sources` SET `label` = \"StevenBlack Unified hosts\" WHERE `url` = \"https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts\"");
+ database.execSQL("UPDATE `hosts_sources` SET `label` = \"Pete Lowe blocklist hosts\" WHERE `url` = \"https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext\"");
+ // Reset local date to rebuild cache
+ database.execSQL("UPDATE `hosts_sources` SET `last_modified_local` = NULL");
+ // Update hosts source date format
+ database.execSQL("UPDATE `hosts_sources` SET `last_modified_online` = `last_modified_online` / 1000");
+ // Clear previous file type hosts sources
+ database.execSQL("DELETE FROM `hosts_sources` WHERE `url` LIKE \"file://%\"");
+ }
+ };
+
+ /**
+ * Migration script from v6 to v7.
+ */
+ static final Migration MIGRATION_6_7 = new Migration(6, 7) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ // Update hosts_sources table
+ database.execSQL("ALTER TABLE `hosts_sources` ADD `entityTag` TEXT DEFAULT NULL");
+ }
+ };
+}
diff --git a/app/src/main/java/org/adaway/db/converter/ListTypeConverter.java b/app/src/main/java/org/adaway/db/converter/ListTypeConverter.java
new file mode 100644
index 0000000..d3e74f1
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/converter/ListTypeConverter.java
@@ -0,0 +1,26 @@
+package org.adaway.db.converter;
+
+import androidx.room.TypeConverter;
+
+import org.adaway.db.entity.ListType;
+
+/**
+ * This class is a type converter for Room to support {@link ListType} type.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class ListTypeConverter {
+ private ListTypeConverter() {
+ // Prevent instantiation
+ }
+
+ @TypeConverter
+ public static ListType fromValue(Integer value) {
+ return value == null ? null : ListType.fromValue(value);
+ }
+
+ @TypeConverter
+ public static Integer typeToValue(ListType type) {
+ return type == null ? null : type.getValue();
+ }
+}
diff --git a/app/src/main/java/org/adaway/db/converter/ZonedDateTimeConverter.java b/app/src/main/java/org/adaway/db/converter/ZonedDateTimeConverter.java
new file mode 100644
index 0000000..3621187
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/converter/ZonedDateTimeConverter.java
@@ -0,0 +1,30 @@
+package org.adaway.db.converter;
+
+import androidx.room.TypeConverter;
+
+import java.time.LocalDateTime;
+import java.time.ZonedDateTime;
+
+import static java.time.ZoneOffset.UTC;
+
+/**
+ * This class is a type converter for Room to support {@link java.time.ZonedDateTime} type.
+ * It is stored as a Unix epoc timestamp.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class ZonedDateTimeConverter {
+ private ZonedDateTimeConverter() {
+ // Prevent instantiation
+ }
+
+ @TypeConverter
+ public static ZonedDateTime fromTimestamp(Long value) {
+ return value == null ? null : ZonedDateTime.of(LocalDateTime.ofEpochSecond(value, 0, UTC), UTC);
+ }
+
+ @TypeConverter
+ public static Long toTimestamp(ZonedDateTime zonedDateTime) {
+ return zonedDateTime == null ? null : zonedDateTime.toEpochSecond();
+ }
+}
diff --git a/app/src/main/java/org/adaway/db/dao/HostEntryDao.java b/app/src/main/java/org/adaway/db/dao/HostEntryDao.java
new file mode 100644
index 0000000..9cdf694
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/dao/HostEntryDao.java
@@ -0,0 +1,78 @@
+package org.adaway.db.dao;
+
+import androidx.annotation.Nullable;
+import androidx.room.Dao;
+import androidx.room.Insert;
+import androidx.room.Query;
+
+import org.adaway.db.entity.HostEntry;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.ListType;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+import static androidx.room.OnConflictStrategy.REPLACE;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+
+/**
+ * This interface is the DAO for {@link HostEntry} records.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@Dao
+public interface HostEntryDao {
+ Pattern ANY_CHAR_PATTERN = Pattern.compile("\\*");
+ Pattern A_CHAR_PATTERN = Pattern.compile("\\?");
+
+ @Query("DELETE FROM `host_entries`")
+ void clear();
+
+ @Query("INSERT INTO `host_entries` SELECT DISTINCT `host`, `type`, `redirection` FROM `hosts_lists` WHERE `type` = 0 AND `enabled` = 1")
+ void importBlocked();
+
+ @Query("SELECT host FROM hosts_lists WHERE type = 1 AND enabled = 1")
+ List getEnabledAllowedHosts();
+
+ @Query("DELETE FROM `host_entries` WHERE `host` LIKE :hostPattern")
+ void allowHost(String hostPattern);
+
+ @Query("SELECT * FROM hosts_lists WHERE type = 2 AND enabled = 1 ORDER BY host ASC, source_id DESC")
+ List getEnabledRedirectedHosts();
+
+ @Insert(onConflict = REPLACE)
+ void redirectHost(HostEntry redirection);
+
+ /**
+ * Synchronize the host entries based on the current hosts lists table records.
+ */
+ default void sync() {
+ clear();
+ importBlocked();
+ for (String allowedHost : getEnabledAllowedHosts()) {
+ allowedHost = ANY_CHAR_PATTERN.matcher(allowedHost).replaceAll("%");
+ allowedHost = A_CHAR_PATTERN.matcher(allowedHost).replaceAll("_");
+ allowHost(allowedHost);
+ }
+ for (HostListItem redirectedHost : getEnabledRedirectedHosts()) {
+ HostEntry entry = new HostEntry();
+ entry.setHost(redirectedHost.getHost());
+ entry.setType(REDIRECTED);
+ entry.setRedirection(redirectedHost.getRedirection());
+ redirectHost(entry);
+ }
+ }
+
+ @Query("SELECT * FROM `host_entries` ORDER BY `host`")
+ List getAll();
+
+ @Query("SELECT `type` FROM `host_entries` WHERE `host` == :host LIMIT 1")
+ ListType getTypeOfHost(String host);
+
+ @Query("SELECT IFNULL((SELECT `type` FROM `host_entries` WHERE `host` == :host LIMIT 1), 1)")
+ ListType getTypeForHost(String host);
+
+ @Nullable
+ @Query("SELECT * FROM `host_entries` WHERE `host` == :host LIMIT 1")
+ HostEntry getEntry(String host);
+}
diff --git a/app/src/main/java/org/adaway/db/dao/HostListItemDao.java b/app/src/main/java/org/adaway/db/dao/HostListItemDao.java
new file mode 100644
index 0000000..cc92a31
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/dao/HostListItemDao.java
@@ -0,0 +1,63 @@
+package org.adaway.db.dao;
+
+import androidx.lifecycle.LiveData;
+import androidx.paging.PagingSource;
+import androidx.room.Dao;
+import androidx.room.Delete;
+import androidx.room.Insert;
+import androidx.room.Query;
+import androidx.room.Update;
+
+import org.adaway.db.entity.HostListItem;
+
+import java.util.List;
+import java.util.Optional;
+
+import static androidx.room.OnConflictStrategy.REPLACE;
+
+/**
+ * This interface is the DAO for {@link HostListItem} entities.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@Dao
+public interface HostListItemDao {
+ @Insert(onConflict = REPLACE)
+ void insert(HostListItem... item);
+
+ @Insert(onConflict = REPLACE)
+ void insert(List items);
+
+ @Update
+ void update(HostListItem item);
+
+ @Delete
+ void delete(HostListItem item);
+
+ @Query("DELETE FROM hosts_lists WHERE source_id = 1 AND host = :host")
+ void deleteUserFromHost(String host);
+
+ @Query("SELECT * FROM hosts_lists WHERE type = :type AND host LIKE :query AND ((:includeSources == 0 AND source_id == 1) || (:includeSources == 1)) GROUP BY host ORDER BY host ASC")
+ PagingSource loadList(int type, boolean includeSources, String query);
+
+ @Query("SELECT * FROM hosts_lists ORDER BY host ASC")
+ List getAll();
+
+ @Query("SELECT * FROM hosts_lists WHERE source_id = 1")
+ List getUserList();
+
+ @Query("SELECT id FROM hosts_lists WHERE host = :host AND source_id = 1 LIMIT 1")
+ Optional getHostId(String host);
+
+ @Query("SELECT COUNT(DISTINCT host) FROM hosts_lists WHERE type = 0 AND enabled = 1")
+ LiveData getBlockedHostCount();
+
+ @Query("SELECT COUNT(DISTINCT host) FROM hosts_lists WHERE type = 1 AND enabled = 1")
+ LiveData getAllowedHostCount();
+
+ @Query("SELECT COUNT(DISTINCT host) FROM hosts_lists WHERE type = 2 AND enabled = 1")
+ LiveData getRedirectHostCount();
+
+ @Query("DELETE FROM hosts_lists WHERE source_id = :sourceId")
+ void clearSourceHosts(int sourceId);
+}
diff --git a/app/src/main/java/org/adaway/db/dao/HostsSourceDao.java b/app/src/main/java/org/adaway/db/dao/HostsSourceDao.java
new file mode 100644
index 0000000..6905a93
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/dao/HostsSourceDao.java
@@ -0,0 +1,80 @@
+package org.adaway.db.dao;
+
+import androidx.lifecycle.LiveData;
+import androidx.room.Dao;
+import androidx.room.Delete;
+import androidx.room.Insert;
+import androidx.room.Query;
+import androidx.room.Update;
+
+import org.adaway.db.entity.HostsSource;
+
+import java.time.ZonedDateTime;
+import java.util.List;
+import java.util.Optional;
+
+import static androidx.room.OnConflictStrategy.IGNORE;
+
+/**
+ * This interface is the DAO for {@link HostsSource} entities.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@Dao
+public interface HostsSourceDao {
+ @Insert(onConflict = IGNORE)
+ void insert(HostsSource source);
+
+ @Update
+ void update(HostsSource source);
+
+ @Delete
+ void delete(HostsSource source);
+
+ @Query("SELECT * FROM hosts_sources WHERE enabled = 1 AND id != 1 ORDER BY url ASC")
+ List getEnabled();
+
+ default void toggleEnabled(HostsSource source) {
+ int id = source.getId();
+ boolean enabled = !source.isEnabled();
+ source.setEnabled(enabled);
+ setSourceEnabled(id, enabled);
+ setSourceItemsEnabled(id, enabled);
+ }
+
+ @Query("UPDATE hosts_sources SET enabled = :enabled WHERE id =:id")
+ void setSourceEnabled(int id, boolean enabled);
+
+ @Query("UPDATE hosts_lists SET enabled = :enabled WHERE source_id =:id")
+ void setSourceItemsEnabled(int id, boolean enabled);
+
+ @Query("SELECT * FROM hosts_sources WHERE id = :id")
+ Optional getById(int id);
+
+ @Query("SELECT * FROM hosts_sources WHERE id != 1 ORDER BY label ASC")
+ List getAll();
+
+ @Query("SELECT * FROM hosts_sources WHERE id != 1 ORDER BY label ASC")
+ LiveData> loadAll();
+
+ @Query("UPDATE hosts_sources SET last_modified_online = :dateTime WHERE id = :id")
+ void updateOnlineModificationDate(int id, ZonedDateTime dateTime);
+
+ @Query("UPDATE hosts_sources SET last_modified_local = :localModificationDate, last_modified_online = :onlineModificationDate WHERE id = :id")
+ void updateModificationDates(int id, ZonedDateTime localModificationDate, ZonedDateTime onlineModificationDate);
+
+ @Query("UPDATE hosts_sources SET entityTag = :entityTag WHERE id = :id")
+ void updateEntityTag(int id, String entityTag);
+
+ @Query("UPDATE hosts_sources SET size = (SELECT count(id) FROM hosts_lists WHERE source_id = :id) WHERE id = :id")
+ void updateSize(int id);
+
+ @Query("SELECT count(id) FROM hosts_sources WHERE enabled = 1 AND last_modified_online > last_modified_local")
+ LiveData countOutdated();
+
+ @Query("SELECT count(id) FROM hosts_sources WHERE enabled = 1 AND last_modified_online <= last_modified_local")
+ LiveData countUpToDate();
+
+ @Query("UPDATE hosts_sources SET last_modified_local = NULL, last_modified_online = NULL, entityTag = NULL, size = 0 WHERE id = :id")
+ void clearProperties(int id);
+}
diff --git a/app/src/main/java/org/adaway/db/entity/HostEntry.java b/app/src/main/java/org/adaway/db/entity/HostEntry.java
new file mode 100644
index 0000000..b68749e
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/entity/HostEntry.java
@@ -0,0 +1,50 @@
+package org.adaway.db.entity;
+
+import androidx.annotation.NonNull;
+import androidx.room.Entity;
+import androidx.room.Index;
+import androidx.room.PrimaryKey;
+
+/**
+ * This entity represents an entry of the built hosts file.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@Entity(
+ tableName = "host_entries",
+ indices = {@Index(value = "host", unique = true)}
+)
+public class HostEntry {
+ @PrimaryKey
+ @NonNull
+ private String host;
+ @NonNull
+ private ListType type;
+ private String redirection;
+
+ @NonNull
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(@NonNull String host) {
+ this.host = host;
+ }
+
+ @NonNull
+ public ListType getType() {
+ return type;
+ }
+
+ public void setType(@NonNull ListType type) {
+ this.type = type;
+ }
+
+ public String getRedirection() {
+ return redirection;
+ }
+
+ public void setRedirection(String redirection) {
+ this.redirection = redirection;
+ }
+}
diff --git a/app/src/main/java/org/adaway/db/entity/HostListItem.java b/app/src/main/java/org/adaway/db/entity/HostListItem.java
new file mode 100644
index 0000000..e1f9226
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/entity/HostListItem.java
@@ -0,0 +1,121 @@
+package org.adaway.db.entity;
+
+import androidx.annotation.NonNull;
+import androidx.room.ColumnInfo;
+import androidx.room.Entity;
+import androidx.room.ForeignKey;
+import androidx.room.Index;
+import androidx.room.PrimaryKey;
+
+import java.util.Objects;
+
+import static androidx.room.ForeignKey.CASCADE;
+
+/**
+ * This entity represents a black, white or redirect list item.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@Entity(
+ tableName = "hosts_lists",
+ indices = {
+ @Index(value = "host"),
+ @Index(value = "source_id")
+ },
+ foreignKeys = @ForeignKey(
+ entity = HostsSource.class,
+ parentColumns = "id",
+ childColumns = "source_id",
+ onUpdate = CASCADE,
+ onDelete = CASCADE
+ )
+)
+public class HostListItem {
+ @PrimaryKey(autoGenerate = true)
+ private int id;
+ @NonNull
+ private String host;
+ @NonNull
+ private ListType type;
+ private boolean enabled;
+ private String redirection;
+ @ColumnInfo(name = "source_id")
+ private int sourceId;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @NonNull
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(@NonNull String host) {
+ this.host = host;
+ }
+
+ @NonNull
+ public ListType getType() {
+ return type;
+ }
+
+ public void setType(@NonNull ListType type) {
+ this.type = type;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public String getRedirection() {
+ return redirection;
+ }
+
+ public void setRedirection(String redirection) {
+ this.redirection = redirection;
+ }
+
+ public int getSourceId() {
+ return sourceId;
+ }
+
+ public void setSourceId(int sourceId) {
+ this.sourceId = sourceId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ HostListItem item = (HostListItem) o;
+
+ if (id != item.id) return false;
+ if (enabled != item.enabled) return false;
+ if (sourceId != item.sourceId) return false;
+ if (!host.equals(item.host)) return false;
+ if (type != item.type) return false;
+ return Objects.equals(redirection, item.redirection);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id;
+ result = 31 * result + host.hashCode();
+ result = 31 * result + type.hashCode();
+ result = 31 * result + (enabled ? 1 : 0);
+ result = 31 * result + (redirection != null ? redirection.hashCode() : 0);
+ result = 31 * result + sourceId;
+ return result;
+ }
+}
diff --git a/app/src/main/java/org/adaway/db/entity/HostsSource.java b/app/src/main/java/org/adaway/db/entity/HostsSource.java
new file mode 100644
index 0000000..1edacd5
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/entity/HostsSource.java
@@ -0,0 +1,187 @@
+package org.adaway.db.entity;
+
+import android.webkit.URLUtil;
+
+import androidx.annotation.NonNull;
+import androidx.room.ColumnInfo;
+import androidx.room.Entity;
+import androidx.room.Index;
+import androidx.room.PrimaryKey;
+
+import java.time.ZonedDateTime;
+import java.util.Objects;
+
+import static org.adaway.db.entity.SourceType.FILE;
+import static org.adaway.db.entity.SourceType.UNSUPPORTED;
+import static org.adaway.db.entity.SourceType.URL;
+
+/**
+ * This entity represents a source to get hosts list.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@Entity(
+ tableName = "hosts_sources",
+ indices = {@Index(value = "url", unique = true)}
+)
+public class HostsSource {
+ /**
+ * The user source ID.
+ */
+ public static final int USER_SOURCE_ID = 1;
+ /**
+ * The user source URL.
+ */
+ public static final String USER_SOURCE_URL = "content://org.adaway/user/hosts";
+
+ @PrimaryKey(autoGenerate = true)
+ private int id;
+ @NonNull
+ private String label;
+ @NonNull
+ private String url;
+ private boolean enabled = true;
+ private boolean allowEnabled = false;
+ private boolean redirectEnabled = false;
+ @ColumnInfo(name = "last_modified_local")
+ private ZonedDateTime localModificationDate;
+ @ColumnInfo(name = "last_modified_online")
+ private ZonedDateTime onlineModificationDate;
+ /**
+ * The HTTP ETag (strong from, may be null).
+ */
+ private String entityTag;
+ /**
+ * The number of hosts list items (0 until synced).
+ */
+ private int size;
+
+ /**
+ * Check whether an URL is valid for as host source.
+ * A valid URL is a HTTPS URL or file URL.
+ *
+ * @param url The URL to check.
+ * @return {@code true} if the URL is valid, {@code false} otherwise.
+ */
+ public static boolean isValidUrl(String url) {
+ return (!"https://".equals(url) && URLUtil.isHttpsUrl(url)) || URLUtil.isContentUrl(url);
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @NonNull
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(@NonNull String label) {
+ this.label = label;
+ }
+
+ @NonNull
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(@NonNull String url) {
+ this.url = url;
+ }
+
+ public SourceType getType() {
+ if (this.url.startsWith("https://")) {
+ return URL;
+ } else if (this.url.startsWith("content://")) {
+ return FILE;
+ } else {
+ return UNSUPPORTED;
+ }
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public boolean isAllowEnabled() {
+ return allowEnabled;
+ }
+
+ public void setAllowEnabled(boolean allowEnabled) {
+ this.allowEnabled = allowEnabled;
+ }
+
+ public boolean isRedirectEnabled() {
+ return redirectEnabled;
+ }
+
+ public void setRedirectEnabled(boolean redirectEnabled) {
+ this.redirectEnabled = redirectEnabled;
+ }
+
+ public ZonedDateTime getLocalModificationDate() {
+ return localModificationDate;
+ }
+
+ public void setLocalModificationDate(ZonedDateTime localModificationDate) {
+ this.localModificationDate = localModificationDate;
+ }
+
+ public ZonedDateTime getOnlineModificationDate() {
+ return onlineModificationDate;
+ }
+
+ public void setOnlineModificationDate(ZonedDateTime lastOnlineModification) {
+ this.onlineModificationDate = lastOnlineModification;
+ }
+
+ public String getEntityTag() {
+ return this.entityTag;
+ }
+
+ public void setEntityTag(String entityTag) {
+ this.entityTag = entityTag;
+ }
+
+ public int getSize() {
+ return this.size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ HostsSource that = (HostsSource) o;
+
+ if (id != that.id) return false;
+ if (enabled != that.enabled) return false;
+ if (!url.equals(that.url)) return false;
+ if (!Objects.equals(localModificationDate, that.localModificationDate))
+ return false;
+ return Objects.equals(onlineModificationDate, that.onlineModificationDate);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id;
+ result = 31 * result + url.hashCode();
+ result = 31 * result + (enabled ? 1 : 0);
+ result = 31 * result + (localModificationDate != null ? localModificationDate.hashCode() : 0);
+ result = 31 * result + (onlineModificationDate != null ? onlineModificationDate.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/app/src/main/java/org/adaway/db/entity/ListType.java b/app/src/main/java/org/adaway/db/entity/ListType.java
new file mode 100644
index 0000000..781d848
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/entity/ListType.java
@@ -0,0 +1,31 @@
+package org.adaway.db.entity;
+
+/**
+ * This enumerate specifies the type of {@link HostListItem}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public enum ListType {
+ BLOCKED(0),
+ ALLOWED(1),
+ REDIRECTED(2);
+
+ private final int value;
+
+ ListType(int value) {
+ this.value = value;
+ }
+
+ public static ListType fromValue(int value) {
+ for (ListType listType : ListType.values()) {
+ if (listType.value == value) {
+ return listType;
+ }
+ }
+ throw new IllegalArgumentException("Invalid value for list type: " + value);
+ }
+
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/app/src/main/java/org/adaway/db/entity/SourceType.java b/app/src/main/java/org/adaway/db/entity/SourceType.java
new file mode 100644
index 0000000..cb9ec65
--- /dev/null
+++ b/app/src/main/java/org/adaway/db/entity/SourceType.java
@@ -0,0 +1,21 @@
+package org.adaway.db.entity;
+
+/**
+ * This enumerate specifies the type of {@link HostsSource}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public enum SourceType {
+ /**
+ * The URL type represents online source to download from URL.
+ */
+ URL,
+ /**
+ * The FILE type represents file stored source to retrieve using SAF API.
+ */
+ FILE,
+ /**
+ * The UNSUPPORTED type represents unhandled source type.
+ */
+ UNSUPPORTED
+}
diff --git a/app/src/main/java/org/adaway/helper/NotificationHelper.java b/app/src/main/java/org/adaway/helper/NotificationHelper.java
new file mode 100644
index 0000000..8a2aade
--- /dev/null
+++ b/app/src/main/java/org/adaway/helper/NotificationHelper.java
@@ -0,0 +1,167 @@
+package org.adaway.helper;
+
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
+import static android.app.PendingIntent.getActivity;
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static androidx.core.app.NotificationCompat.PRIORITY_LOW;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.annotation.NonNull;
+import androidx.core.app.NotificationCompat;
+
+import org.adaway.R;
+import org.adaway.ui.home.HomeActivity;
+import org.adaway.ui.update.UpdateActivity;
+
+/**
+ * This class is an helper class to deals with notifications.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class NotificationHelper {
+ /**
+ * The notification channel for updates.
+ */
+ public static final String UPDATE_NOTIFICATION_CHANNEL = "UpdateChannel";
+ /**
+ * The notification channel for VPN service.
+ */
+ public static final String VPN_SERVICE_NOTIFICATION_CHANNEL = "VpnServiceChannel";
+ /**
+ * The update hosts notification identifier.
+ */
+ private static final int UPDATE_HOSTS_NOTIFICATION_ID = 10;
+ /**
+ * The update application notification identifier.
+ */
+ private static final int UPDATE_APP_NOTIFICATION_ID = 11;
+ /**
+ * The VPN running service notification identifier.
+ */
+ public static final int VPN_RUNNING_SERVICE_NOTIFICATION_ID = 20;
+ /**
+ * The VPN resume service notification identifier.
+ */
+ public static final int VPN_RESUME_SERVICE_NOTIFICATION_ID = 21;
+
+ /**
+ * Private constructor.
+ */
+ private NotificationHelper() {
+
+ }
+
+ /**
+ * Create the application notification channel.
+ *
+ * @param context The application context.
+ */
+ public static void createNotificationChannels(@NonNull Context context) {
+ // Create update notification channel
+ NotificationChannel updateChannel = new NotificationChannel(
+ UPDATE_NOTIFICATION_CHANNEL,
+ context.getString(R.string.notification_update_channel_name),
+ NotificationManager.IMPORTANCE_LOW
+ );
+ updateChannel.setDescription(context.getString(R.string.notification_update_channel_description));
+ // Create VPN service notification channel
+ NotificationChannel vpnServiceChannel = new NotificationChannel(
+ VPN_SERVICE_NOTIFICATION_CHANNEL,
+ context.getString(R.string.notification_vpn_channel_name),
+ NotificationManager.IMPORTANCE_LOW
+ );
+ updateChannel.setDescription(context.getString(R.string.notification_vpn_channel_description));
+ // Register the channels with the system; you can't change the importance or other notification behaviors after this
+ NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
+ if (notificationManager != null) {
+ notificationManager.createNotificationChannel(updateChannel);
+ notificationManager.createNotificationChannel(vpnServiceChannel);
+ }
+ }
+
+ /**
+ * Show the notification about new hosts update available.
+ *
+ * @param context The application context.
+ */
+ public static void showUpdateHostsNotification(@NonNull Context context) {
+ // Get notification manager
+ NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
+ if (notificationManager == null || !notificationManager.areNotificationsEnabled()) {
+ return;
+ }
+ // Build notification
+ int color = context.getColor(R.color.notification);
+ String title = context.getString(R.string.notification_update_host_available_title);
+ String text = context.getString(R.string.notification_update_host_available_text);
+ Intent intent = new Intent(context, HomeActivity.class);
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
+ PendingIntent pendingIntent = getActivity(context, 0, intent, FLAG_IMMUTABLE);
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context, UPDATE_NOTIFICATION_CHANNEL)
+ .setSmallIcon(R.drawable.logo)
+ .setColorized(true)
+ .setColor(color)
+ .setShowWhen(false)
+ .setContentTitle(title)
+ .setContentText(text)
+ .setContentIntent(pendingIntent)
+ .setPriority(PRIORITY_LOW)
+ .setAutoCancel(true);
+ // Notify the built notification
+ notificationManager.notify(UPDATE_HOSTS_NOTIFICATION_ID, builder.build());
+ }
+
+ /**
+ * Show the notification about new application update available.
+ *
+ * @param context The application context.
+ */
+ public static void showUpdateApplicationNotification(@NonNull Context context) {
+ // Get notification manager
+ NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
+ if (notificationManager == null || !notificationManager.areNotificationsEnabled()) {
+ return;
+ }
+ // Build notification
+ int color = context.getColor(R.color.notification);
+ String title = context.getString(R.string.notification_update_app_available_title);
+ String text = context.getString(R.string.notification_update_app_available_text);
+ Intent intent = new Intent(context, UpdateActivity.class);
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
+ PendingIntent pendingIntent = getActivity(context, 0, intent, FLAG_IMMUTABLE);
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context, UPDATE_NOTIFICATION_CHANNEL)
+ .setSmallIcon(R.drawable.logo)
+ .setColorized(true)
+ .setColor(color)
+ .setShowWhen(false)
+ .setContentTitle(title)
+ .setContentText(text)
+ .setContentIntent(pendingIntent)
+ .setPriority(PRIORITY_LOW)
+ .setAutoCancel(true);
+ // Notify the built notification
+ notificationManager.notify(UPDATE_HOSTS_NOTIFICATION_ID, builder.build());
+ }
+
+ /**
+ * Hide the notification about new hosts update available.
+ *
+ * @param context The application context.
+ */
+ public static void clearUpdateNotifications(@NonNull Context context) {
+ // Get notification manager
+ NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
+ if (notificationManager == null) {
+ return;
+ }
+ // Cancel the notification
+ notificationManager.cancel(UPDATE_HOSTS_NOTIFICATION_ID);
+ notificationManager.cancel(UPDATE_APP_NOTIFICATION_ID);
+ }
+}
diff --git a/app/src/main/java/org/adaway/helper/PreferenceHelper.java b/app/src/main/java/org/adaway/helper/PreferenceHelper.java
new file mode 100644
index 0000000..d3d0bc9
--- /dev/null
+++ b/app/src/main/java/org/adaway/helper/PreferenceHelper.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.helper;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import androidx.appcompat.app.AppCompatDelegate;
+
+import org.adaway.R;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.util.Constants;
+import org.adaway.vpn.VpnStatus;
+
+import java.util.Collections;
+import java.util.Set;
+
+public final class PreferenceHelper {
+ private PreferenceHelper() {
+
+ }
+
+ public static int getDarkThemeMode(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ String pref = prefs.getString(
+ context.getString(R.string.pref_dark_theme_mode_key),
+ context.getResources().getString(R.string.pref_dark_theme_mode_def)
+ );
+ switch (pref) {
+ case "MODE_NIGHT_NO":
+ return AppCompatDelegate.MODE_NIGHT_NO;
+ case "MODE_NIGHT_YES":
+ return AppCompatDelegate.MODE_NIGHT_YES;
+ default:
+ return AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
+ }
+ }
+
+ public static boolean getUpdateCheck(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_update_check_key),
+ context.getResources().getBoolean(R.bool.pref_update_check_def)
+ );
+ }
+
+ public static boolean getNeverReboot(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_never_reboot_key),
+ context.getResources().getBoolean(R.bool.pref_never_reboot_def)
+ );
+ }
+
+ public static void setNeverReboot(Context context, boolean value) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putBoolean(context.getString(R.string.pref_never_reboot_key), value);
+ editor.apply();
+ }
+
+ public static boolean getEnableIpv6(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_enable_ipv6_key),
+ context.getResources().getBoolean(R.bool.pref_enable_ipv6_def)
+ );
+ }
+
+ public static boolean getUpdateCheckAppStartup(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_update_check_app_startup_key),
+ context.getResources().getBoolean(R.bool.pref_update_check_app_startup_def)
+ );
+ }
+
+ public static boolean getUpdateCheckAppDaily(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_update_check_app_daily_key),
+ context.getResources().getBoolean(R.bool.pref_update_check_app_daily_def)
+ );
+ }
+
+ public static boolean getIncludeBetaReleases(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_update_include_beta_releases_key),
+ context.getResources().getBoolean(R.bool.pref_update_include_beta_releases_def)
+ );
+ }
+
+ public static boolean getUpdateCheckHostsDaily(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_update_check_hosts_daily_key),
+ context.getResources().getBoolean(R.bool.pref_update_check_hosts_daily_def)
+ );
+ }
+
+ public static boolean getAutomaticUpdateDaily(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_automatic_update_daily_key),
+ context.getResources().getBoolean(R.bool.pref_automatic_update_daily_def)
+ );
+ }
+
+ public static boolean getUpdateOnlyOnWifi(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_update_only_on_wifi_key),
+ context.getResources().getBoolean(R.bool.pref_update_only_on_wifi_def)
+ );
+ }
+
+ public static String getRedirectionIpv4(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getString(
+ context.getString(R.string.pref_redirection_ipv4_key),
+ context.getString(R.string.pref_redirection_ipv4_def)
+ );
+ }
+
+ public static String getRedirectionIpv6(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getString(
+ context.getString(R.string.pref_redirection_ipv6_key),
+ context.getString(R.string.pref_redirection_ipv6_def)
+ );
+ }
+
+ public static boolean getWebServerEnabled(Context context) {
+ SharedPreferences prefs = context.getApplicationContext().getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_webserver_enabled_key),
+ context.getResources().getBoolean(R.bool.pref_webserver_enabled_def)
+ );
+ }
+
+ public static boolean getWebServerIcon(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_webserver_icon_key),
+ context.getResources().getBoolean(R.bool.pref_webserver_icon_def)
+ );
+ }
+
+ public static AdBlockMethod getAdBlockMethod(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return AdBlockMethod.fromCode(prefs.getInt(
+ context.getString(R.string.pref_ad_block_method_key),
+ context.getResources().getInteger(R.integer.pref_ad_block_method_key_def)
+ ));
+ }
+
+ public static void setAbBlockMethod(Context context, AdBlockMethod method) {
+ SharedPreferences prefs = context.getApplicationContext().getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putInt(context.getString(R.string.pref_ad_block_method_key), method.toCode());
+ editor.apply();
+ }
+
+ public static VpnStatus getVpnServiceStatus(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return VpnStatus.fromCode(prefs.getInt(
+ context.getString(R.string.pref_vpn_service_status_key),
+ context.getResources().getInteger(R.integer.pref_vpn_service_status_def)
+ ));
+ }
+
+ public static void setVpnServiceStatus(Context context, VpnStatus status) {
+ SharedPreferences prefs = context.getApplicationContext().getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putInt(context.getString(R.string.pref_vpn_service_status_key), status.toCode());
+ editor.apply();
+ }
+
+ public static boolean getVpnServiceOnBoot(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_vpn_service_on_boot_key),
+ context.getResources().getBoolean(R.bool.pref_vpn_service_on_boot_def)
+ );
+ }
+
+ public static boolean getVpnWatchdogEnabled(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_vpn_watchdog_enabled_key),
+ context.getResources().getBoolean(R.bool.pref_vpn_watchdog_enabled_def)
+ );
+ }
+
+ public static boolean getDebugEnabled(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_enable_debug_key),
+ context.getResources().getBoolean(R.bool.pref_enable_debug_def)
+ );
+ }
+
+ public static boolean getTelemetryEnabled(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_enable_telemetry_key),
+ context.getResources().getBoolean(R.bool.pref_enable_telemetry_def)
+ );
+ }
+
+ public static void setTelemetryEnabled(Context context, boolean enabled) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putBoolean(context.getString(R.string.pref_enable_telemetry_key), enabled);
+ editor.apply();
+ }
+
+ public static boolean getDisplayTelemetryConsent(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getBoolean(
+ context.getString(R.string.pref_display_telemetry_consent_key),
+ context.getResources().getBoolean(R.bool.pref_display_telemetry_consent_def)
+ );
+ }
+
+ public static void setDisplayTelemetryConsent(Context context, boolean displayTelemetryConsent) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putBoolean(context.getString(R.string.pref_display_telemetry_consent_key), displayTelemetryConsent);
+ editor.apply();
+ }
+
+ public static String getVpnExcludedSystemApps(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getString(
+ context.getString(R.string.pref_vpn_excluded_system_apps_key),
+ context.getString(R.string.pref_vpn_excluded_system_apps_default)
+ );
+ }
+
+ public static Set getVpnExcludedApps(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ return prefs.getStringSet(
+ context.getString(R.string.pref_vpn_excluded_user_apps_key),
+ Collections.emptySet()
+ );
+ }
+
+ public static void setVpnExcludedApps(Context context, Set excludedApplicationPackageNames) {
+ SharedPreferences prefs = context.getSharedPreferences(
+ Constants.PREFS_NAME,
+ Context.MODE_PRIVATE
+ );
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putStringSet(context.getString(R.string.pref_vpn_excluded_user_apps_key), excludedApplicationPackageNames);
+ editor.apply();
+ }
+}
diff --git a/app/src/main/java/org/adaway/helper/ThemeHelper.java b/app/src/main/java/org/adaway/helper/ThemeHelper.java
new file mode 100644
index 0000000..a1e3233
--- /dev/null
+++ b/app/src/main/java/org/adaway/helper/ThemeHelper.java
@@ -0,0 +1,29 @@
+package org.adaway.helper;
+
+import android.content.Context;
+
+import androidx.appcompat.app.AppCompatDelegate;
+
+/**
+ * This class is a helper to apply user selected theme on the application activity.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class ThemeHelper {
+
+ /**
+ * Private constructor.
+ */
+ private ThemeHelper() {
+
+ }
+
+ /**
+ * Apply the user selected theme.
+ *
+ * @param context The context to apply theme.
+ */
+ public static void applyTheme(Context context) {
+ AppCompatDelegate.setDefaultNightMode(PreferenceHelper.getDarkThemeMode(context));
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/adblocking/AdBlockMethod.java b/app/src/main/java/org/adaway/model/adblocking/AdBlockMethod.java
new file mode 100644
index 0000000..e379cea
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/adblocking/AdBlockMethod.java
@@ -0,0 +1,40 @@
+package org.adaway.model.adblocking;
+
+import java.util.Arrays;
+
+/**
+ * This enum represents the ad blocking methods.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public enum AdBlockMethod {
+ /**
+ * Not defined ad block method.
+ */
+ UNDEFINED(0),
+ /**
+ * The system hosts file ad block method.
+ */
+ ROOT(1),
+ /**
+ * The VPN based ad block method.
+ */
+ VPN(2);
+
+ private int code;
+
+ AdBlockMethod(int code) {
+ this.code = code;
+ }
+
+ public static AdBlockMethod fromCode(int code) {
+ return Arrays.stream(AdBlockMethod.values())
+ .filter(method -> method.code == code)
+ .findAny()
+ .orElse(UNDEFINED);
+ }
+
+ public int toCode() {
+ return this.code;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/adblocking/AdBlockModel.java b/app/src/main/java/org/adaway/model/adblocking/AdBlockModel.java
new file mode 100644
index 0000000..c04f3ee
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/adblocking/AdBlockModel.java
@@ -0,0 +1,140 @@
+package org.adaway.model.adblocking;
+
+import android.content.Context;
+
+import androidx.annotation.StringRes;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import org.adaway.model.error.HostErrorException;
+import org.adaway.model.root.RootModel;
+import org.adaway.model.vpn.VpnModel;
+
+import java.util.List;
+
+import timber.log.Timber;
+
+/**
+ * This class is the base model for all ad block model.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public abstract class AdBlockModel {
+ /**
+ * The application context.
+ */
+ protected final Context context;
+ /**
+ * The hosts installation status:
+ *
+ *
{@code null} if not defined,
+ *
{@code true} if hosts list is installed,
+ *
{@code false} if default hosts file.
+ *
+ */
+ protected final MutableLiveData applied;
+ /**
+ * The model state.
+ */
+ private final MutableLiveData state;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ protected AdBlockModel(Context context) {
+ this.context = context;
+ this.state = new MutableLiveData<>();
+ this.applied = new MutableLiveData<>();
+ }
+
+ /**
+ * Instantiate ad block model.
+ *
+ * @param context The application context.
+ * @param method The ad block method to get model.
+ * @return The instantiated model.
+ */
+ public static AdBlockModel build(Context context, AdBlockMethod method) {
+ switch (method) {
+ case ROOT:
+ return new RootModel(context);
+ case VPN:
+ return new VpnModel(context);
+ default:
+ return new UndefinedBlockModel(context);
+ }
+ }
+
+ /**
+ * Get ad block method.
+ *
+ * @return The ad block method of this model.
+ */
+ public abstract AdBlockMethod getMethod();
+
+ /**
+ * Checks if hosts list is applied.
+ *
+ * @return {@code true} if applied, {@code false} if default.
+ */
+ public LiveData isApplied() {
+ return this.applied;
+ }
+
+ /**
+ * Apply hosts list.
+ *
+ * @throws HostErrorException If the model configuration could not be applied.
+ */
+ public abstract void apply() throws HostErrorException;
+
+ /**
+ * Revert the hosts list to the default one.
+ *
+ * @throws HostErrorException If the model configuration could not be revert.
+ */
+ public abstract void revert() throws HostErrorException;
+
+ /**
+ * Get the model state.
+ *
+ * @return The model state.
+ */
+ public LiveData getState() {
+ return this.state;
+ }
+
+ protected void setState(@StringRes int stateResId, Object... details) {
+ String state = this.context.getString(stateResId, details);
+ Timber.d(state);
+ this.state.postValue(state);
+ }
+
+ /**
+ * Get whether log are recoding or not.
+ *
+ * @return {@code true} if logs are recoding, {@code false} otherwise.
+ */
+ public abstract boolean isRecordingLogs();
+
+ /**
+ * Set log recoding.
+ *
+ * @param recording {@code true} to record logs, {@code false} otherwise.
+ */
+ public abstract void setRecordingLogs(boolean recording);
+
+ /**
+ * Get logs.
+ *
+ * @return The logs unique and sorted by date, older first.
+ */
+ public abstract List getLogs();
+
+ /**
+ * Clear logs.
+ */
+ public abstract void clearLogs();
+}
diff --git a/app/src/main/java/org/adaway/model/adblocking/UndefinedBlockModel.java b/app/src/main/java/org/adaway/model/adblocking/UndefinedBlockModel.java
new file mode 100644
index 0000000..40ab163
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/adblocking/UndefinedBlockModel.java
@@ -0,0 +1,59 @@
+package org.adaway.model.adblocking;
+
+import static org.adaway.model.adblocking.AdBlockMethod.UNDEFINED;
+import static java.util.Collections.emptyList;
+
+import android.content.Context;
+
+import java.util.List;
+
+/**
+ * This class is a stub model when no ad block method is defined.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class UndefinedBlockModel extends AdBlockModel {
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ public UndefinedBlockModel(Context context) {
+ super(context);
+ }
+
+ @Override
+ public AdBlockMethod getMethod() {
+ return UNDEFINED;
+ }
+
+ @Override
+ public void apply() {
+ // Unsupported operation
+ }
+
+ @Override
+ public void revert() {
+ // Unsupported operation
+ }
+
+ @Override
+ public boolean isRecordingLogs() {
+ return false;
+ }
+
+ @Override
+ public void setRecordingLogs(boolean recording) {
+ // Unsupported operation
+ }
+
+ @Override
+ public List getLogs() {
+ return emptyList();
+ }
+
+ @Override
+ public void clearLogs() {
+ // Unsupported operation
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/backup/AppBackupAgent.java b/app/src/main/java/org/adaway/model/backup/AppBackupAgent.java
new file mode 100644
index 0000000..9f12734
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/backup/AppBackupAgent.java
@@ -0,0 +1,82 @@
+package org.adaway.model.backup;
+
+import static org.adaway.util.Constants.PREFS_NAME;
+
+import android.app.backup.BackupAgentHelper;
+import android.app.backup.BackupDataInputStream;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.FileBackupHelper;
+import android.app.backup.SharedPreferencesBackupHelper;
+import android.content.Context;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+
+import java.io.File;
+import java.io.IOException;
+
+import timber.log.Timber;
+
+/**
+ * This class is a {@link android.app.backup.BackupAgent} to backup and restore application state
+ * using Android Backup Service. It is based on key-value pairs backup to prevent killing the
+ * application during the backup (leaving the VPN foreground service always running). It backs up
+ * and restores the application preferences and the user rules.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class AppBackupAgent extends BackupAgentHelper {
+ private static final String PREFS_BACKUP_KEY = "prefs";
+ private static final String RULES_BACKUP_KEY = "rules";
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ addHelper(PREFS_BACKUP_KEY, new SharedPreferencesBackupHelper(this, PREFS_NAME));
+ addHelper(RULES_BACKUP_KEY, new SourceBackupHelper(this));
+ }
+
+ /**
+ * This class is a {@link android.app.backup.BackupHelper} to backup and restore user rules.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+ private static class SourceBackupHelper extends FileBackupHelper {
+ private static final String RULES_FILE_NAME = "rules-backup.json";
+ private final Context context;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ public SourceBackupHelper(Context context) {
+ super(context, RULES_FILE_NAME);
+ this.context = context;
+ }
+
+ @Override
+ public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) {
+ try {
+ BackupExporter.exportBackup(this.context, getRulesFileUri());
+ super.performBackup(oldState, data, newState);
+ } catch (IOException e) {
+ Timber.w(e, "Failed to export rules to backup.");
+ }
+ }
+
+ @Override
+ public void restoreEntity(BackupDataInputStream data) {
+ super.restoreEntity(data);
+ try {
+ BackupImporter.importBackup(this.context, getRulesFileUri());
+ } catch (IOException e) {
+ Timber.w(e, "Failed to import rules from backup.");
+ }
+ }
+
+ private Uri getRulesFileUri() {
+ File ruleFile = new File(this.context.getFilesDir(), RULES_FILE_NAME);
+ return Uri.fromFile(ruleFile);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/backup/BackupExporter.java b/app/src/main/java/org/adaway/model/backup/BackupExporter.java
new file mode 100644
index 0000000..819f655
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/backup/BackupExporter.java
@@ -0,0 +1,141 @@
+package org.adaway.model.backup;
+
+import android.content.Context;
+import android.net.Uri;
+import android.widget.Toast;
+
+import androidx.annotation.UiThread;
+
+import org.adaway.R;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.util.AppExecutors;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.List;
+import java.util.concurrent.Executor;
+
+import static java.util.stream.Collectors.toList;
+import static org.adaway.db.entity.ListType.ALLOWED;
+import static org.adaway.db.entity.ListType.BLOCKED;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+import static org.adaway.model.backup.BackupFormat.ALLOWED_KEY;
+import static org.adaway.model.backup.BackupFormat.BLOCKED_KEY;
+import static org.adaway.model.backup.BackupFormat.REDIRECTED_KEY;
+import static org.adaway.model.backup.BackupFormat.SOURCES_KEY;
+import static org.adaway.model.backup.BackupFormat.hostToJson;
+import static org.adaway.model.backup.BackupFormat.sourceToJson;
+
+import timber.log.Timber;
+
+/**
+ * This class is a helper class to export user lists and hosts sources to a backup file.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class BackupExporter {
+ private static final Executor DISK_IO_EXECUTOR = AppExecutors.getInstance().diskIO();
+ private static final Executor MAIN_THREAD_EXECUTOR = AppExecutors.getInstance().mainThread();
+
+ private BackupExporter() {
+
+ }
+
+ /**
+ * Export all user lists and hosts sources to a backup file on the external storage.
+ *
+ * @param context The application context.
+ */
+ public static void exportToBackup(Context context, Uri backupUri) {
+ DISK_IO_EXECUTOR.execute(() -> {
+ boolean imported = true;
+ try {
+ exportBackup(context, backupUri);
+ } catch (IOException e) {
+ Timber.e(e, "Failed to import backup.");
+ imported = false;
+ }
+ boolean successful = imported;
+ String fileName = getFileNameFromUri(backupUri);
+ MAIN_THREAD_EXECUTOR.execute(() -> notifyExportEnd(context, successful, fileName));
+ });
+ }
+
+ private static String getFileNameFromUri(Uri backupUri) {
+ String path = backupUri.getPath();
+ return path == null ? "" : new File(path).getName();
+ }
+
+ @UiThread
+ private static void notifyExportEnd(Context context, boolean successful, String backupUri) {
+ Toast.makeText(
+ context,
+ context.getString(successful ? R.string.export_success : R.string.export_failed, backupUri),
+ Toast.LENGTH_LONG
+ ).show();
+ }
+
+ static void exportBackup(Context context, Uri backupUri) throws IOException {
+ // Open writer on the export file
+ try (OutputStream outputStream = context.getContentResolver().openOutputStream(backupUri);
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream))) {
+ JSONObject backup = makeBackup(context);
+ writer.write(backup.toString(4));
+ } catch (JSONException e) {
+ throw new IOException("Failed to generate backup.", e);
+ } catch (IOException e) {
+ throw new IOException("Could not write file.", e);
+ }
+ }
+
+ private static JSONObject makeBackup(Context context) throws JSONException {
+ AppDatabase database = AppDatabase.getInstance(context);
+ HostsSourceDao hostsSourceDao = database.hostsSourceDao();
+ HostListItemDao hostListItemDao = database.hostsListItemDao();
+
+ List userHosts = hostListItemDao.getUserList();
+ List blockedHosts = userHosts.stream()
+ .filter(value -> value.getType() == BLOCKED)
+ .collect(toList());
+ List allowedHosts = userHosts.stream()
+ .filter(value -> value.getType() == ALLOWED)
+ .collect(toList());
+ List redirectedHosts = userHosts.stream()
+ .filter(value -> value.getType() == REDIRECTED)
+ .collect(toList());
+
+ JSONObject backupObject = new JSONObject();
+ backupObject.put(SOURCES_KEY, buildSourcesBackup(hostsSourceDao.getAll()));
+ backupObject.put(BLOCKED_KEY, buildListBackup(blockedHosts));
+ backupObject.put(ALLOWED_KEY, buildListBackup(allowedHosts));
+ backupObject.put(REDIRECTED_KEY, buildListBackup(redirectedHosts));
+
+ return backupObject;
+ }
+
+ private static JSONArray buildSourcesBackup(List sources) throws JSONException {
+ JSONArray sourceArray = new JSONArray();
+ for (HostsSource source : sources) {
+ sourceArray.put(sourceToJson(source));
+ }
+ return sourceArray;
+ }
+
+ private static JSONArray buildListBackup(List hosts) throws JSONException {
+ JSONArray listArray = new JSONArray();
+ for (HostListItem host : hosts) {
+ listArray.put(hostToJson(host));
+ }
+ return listArray;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/backup/BackupFormat.java b/app/src/main/java/org/adaway/model/backup/BackupFormat.java
new file mode 100644
index 0000000..68316d3
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/backup/BackupFormat.java
@@ -0,0 +1,84 @@
+package org.adaway.model.backup;
+
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.HostsSource;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+
+/**
+ * This class defines user lists and hosts sources file format.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+final class BackupFormat {
+ /*
+ * Source backup format.
+ */
+ static final String SOURCES_KEY = "sources";
+ static final String SOURCE_LABEL_ATTRIBUTE = "label";
+ static final String SOURCE_URL_ATTRIBUTE = "url";
+ static final String SOURCE_ENABLED_ATTRIBUTE = "enabled";
+ static final String SOURCE_ALLOW_ATTRIBUTE = "allow";
+ static final String SOURCE_REDIRECT_ATTRIBUTE = "redirect";
+ /*
+ * User source backup format.
+ */
+ static final String BLOCKED_KEY = "blocked";
+ static final String ALLOWED_KEY = "allowed";
+ static final String REDIRECTED_KEY = "redirected";
+ static final String ENABLED_ATTRIBUTE = "enabled";
+ static final String HOST_ATTRIBUTE = "host";
+ static final String REDIRECT_ATTRIBUTE = "redirect";
+
+ BackupFormat() {
+
+ }
+
+ static JSONObject sourceToJson(HostsSource source) throws JSONException {
+ JSONObject sourceObject = new JSONObject();
+ sourceObject.put(SOURCE_LABEL_ATTRIBUTE, source.getLabel());
+ sourceObject.put(SOURCE_URL_ATTRIBUTE, source.getUrl());
+ sourceObject.put(SOURCE_ENABLED_ATTRIBUTE, source.isEnabled());
+ sourceObject.put(SOURCE_ALLOW_ATTRIBUTE, source.isAllowEnabled());
+ sourceObject.put(SOURCE_REDIRECT_ATTRIBUTE, source.isRedirectEnabled());
+ return sourceObject;
+ }
+
+ static HostsSource sourceFromJson(JSONObject sourceObject) throws JSONException {
+ HostsSource source = new HostsSource();
+ source.setLabel(sourceObject.getString(SOURCE_LABEL_ATTRIBUTE));
+ String url = sourceObject.getString(SOURCE_URL_ATTRIBUTE);
+ if (!HostsSource.isValidUrl(url)) {
+ throw new JSONException("Invalid source URL: "+url);
+ }
+ source.setUrl(url);
+ source.setEnabled(sourceObject.getBoolean(SOURCE_ENABLED_ATTRIBUTE));
+ source.setAllowEnabled(sourceObject.getBoolean(SOURCE_ALLOW_ATTRIBUTE));
+ source.setRedirectEnabled(sourceObject.getBoolean(SOURCE_REDIRECT_ATTRIBUTE));
+ return source;
+ }
+
+ static JSONObject hostToJson(HostListItem host) throws JSONException {
+ JSONObject hostObject = new JSONObject();
+ hostObject.put(HOST_ATTRIBUTE, host.getHost());
+ String redirection = host.getRedirection();
+ if (redirection != null && !redirection.isEmpty()) {
+ hostObject.put(REDIRECT_ATTRIBUTE, redirection);
+ }
+ hostObject.put(ENABLED_ATTRIBUTE, host.isEnabled());
+ return hostObject;
+ }
+
+ static HostListItem hostFromJson(JSONObject hostObject) throws JSONException {
+ HostListItem host = new HostListItem();
+ host.setHost(hostObject.getString(HOST_ATTRIBUTE));
+ if (hostObject.has(REDIRECT_ATTRIBUTE)) {
+ host.setRedirection(hostObject.getString(REDIRECT_ATTRIBUTE));
+ }
+ host.setEnabled(hostObject.getBoolean(ENABLED_ATTRIBUTE));
+ host.setSourceId(USER_SOURCE_ID);
+ return host;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/backup/BackupImporter.java b/app/src/main/java/org/adaway/model/backup/BackupImporter.java
new file mode 100644
index 0000000..41944c6
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/backup/BackupImporter.java
@@ -0,0 +1,136 @@
+package org.adaway.model.backup;
+
+import android.content.Context;
+import android.net.Uri;
+import android.widget.Toast;
+
+import androidx.annotation.UiThread;
+
+import org.adaway.R;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.ListType;
+import org.adaway.util.AppExecutors;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+import static org.adaway.db.entity.ListType.ALLOWED;
+import static org.adaway.db.entity.ListType.BLOCKED;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+import static org.adaway.model.backup.BackupFormat.ALLOWED_KEY;
+import static org.adaway.model.backup.BackupFormat.BLOCKED_KEY;
+import static org.adaway.model.backup.BackupFormat.REDIRECTED_KEY;
+import static org.adaway.model.backup.BackupFormat.SOURCES_KEY;
+import static org.adaway.model.backup.BackupFormat.hostFromJson;
+import static org.adaway.model.backup.BackupFormat.sourceFromJson;
+
+import timber.log.Timber;
+
+/**
+ * This class is a helper class to import user lists and hosts sources to a backup file.
+ * Importing a file source will no restore read access from Storage Access Framework.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class BackupImporter {
+
+ private BackupImporter() {
+
+ }
+
+ private static final Executor DISK_IO_EXECUTOR = AppExecutors.getInstance().diskIO();
+ private static final Executor MAIN_THREAD_EXECUTOR = AppExecutors.getInstance().mainThread();
+
+ /**
+ * Import a backup file.
+ *
+ * @param context The application context.
+ * @param backupUri The URI of a backup file.
+ */
+ @UiThread
+ public static void importFromBackup(Context context, Uri backupUri) {
+ DISK_IO_EXECUTOR.execute(() -> {
+ boolean imported = true;
+ try {
+ importBackup(context, backupUri);
+ } catch (IOException e) {
+ Timber.e(e, "Failed to import backup.");
+ imported = false;
+ }
+ boolean successful = imported;
+ MAIN_THREAD_EXECUTOR.execute(() -> notifyImportEnd(context, successful));
+ });
+ }
+
+ @UiThread
+ private static void notifyImportEnd(Context context, boolean successful) {
+ Toast.makeText(
+ context,
+ context.getString(successful ? R.string.import_success : R.string.import_failed),
+ Toast.LENGTH_LONG
+ ).show();
+ }
+
+ static void importBackup(Context context, Uri backupUri) throws IOException {
+ try (InputStream inputStream = context.getContentResolver().openInputStream(backupUri);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
+ StringBuilder contentBuilder = new StringBuilder();
+ String line;
+ while ((line = reader.readLine()) != null) {
+ contentBuilder.append(line);
+ }
+ JSONObject backupObject = new JSONObject(contentBuilder.toString());
+ importBackup(context, backupObject);
+ } catch (JSONException exception) {
+ throw new IOException("Failed to parse backup file.", exception);
+ } catch (FileNotFoundException exception) {
+ throw new IOException("Failed to find backup file.", exception);
+ } catch (IOException exception) {
+ throw new IOException("Failed to read backup file.", exception);
+ }
+ }
+
+ private static void importBackup(Context context, JSONObject backupObject) throws JSONException {
+ AppDatabase database = AppDatabase.getInstance(context);
+ HostsSourceDao hostsSourceDao = database.hostsSourceDao();
+ HostListItemDao hostListItemDao = database.hostsListItemDao();
+
+ importSourceBackup(hostsSourceDao, backupObject.getJSONArray(SOURCES_KEY));
+ importListBackup(hostListItemDao, BLOCKED, backupObject.getJSONArray(BLOCKED_KEY));
+ importListBackup(hostListItemDao, ALLOWED, backupObject.getJSONArray(ALLOWED_KEY));
+ importListBackup(hostListItemDao, REDIRECTED, backupObject.getJSONArray(REDIRECTED_KEY));
+ }
+
+ private static void importSourceBackup(HostsSourceDao hostsSourceDao, JSONArray sources) throws JSONException {
+ for (int index = 0; index < sources.length(); index++) {
+ JSONObject sourceObject = sources.getJSONObject(index);
+ hostsSourceDao.insert(sourceFromJson(sourceObject));
+ }
+ }
+
+ private static void importListBackup(HostListItemDao hostListItemDao, ListType type, JSONArray hosts) throws JSONException {
+ for (int index = 0; index < hosts.length(); index++) {
+ JSONObject hostObject = hosts.getJSONObject(index);
+ HostListItem host = hostFromJson(hostObject);
+ host.setType(type);
+ Optional id = hostListItemDao.getHostId(host.getHost());
+ if (id.isPresent()) {
+ host.setId(id.get());
+ hostListItemDao.update(host);
+ } else {
+ hostListItemDao.insert(host);
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/error/HostError.java b/app/src/main/java/org/adaway/model/error/HostError.java
new file mode 100644
index 0000000..de2106d
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/error/HostError.java
@@ -0,0 +1,44 @@
+package org.adaway.model.error;
+
+import androidx.annotation.StringRes;
+
+import org.adaway.R;
+
+/**
+ * This enumeration represents the hosts error case.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public enum HostError {
+ // Source model errors
+ NO_CONNECTION(R.string.error_no_connection_message, R.string.error_no_connection_details),
+ DOWNLOAD_FAILED(R.string.error_download_failed_message, R.string.error_no_connection_details),
+ // Host install model errors
+ PRIVATE_FILE_FAILED(R.string.error_private_file_failed_message, R.string.error_private_file_failed_details),
+ NOT_ENOUGH_SPACE(R.string.error_not_enough_space_message, R.string.error_not_enough_space_details),
+ COPY_FAIL(R.string.error_copy_failed_message, R.string.error_copy_failed_details),
+ REVERT_FAIL(R.string.error_revert_failed_message, R.string.error_revert_failed_details),
+ // VPN model error
+ ENABLE_VPN_FAIL(R.string.error_enable_vpn_failed_message, R.string.error_enable_vpn_failed_details),
+ DISABLE_VPN_FAIL(R.string.error_disable_vpn_failed_message, R.string.error_disable_vpn_failed_details);
+
+ @StringRes
+ private final int messageKey;
+ @StringRes
+ private final int detailsKey;
+
+ HostError(int messageKey, int detailsKey) {
+ this.messageKey = messageKey;
+ this.detailsKey = detailsKey;
+ }
+
+ @StringRes
+ public int getMessageKey() {
+ return this.messageKey;
+ }
+
+ @StringRes
+ public int getDetailsKey() {
+ return this.detailsKey;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/error/HostErrorException.java b/app/src/main/java/org/adaway/model/error/HostErrorException.java
new file mode 100644
index 0000000..50550f1
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/error/HostErrorException.java
@@ -0,0 +1,43 @@
+package org.adaway.model.error;
+
+/**
+ * This class in an {@link Exception} thrown on hosts error.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class HostErrorException extends Exception {
+ /**
+ * The exception error type.
+ */
+ private final HostError error;
+
+ /**
+ * Constructor.
+ *
+ * @param error The exception error type.
+ */
+ public HostErrorException(HostError error) {
+ super("An host error " + error.name() + " occurred");
+ this.error = error;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param error The exception error type.
+ * @param cause The cause of this exception.
+ */
+ public HostErrorException(HostError error, Throwable cause) {
+ super("An host error " + error.name() + " occurred", cause);
+ this.error = error;
+ }
+
+ /**
+ * Get the error type.
+ *
+ * @return The exception error type
+ */
+ public HostError getError() {
+ return this.error;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/git/GistHostsSource.java b/app/src/main/java/org/adaway/model/git/GistHostsSource.java
new file mode 100644
index 0000000..31d0afc
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/git/GistHostsSource.java
@@ -0,0 +1,61 @@
+package org.adaway.model.git;
+
+import androidx.annotation.Nullable;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeParseException;
+
+import timber.log.Timber;
+
+/**
+ * This class is an utility class to get information from GitHub gist hosting.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class GistHostsSource extends GitHostsJsonApiSource {
+ /**
+ * The gist identifier.
+ */
+ private final String gistIdentifier;
+
+ /**
+ * Constructor.
+ *
+ * @param url The hosts file URL hosted on GitHub gist.
+ * @throws MalformedURLException If the URl is not a gist URL.
+ */
+ GistHostsSource(String url) throws MalformedURLException {
+ // Check URL path
+ URL parsedUrl = new URL(url);
+ String path = parsedUrl.getPath();
+ String[] pathParts = path.split("/");
+ if (pathParts.length < 2) {
+ throw new MalformedURLException("The GitHub gist URL " + url + " is not valid.");
+ }
+ // Extract gist identifier from path
+ this.gistIdentifier = pathParts[2];
+ }
+
+ @Override
+ protected String getCommitApiUrl() {
+ return "https://api.github.com/gists/" + this.gistIdentifier;
+ }
+
+ @Nullable
+ protected ZonedDateTime parseJsonBody(String body) throws JSONException {
+ JSONObject gistObject = new JSONObject(body);
+ String dateString = gistObject.getString("updated_at");
+ ZonedDateTime date = null;
+ try {
+ date = ZonedDateTime.parse(dateString);
+ } catch (DateTimeParseException exception) {
+ Timber.w(exception, "Failed to parse commit date: " + dateString + ".");
+ }
+ return date;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/git/GitHostsJsonApiSource.java b/app/src/main/java/org/adaway/model/git/GitHostsJsonApiSource.java
new file mode 100644
index 0000000..a61962b
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/git/GitHostsJsonApiSource.java
@@ -0,0 +1,53 @@
+package org.adaway.model.git;
+
+import androidx.annotation.Nullable;
+
+import org.json.JSONException;
+
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.net.UnknownHostException;
+import java.time.ZonedDateTime;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+import timber.log.Timber;
+
+/**
+ * This class is an utility class to get information from Git hosted hosts sources from JSON API.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public abstract class GitHostsJsonApiSource extends GitHostsSource {
+ @Override
+ @Nullable
+ public ZonedDateTime getLastUpdate() {
+ return getLastUpdateFromApi(getCommitApiUrl());
+ }
+
+ protected abstract String getCommitApiUrl();
+
+ @Nullable
+ protected ZonedDateTime getLastUpdateFromApi(String commitApiUrl) {
+ // Create client and request
+ OkHttpClient client = new OkHttpClient();
+ Request request = new Request.Builder().url(commitApiUrl).build();
+ try (Response response = client.newCall(request).execute();
+ ResponseBody body = response.body()) {
+ if (response.isSuccessful()) {
+ return parseJsonBody(body.string());
+ }
+ } catch (UnknownHostException | SocketTimeoutException exception) {
+ Timber.i(exception, "Unable to reach API backend.");
+ } catch (IOException | JSONException exception) {
+ Timber.e(exception, "Unable to get commits from API.");
+ }
+ // Return failed
+ return null;
+ }
+
+ @Nullable
+ protected abstract ZonedDateTime parseJsonBody(String body) throws JSONException;
+}
diff --git a/app/src/main/java/org/adaway/model/git/GitHostsSource.java b/app/src/main/java/org/adaway/model/git/GitHostsSource.java
new file mode 100644
index 0000000..f1fad34
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/git/GitHostsSource.java
@@ -0,0 +1,65 @@
+package org.adaway.model.git;
+
+import androidx.annotation.Nullable;
+
+import java.net.MalformedURLException;
+import java.time.ZonedDateTime;
+
+/**
+ * This class is an utility class to get information from Git hosted hosts sources.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public abstract class GitHostsSource {
+ /**
+ * The GitHub repository URL.
+ */
+ private static final String GITHUB_REPO_URL = "https://raw.githubusercontent.com/";
+ /**
+ * The GitHub gist URL.
+ */
+ private static final String GITHUB_GIST_URL = "https://gist.githubusercontent.com";
+ /**
+ * The GitLab URL.
+ */
+ private static final String GITLAB_URL = "https://gitlab.com/";
+
+ /**
+ * Check if a hosts file url is hosted on Git hosting.
+ *
+ * @param url The url to check.
+ * @return {@code true} if the hosts file is hosted on Git hosting, {@code false} otherwise.
+ */
+ public static boolean isHostedOnGit(String url) {
+ return url.startsWith(GITHUB_REPO_URL) ||
+ url.startsWith(GITHUB_GIST_URL) ||
+ url.startsWith(GITLAB_URL);
+ }
+
+ /**
+ * Get the GitHub hosts source.
+ *
+ * @param url The URL to get source from.
+ * @return The GitHub hosts source.
+ * @throws MalformedURLException If the URL is not a GitHub URL or not a supported GitHub URL.
+ */
+ public static GitHostsSource getSource(String url) throws MalformedURLException {
+ if (url.startsWith(GITHUB_REPO_URL)) {
+ return new GitHubHostsSource(url);
+ } else if (url.startsWith(GITHUB_GIST_URL)) {
+ return new GistHostsSource(url);
+ } else if (url.startsWith(GITLAB_URL)) {
+ return new GitLabHostsSource(url);
+ } else {
+ throw new MalformedURLException("URL is not a supported Git hosting URL");
+ }
+ }
+
+ /**
+ * Get last update of the hosts file.
+ *
+ * @return The last update date, {@code null} if the date could not be retrieved.
+ */
+ @Nullable
+ public abstract ZonedDateTime getLastUpdate();
+}
diff --git a/app/src/main/java/org/adaway/model/git/GitHubHostsSource.java b/app/src/main/java/org/adaway/model/git/GitHubHostsSource.java
new file mode 100644
index 0000000..890e8d4
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/git/GitHubHostsSource.java
@@ -0,0 +1,84 @@
+package org.adaway.model.git;
+
+import static java.util.stream.Collectors.joining;
+
+import androidx.annotation.Nullable;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.Arrays;
+
+import timber.log.Timber;
+
+/**
+ * This class is an utility class to get information from GitHub repository hosting.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class GitHubHostsSource extends GitHostsJsonApiSource {
+ /**
+ * The GitHub owner name.
+ */
+ private final String owner;
+ /**
+ * The GitHub repository name.
+ */
+ private final String repo;
+ /**
+ * The GitHub blob (hosts file) path.
+ */
+ private final String blobPath;
+
+ /**
+ * Constructor.
+ *
+ * @param url The hosts file URL hosted on GitHub.
+ * @throws MalformedURLException If the URl is not a GitHub URL.
+ */
+ GitHubHostsSource(String url) throws MalformedURLException {
+ // Check URL path
+ URL parsedUrl = new URL(url);
+ String path = parsedUrl.getPath();
+ String[] pathParts = path.split("/");
+ if (pathParts.length < 5) {
+ throw new MalformedURLException("The GitHub user content URL " + url + " is not valid.");
+ }
+ // Extract components from path
+ this.owner = pathParts[1];
+ this.repo = pathParts[2];
+ this.blobPath = Arrays.stream(pathParts)
+ .skip(4)
+ .collect(joining("/"));
+ }
+
+ @Override
+ protected String getCommitApiUrl() {
+ return "https://api.github.com/repos/" + this.owner + "/" + this.repo +
+ "/commits?per_page=1&path=" + this.blobPath;
+ }
+
+ @Nullable
+ protected ZonedDateTime parseJsonBody(String body) throws JSONException {
+ JSONArray commitArray = new JSONArray(body);
+ int nbrOfCommits = commitArray.length();
+ ZonedDateTime date = null;
+ for (int i = 0; i < nbrOfCommits && date == null; i++) {
+ JSONObject commitItemObject = commitArray.getJSONObject(i);
+ JSONObject commitObject = commitItemObject.getJSONObject("commit");
+ JSONObject committerObject = commitObject.getJSONObject("committer");
+ String dateString = committerObject.getString("date");
+ try {
+ date = ZonedDateTime.parse(dateString);
+ } catch (DateTimeParseException exception) {
+ Timber.w(exception, "Failed to parse commit date: " + dateString + ".");
+ }
+ }
+ return date;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/git/GitLabHostsSource.java b/app/src/main/java/org/adaway/model/git/GitLabHostsSource.java
new file mode 100644
index 0000000..cd35f67
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/git/GitLabHostsSource.java
@@ -0,0 +1,81 @@
+package org.adaway.model.git;
+
+import static java.util.stream.Collectors.joining;
+
+import androidx.annotation.Nullable;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.Arrays;
+
+import timber.log.Timber;
+
+/**
+ * This class is an utility class to get information from GitLab hosts source hosting.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class GitLabHostsSource extends GitHostsJsonApiSource {
+ /**
+ * The GitHub owner name.
+ */
+ private final String owner;
+ /**
+ * The GitHub repository name.
+ */
+ private final String repo;
+ /**
+ * The GitLab reference name.
+ */
+ private final String ref;
+ /**
+ * The GitLab (hosts) file path.
+ */
+ private final String path;
+
+ GitLabHostsSource(String url) throws MalformedURLException {
+ // Check URL path
+ URL parsedUrl = new URL(url);
+ String path = parsedUrl.getPath();
+ String[] pathParts = path.split("/");
+ if (pathParts.length < 5) {
+ throw new MalformedURLException("The GitLab user content URL " + url + " is not valid.");
+ }
+ // Extract components from path
+ this.owner = pathParts[1];
+ this.repo = pathParts[2];
+ this.ref = pathParts[4];
+ this.path = Arrays.stream(pathParts)
+ .skip(5)
+ .collect(joining("/"));
+ }
+
+ @Override
+ protected String getCommitApiUrl() {
+ return "https://gitlab.com/api/v4/projects/" + this.owner + "%2F" + this.repo
+ + "/repository/commits?path=" + this.path + "&ref_name=" + this.ref;
+ }
+
+ @Nullable
+ protected ZonedDateTime parseJsonBody(String body) throws JSONException {
+ JSONArray commitArray = new JSONArray(body);
+ int nbrOfCommits = commitArray.length();
+ ZonedDateTime date = null;
+ for (int i = 0; i < nbrOfCommits && date == null; i++) {
+ JSONObject commitItemObject = commitArray.getJSONObject(i);
+ String dateString = commitItemObject.getString("committed_date");
+ try {
+ date = ZonedDateTime.parse(dateString);
+ } catch (DateTimeParseException exception) {
+ Timber.w(exception, "Failed to parse commit date: " + dateString + ".");
+ }
+ }
+ return date;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/root/CommandException.java b/app/src/main/java/org/adaway/model/root/CommandException.java
new file mode 100644
index 0000000..b755592
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/root/CommandException.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.model.root;
+
+class CommandException extends Exception {
+
+ private static final long serialVersionUID = -4014185620880841310L;
+
+ CommandException(String msg) {
+ super(msg);
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/root/MountType.java b/app/src/main/java/org/adaway/model/root/MountType.java
new file mode 100644
index 0000000..f32e2dc
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/root/MountType.java
@@ -0,0 +1,31 @@
+package org.adaway.model.root;
+
+/**
+ * This class is an enum to define mount type.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public enum MountType {
+ /**
+ * Mount as read only.
+ */
+ READ_ONLY("ro"),
+ /**
+ * Mount as read/write.
+ */
+ READ_WRITE("rw");
+
+ private final String option;
+
+ MountType(String option) {
+ this.option = option;
+ }
+
+ /**
+ * Get related command line option.
+ * @return The related command line option.
+ */
+ public String getOption() {
+ return this.option;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/root/RootModel.java b/app/src/main/java/org/adaway/model/root/RootModel.java
new file mode 100644
index 0000000..6dc4cf1
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/root/RootModel.java
@@ -0,0 +1,319 @@
+package org.adaway.model.root;
+
+import static android.content.Context.MODE_PRIVATE;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+import static org.adaway.model.adblocking.AdBlockMethod.ROOT;
+import static org.adaway.model.error.HostError.COPY_FAIL;
+import static org.adaway.model.error.HostError.NOT_ENOUGH_SPACE;
+import static org.adaway.model.error.HostError.PRIVATE_FILE_FAILED;
+import static org.adaway.model.error.HostError.REVERT_FAIL;
+import static org.adaway.model.root.ShellUtils.isWritable;
+import static org.adaway.util.Constants.ANDROID_SYSTEM_ETC_HOSTS;
+import static org.adaway.util.Constants.COMMAND_CHMOD_644;
+import static org.adaway.util.Constants.COMMAND_CHOWN;
+import static org.adaway.util.Constants.DEFAULT_HOSTS_FILENAME;
+import static org.adaway.util.Constants.HOSTS_FILENAME;
+import static org.adaway.util.Constants.LINE_SEPARATOR;
+import static org.adaway.util.Constants.LOCALHOST_HOSTNAME;
+import static org.adaway.util.Constants.LOCALHOST_IPV4;
+import static org.adaway.util.Constants.LOCALHOST_IPV6;
+import static org.adaway.model.root.MountType.READ_ONLY;
+import static org.adaway.model.root.MountType.READ_WRITE;
+import static org.adaway.model.root.ShellUtils.mergeAllLines;
+
+import android.content.Context;
+
+import com.topjohnwu.superuser.Shell;
+
+import org.adaway.R;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostEntryDao;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostEntry;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.error.HostErrorException;
+import org.adaway.util.AppExecutors;
+import org.adaway.util.WebServerUtils;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.Executor;
+
+import timber.log.Timber;
+
+/**
+ * This class is the model to represent hosts file installation.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class RootModel extends AdBlockModel {
+ private static final String HEADER1 = "# This hosts file has been generated by AdAway on: ";
+ private static final String HEADER2 = "# Please do not modify it directly, it will be overwritten when AdAway is applied again.";
+ private static final String HEADER_SOURCES = "# This file is generated from the following sources:";
+ private final HostsSourceDao hostsSourceDao;
+ private final HostEntryDao hostEntryDao;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ public RootModel(Context context) {
+ super(context);
+ // Get DOA
+ AppDatabase database = AppDatabase.getInstance(this.context);
+ this.hostsSourceDao = database.hostsSourceDao();
+ this.hostEntryDao = database.hostEntryDao();
+ // Check if host list is applied
+ Executor executor = AppExecutors.getInstance().diskIO();
+ executor.execute(this::checkApplied);
+ executor.execute(() -> syncPreferences(context));
+ }
+
+ @Override
+ public AdBlockMethod getMethod() {
+ return ROOT;
+ }
+
+ @Override
+ public void apply() throws HostErrorException {
+ setState(R.string.status_apply_sources);
+ setState(R.string.status_create_new_hosts);
+ createNewHostsFile();
+ setState(R.string.status_copy_new_hosts);
+ copyNewHostsFile();
+ setState(R.string.status_check_copy);
+ setState(R.string.status_hosts_updated);
+ this.applied.postValue(true);
+ }
+
+ /**
+ * Revert to the default hosts file.
+ *
+ * @throws HostErrorException If the hosts file could not be reverted.
+ */
+ @Override
+ public void revert() throws HostErrorException {
+ // Update status
+ setState(R.string.status_revert);
+ try {
+ // Revert hosts file
+ revertHostFile();
+ setState(R.string.status_revert_done);
+ this.applied.postValue(false);
+ } catch (IOException exception) {
+ throw new HostErrorException(REVERT_FAIL, exception);
+ }
+ }
+
+ @Override
+ public boolean isRecordingLogs() {
+ return TcpdumpUtils.isTcpdumpRunning();
+ }
+
+ @Override
+ public void setRecordingLogs(boolean recording) {
+ if (recording) {
+ TcpdumpUtils.startTcpdump(this.context);
+ } else {
+ TcpdumpUtils.stopTcpdump();
+ }
+ }
+
+ @Override
+ public List getLogs() {
+ return TcpdumpUtils.getLogs(this.context);
+ }
+
+ @Override
+ public void clearLogs() {
+ TcpdumpUtils.clearLogFile(this.context);
+ }
+
+ private void checkApplied() {
+ boolean applied = false;
+
+ Shell.Result result = Shell.cmd("head -n 1 " + ANDROID_SYSTEM_ETC_HOSTS).exec();
+ if (!result.isSuccess()) {
+ Timber.e("Failed to read first line of hosts file. Error code: %s", result.getCode());
+ } else {
+ applied = mergeAllLines(result.getOut()).startsWith(HEADER1);
+ }
+
+ this.applied.postValue(applied);
+ }
+
+ private void syncPreferences(Context context) {
+ if (PreferenceHelper.getWebServerEnabled(context) && !WebServerUtils.isWebServerRunning()) {
+ WebServerUtils.startWebServer(context);
+ }
+ }
+
+ private void deleteNewHostsFile() {
+ // delete generated hosts file from private storage
+ this.context.deleteFile(HOSTS_FILENAME);
+ }
+
+ private void copyNewHostsFile() throws HostErrorException {
+ try {
+ copyHostsFile(HOSTS_FILENAME);
+ } catch (CommandException exception) {
+ throw new HostErrorException(COPY_FAIL, exception);
+ }
+ }
+
+ /**
+ * Create a new hosts files in a private file from downloaded hosts sources.
+ *
+ * @throws HostErrorException If the new hosts file could not be created.
+ */
+ private void createNewHostsFile() throws HostErrorException {
+ deleteNewHostsFile();
+ try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(this.context.openFileOutput(HOSTS_FILENAME, MODE_PRIVATE)))) {
+ writeHostsHeader(writer);
+ writeLoopbackToHosts(writer);
+ writeHosts(writer);
+ } catch (IOException exception) {
+ throw new HostErrorException(PRIVATE_FILE_FAILED, exception);
+ }
+ }
+
+ private void writeHostsHeader(BufferedWriter writer) throws IOException {
+ // Format current date
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
+ Date now = new Date();
+ String date = formatter.format(now);
+ // Write header
+ writer.write(HEADER1);
+ writer.write(date);
+ writer.newLine();
+ writer.write(HEADER2);
+ writer.newLine();
+ // Write hosts source
+ writer.write(HEADER_SOURCES);
+ writer.newLine();
+ for (HostsSource hostsSource : this.hostsSourceDao.getEnabled()) {
+ writer.write("# - " + hostsSource.getLabel() + ":" + hostsSource.getUrl());
+ writer.newLine();
+ }
+ // Write empty line separator
+ writer.newLine();
+ }
+
+ private void writeLoopbackToHosts(BufferedWriter writer) throws IOException {
+ writer.write(LOCALHOST_IPV4 + " " + LOCALHOST_HOSTNAME);
+ writer.newLine();
+ writer.write(LOCALHOST_IPV6 + " " + LOCALHOST_HOSTNAME);
+ writer.newLine();
+ }
+
+ private void writeHosts(BufferedWriter writer) throws IOException {
+ // Get user preferences
+ String redirectionIpv4 = PreferenceHelper.getRedirectionIpv4(this.context);
+ String redirectionIpv6 = PreferenceHelper.getRedirectionIpv6(this.context);
+ boolean enableIpv6 = PreferenceHelper.getEnableIpv6(this.context);
+ // Write each hostname
+ for (HostEntry entry : this.hostEntryDao.getAll()) {
+ String hostname = entry.getHost();
+ if (entry.getType() == REDIRECTED) {
+ writer.write(entry.getRedirection() + " " + hostname);
+ writer.newLine();
+ } else {
+ writer.write(redirectionIpv4 + " " + hostname);
+ writer.newLine();
+ if (enableIpv6) {
+ writer.write(redirectionIpv6 + " " + hostname);
+ writer.newLine();
+ }
+ }
+ }
+ }
+
+ /**
+ * Revert to default hosts file.
+ *
+ * @throws IOException If the hosts file could not be reverted.
+ */
+ private void revertHostFile() throws IOException {
+ // Create private file
+ try (FileOutputStream fos = this.context.openFileOutput(DEFAULT_HOSTS_FILENAME, MODE_PRIVATE)) {
+ // Write default localhost as hosts file
+ String localhost = LOCALHOST_IPV4 + " " + LOCALHOST_HOSTNAME + LINE_SEPARATOR +
+ LOCALHOST_IPV6 + " " + LOCALHOST_HOSTNAME + LINE_SEPARATOR;
+ fos.write(localhost.getBytes());
+ // Copy generated hosts file to target location
+ copyHostsFile(DEFAULT_HOSTS_FILENAME);
+ // Delete generated hosts file after applying it
+ this.context.deleteFile(DEFAULT_HOSTS_FILENAME);
+ } catch (Exception exception) {
+ throw new IOException("Unable to revert hosts file.", exception);
+ }
+ }
+
+ /**
+ * Copy source file from private storage of AdAway to hosts file target using root commands.
+ */
+ private void copyHostsFile(String source) throws HostErrorException, CommandException {
+ String privateDir = this.context.getFilesDir().getAbsolutePath();
+ String privateFile = privateDir + File.separator + source;
+
+ // if the target has a trailing slash, it is not a valid target!
+ String target = ANDROID_SYSTEM_ETC_HOSTS;
+ File targetFile = new File(target);
+
+ /* check for space on partition */
+ long size = new File(privateFile).length();
+ Timber.i("Size of hosts file: %s.", size);
+ if (!hasEnoughSpaceOnPartition(targetFile, size)) {
+ throw new HostErrorException(NOT_ENOUGH_SPACE);
+ }
+
+ /* Execute commands */
+ boolean writable = isWritable(targetFile);
+ try {
+ if (!writable) {
+ // remount for write access
+ Timber.i("Remounting for RW…");
+ if (!ShellUtils.remountPartition(targetFile, READ_WRITE)) {
+ throw new CommandException("Failed to remount hosts file partition as read-write.");
+ }
+ }
+ // Copy hosts file then set owner and permissions
+ Shell.Result result = Shell.cmd(
+ "dd if=" + privateFile + " of=" + target,
+ COMMAND_CHOWN + " " + target,
+ COMMAND_CHMOD_644 + " " + target
+ ).exec();
+ if (!result.isSuccess()) {
+ throw new CommandException("Failed to copy hosts file: " + mergeAllLines(result.getErr()));
+ }
+ } finally {
+ if (!writable) {
+ // after all remount target back as read only
+ ShellUtils.remountPartition(targetFile, READ_ONLY);
+ }
+ }
+ }
+
+ /**
+ * Check if there is enough space on partition where target is located
+ *
+ * @param size size of file to put on partition
+ * @param target path where to put the file
+ * @return true if it will fit on partition of target, false if it will not fit.
+ */
+ private boolean hasEnoughSpaceOnPartition(File target, long size) {
+ long freeSpace = target.getFreeSpace();
+ return (freeSpace == 0 || freeSpace > size);
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/root/ShellUtils.java b/app/src/main/java/org/adaway/model/root/ShellUtils.java
new file mode 100644
index 0000000..f50f30b
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/root/ShellUtils.java
@@ -0,0 +1,99 @@
+package org.adaway.model.root;
+
+import static com.topjohnwu.superuser.ShellUtils.escapedString;
+
+import android.content.Context;
+
+import com.topjohnwu.superuser.Shell;
+
+import java.io.File;
+import java.util.List;
+import java.util.Optional;
+
+import timber.log.Timber;
+
+/**
+ * This class is an utility class to help with shell commands.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class ShellUtils {
+ private static final String EXECUTABLE_PREFIX = "lib";
+ private static final String EXECUTABLE_SUFFIX = "_exec.so";
+
+ /**
+ * Private constructor.
+ */
+ private ShellUtils() {
+
+ }
+
+ public static String mergeAllLines(List lines) {
+ return String.join("\n", lines);
+ }
+
+ public static boolean isBundledExecutableRunning(String executable) {
+ return Shell.cmd("ps -A | grep " + EXECUTABLE_PREFIX + executable + EXECUTABLE_SUFFIX).exec().isSuccess();
+ }
+
+ public static boolean runBundledExecutable(Context context, String executable, String parameters) {
+ String nativeLibraryDir = context.getApplicationInfo().nativeLibraryDir;
+ String command = "LD_LIBRARY_PATH=" + nativeLibraryDir + " " +
+ nativeLibraryDir + File.separator + EXECUTABLE_PREFIX + executable + EXECUTABLE_SUFFIX + " " +
+ parameters + " &";
+ return Shell.cmd(command).exec().isSuccess();
+ }
+
+ public static void killBundledExecutable(String executable) {
+ Shell.cmd("killall " + EXECUTABLE_PREFIX + executable + EXECUTABLE_SUFFIX).exec();
+ }
+
+
+
+ /**
+ * Check if a path is writable.
+ *
+ * @param file The file to check.
+ * @return true if the path is writable, false otherwise.
+ */
+ public static boolean isWritable(File file) {
+ // Check first if file can be written without privileges
+ if (file.canWrite()) {
+ return true;
+ }
+ return Shell.cmd("test -w " + escapedString(file.getAbsolutePath()))
+ .exec()
+ .isSuccess();
+ }
+
+ public static boolean remountPartition(File file, MountType type) {
+ Optional partitionOptional = findPartition(file);
+ if (!partitionOptional.isPresent()) {
+ return false;
+ }
+ String partition = partitionOptional.get();
+ Shell.Result result = Shell.cmd("mount -o " + type.getOption() + ",remount " + partition).exec();
+ boolean success = result.isSuccess();
+ if (!success) {
+ Timber.w("Failed to remount partition %s as %s: %s.", partition, type.getOption(), mergeAllLines(result.getErr()));
+ }
+ return success;
+ }
+
+ private static Optional findPartition(File file) {
+ // Get mount points
+ Shell.Result result = Shell.cmd("cat /proc/mounts | cut -d ' ' -f2").exec();
+ List out = result.getOut();
+ // Check file and each parent against mount points
+ while (file != null) {
+ String path = file.getAbsolutePath();
+ for (String mount : out) {
+ if (path.equals(mount)) {
+ return Optional.of(mount);
+ }
+ }
+ file = file.getParentFile();
+ }
+ return Optional.empty();
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/root/TcpdumpUtils.java b/app/src/main/java/org/adaway/model/root/TcpdumpUtils.java
new file mode 100644
index 0000000..664a99d
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/root/TcpdumpUtils.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.model.root;
+
+import android.content.Context;
+
+import com.topjohnwu.superuser.Shell;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.util.Collections.emptyList;
+import static org.adaway.model.root.ShellUtils.isBundledExecutableRunning;
+import static org.adaway.model.root.ShellUtils.killBundledExecutable;
+import static org.adaway.model.root.ShellUtils.mergeAllLines;
+import static org.adaway.model.root.ShellUtils.runBundledExecutable;
+
+import timber.log.Timber;
+
+class TcpdumpUtils {
+ private static final String TCPDUMP_EXECUTABLE = "tcpdump";
+ private static final String TCPDUMP_LOG = "dns_log.txt";
+ private static final String TCPDUMP_HOSTNAME_REGEX = "(?:A\\?|AAAA\\?)\\s(\\S+)\\.\\s";
+ private static final Pattern TCPDUMP_HOSTNAME_PATTERN = Pattern.compile(TCPDUMP_HOSTNAME_REGEX);
+
+ /**
+ * Private constructor.
+ */
+ private TcpdumpUtils() {
+
+ }
+
+ /**
+ * Checks if tcpdump is running
+ *
+ * @return true if tcpdump is running
+ */
+ static boolean isTcpdumpRunning() {
+ return isBundledExecutableRunning(TCPDUMP_EXECUTABLE);
+ }
+
+ /**
+ * Start tcpdump tool.
+ *
+ * @param context The application context.
+ * @return returns true if starting worked
+ */
+ static boolean startTcpdump(Context context) {
+ Timber.d("Starting tcpdump...");
+ checkSystemTcpdump();
+
+ File file = getLogFile(context);
+ try {
+ // Create log file before using it with tcpdump if not exists
+ if (!file.exists() && !file.createNewFile()) {
+ return false;
+ }
+ } catch (IOException e) {
+ Timber.e(e, "Problem while getting cache directory!");
+ return false;
+ }
+
+ // "-i any": listen on any network interface
+ // "-p": disable promiscuous mode (doesn't work anyway)
+ // "-l": Make stdout line buffered. Useful if you want to see the data while
+ // capturing it.
+ // "-v": verbose
+ // "-t": don't print a timestamp
+ // "-s 0": capture first 512 bit of packet to get DNS content
+ String parameters = "-i any -p -l -v -t -s 512 'udp dst port 53' >> " + file + " 2>&1";
+
+ return runBundledExecutable(context, TCPDUMP_EXECUTABLE, parameters);
+ }
+
+ /**
+ * Stop tcpdump.
+ */
+ static void stopTcpdump() {
+ killBundledExecutable(TCPDUMP_EXECUTABLE);
+ }
+
+ /**
+ * Check if tcpdump binary in bundled in the system.
+ */
+ static void checkSystemTcpdump() {
+ try {
+ Shell.Result result = Shell.cmd("tcpdump --version").exec();
+ int exitCode = result.getCode();
+ String output = mergeAllLines(result.getOut());
+ String msg = "Tcpdump " + (
+ exitCode == 0 ?
+ "present" :
+ "missing (" + exitCode + ")"
+ ) + "\n" + output;
+ Timber.i(msg);
+ } catch (Exception exception) {
+ Timber.w(exception, "Failed to check system tcpdump binary.");
+ }
+ }
+
+ /**
+ * Get the tcpdump log file.
+ *
+ * @param context The application context.
+ * @return The tcpdump log file.
+ */
+ static File getLogFile(Context context) {
+ return new File(context.getCacheDir(), TCPDUMP_LOG);
+ }
+
+ /**
+ * Get the tcpdump log content.
+ *
+ * @param context The application context.
+ * @return The tcpdump log file content.
+ */
+ static List getLogs(Context context) {
+ Path logPath = getLogFile(context).toPath();
+ // Check if the log file exists
+ if (!Files.exists(logPath)) {
+ return emptyList();
+ }
+ try (Stream lines = Files.lines(logPath)) {
+ return lines
+ .map(TcpdumpUtils::getTcpdumpHostname)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ } catch (IOException exception) {
+ Timber.e(exception, "Can not get cache directory.");
+ return emptyList();
+ }
+ }
+
+ /**
+ * Delete log file of tcpdump.
+ *
+ * @param context The application context.
+ */
+ static boolean clearLogFile(Context context) {
+ // Get the log file
+ File file = getLogFile(context);
+ // Check if file exists
+ if (!file.exists()) {
+ return true;
+ }
+ // Truncate the file content
+ try (FileOutputStream outputStream = new FileOutputStream(file, false)) {
+ // Only truncate the file
+ outputStream.close(); // Useless but help lint
+ } catch (IOException exception) {
+ Timber.e(exception, "Error while truncating the tcpdump file!");
+ // Return failed to clear the log file
+ return false;
+ }
+ // Return successfully clear the log file
+ return true;
+ }
+
+ /**
+ * Gets hostname out of tcpdump log line.
+ *
+ * @param input One line from dns log.
+ * @return A hostname or {code null} if no DNS query in the input.
+ */
+ private static String getTcpdumpHostname(String input) {
+ Matcher tcpdumpHostnameMatcher = TCPDUMP_HOSTNAME_PATTERN.matcher(input);
+ if (tcpdumpHostnameMatcher.find()) {
+ return tcpdumpHostnameMatcher.group(1);
+ } else {
+ Timber.d("Does not find: %s.", input);
+ return null;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/root/package-info.java b/app/src/main/java/org/adaway/model/root/package-info.java
new file mode 100644
index 0000000..224ddbd
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/root/package-info.java
@@ -0,0 +1,9 @@
+/**
+ * The root ad-blocker related implementations.
+ *
+ * It relies on libsu from John Wu and shell commands.
+ * Supported shell commands are described here: https://chromium.googlesource.com/aosp/platform/system/core/+/upstream/shell_and_utilities/#android-8_0-oreo
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+package org.adaway.model.root;
\ No newline at end of file
diff --git a/app/src/main/java/org/adaway/model/source/SourceLoader.java b/app/src/main/java/org/adaway/model/source/SourceLoader.java
new file mode 100644
index 0000000..bc2cfdd
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/source/SourceLoader.java
@@ -0,0 +1,267 @@
+package org.adaway.model.source;
+
+import static org.adaway.db.entity.ListType.ALLOWED;
+import static org.adaway.db.entity.ListType.BLOCKED;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+import static org.adaway.util.Constants.BOGUS_IPV4;
+import static org.adaway.util.Constants.LOCALHOST_HOSTNAME;
+import static org.adaway.util.Constants.LOCALHOST_IPV4;
+import static org.adaway.util.Constants.LOCALHOST_IPV6;
+
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.db.entity.ListType;
+import org.adaway.util.RegexUtils;
+
+import java.io.BufferedReader;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import timber.log.Timber;
+
+/**
+ * This class is an {@link HostsSource} loader.
+ * It parses a source and loads it to database.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class SourceLoader {
+ private static final String TAG = "SourceLoader";
+ private static final String END_OF_QUEUE_MARKER = "#EndOfQueueMarker";
+ private static final int INSERT_BATCH_SIZE = 100;
+ private static final String HOSTS_PARSER = "^\\s*([^#\\s]+)\\s+([^#\\s]+).*$";
+ static final Pattern HOSTS_PARSER_PATTERN = Pattern.compile(HOSTS_PARSER);
+
+ private final HostsSource source;
+
+ SourceLoader(HostsSource hostsSource) {
+ this.source = hostsSource;
+ }
+
+ void parse(BufferedReader reader, HostListItemDao hostListItemDao) {
+ // Clear current hosts
+ hostListItemDao.clearSourceHosts(this.source.getId());
+ // Create batch
+ int parserCount = 3;
+ LinkedBlockingQueue hostsLineQueue = new LinkedBlockingQueue<>();
+ LinkedBlockingQueue hostsListItemQueue = new LinkedBlockingQueue<>();
+ SourceReader sourceReader = new SourceReader(reader, hostsLineQueue, parserCount);
+ ItemInserter inserter = new ItemInserter(hostsListItemQueue, hostListItemDao, parserCount);
+ ExecutorService executorService = Executors.newFixedThreadPool(
+ parserCount + 2,
+ r -> new Thread(r, TAG)
+ );
+ executorService.execute(sourceReader);
+ for (int i = 0; i < parserCount; i++) {
+ executorService.execute(new HostListItemParser(this.source, hostsLineQueue, hostsListItemQueue));
+ }
+ Future inserterFuture = executorService.submit(inserter);
+ try {
+ Integer inserted = inserterFuture.get();
+ Timber.i("%s host list items inserted.", inserted);
+ } catch (ExecutionException e) {
+ Timber.w(e, "Failed to parse hosts sources.");
+ } catch (InterruptedException e) {
+ Timber.w(e, "Interrupted while parsing sources.");
+ Thread.currentThread().interrupt();
+ }
+ executorService.shutdown();
+ }
+
+ private static class SourceReader implements Runnable {
+ private final BufferedReader reader;
+ private final BlockingQueue queue;
+ private final int parserCount;
+
+ private SourceReader(BufferedReader reader, BlockingQueue queue, int parserCount) {
+ this.reader = reader;
+ this.queue = queue;
+ this.parserCount = parserCount;
+ }
+
+ @Override
+ public void run() {
+ try {
+ this.reader.lines().forEach(this.queue::add);
+ } catch (Throwable t) {
+ Timber.w(t, "Failed to read hosts source.");
+ } finally {
+ // Send end of queue marker to parsers
+ for (int i = 0; i < this.parserCount; i++) {
+ this.queue.add(END_OF_QUEUE_MARKER);
+ }
+ }
+ }
+ }
+
+ private static class HostListItemParser implements Runnable {
+ private final HostsSource source;
+ private final BlockingQueue lineQueue;
+ private final BlockingQueue itemQueue;
+
+ private HostListItemParser(HostsSource source, BlockingQueue lineQueue, BlockingQueue itemQueue) {
+ this.source = source;
+ this.lineQueue = lineQueue;
+ this.itemQueue = itemQueue;
+ }
+
+ @Override
+ public void run() {
+ boolean allowedList = this.source.isAllowEnabled();
+ boolean endOfSource = false;
+ while (!endOfSource) {
+ try {
+ String line = this.lineQueue.take();
+ // Check end of queue marker
+ //noinspection StringEquality
+ if (line == END_OF_QUEUE_MARKER) {
+ endOfSource = true;
+ // Send end of queue marker to inserter
+ HostListItem endItem = new HostListItem();
+ endItem.setHost(line);
+ this.itemQueue.add(endItem);
+ } // Check comments
+ else if (line.isEmpty() || line.charAt(0) == '#') {
+ Timber.d("Skip comment: %s.", line);
+ } else {
+ HostListItem item = allowedList ? parseAllowListItem(line) : parseHostListItem(line);
+ if (item != null && isRedirectionValid(item) && isHostValid(item)) {
+ this.itemQueue.add(item);
+ }
+ }
+ } catch (InterruptedException e) {
+ Timber.w(e, "Interrupted while parsing hosts list item.");
+ endOfSource = true;
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+
+ private HostListItem parseHostListItem(String line) {
+ Matcher matcher = HOSTS_PARSER_PATTERN.matcher(line);
+ if (!matcher.matches()) {
+ Timber.d("Does not match: %s.", line);
+ return null;
+ }
+ // Check IP address validity or while list entry (if allowed)
+ String ip = matcher.group(1);
+ String hostname = matcher.group(2);
+ assert hostname != null;
+ // Skip localhost name
+ if (LOCALHOST_HOSTNAME.equals(hostname)) {
+ return null;
+ }
+ // check if ip is 127.0.0.1 or 0.0.0.0
+ ListType type;
+ if (LOCALHOST_IPV4.equals(ip)
+ || BOGUS_IPV4.equals(ip)
+ || LOCALHOST_IPV6.equals(ip)) {
+ type = BLOCKED;
+ } else if (this.source.isRedirectEnabled()) {
+ type = REDIRECTED;
+ } else {
+ return null;
+ }
+ HostListItem item = new HostListItem();
+ item.setType(type);
+ item.setHost(hostname);
+ item.setEnabled(true);
+ if (type == REDIRECTED) {
+ item.setRedirection(ip);
+ }
+ item.setSourceId(this.source.getId());
+ return item;
+ }
+
+ private HostListItem parseAllowListItem(String line) {
+ // Extract hostname
+ int indexOf = line.indexOf('#');
+ if (indexOf == 1) {
+ line = line.substring(0, indexOf);
+ }
+ line = line.trim();
+ // Create item
+ HostListItem item = new HostListItem();
+ item.setType(ALLOWED);
+ item.setHost(line);
+ item.setEnabled(true);
+ item.setSourceId(this.source.getId());
+ return item;
+ }
+
+ private boolean isRedirectionValid(HostListItem item) {
+ return item.getType() != REDIRECTED || RegexUtils.isValidIP(item.getRedirection());
+ }
+
+ private boolean isHostValid(HostListItem item) {
+ String hostname = item.getHost();
+ if (item.getType() == BLOCKED) {
+ if (hostname.indexOf('?') != -1 || hostname.indexOf('*') != -1) {
+ return false;
+ }
+ return RegexUtils.isValidHostname(hostname);
+ }
+ return RegexUtils.isValidWildcardHostname(hostname);
+ }
+ }
+
+ private static class ItemInserter implements Callable {
+ private final BlockingQueue hostListItemQueue;
+ private final HostListItemDao hostListItemDao;
+ private final int parserCount;
+
+ private ItemInserter(BlockingQueue itemQueue, HostListItemDao hostListItemDao, int parserCount) {
+ this.hostListItemQueue = itemQueue;
+ this.hostListItemDao = hostListItemDao;
+ this.parserCount = parserCount;
+ }
+
+ @Override
+ public Integer call() {
+ int inserted = 0;
+ int workerStopped = 0;
+ HostListItem[] batch = new HostListItem[INSERT_BATCH_SIZE];
+ int cacheSize = 0;
+ boolean queueEmptied = false;
+ while (!queueEmptied) {
+ try {
+ HostListItem item = this.hostListItemQueue.take();
+ // Check end of queue marker
+ //noinspection StringEquality
+ if (item.getHost() == END_OF_QUEUE_MARKER) {
+ workerStopped++;
+ if (workerStopped >= this.parserCount) {
+ queueEmptied = true;
+ }
+ } else {
+ batch[cacheSize++] = item;
+ if (cacheSize >= batch.length) {
+ this.hostListItemDao.insert(batch);
+ inserted += cacheSize;
+ cacheSize = 0;
+ }
+ }
+ } catch (InterruptedException e) {
+ Timber.w(e, "Interrupted while inserted hosts list item.");
+ queueEmptied = true;
+ Thread.currentThread().interrupt();
+ }
+ }
+ // Flush current batch
+ HostListItem[] remaining = new HostListItem[cacheSize];
+ System.arraycopy(batch, 0, remaining, 0, remaining.length);
+ this.hostListItemDao.insert(remaining);
+ inserted += cacheSize;
+ // Return number of inserted items
+ return inserted;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/source/SourceModel.java b/app/src/main/java/org/adaway/model/source/SourceModel.java
new file mode 100644
index 0000000..91fccb2
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/source/SourceModel.java
@@ -0,0 +1,508 @@
+package org.adaway.model.source;
+
+import static android.content.Context.CONNECTIVITY_SERVICE;
+import static android.provider.DocumentsContract.Document.COLUMN_LAST_MODIFIED;
+import static org.adaway.model.error.HostError.DOWNLOAD_FAILED;
+import static org.adaway.model.error.HostError.NO_CONNECTION;
+import static java.net.HttpURLConnection.HTTP_NOT_MODIFIED;
+import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;
+import static java.time.format.FormatStyle.MEDIUM;
+import static java.time.temporal.ChronoUnit.WEEKS;
+import static java.util.Objects.requireNonNull;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import org.adaway.R;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.converter.ZonedDateTimeConverter;
+import org.adaway.db.dao.HostEntryDao;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostEntry;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.model.error.HostErrorException;
+import org.adaway.model.git.GitHostsSource;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.List;
+
+import okhttp3.Cache;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import timber.log.Timber;
+
+/**
+ * This class is the model to represent hosts source management.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class SourceModel {
+ /**
+ * The HTTP client cache size (100Mo).
+ */
+ private static final long CACHE_SIZE = 100L * 1024L * 1024L;
+ private static final String LAST_MODIFIED_HEADER = "Last-Modified";
+ private static final String IF_NONE_MATCH_HEADER = "If-None-Match";
+ private static final String IF_MODIFIED_SINCE_HEADER = "If-Modified-Since";
+ private static final String ENTITY_TAG_HEADER = "ETag";
+ private static final String WEAK_ENTITY_TAG_PREFIX = "W/";
+ /**
+ * The application context.
+ */
+ private final Context context;
+ /**
+ * The {@link HostsSource} DAO.
+ */
+ private final HostsSourceDao hostsSourceDao;
+ /**
+ * The {@link HostListItem} DAO.
+ */
+ private final HostListItemDao hostListItemDao;
+ /**
+ * The {@link HostEntry} DAO.
+ */
+ private final HostEntryDao hostEntryDao;
+ /**
+ * The update available status.
+ */
+ private final MutableLiveData updateAvailable;
+ /**
+ * The model state.
+ */
+ private final MutableLiveData state;
+ /**
+ * The HTTP client to download hosts sources ({@code null} until initialized by {@link #getHttpClient()}).
+ */
+ private OkHttpClient cachedHttpClient;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ public SourceModel(Context context) {
+ this.context = context;
+ AppDatabase database = AppDatabase.getInstance(this.context);
+ this.hostsSourceDao = database.hostsSourceDao();
+ this.hostListItemDao = database.hostsListItemDao();
+ this.hostEntryDao = database.hostEntryDao();
+ this.state = new MutableLiveData<>("");
+ this.updateAvailable = new MutableLiveData<>();
+ this.updateAvailable.setValue(false);
+ SourceUpdateService.syncPreferences(context);
+ }
+
+ /**
+ * Get the model state.
+ *
+ * @return The model state.
+ */
+ public LiveData getState() {
+ return this.state;
+ }
+
+ /**
+ * Get the update available status.
+ *
+ * @return {@code true} if source update is available, {@code false} otherwise.
+ */
+ public LiveData isUpdateAvailable() {
+ return this.updateAvailable;
+ }
+
+ /**
+ * Check if there is update available for hosts sources.
+ *
+ * @throws HostErrorException If the hosts sources could not be checked.
+ */
+ public boolean checkForUpdate() throws HostErrorException {
+ // Check current connection
+ if (isDeviceOffline()) {
+ throw new HostErrorException(NO_CONNECTION);
+ }
+ // Initialize update status
+ boolean updateAvailable = false;
+ // Get enabled hosts sources
+ List sources = this.hostsSourceDao.getEnabled();
+ if (sources.isEmpty()) {
+ // Return no update as no source
+ this.updateAvailable.postValue(false);
+ return false;
+ }
+ // Update state
+ setState(R.string.status_check);
+ // Check each source
+ for (HostsSource source : sources) {
+ // Get URL and lastModified from db
+ ZonedDateTime lastModifiedLocal = source.getLocalModificationDate();
+ // Update state
+ setState(R.string.status_check_source, source.getLabel());
+ // Get hosts source last update
+ ZonedDateTime lastModifiedOnline = getHostsSourceLastUpdate(source);
+ // Some help with debug here
+ Timber.d("lastModifiedLocal: %s", dateToString(lastModifiedLocal));
+ Timber.d("lastModifiedOnline: %s", dateToString(lastModifiedOnline));
+ // Save last modified online
+ this.hostsSourceDao.updateOnlineModificationDate(source.getId(), lastModifiedOnline);
+ // Check if last modified online retrieved
+ if (lastModifiedOnline == null) {
+ // If not, consider update is available if install is older than a week
+ ZonedDateTime lastWeek = ZonedDateTime.now().minus(1, WEEKS);
+ if (lastModifiedLocal != null && lastModifiedLocal.isBefore(lastWeek)) {
+ updateAvailable = true;
+ }
+ } else {
+ // Check if source was never installed or installed before the last update
+ if (lastModifiedLocal == null || lastModifiedOnline.isAfter(lastModifiedLocal)) {
+ updateAvailable = true;
+ }
+ }
+ }
+ // Update statuses
+ Timber.d("Update check result: %s.", updateAvailable);
+ if (updateAvailable) {
+ setState(R.string.status_update_available);
+ } else {
+ setState(R.string.status_no_update_found);
+ }
+ this.updateAvailable.postValue(updateAvailable);
+ return updateAvailable;
+ }
+
+ /**
+ * Format {@link ZonedDateTime} for printing.
+ *
+ * @param zonedDateTime The date to format.
+ * @return The formatted date string.
+ */
+ private String dateToString(ZonedDateTime zonedDateTime) {
+ if (zonedDateTime == null) {
+ return "not defined";
+ } else {
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(MEDIUM);
+ return zonedDateTime + " (" + zonedDateTime.format(dateTimeFormatter) + ")";
+ }
+ }
+
+ /**
+ * Checks if device is offline.
+ *
+ * @return returns {@code true} if device is offline, {@code false} otherwise.
+ */
+ private boolean isDeviceOffline() {
+ ConnectivityManager connectivityManager = (ConnectivityManager) this.context.getSystemService(CONNECTIVITY_SERVICE);
+ if (connectivityManager == null) {
+ return false;
+ }
+ NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
+ return netInfo == null || !netInfo.isConnectedOrConnecting();
+ }
+
+ /**
+ * Get the hosts source last online update.
+ *
+ * @param source The hosts source to get last online update.
+ * @return The last online date, {@code null} if the date could not be retrieved.
+ */
+ @Nullable
+ private ZonedDateTime getHostsSourceLastUpdate(HostsSource source) {
+ switch (source.getType()) {
+ case URL:
+ return getUrlLastUpdate(source);
+ case FILE:
+ Uri fileUri = Uri.parse(source.getUrl());
+ return getFileLastUpdate(fileUri);
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Get the url last online update.
+ *
+ * @param source The source to get last online update.
+ * @return The last online date, {@code null} if the date could not be retrieved.
+ */
+ private ZonedDateTime getUrlLastUpdate(HostsSource source) {
+ String url = source.getUrl();
+ Timber.v("Checking url last update for source: %s.", url);
+ // Check Git hosting
+ if (GitHostsSource.isHostedOnGit(url)) {
+ try {
+ return GitHostsSource.getSource(url).getLastUpdate();
+ } catch (MalformedURLException e) {
+ Timber.w(e, "Failed to get Git last commit for url %s.", url);
+ return null;
+ }
+ }
+ // Default hosting
+ Request request = getRequestFor(source).head().build();
+ try (Response response = getHttpClient().newCall(request).execute()) {
+ String lastModified = response.header(LAST_MODIFIED_HEADER);
+ if (lastModified == null) {
+ return response.code() == HTTP_NOT_MODIFIED ?
+ source.getOnlineModificationDate() : null;
+ }
+ return ZonedDateTime.parse(lastModified, RFC_1123_DATE_TIME);
+ } catch (IOException | DateTimeParseException e) {
+ Timber.e(e, "Exception while fetching last modified date of source %s.", url);
+ return null;
+ }
+ }
+
+ /**
+ * Get the file last modified date.
+ *
+ * @param fileUri The file uri to get last modified date.
+ * @return The file last modified date, {@code null} if date could not be retrieved.
+ */
+ private ZonedDateTime getFileLastUpdate(Uri fileUri) {
+ ContentResolver contentResolver = this.context.getContentResolver();
+ try (Cursor cursor = contentResolver.query(fileUri, null, null, null, null)) {
+ if (cursor == null || !cursor.moveToFirst()) {
+ Timber.w("The content resolver could not find %s.", fileUri);
+ return null;
+ }
+ int columnIndex = cursor.getColumnIndex(COLUMN_LAST_MODIFIED);
+ if (columnIndex == -1) {
+ Timber.w("The content resolver does not support last modified column %s.", fileUri);
+ return null;
+ }
+ return ZonedDateTimeConverter.fromTimestamp(cursor.getLong(columnIndex));
+ } catch (SecurityException e) {
+ Timber.i(e, "The SAF permission was removed.");
+ return null;
+ }
+ }
+
+ /**
+ * Retrieve all hosts sources files to copy into a private local file.
+ *
+ * @throws HostErrorException If the hosts sources could not be downloaded.
+ */
+ public void retrieveHostsSources() throws HostErrorException {
+ // Check connection status
+ if (isDeviceOffline()) {
+ throw new HostErrorException(NO_CONNECTION);
+ }
+ // Update state to downloading
+ setState(R.string.status_retrieve);
+ // Initialize copy counters
+ int numberOfCopies = 0;
+ int numberOfFailedCopies = 0;
+ // Compute current date in UTC timezone
+ ZonedDateTime now = ZonedDateTime.now();
+ // Get each hosts source
+ for (HostsSource source : this.hostsSourceDao.getAll()) {
+ int sourceId = source.getId();
+ // Clear disabled source
+ if (!source.isEnabled()) {
+ this.hostListItemDao.clearSourceHosts(sourceId);
+ this.hostsSourceDao.clearProperties(sourceId);
+ continue;
+ }
+ // Get hosts source last update
+ ZonedDateTime onlineModificationDate = getHostsSourceLastUpdate(source);
+ if (onlineModificationDate == null) {
+ onlineModificationDate = now;
+ }
+ // Check if update available
+ ZonedDateTime localModificationDate = source.getLocalModificationDate();
+ if (localModificationDate != null && localModificationDate.isAfter(onlineModificationDate)) {
+ Timber.i("Skip source %s: no update.", source.getLabel());
+ continue;
+ }
+ // Increment number of copy
+ numberOfCopies++;
+ try {
+ // Check hosts source type
+ switch (source.getType()) {
+ case URL:
+ downloadHostSource(source);
+ break;
+ case FILE:
+ readSourceFile(source);
+ break;
+ default:
+ Timber.w("Hosts source type is not supported.");
+ }
+ // Update local and online modification dates to now
+ localModificationDate = onlineModificationDate.isAfter(now) ? onlineModificationDate : now;
+ this.hostsSourceDao.updateModificationDates(sourceId, localModificationDate, onlineModificationDate);
+ // Update size
+ this.hostsSourceDao.updateSize(sourceId);
+ } catch (IOException e) {
+ Timber.w(e, "Failed to retrieve host source %s.", source.getUrl());
+ // Increment number of failed copy
+ numberOfFailedCopies++;
+ }
+ }
+ // Check if all copies failed
+ if (numberOfCopies == numberOfFailedCopies && numberOfCopies != 0) {
+ throw new HostErrorException(DOWNLOAD_FAILED);
+ }
+ // Synchronize hosts entries
+ syncHostEntries();
+ // Mark no update available
+ this.updateAvailable.postValue(false);
+ }
+
+ /**
+ * Synchronize hosts entries from current source states.
+ */
+ public void syncHostEntries() {
+ setState(R.string.status_sync_database);
+ this.hostEntryDao.sync();
+ }
+
+ /**
+ * Get the HTTP client to download hosts sources.
+ *
+ * @return The HTTP client to download hosts sources.
+ */
+ @NonNull
+ private OkHttpClient getHttpClient() {
+ if (this.cachedHttpClient == null) {
+ this.cachedHttpClient = new OkHttpClient.Builder()
+ .cache(new Cache(this.context.getCacheDir(), CACHE_SIZE))
+ .build();
+ }
+ return this.cachedHttpClient;
+ }
+
+ /**
+ * Get request builder for an hosts source.
+ * All cache data available are filled into the headers.
+ *
+ * @param source The hosts source to get request builder.
+ * @return The hosts source request builder.
+ */
+ private Request.Builder getRequestFor(HostsSource source) {
+ Request.Builder request = new Request.Builder().url(source.getUrl());
+ if (source.getEntityTag() != null) {
+ request = request.header(IF_NONE_MATCH_HEADER, source.getEntityTag());
+ }
+ if (source.getOnlineModificationDate() != null) {
+ String lastModified = source.getOnlineModificationDate().format(RFC_1123_DATE_TIME);
+ request = request.header(IF_MODIFIED_SINCE_HEADER, lastModified);
+ }
+ return request;
+ }
+
+ /**
+ * Download an hosts source file and append it to the database.
+ *
+ * @param source The hosts source to download.
+ * @throws IOException If the hosts source could not be downloaded.
+ */
+ private void downloadHostSource(HostsSource source) throws IOException {
+ // Get hosts file URL
+ String hostsFileUrl = source.getUrl();
+ Timber.v("Downloading hosts file: %s.", hostsFileUrl);
+ // Set state to downloading hosts source
+ setState(R.string.status_download_source, hostsFileUrl);
+ // Create request
+ Request request = getRequestFor(source).build();
+ // Request hosts file and open byte stream
+ try (Response response = getHttpClient().newCall(request).execute();
+ Reader reader = requireNonNull(response.body()).charStream();
+ BufferedReader bufferedReader = new BufferedReader(reader)) {
+ // Skip source parsing if not modified
+ if (response.code() == HTTP_NOT_MODIFIED) {
+ Timber.d("Source %s was not updated since last fetch.", source.getUrl());
+ return;
+ }
+ // Extract ETag if present
+ String entityTag = response.header(ENTITY_TAG_HEADER);
+ if (entityTag != null) {
+ if (entityTag.startsWith(WEAK_ENTITY_TAG_PREFIX)) {
+ entityTag = entityTag.substring(WEAK_ENTITY_TAG_PREFIX.length());
+ }
+ this.hostsSourceDao.updateEntityTag(source.getId(), entityTag);
+ }
+ // Parse source
+ parseSourceInputStream(source, bufferedReader);
+ } catch (IOException e) {
+ throw new IOException("Exception while downloading hosts file from " + hostsFileUrl + ".", e);
+ }
+ }
+
+ /**
+ * Read a hosts source file and append it to the database.
+ *
+ * @param hostsSource The hosts source to copy.
+ * @throws IOException If the hosts source could not be copied.
+ */
+ private void readSourceFile(HostsSource hostsSource) throws IOException {
+ // Get hosts file URI
+ String hostsFileUrl = hostsSource.getUrl();
+ Uri fileUri = Uri.parse(hostsFileUrl);
+ Timber.v("Reading hosts source file: %s.", hostsFileUrl);
+ // Set state to copying hosts source
+ setState(R.string.status_read_source, hostsFileUrl);
+ try (InputStream inputStream = this.context.getContentResolver().openInputStream(fileUri);
+ InputStreamReader reader = new InputStreamReader(inputStream);
+ BufferedReader bufferedReader = new BufferedReader(reader)) {
+ parseSourceInputStream(hostsSource, bufferedReader);
+ } catch (IOException e) {
+ throw new IOException("Error while reading hosts file from " + hostsFileUrl + ".", e);
+ }
+ }
+
+ /**
+ * Parse a source from its input stream to store it into database.
+ *
+ * @param hostsSource The host source to parse.
+ * @param reader The host source reader.
+ */
+ private void parseSourceInputStream(HostsSource hostsSource, BufferedReader reader) {
+ setState(R.string.status_parse_source, hostsSource.getLabel());
+ long startTime = System.currentTimeMillis();
+ new SourceLoader(hostsSource).parse(reader, this.hostListItemDao);
+ long endTime = System.currentTimeMillis();
+ Timber.i("Parsed " + hostsSource.getUrl() + " in " + (endTime - startTime) / 1000 + "s");
+ }
+
+ /**
+ * Enable all hosts sources.
+ *
+ * @return {@code true} if at least one source was updated, {@code false} otherwise.
+ */
+ public boolean enableAllSources() {
+ boolean updated = false;
+ for (HostsSource source : this.hostsSourceDao.getAll()) {
+ if (!source.isEnabled()) {
+ this.hostsSourceDao.toggleEnabled(source);
+ updated = true;
+ }
+ }
+ return updated;
+ }
+
+ private void setState(@StringRes int stateResId, Object... details) {
+ String state = this.context.getString(stateResId, details);
+ Timber.d("Source model state: %s.", state);
+ this.state.postValue(state);
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/source/SourceUpdateService.java b/app/src/main/java/org/adaway/model/source/SourceUpdateService.java
new file mode 100644
index 0000000..047f395
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/source/SourceUpdateService.java
@@ -0,0 +1,176 @@
+package org.adaway.model.source;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.work.Constraints;
+import androidx.work.ExistingPeriodicWorkPolicy;
+import androidx.work.NetworkType;
+import androidx.work.PeriodicWorkRequest;
+import androidx.work.WorkManager;
+import androidx.work.Worker;
+import androidx.work.WorkerParameters;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.helper.NotificationHelper;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.error.HostErrorException;
+
+import static androidx.work.ExistingPeriodicWorkPolicy.KEEP;
+import static androidx.work.ExistingPeriodicWorkPolicy.UPDATE;
+import static androidx.work.ListenableWorker.Result.failure;
+import static androidx.work.ListenableWorker.Result.retry;
+import static androidx.work.ListenableWorker.Result.success;
+import static java.util.concurrent.TimeUnit.HOURS;
+
+import timber.log.Timber;
+
+/**
+ * This class is a service to check for hosts sources update.
+ * It could be enabled or disabled for periodic check.
+ * The implementation is based on WorkManager from Android X.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class SourceUpdateService {
+ /**
+ * The name of the periodic work.
+ */
+ private static final String WORK_NAME = "HostsUpdateWork";
+
+ /**
+ * Private constructor.
+ */
+ private SourceUpdateService() {
+
+ }
+
+ /**
+ * Enable update service.
+ *
+ * @param context The application context.
+ * @param unmeteredNetworkOnly true if the update should be done on unmetered network only, false otherwise.
+ */
+ public static void enable(Context context, boolean unmeteredNetworkOnly) {
+ enqueueWork(context, UPDATE, unmeteredNetworkOnly);
+ }
+
+ /**
+ * Disable update service.
+ *
+ * @param context The application context.
+ */
+ public static void disable(Context context) {
+ // Cancel previous work
+ WorkManager.getInstance(context).cancelUniqueWork(WORK_NAME);
+ }
+
+ /**
+ * Sync service on user preferences.
+ *
+ * @param context The application context.
+ */
+ static void syncPreferences(Context context) {
+ if (PreferenceHelper.getUpdateCheckHostsDaily(context)) {
+ enqueueWork(context, KEEP, PreferenceHelper.getUpdateOnlyOnWifi(context));
+ } else {
+ disable(context);
+ }
+ }
+
+ private static void enqueueWork(Context context, ExistingPeriodicWorkPolicy workPolicy, boolean unmeteredNetworkOnly) {
+ // Create work request
+ PeriodicWorkRequest workRequest = getWorkRequest(unmeteredNetworkOnly);
+ // Enqueue work request
+ WorkManager workManager = WorkManager.getInstance(context);
+ workManager.enqueueUniquePeriodicWork(WORK_NAME, workPolicy, workRequest);
+ }
+
+ /**
+ * Create source update work request.
+ *
+ * @param unmeteredNetworkOnly true if the update should be done on unmetered network only, false otherwise.
+ * @return The source update work request to queue.
+ */
+ private static PeriodicWorkRequest getWorkRequest(boolean unmeteredNetworkOnly) {
+ // Create worker constraints
+ Constraints constraints = new Constraints.Builder()
+ .setRequiredNetworkType(unmeteredNetworkOnly ? NetworkType.UNMETERED : NetworkType.CONNECTED)
+ .setRequiresStorageNotLow(true)
+ .build();
+ // Create work request
+ return new PeriodicWorkRequest.Builder(HostsSourcesUpdateWorker.class, 6, HOURS)
+ .setConstraints(constraints)
+ .setInitialDelay(3, HOURS)
+ .build();
+ }
+
+ /**
+ * This class is a {@link Worker} to fetch hosts sources updates and install them if needed.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+ public static class HostsSourcesUpdateWorker extends Worker {
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ * @param workerParams The parameters to setup this worker.
+ */
+ public HostsSourcesUpdateWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
+ super(context, workerParams);
+ }
+
+ @NonNull
+ @Override
+ public Result doWork() {
+ Timber.i("Starting update worker");
+ // Create model
+ AdAwayApplication application = (AdAwayApplication) getApplicationContext();
+ SourceModel model = application.getSourceModel();
+ // Check for update
+ boolean hasUpdate;
+ try {
+ hasUpdate = model.checkForUpdate();
+ } catch (HostErrorException exception) {
+ // An error occurred, check will be retried
+ Timber.e(exception, "Failed to check for update. Will retry later.");
+ return retry();
+ }
+ if (hasUpdate) {
+ // Do update
+ try {
+ doUpdate(application);
+ } catch (HostErrorException exception) {
+ // Installation failed. Worker failed.
+ Timber.e(exception, "Failed to apply hosts file during background update.");
+ return failure();
+ }
+ }
+ // Return as success
+ return success();
+ }
+
+ /**
+ * Handle update according user preferences.
+ *
+ * @param application The application.
+ * @throws HostErrorException If the update could not be handled.
+ */
+ private void doUpdate(AdAwayApplication application) throws HostErrorException {
+ // Check if automatic update are enabled
+ if (PreferenceHelper.getAutomaticUpdateDaily(application)) {
+ // Retrieve source updates
+ SourceModel sourceModel = application.getSourceModel();
+ sourceModel.retrieveHostsSources();
+ // Apply source updates
+ AdBlockModel adBlockModel = application.getAdBlockModel();
+ adBlockModel.apply();
+ } else {
+ // Display update notification
+ NotificationHelper.showUpdateHostsNotification(application);
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/update/ApkDownloadReceiver.java b/app/src/main/java/org/adaway/model/update/ApkDownloadReceiver.java
new file mode 100644
index 0000000..9927631
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/update/ApkDownloadReceiver.java
@@ -0,0 +1,48 @@
+package org.adaway.model.update;
+
+import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+
+import static android.content.Intent.ACTION_INSTALL_PACKAGE;
+
+import timber.log.Timber;
+
+/**
+ * This class is a {@link BroadcastReceiver} to install downloaded application updates.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class ApkDownloadReceiver extends BroadcastReceiver {
+ private final long downloadId;
+
+ public ApkDownloadReceiver(long downloadId) {
+ this.downloadId = downloadId;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ //Fetching the download id received with the broadcast
+ long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
+ //Checking if the received broadcast is for our enqueued download by matching download id
+ if (this.downloadId == id) {
+ DownloadManager downloadManager = context.getSystemService(DownloadManager.class);
+ Uri apkUri = downloadManager.getUriForDownloadedFile(id);
+ if (apkUri == null) {
+ Timber.w("Failed to download id: %s.", id);
+ } else {
+ installApk(context, apkUri);
+ }
+ }
+ }
+
+ private void installApk(Context context, Uri apkUri) {
+ Intent install = new Intent(ACTION_INSTALL_PACKAGE);
+ install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ install.setData(apkUri);
+ context.startActivity(install);
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/update/ApkUpdateService.java b/app/src/main/java/org/adaway/model/update/ApkUpdateService.java
new file mode 100644
index 0000000..1b377a7
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/update/ApkUpdateService.java
@@ -0,0 +1,112 @@
+package org.adaway.model.update;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.work.ExistingPeriodicWorkPolicy;
+import androidx.work.PeriodicWorkRequest;
+import androidx.work.WorkManager;
+import androidx.work.Worker;
+import androidx.work.WorkerParameters;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.helper.NotificationHelper;
+import org.adaway.helper.PreferenceHelper;
+
+import static androidx.work.ExistingPeriodicWorkPolicy.KEEP;
+import static androidx.work.ExistingPeriodicWorkPolicy.UPDATE;
+import static androidx.work.ListenableWorker.Result.success;
+import static java.util.concurrent.TimeUnit.DAYS;
+
+import timber.log.Timber;
+
+/**
+ * This class is a service to check for application update.
+ * It could be enabled or disabled for periodic check.
+ * The implementation is based on WorkManager from Android X.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class ApkUpdateService {
+ /**
+ * The name of the periodic work.
+ */
+ private static final String WORK_NAME = "ApkUpdateWork";
+
+ /**
+ * Private constructor.
+ */
+ private ApkUpdateService() {
+
+ }
+
+ /**
+ * Enable update service.
+ *
+ * @param context The application context.
+ */
+ public static void enable(Context context) {
+ enqueueWork(context, UPDATE);
+ }
+
+ /**
+ * Disable update service.
+ *
+ * @param context The application context.
+ */
+ public static void disable(Context context) {
+ // Cancel previous work
+ WorkManager.getInstance(context).cancelUniqueWork(WORK_NAME);
+ }
+
+ static void syncPreferences(Context context) {
+ if (PreferenceHelper.getUpdateCheckAppDaily(context)) {
+ enqueueWork(context, KEEP);
+ } else {
+ disable(context);
+ }
+ }
+
+ private static void enqueueWork(Context context, ExistingPeriodicWorkPolicy workPolicy) {
+ // Create work request
+ PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(ApkUpdateWorker.class, 1, DAYS).build();
+ // Enqueue work request
+ WorkManager workManager = WorkManager.getInstance(context);
+ workManager.enqueueUniquePeriodicWork(WORK_NAME, workPolicy, workRequest);
+ }
+
+ /**
+ * This class is a {@link Worker} to check for application update and notify them if needed.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+ public static class ApkUpdateWorker extends Worker {
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ * @param workerParams The parameters to setup this worker.
+ */
+ public ApkUpdateWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
+ super(context, workerParams);
+ }
+
+ @NonNull
+ @Override
+ public Result doWork() {
+ Timber.i("Starting update worker");
+ // Create model
+ AdAwayApplication application = (AdAwayApplication) getApplicationContext();
+ UpdateModel model = application.getUpdateModel();
+ // Check for update
+ model.checkForUpdate();
+ Manifest manifest = model.getManifest().getValue();
+ if (manifest != null && manifest.updateAvailable) {
+ // Display update notification
+ NotificationHelper.showUpdateApplicationNotification(application);
+ }
+ // Return as success
+ return success();
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/update/Manifest.java b/app/src/main/java/org/adaway/model/update/Manifest.java
new file mode 100644
index 0000000..40bf731
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/update/Manifest.java
@@ -0,0 +1,24 @@
+package org.adaway.model.update;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * This class is represent an application manifest.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class Manifest {
+ public final String version;
+ public final int versionCode;
+ public final String changelog;
+ public final boolean updateAvailable;
+
+ public Manifest(String manifest, long currentVersionCode) throws JSONException {
+ JSONObject manifestObject = new JSONObject(manifest);
+ this.version = manifestObject.getString("version");
+ this.versionCode = manifestObject.getInt("versionCode");
+ this.changelog = manifestObject.getString("changelog");
+ this.updateAvailable = this.versionCode > currentVersionCode;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/update/UpdateModel.java b/app/src/main/java/org/adaway/model/update/UpdateModel.java
new file mode 100644
index 0000000..a7e65d7
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/update/UpdateModel.java
@@ -0,0 +1,203 @@
+package org.adaway.model.update;
+
+import static android.app.DownloadManager.ACTION_DOWNLOAD_COMPLETE;
+import static android.os.Build.VERSION.SDK_INT;
+import static org.adaway.model.update.UpdateStore.getApkStore;
+import static java.util.Objects.requireNonNull;
+
+import android.app.DownloadManager;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import org.adaway.R;
+import org.adaway.helper.PreferenceHelper;
+import org.json.JSONException;
+
+import java.io.IOException;
+
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+import timber.log.Timber;
+
+/**
+ * This class is the model in charge of updating the application.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class UpdateModel {
+ private static final String MANIFEST_URL = "https://app.adaway.org/manifest.json";
+ private static final String DOWNLOAD_URL = "https://app.adaway.org/adaway.apk?versionCode=";
+ private final Context context;
+ private final VersionInfo versionInfo;
+ private final OkHttpClient client;
+ private final MutableLiveData manifest;
+ private ApkDownloadReceiver receiver;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ public UpdateModel(Context context) {
+ this.context = context;
+ this.versionInfo = VersionInfo.get(context);
+ this.manifest = new MutableLiveData<>();
+ this.client = buildHttpClient();
+ ApkUpdateService.syncPreferences(context);
+ }
+
+ /**
+ * Get the current version code.
+ *
+ * @return The current version code.
+ */
+ public int getVersionCode() {
+ return this.versionInfo.code;
+ }
+
+ /**
+ * Get the current version name.
+ *
+ * @return The current version name.
+ */
+ public String getVersionName() {
+ return this.versionInfo.name;
+ }
+
+ /**
+ * Get the last version manifest.
+ *
+ * @return The last version manifest.
+ */
+ public LiveData getManifest() {
+ return this.manifest;
+ }
+
+ /**
+ * Get the application update store.
+ *
+ * @return The application update store.
+ */
+ public UpdateStore getStore() {
+ return getApkStore(this.context);
+ }
+
+ /**
+ * Get the application update channel.
+ *
+ * @return The application update channel.
+ */
+ public String getChannel() {
+ return PreferenceHelper.getIncludeBetaReleases(this.context) ? "beta" : "stable";
+ }
+
+ /**
+ * Check if there is an update available.
+ */
+ public void checkForUpdate() {
+ Manifest manifest = downloadManifest();
+ // Notify update
+ if (manifest != null) {
+ this.manifest.postValue(manifest);
+ }
+ }
+
+ private OkHttpClient buildHttpClient() {
+ return new OkHttpClient.Builder().build();
+ }
+
+ private Manifest downloadManifest() {
+ if (!this.versionInfo.isValid()) {
+ return null;
+ }
+ HttpUrl httpUrl = requireNonNull(HttpUrl.parse(MANIFEST_URL), "Failed to parse manifest URL")
+ .newBuilder()
+ .addQueryParameter("versionCode", Integer.toString(this.versionInfo.code))
+ .addQueryParameter("sdkCode", Integer.toString(SDK_INT))
+ .addQueryParameter("channel", getChannel())
+ .addQueryParameter("store", getStore().getName())
+ .build();
+ Request request = new Request.Builder()
+ .url(httpUrl)
+ .build();
+ try (Response execute = this.client.newCall(request).execute();
+ ResponseBody body = execute.body()) {
+ if (execute.isSuccessful() && body != null) {
+ return new Manifest(body.string(), this.versionInfo.code);
+ } else {
+ return null;
+ }
+ } catch (IOException | JSONException exception) {
+ Timber.e(exception, "Unable to download manifest.");
+ // Return failed
+ return null;
+ }
+ }
+
+ /**
+ * Update the application to the latest version.
+ *
+ * @return The download identifier ({@code -1} if download was not started).
+ */
+ public long update() {
+ // Check manifest
+ Manifest manifest = this.manifest.getValue();
+ if (manifest == null) {
+ return -1;
+ }
+ // Check previous broadcast receiver
+ if (this.receiver != null) {
+ this.context.unregisterReceiver(this.receiver);
+ }
+ // Queue download
+ long downloadId = download(manifest);
+ // Register new broadcast receiver
+ this.receiver = new ApkDownloadReceiver(downloadId);
+ this.context.registerReceiver(this.receiver, new IntentFilter(ACTION_DOWNLOAD_COMPLETE));
+ // Return download identifier
+ return downloadId;
+ }
+
+ private long download(Manifest manifest) {
+ Timber.i("Downloading " + manifest.version + ".");
+ Uri uri = Uri.parse(DOWNLOAD_URL + manifest.versionCode);
+ DownloadManager.Request request = new DownloadManager.Request(uri)
+ .setTitle("AdAway " + manifest.version)
+ .setDescription(this.context.getString(R.string.update_notification_description));
+ DownloadManager downloadManager = this.context.getSystemService(DownloadManager.class);
+ return downloadManager.enqueue(request);
+ }
+
+ private static class VersionInfo {
+ private final int code;
+ private final String name;
+
+ private VersionInfo(int code, String name) {
+ this.code = code;
+ this.name = name;
+ }
+
+ public static VersionInfo get(Context context) {
+ try {
+ PackageInfo packageInfo = context.getPackageManager()
+ .getPackageInfo(context.getPackageName(), 0);
+ return new VersionInfo(packageInfo.versionCode, packageInfo.versionName);
+ } catch (PackageManager.NameNotFoundException e) {
+ return new VersionInfo(0, "development");
+ }
+ }
+
+ public boolean isValid() {
+ return this.code > 0;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/update/UpdateStore.java b/app/src/main/java/org/adaway/model/update/UpdateStore.java
new file mode 100644
index 0000000..8ea7d39
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/update/UpdateStore.java
@@ -0,0 +1,120 @@
+package org.adaway.model.update;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.Signature;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import static android.content.pm.PackageManager.GET_SIGNATURES;
+import static android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES;
+import static android.os.Build.VERSION.SDK_INT;
+import static android.os.Build.VERSION_CODES.P;
+
+import timber.log.Timber;
+
+/**
+ * This enumerates represents the stores to get AdAway updates.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public enum UpdateStore {
+ /**
+ * The official store (usually GitHub releases) with AdAway signing key.
+ */
+ ADAWAY("adaway", "D647FDAC42961502AC78F99919B8E1901747E8DA78FE13E1EABA688FECC4C99E"),
+ /**
+ * The F-Droid store with F-Droid signing key.
+ */
+ F_DROID("fdroid", "42203F1AC857426D1496E971DB96FBE1F88C25C9E1F895A5C98D703891292277"),
+ /**
+ * An unknown store.
+ */
+ UNKNOWN("unknown", "");
+ /**
+ * The store name.
+ */
+ public final String storeName;
+ /**
+ * The store singing certificate digest.
+ */
+ public final String sign;
+
+ UpdateStore(String name, String sign) {
+ this.storeName = name;
+ this.sign = sign;
+ }
+
+ /**
+ * Get the store of the running application.
+ *
+ * @param context The application context.
+ * @return The application store, {@link #UNKNOWN} if store can't be defined.
+ */
+ @SuppressLint("PackageManagerGetSignatures")
+ public static UpdateStore getApkStore(Context context) {
+ PackageManager packageManager = context.getPackageManager();
+ String packageName = context.getPackageName();
+ Signature[] signatures;
+ try {
+ if (SDK_INT >= P) {
+ signatures = packageManager.getPackageInfo(
+ packageName,
+ GET_SIGNING_CERTIFICATES
+ ).signingInfo.getSigningCertificateHistory();
+ } else {
+ // Signatures are not used for security reason. Only to guess the flavor of the app.
+ signatures = packageManager.getPackageInfo(
+ packageName,
+ GET_SIGNATURES
+ ).signatures;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Timber.w(e, "Failed to get application package info.");
+ return UpdateStore.UNKNOWN;
+ }
+ return UpdateStore.getFromSigns(signatures);
+ }
+
+ private static UpdateStore getFromSigns(Signature[] signatures) {
+ try {
+ MessageDigest md = MessageDigest.getInstance("SHA-256");
+ for (Signature signature : signatures) {
+ md.update(signature.toByteArray());
+ String sign = bytesToHex(md.digest());
+ for (UpdateStore store : UpdateStore.values()) {
+ if (store.sign.equals(sign)) {
+ return store;
+ }
+ }
+ }
+ } catch (NoSuchAlgorithmException e) {
+ Timber.w(e, "SHA-256 algorithm is no supported.");
+ }
+ return UpdateStore.UNKNOWN;
+ }
+
+ private static String bytesToHex(byte[] bytes) {
+ final char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+ char[] hexChars = new char[bytes.length * 2];
+ int v;
+ for (int j = 0; j < bytes.length; j++) {
+ v = bytes[j] & 0xFF;
+ hexChars[j * 2] = hexArray[v >>> 4];
+ hexChars[j * 2 + 1] = hexArray[v & 0x0F];
+ }
+ return new String(hexChars);
+ }
+
+ /**
+ * Get the store name.
+ *
+ * @return The store name.
+ */
+ public String getName() {
+ return this.storeName;
+ }
+}
diff --git a/app/src/main/java/org/adaway/model/vpn/VpnModel.java b/app/src/main/java/org/adaway/model/vpn/VpnModel.java
new file mode 100644
index 0000000..a9f220e
--- /dev/null
+++ b/app/src/main/java/org/adaway/model/vpn/VpnModel.java
@@ -0,0 +1,124 @@
+package org.adaway.model.vpn;
+
+import static org.adaway.model.adblocking.AdBlockMethod.VPN;
+import static org.adaway.model.error.HostError.ENABLE_VPN_FAIL;
+
+import android.content.Context;
+import android.util.LruCache;
+
+import org.adaway.R;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostEntryDao;
+import org.adaway.db.entity.HostEntry;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.error.HostErrorException;
+import org.adaway.vpn.VpnServiceControls;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+import timber.log.Timber;
+
+/**
+ * This class is the model to represent VPN service configuration.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class VpnModel extends AdBlockModel {
+ private final HostEntryDao hostEntryDao;
+ private final LruCache blockCache;
+ private final LinkedHashSet logs;
+ private boolean recordingLogs;
+ private int requestCount;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ public VpnModel(Context context) {
+ super(context);
+ AppDatabase database = AppDatabase.getInstance(context);
+ this.hostEntryDao = database.hostEntryDao();
+ this.blockCache = new LruCache(4 * 1024) {
+ @Override
+ protected HostEntry create(String key) {
+ return VpnModel.this.hostEntryDao.getEntry(key);
+ }
+ };
+ this.logs = new LinkedHashSet<>();
+ this.recordingLogs = false;
+ this.requestCount = 0;
+ this.applied.postValue(VpnServiceControls.isRunning(context));
+ }
+
+ @Override
+ public AdBlockMethod getMethod() {
+ return VPN;
+ }
+
+ @Override
+ public void apply() throws HostErrorException {
+ // Clear cache
+ this.blockCache.evictAll();
+ // Start VPN
+ boolean started = VpnServiceControls.start(this.context);
+ this.applied.postValue(started);
+ if (!started) {
+ throw new HostErrorException(ENABLE_VPN_FAIL);
+ }
+ setState(R.string.status_vpn_configuration_updated);
+ }
+
+ @Override
+ public void revert() {
+ VpnServiceControls.stop(this.context);
+ this.applied.postValue(false);
+ }
+
+ @Override
+ public boolean isRecordingLogs() {
+ return this.recordingLogs;
+ }
+
+ @Override
+ public void setRecordingLogs(boolean recording) {
+ this.recordingLogs = recording;
+ }
+
+ @Override
+ public List getLogs() {
+ return new ArrayList<>(this.logs);
+ }
+
+ @Override
+ public void clearLogs() {
+ this.logs.clear();
+ }
+
+ /**
+ * Checks host entry related to an host name.
+ *
+ * @param host A hostname to check.
+ * @return The related host entry.
+ */
+ public HostEntry getEntry(String host) {
+ // Compute miss rate periodically
+ this.requestCount++;
+ if (this.requestCount >= 1000) {
+ int hits = this.blockCache.hitCount();
+ int misses = this.blockCache.missCount();
+ double missRate = 100D * (hits + misses) / misses;
+ Timber.d("Host cache miss rate: %s.", missRate);
+ this.requestCount = 0;
+ }
+ // Add host to logs
+ if (this.recordingLogs) {
+ this.logs.add(host);
+ }
+ // Check cache
+ return this.blockCache.get(host);
+ }
+}
diff --git a/app/src/main/java/org/adaway/tile/AdBlockingTileService.java b/app/src/main/java/org/adaway/tile/AdBlockingTileService.java
new file mode 100644
index 0000000..a805f7a
--- /dev/null
+++ b/app/src/main/java/org/adaway/tile/AdBlockingTileService.java
@@ -0,0 +1,81 @@
+package org.adaway.tile;
+
+import android.service.quicksettings.Tile;
+import android.service.quicksettings.TileService;
+
+import androidx.lifecycle.LiveData;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.error.HostErrorException;
+import org.adaway.util.AppExecutors;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static android.service.quicksettings.Tile.STATE_ACTIVE;
+import static android.service.quicksettings.Tile.STATE_INACTIVE;
+
+import timber.log.Timber;
+
+/**
+ * This class is a {@link TileService} to toggle ad-blocking.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class AdBlockingTileService extends TileService {
+ private final AtomicBoolean toggling = new AtomicBoolean(false);
+
+ @Override
+ public void onTileAdded() {
+ boolean adBlocked = getModel().isApplied().getValue() == Boolean.TRUE;
+ updateTile(adBlocked);
+ }
+
+ @Override
+ public void onStartListening() {
+ LiveData applied = getModel().isApplied();
+ applied.observeForever(this::updateTile);
+ }
+
+ @Override
+ public void onStopListening() {
+ LiveData applied = getModel().isApplied();
+ applied.removeObserver(this::updateTile);
+ }
+
+ @Override
+ public void onClick() {
+ AppExecutors.getInstance()
+ .diskIO()
+ .execute(this::toggleAdBlocking);
+ }
+
+ private void updateTile(boolean adBlocked) {
+ Tile tile = getQsTile();
+ tile.setState(adBlocked ? STATE_ACTIVE : STATE_INACTIVE);
+ tile.updateTile();
+ }
+
+ private void toggleAdBlocking() {
+ if (this.toggling.get()) {
+ return;
+ }
+ AdBlockModel model = getModel();
+ try {
+ this.toggling.set(true);
+ if (model.isApplied().getValue() == Boolean.TRUE) {
+ model.revert();
+ } else {
+ model.apply();
+ }
+ } catch (HostErrorException e) {
+ Timber.w(e, "Failed to toggle ad-blocking.");
+ } finally {
+ this.toggling.set(false);
+ }
+ }
+
+ private AdBlockModel getModel() {
+ return ((AdAwayApplication) getApplication()).getAdBlockModel();
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/Animations.java b/app/src/main/java/org/adaway/ui/Animations.java
new file mode 100644
index 0000000..e8adbef
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/Animations.java
@@ -0,0 +1,104 @@
+package org.adaway.ui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.view.View;
+
+import static android.view.View.ALPHA;
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+
+/**
+ * This class is an utility class to animate views.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class Animations {
+
+ private Animations() {
+
+ }
+
+ /**
+ * Animate view to be shown.
+ *
+ * @param view The view to animate.
+ */
+ public static void showView(View view) {
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, ALPHA, 1F);
+ objectAnimator.setAutoCancel(true);
+ objectAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ view.setVisibility(VISIBLE);
+ }
+ });
+ objectAnimator.start();
+ }
+
+ /**
+ * Animate view to be hidden.
+ *
+ * @param view The view to animate.
+ */
+ public static void hideView(View view) {
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, ALPHA, 0F);
+ objectAnimator.setAutoCancel(true);
+ objectAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setVisibility(INVISIBLE);
+ }
+ });
+ objectAnimator.start();
+ }
+
+ /**
+ * Animate view to be removed.
+ *
+ * @param view The view to animate.
+ */
+ public static void removeView(View view) {
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, ALPHA, 0F);
+ objectAnimator.setAutoCancel(true);
+ objectAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setVisibility(GONE);
+ }
+ });
+ objectAnimator.start();
+ }
+
+ /**
+ * Immediately set view to shown state.
+ *
+ * @param view The view to set.
+ */
+ public static void setShown(View view) {
+ view.setVisibility(VISIBLE);
+ view.setAlpha(1f);
+ }
+
+ /**
+ * Immediately set view to hidden state.
+ *
+ * @param view The view to set.
+ */
+ public static void setHidden(View view) {
+ view.setVisibility(INVISIBLE);
+ view.setAlpha(0f);
+ }
+
+ /**
+ * Immediately set view to gone state.
+ *
+ * @param view The view to set.
+ */
+ public static void setRemoved(View view) {
+ view.setVisibility(GONE);
+ view.setAlpha(0f);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/adblocking/ApplyConfigurationSnackbar.java b/app/src/main/java/org/adaway/ui/adblocking/ApplyConfigurationSnackbar.java
new file mode 100644
index 0000000..15be07c
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/adblocking/ApplyConfigurationSnackbar.java
@@ -0,0 +1,191 @@
+package org.adaway.ui.adblocking;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Observer;
+
+import com.google.android.material.snackbar.Snackbar;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.R;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.error.HostErrorException;
+import org.adaway.model.source.SourceModel;
+import org.adaway.util.AppExecutors;
+
+import java.util.Collection;
+
+import static com.google.android.material.snackbar.Snackbar.LENGTH_INDEFINITE;
+import static com.google.android.material.snackbar.Snackbar.LENGTH_LONG;
+
+/**
+ * This class is a {@link Snackbar} to notify about adblock model new configuration to apply.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class ApplyConfigurationSnackbar {
+ /**
+ * The view to bind the snackbar to.
+ */
+ private final View view;
+ /**
+ * The notify snackbar when hosts update available.
+ */
+ private final Snackbar notifySnackbar;
+ /**
+ * The wait snackbar during hosts install.
+ */
+ private final Snackbar waitSnackbar;
+ /**
+ * To synchronize sources before installing or not.
+ */
+ private final boolean syncSources;
+ /**
+ * The current hosts update available status ({@code true} if update available, {@code false} otherwise).
+ */
+ private boolean update;
+ /**
+ * Whether or not ignore the next update event ({@code true} to ignore, {@code false} otherwise).
+ */
+ private boolean skipUpdate;
+ /**
+ * Whether or not ignore update events during the install ({@code true} to ignore, {@code false} otherwise).
+ */
+ private boolean ignoreEventDuringInstall;
+
+ /**
+ * Constructor.
+ *
+ * @param view The view to bind the snackbar to.
+ * @param syncSources To synchronize sources before installing or not.
+ * @param ignoreEventDuringInstall {@code true} to ignore events, {@code false} otherwise.
+ */
+ public ApplyConfigurationSnackbar(@NonNull View view, boolean syncSources, boolean ignoreEventDuringInstall) {
+ this.view = view;
+ this.notifySnackbar = Snackbar.make(this.view, R.string.notification_configuration_changed, LENGTH_INDEFINITE)
+ .setAction(R.string.notification_configuration_changed_action, v -> apply());
+ this.waitSnackbar = Snackbar.make(this.view, R.string.notification_configuration_installing, LENGTH_INDEFINITE);
+ appendViewToSnackbar(this.waitSnackbar, new ProgressBar(this.view.getContext()));
+ this.syncSources = syncSources;
+ this.ignoreEventDuringInstall = ignoreEventDuringInstall;
+ this.update = false;
+ this.skipUpdate = false;
+ }
+
+ /**
+ * Create {@link Observer} which ignores first (initialization) event.
+ *
+ * @param The type of data to observe.
+ * @return The observer instance.
+ */
+ public Observer createObserver() {
+ return new Observer() {
+ boolean firstUpdate = true;
+
+ @Override
+ public void onChanged(@Nullable T t) {
+ // Check new data
+ if (t == null || (t instanceof Collection && ((Collection>) t).isEmpty())) {
+ return;
+ }
+ // First update
+ if (this.firstUpdate) {
+ this.firstUpdate = false;
+ return;
+ }
+ ApplyConfigurationSnackbar.this.notifyUpdateAvailable();
+ }
+ };
+ }
+
+ /**
+ * Notify update available.
+ */
+ public void notifyUpdateAvailable() {
+ // Check if notify snackbar is already displayed
+ if (this.notifySnackbar.isShown()) {
+ return;
+ }
+ // Check if wait snackbar is displayed
+ if (this.waitSnackbar.isShown()) {
+ // Mark update available
+ this.update = true;
+ return;
+ }
+ // Check if update event should be skipped
+ if (this.skipUpdate) {
+ this.skipUpdate = false;
+ return;
+ }
+ // Show notify snackbar
+ this.notifySnackbar.show();
+ // Mark update as notified
+ this.update = false;
+ }
+
+ private void apply() {
+ showLoading();
+ AppExecutors.getInstance().diskIO().execute(() -> {
+ AdAwayApplication application = (AdAwayApplication) this.view.getContext().getApplicationContext();
+ SourceModel sourceModel = application.getSourceModel();
+ AdBlockModel adBlockModel = application.getAdBlockModel();
+ try {
+ if (this.syncSources) {
+ sourceModel.retrieveHostsSources();
+ } else {
+ sourceModel.syncHostEntries();
+ }
+ adBlockModel.apply();
+ endLoading(true);
+ } catch (HostErrorException exception) {
+ endLoading(false);
+ }
+ });
+ }
+
+ private void showLoading() {
+ // Clear notify snackbar
+ this.notifySnackbar.dismiss();
+ // Show wait snackbar
+ this.waitSnackbar.show();
+ }
+
+ private void endLoading(boolean successfulInstall) {
+ // Ensure the snackbar has time to display
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ // Clear snackbars
+ this.waitSnackbar.dismiss();
+ // Check install failure
+ if (!successfulInstall) {
+ Snackbar failureSnackbar = Snackbar.make(this.view, R.string.notification_configuration_failed, LENGTH_LONG);
+ ImageView view = new ImageView(this.view.getContext());
+ view.setImageResource(R.drawable.ic_error_outline_24dp);
+ appendViewToSnackbar(failureSnackbar, view);
+ failureSnackbar.show();
+ }
+ // Check pending update notification
+ else if (this.update) {
+ // Ignore next update event if events should be ignored
+ if (this.ignoreEventDuringInstall) {
+ this.skipUpdate = true;
+ } else {
+ // Otherwise display update notification
+ notifyUpdateAvailable();
+ }
+ }
+ }
+
+ private void appendViewToSnackbar(Snackbar snackbar, View view) {
+ ViewGroup viewGroup = (ViewGroup) snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_text).getParent();
+ viewGroup.addView(view);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/adware/AdwareFragment.java b/app/src/main/java/org/adaway/ui/adware/AdwareFragment.java
new file mode 100644
index 0000000..234a5a8
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/adware/AdwareFragment.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.adware;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.ViewModelProvider;
+
+import org.adaway.R;
+
+import java.util.List;
+
+/**
+ * This class is a {@link Fragment} to scan and uninstall adware.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class AdwareFragment extends Fragment {
+ /**
+ * The adware install list view.
+ */
+ private ListView mListView;
+ /**
+ * The status text.
+ */
+ private TextView mStatusText;
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ // Create fragment view
+ View view = inflater.inflate(R.layout.adware_fragment, container, false);
+ // Get list view
+ this.mListView = view.findViewById(R.id.adware_list);
+ // Bind list onclick listener
+ this.mListView.setOnItemClickListener((parent, view1, position, id) -> {
+ // Get clicked adware
+ AdwareInstall adwareInstall = (AdwareInstall) parent.getItemAtPosition(position);
+ // Uninstall adware
+ AdwareFragment.this.uninstallAdware(adwareInstall);
+ });
+ // Get status text
+ this.mStatusText = view.findViewById(R.id.adware_status_text);
+ /*
+ * Get model and bind it to view.
+ */
+ // Get the model scope
+ FragmentActivity activity = requireActivity();
+ // Get the model
+ AdwareViewModel model = new ViewModelProvider(activity).get(AdwareViewModel.class);
+ // Bind model to views
+ model.getAdware().observe(getViewLifecycleOwner(), data -> {
+ if (data == null) {
+ this.displayStatusText(R.string.adware_scanning);
+ } else if (data.isEmpty()) {
+ this.displayStatusText(R.string.adware_empty);
+ } else {
+ this.displayAdware(data);
+ }
+ });
+ // Return created view
+ return view;
+ }
+
+ /**
+ * Display a status text.
+ *
+ * @param text The status text to display.
+ */
+ private void displayStatusText(int text) {
+ // Set text
+ this.mStatusText.setText(text);
+ // Show the text
+ this.mStatusText.setVisibility(View.VISIBLE);
+ this.mListView.setVisibility(View.GONE);
+ }
+
+ /**
+ * Display the installed adware.
+ *
+ * @param data The adware to show.
+ */
+ private void displayAdware(List data) {
+ // Create adapter
+ String[] from = new String[]{
+ AdwareInstall.APPLICATION_NAME_KEY,
+ AdwareInstall.PACKAGE_NAME_KEY
+ };
+ int[] to = new int[]{
+ R.id.checkbox_list_text,
+ R.id.checkbox_list_subtext
+ };
+ SimpleAdapter adapter = new SimpleAdapter(this.getContext(),
+ data,
+ R.layout.list_two_entries,
+ from,
+ to
+ );
+ // Update list
+ adapter.notifyDataSetChanged();
+ // Show the list
+ this.mListView.setAdapter(adapter);
+ this.mStatusText.setVisibility(View.GONE);
+ this.mListView.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * Uninstall adware.
+ *
+ * @param adwareInstall The adware to uninstall.
+ */
+ private void uninstallAdware(AdwareInstall adwareInstall) {
+ Intent intent = new Intent(Intent.ACTION_DELETE);
+ intent.setData(Uri.parse("package:" + adwareInstall.get(AdwareInstall.PACKAGE_NAME_KEY)));
+ this.startActivity(intent);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/adware/AdwareInstall.java b/app/src/main/java/org/adaway/ui/adware/AdwareInstall.java
new file mode 100644
index 0000000..1b03ce9
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/adware/AdwareInstall.java
@@ -0,0 +1,43 @@
+package org.adaway.ui.adware;
+
+import androidx.annotation.NonNull;
+
+import java.util.HashMap;
+
+/**
+ * This class is a POJO to represent an installed adware.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class AdwareInstall extends HashMap implements Comparable {
+ /**
+ * The adware application name.
+ */
+ final static String APPLICATION_NAME_KEY = "app_name";
+ /**
+ * The adware package name.
+ */
+ final static String PACKAGE_NAME_KEY = "package_name";
+
+ /**
+ * Constructor.
+ *
+ * @param applicationName The adware application name.
+ * @param packageName The adware package name.
+ */
+ AdwareInstall(String applicationName, String packageName) {
+ super(2);
+ this.put(AdwareInstall.APPLICATION_NAME_KEY, applicationName);
+ this.put(AdwareInstall.PACKAGE_NAME_KEY, packageName);
+ }
+
+ @Override
+ public int compareTo(@NonNull AdwareInstall other) {
+ int nameComparison = this.get(AdwareInstall.APPLICATION_NAME_KEY).compareTo(other.get(AdwareInstall.APPLICATION_NAME_KEY));
+ if (nameComparison == 0) {
+ return this.get(AdwareInstall.PACKAGE_NAME_KEY).compareTo(other.get(AdwareInstall.PACKAGE_NAME_KEY));
+ } else {
+ return nameComparison;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/adware/AdwareLiveData.java b/app/src/main/java/org/adaway/ui/adware/AdwareLiveData.java
new file mode 100644
index 0000000..5d9c82f
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/adware/AdwareLiveData.java
@@ -0,0 +1,154 @@
+package org.adaway.ui.adware;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ComponentInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+
+import androidx.annotation.WorkerThread;
+import androidx.lifecycle.LiveData;
+
+import org.adaway.util.AppExecutors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static java.util.stream.Collectors.toList;
+
+import timber.log.Timber;
+
+/**
+ * This class is {@link LiveData} to represents installed adware on device.
+ */
+class AdwareLiveData extends LiveData> {
+ /**
+ * The adware package prefixes.
+ */
+ private static final String[] AD_PACKAGE_PREFIXES = {
+ "com.airpush.",
+ "com.adnotify.",
+ "com.appbucks.sdk.",
+ "com.appenda.",
+ "com.applovin.",
+ "com.iac.notification.",
+ "com.inmobi.",
+ "com.Leadbolt.",
+ "com.sellaring.",
+ "com.senddroid.",
+ "com.tapjoy.",
+ "cn.kuguo."
+ };
+
+ /**
+ * The application context.
+ */
+ private final Context context;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ AdwareLiveData(Context context) {
+ this.context = context;
+ AppExecutors.getInstance().diskIO().execute(this::loadData);
+ }
+
+ @WorkerThread
+ private void loadData() {
+ // Get the package manager
+ PackageManager pm = this.context.getPackageManager();
+ // Get the adware packages
+ List adwarePackages = this.getAdwarePackages(pm);
+ // Create related adware installs
+ List adwareInstalls = adwarePackages.stream()
+ .map(this::createInstallFromPackageInfo)
+ .sorted()
+ .collect(toList());
+ // Post loaded adware installs
+ this.postValue(adwareInstalls);
+ }
+
+ /**
+ * Finds all installed packages that look like they include a known ad framework
+ *
+ * @param pm The package manager.
+ * @return The found adware package information.
+ */
+ private List getAdwarePackages(PackageManager pm) {
+ List adPackages = new ArrayList<>();
+ // It'd be simpler to just use pm.getInstalledPackages here, but apparently it's broken
+ List applicationInfoList = pm.getInstalledApplications(0);
+ for (ApplicationInfo applicationInfo : applicationInfoList) {
+ try {
+ // Retrieve package information
+ PackageInfo packageInfo = pm.getPackageInfo(
+ applicationInfo.packageName,
+ PackageManager.GET_ACTIVITIES | PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES
+ );
+ if (this.isAdware(packageInfo)) {
+ adPackages.add(packageInfo);
+ }
+ } catch (Exception exception) {
+ Timber.e(exception, "An error occurred while scanning applications for adware");
+ }
+ }
+ return adPackages;
+ }
+
+ /**
+ * Check if application is an adware.
+ *
+ * @param info The application package information.
+ * @return true if the application is an adware, false otherwise.
+ */
+ private boolean isAdware(PackageInfo info) {
+ // Get package name
+ String packageName = info.packageName;
+ Timber.v("Scanning package %s", packageName);
+ // Check package components
+ boolean matchActivity = info.activities != null && checkComponent(packageName, "activity", info.activities);
+ boolean matchReceiver = info.receivers != null && checkComponent(packageName, "receiver", info.receivers);
+ boolean matchService = info.services != null && checkComponent(packageName, "service", info.services);
+ return matchActivity || matchReceiver || matchService;
+ }
+
+
+ /**
+ * Check if an application component match the adware signature.
+ *
+ * @param packageName The application package name.
+ * @param type The component type.
+ * @param info The application components to check.
+ * @return true if a component matches adware signature, false otherwise.
+ */
+ private boolean checkComponent(String packageName, String type, ComponentInfo[] info) {
+ for (ComponentInfo componentInfo : info) {
+ String componentName = componentInfo.name;
+ Timber.v("[%s] %s", type, componentName);
+ for (String adPackagePrefix : AD_PACKAGE_PREFIXES) {
+ if (componentName.startsWith(adPackagePrefix)) {
+ Timber.i("Detected ad framework prefix %s in package %s as %s %s", adPackagePrefix, packageName, type, componentName);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Create {@link AdwareInstall} from {@link PackageInfo}.
+ *
+ * @param packageInfo The package info to convert.
+ * @return The related adware install.
+ */
+ private AdwareInstall createInstallFromPackageInfo(PackageInfo packageInfo) {
+ // Get the package manager
+ PackageManager pm = this.context.getPackageManager();
+ // Retrieve application name
+ String applicationName = pm.getApplicationLabel(packageInfo.applicationInfo).toString();
+ // Add adware install
+ return new AdwareInstall(applicationName, packageInfo.packageName);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/adware/AdwareViewModel.java b/app/src/main/java/org/adaway/ui/adware/AdwareViewModel.java
new file mode 100644
index 0000000..c0dc5db
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/adware/AdwareViewModel.java
@@ -0,0 +1,37 @@
+package org.adaway.ui.adware;
+
+import android.app.Application;
+
+import androidx.lifecycle.AndroidViewModel;
+import androidx.annotation.NonNull;
+
+/**
+ * This class is a {@link androidx.lifecycle.ViewModel} for adware UI.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class AdwareViewModel extends AndroidViewModel {
+ /**
+ * The install adware.
+ */
+ private final AdwareLiveData adware;
+
+ /**
+ * Constructor.
+ *
+ * @param application The application context.
+ */
+ public AdwareViewModel(@NonNull Application application) {
+ super(application);
+ this.adware = new AdwareLiveData(application);
+ }
+
+ /**
+ * Get the installed adware.
+ *
+ * @return The installed adware.
+ */
+ public AdwareLiveData getAdware() {
+ return this.adware;
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/dialog/AlertDialogValidator.java b/app/src/main/java/org/adaway/ui/dialog/AlertDialogValidator.java
new file mode 100644
index 0000000..a0eebfe
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/dialog/AlertDialogValidator.java
@@ -0,0 +1,55 @@
+package org.adaway.ui.dialog;
+
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.arch.core.util.Function;
+
+import android.content.DialogInterface;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.widget.Button;
+
+/**
+ * This class is a {@link TextWatcher} to validate an alert dialog field.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class AlertDialogValidator implements TextWatcher {
+ /**
+ * The button to change status.
+ */
+ private final Button mButton;
+ /**
+ * The field validator.
+ */
+ private final Function validator;
+
+ /**
+ * Constructor.
+ *
+ * @param dialog The button to change status.
+ * @param validator The field validator.
+ * @param initialState The validation initial state.
+ */
+ public AlertDialogValidator(AlertDialog dialog, Function validator, boolean initialState) {
+ this.mButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
+ this.mButton.setEnabled(initialState);
+ this.validator = validator;
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ String url = s.toString();
+ this.mButton.setEnabled(this.validator.apply(url));
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/dialog/MissingAppDialog.java b/app/src/main/java/org/adaway/ui/dialog/MissingAppDialog.java
new file mode 100644
index 0000000..6f034a5
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/dialog/MissingAppDialog.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.dialog;
+
+import android.app.SearchManager;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+
+import androidx.annotation.StringRes;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+import org.adaway.R;
+
+import timber.log.Timber;
+
+/**
+ * This class is an utility class to help install missing applications.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class MissingAppDialog {
+ /**
+ * Show a dialog to install a text editor.
+ *
+ * @param context The application context.
+ */
+ public static void showTextEditorMissingDialog(Context context) {
+ showMissingAppDialog(
+ context,
+ R.string.no_text_editor_title,
+ R.string.no_text_editor,
+ "market://details?id=jp.sblo.pandora.jota",
+ "Text Edit"
+ );
+ }
+
+ /**
+ * Show a dialog to install a file manager.
+ *
+ * @param context The application context.
+ */
+ public static void showFileManagerMissingDialog(Context context) {
+ showMissingAppDialog(
+ context,
+ R.string.no_file_manager_title,
+ R.string.no_file_manager,
+ "market://details?id=org.openintents.filemanager",
+ "OI File Manager"
+ );
+ }
+
+ private static void showMissingAppDialog(
+ Context context,
+ @StringRes int title,
+ @StringRes int message,
+ String appGooglePlayUri,
+ String appFdroidQuery
+ ) {
+ new MaterialAlertDialogBuilder(context)
+ .setTitle(title)
+ .setMessage(message)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setPositiveButton(R.string.button_yes, (dialog, id) -> {
+ Intent intentGooglePlay = new Intent(Intent.ACTION_VIEW);
+ intentGooglePlay.setData(Uri.parse(appGooglePlayUri));
+
+ try {
+ context.startActivity(intentGooglePlay);
+ } catch (ActivityNotFoundException e) {
+ Timber.e(e, "No Google Play Store installed!, Trying FDroid...");
+
+ Intent intentFDroid = new Intent(Intent.ACTION_SEARCH);
+ intentFDroid.setComponent(new ComponentName("org.fdroid.fdroid",
+ "org.fdroid.fdroid.SearchResults"));
+ intentFDroid.putExtra(SearchManager.QUERY, appFdroidQuery);
+
+ try {
+ context.startActivity(intentFDroid);
+ } catch (ActivityNotFoundException e2) {
+ Timber.e(e2, "No FDroid installed!");
+ }
+ }
+ })
+ .setNegativeButton(R.string.button_no, (dialog, id) -> dialog.dismiss())
+ .create()
+ .show();
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/help/HelpActivity.java b/app/src/main/java/org/adaway/ui/help/HelpActivity.java
new file mode 100644
index 0000000..d9ea623
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/help/HelpActivity.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.help;
+
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+import androidx.viewpager2.widget.ViewPager2;
+
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
+
+import org.adaway.R;
+import org.adaway.helper.ThemeHelper;
+
+public class HelpActivity extends AppCompatActivity {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ setContentView(R.layout.help_activity);
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ ViewPager2 viewPager = findViewById(R.id.pager);
+ viewPager.setAdapter(new TabsAdapter(this));
+
+ TabLayout tabLayout = findViewById(R.id.tabLayout);
+
+ new TabLayoutMediator(
+ tabLayout,
+ viewPager,
+ (tab, position) -> tab.setText(getTabName(position))
+ ).attach();
+ }
+
+ private @StringRes
+ int getTabName(int position) {
+ switch (position) {
+ case 0:
+ return R.string.help_tab_faq;
+ case 1:
+ return R.string.help_tab_problems;
+ case 2:
+ return R.string.help_tab_s_on_s_off;
+ default:
+ throw new IllegalStateException("Position " + position + " is not supported.");
+ }
+ }
+
+ private static class TabsAdapter extends FragmentStateAdapter {
+ private final Fragment faqFragment = HelpFragmentHtml.newInstance(R.raw.help_faq);
+ private final Fragment problemsFragment = HelpFragmentHtml.newInstance(R.raw.help_problems);
+ private final Fragment sonSofFragment = HelpFragmentHtml.newInstance(R.raw.help_s_on_s_off);
+
+ TabsAdapter(@NonNull FragmentActivity fragmentActivity) {
+ super(fragmentActivity);
+ }
+
+ @NonNull
+ @Override
+ public Fragment createFragment(int position) {
+ switch (position) {
+ case 0:
+ return this.faqFragment;
+ case 1:
+ return this.problemsFragment;
+ case 2:
+ return this.sonSofFragment;
+ default:
+ throw new IllegalStateException("Position " + position + " is not supported.");
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return 3;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/help/HelpFragmentHtml.java b/app/src/main/java/org/adaway/ui/help/HelpFragmentHtml.java
new file mode 100644
index 0000000..e8dd76e
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/help/HelpFragmentHtml.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.help;
+
+import android.os.Bundle;
+import android.text.Html;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RawRes;
+import androidx.fragment.app.Fragment;
+
+import org.adaway.R;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import static android.text.Html.FROM_HTML_MODE_LEGACY;
+
+import timber.log.Timber;
+
+public class HelpFragmentHtml extends Fragment {
+ private static final String TAG = "Help";
+ private static final String ARG_HTML_FILE = "htmlFile";
+
+ /**
+ * Create a new instance of HelpFragmentHtml, providing "htmlFile" as an argument.
+ */
+ static HelpFragmentHtml newInstance(@RawRes int htmlFile) {
+ HelpFragmentHtml instance = new HelpFragmentHtml();
+
+ // Supply html raw file input as an argument.
+ Bundle args = new Bundle();
+ args.putInt(ARG_HTML_FILE, htmlFile);
+ instance.setArguments(args);
+
+ return instance;
+ }
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ Spanned spanned = new SpannableString("");
+ if (getArguments() != null) {
+ int htmlFile = getArguments().getInt(ARG_HTML_FILE);
+ try {
+ spanned = Html.fromHtml(readHtmlRawFile(htmlFile), FROM_HTML_MODE_LEGACY);
+ } catch (IOException e) {
+ Timber.w("Failed to read help file.");
+ }
+ }
+
+ View view = inflater.inflate(R.layout.help_fragment, container, false);
+ TextView helpTextView = view.findViewById(R.id.helpTextView);
+ helpTextView.setText(spanned);
+ helpTextView.setMovementMethod(LinkMovementMethod.getInstance());
+ return view;
+ }
+
+ private String readHtmlRawFile(@RawRes int resourceId) throws IOException {
+ try (InputStream inputStream = getResources().openRawResource(resourceId);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
+ StringBuilder content = new StringBuilder();
+ String line;
+ while ((line = reader.readLine()) != null) {
+ content.append(line);
+ }
+ return content.toString();
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/home/HomeActivity.java b/app/src/main/java/org/adaway/ui/home/HomeActivity.java
new file mode 100644
index 0000000..229b3e5
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/home/HomeActivity.java
@@ -0,0 +1,366 @@
+package org.adaway.ui.home;
+
+import static com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HALF_EXPANDED;
+import static com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HIDDEN;
+import static org.adaway.model.adblocking.AdBlockMethod.UNDEFINED;
+import static org.adaway.model.adblocking.AdBlockMethod.VPN;
+import static org.adaway.ui.Animations.removeView;
+import static org.adaway.ui.Animations.showView;
+import static org.adaway.ui.lists.ListsActivity.ALLOWED_HOSTS_TAB;
+import static org.adaway.ui.lists.ListsActivity.BLOCKED_HOSTS_TAB;
+import static org.adaway.ui.lists.ListsActivity.REDIRECTED_HOSTS_TAB;
+import static org.adaway.ui.lists.ListsActivity.TAB;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.net.Uri;
+import android.net.VpnService;
+import android.os.Bundle;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
+import androidx.annotation.IdRes;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.Transformations;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.google.android.material.bottomsheet.BottomSheetBehavior;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+import org.adaway.R;
+import org.adaway.databinding.HomeActivityBinding;
+import org.adaway.helper.NotificationHelper;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.helper.ThemeHelper;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.model.error.HostError;
+import org.adaway.ui.help.HelpActivity;
+import org.adaway.ui.hosts.HostsSourcesActivity;
+import org.adaway.ui.lists.ListsActivity;
+import org.adaway.ui.log.LogActivity;
+import org.adaway.ui.prefs.PrefsActivity;
+import org.adaway.ui.support.SupportActivity;
+import org.adaway.ui.update.UpdateActivity;
+import org.adaway.ui.welcome.WelcomeActivity;
+
+import kotlin.jvm.functions.Function1;
+import timber.log.Timber;
+
+/**
+ * This class is the application main activity.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class HomeActivity extends AppCompatActivity {
+ /**
+ * The project link.
+ */
+ private static final String PROJECT_LINK = "https://github.com/AdAway/AdAway";
+
+ private HomeActivityBinding binding;
+ private BottomSheetBehavior drawerBehavior;
+ private OnBackPressedCallback onBackPressedCallback;
+ private HomeViewModel homeViewModel;
+ private ActivityResultLauncher prepareVpnLauncher;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ NotificationHelper.clearUpdateNotifications(this);
+ Timber.i("Starting main activity");
+ this.binding = HomeActivityBinding.inflate(getLayoutInflater());
+ setContentView(this.binding.getRoot());
+
+ this.homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
+ this.homeViewModel.isAdBlocked().observe(this, this::notifyAdBlocked);
+ this.homeViewModel.getError().observe(this, this::notifyError);
+
+ applyActionBar();
+ bindAppVersion();
+ bindHostCounter();
+ bindSourceCounter();
+ bindPending();
+ bindState();
+ bindClickListeners();
+ setUpBottomDrawer();
+ bindFab();
+
+ this.binding.navigationView.setNavigationItemSelectedListener(item -> {
+ if (showFragment(item.getItemId())) {
+ this.drawerBehavior.setState(STATE_HIDDEN);
+ }
+ return false; // TODO Handle selection
+ });
+
+ this.prepareVpnLauncher = registerForActivityResult(new StartActivityForResult(), result -> {
+
+ });
+
+ if (savedInstanceState == null) {
+ checkUpdateAtStartup();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ checkFirstStep();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ return showFragment(item.getItemId());
+ }
+
+ private void checkFirstStep() {
+ AdBlockMethod adBlockMethod = PreferenceHelper.getAdBlockMethod(this);
+ Intent prepareIntent;
+ if (adBlockMethod == UNDEFINED) {
+ // Start welcome activity
+ startActivity(new Intent(this, WelcomeActivity.class));
+ finish();
+ } else if (adBlockMethod == VPN && (prepareIntent = VpnService.prepare(this)) != null) {
+ // Prepare VPN
+ this.prepareVpnLauncher.launch(prepareIntent);
+ }
+ }
+
+ private void checkUpdateAtStartup() {
+ boolean checkAppUpdateAtStartup = PreferenceHelper.getUpdateCheckAppStartup(this);
+ if (checkAppUpdateAtStartup) {
+ this.homeViewModel.checkForAppUpdate();
+ }
+ boolean checkUpdateAtStartup = PreferenceHelper.getUpdateCheck(this);
+ if (checkUpdateAtStartup) {
+ this.homeViewModel.update();
+ }
+ }
+
+ private void applyActionBar() {
+ setSupportActionBar(this.binding.bar);
+ }
+
+ private void bindAppVersion() {
+ TextView versionTextView = this.binding.content.versionTextView;
+ versionTextView.setText(this.homeViewModel.getVersionName());
+ versionTextView.setOnClickListener(this::showUpdate);
+
+ this.homeViewModel.getAppManifest().observe(
+ this,
+ manifest -> {
+ if (manifest.updateAvailable) {
+ versionTextView.setTypeface(versionTextView.getTypeface(), Typeface.BOLD);
+ versionTextView.setText(R.string.update_available);
+ }
+ }
+ );
+ }
+
+ private void bindHostCounter() {
+ Function1 stringMapper = count -> Integer.toString(count);
+
+ TextView blockedHostCountTextView = this.binding.content.blockedHostCounterTextView;
+ LiveData blockedHostCount = this.homeViewModel.getBlockedHostCount();
+ Transformations.map(blockedHostCount, stringMapper).observe(this, blockedHostCountTextView::setText);
+
+ TextView allowedHostCountTextView = this.binding.content.allowedHostCounterTextView;
+ LiveData allowedHostCount = this.homeViewModel.getAllowedHostCount();
+ Transformations.map(allowedHostCount, stringMapper).observe(this, allowedHostCountTextView::setText);
+
+ TextView redirectHostCountTextView = this.binding.content.redirectHostCounterTextView;
+ LiveData redirectHostCount = this.homeViewModel.getRedirectHostCount();
+ Transformations.map(redirectHostCount, stringMapper).observe(this, redirectHostCountTextView::setText);
+ }
+
+ private void bindSourceCounter() {
+ Resources resources = getResources();
+
+ TextView upToDateSourcesTextView = this.binding.content.upToDateSourcesTextView;
+ LiveData upToDateSourceCount = this.homeViewModel.getUpToDateSourceCount();
+ upToDateSourceCount.observe(this, count ->
+ upToDateSourcesTextView.setText(resources.getQuantityString(R.plurals.up_to_date_source_label, count, count))
+ );
+
+ TextView outdatedSourcesTextView = this.binding.content.outdatedSourcesTextView;
+ LiveData outdatedSourceCount = this.homeViewModel.getOutdatedSourceCount();
+ outdatedSourceCount.observe(this, count ->
+ outdatedSourcesTextView.setText(resources.getQuantityString(R.plurals.outdated_source_label, count, count))
+ );
+ }
+
+ private void bindPending() {
+ this.homeViewModel.getPending().observe(this, pending -> {
+ if (pending) {
+ showView(this.binding.content.sourcesProgressBar);
+ showView(this.binding.content.stateTextView);
+ } else {
+ removeView(this.binding.content.sourcesProgressBar);
+ }
+ });
+ }
+
+ private void bindState() {
+ this.homeViewModel.getState().observe(this, text -> {
+ this.binding.content.stateTextView.setText(text);
+ if (text.isEmpty()) {
+ removeView(this.binding.content.stateTextView);
+ } else {
+ showView(this.binding.content.stateTextView);
+ }
+ });
+ }
+
+ private void bindClickListeners() {
+ this.binding.content.blockedHostCardView.setOnClickListener(v -> startHostListActivity(BLOCKED_HOSTS_TAB));
+ this.binding.content.allowedHostCardView.setOnClickListener(v -> startHostListActivity(ALLOWED_HOSTS_TAB));
+ this.binding.content.redirectHostCardView.setOnClickListener(v -> startHostListActivity(REDIRECTED_HOSTS_TAB));
+ this.binding.content.sourcesCardView.setOnClickListener(this::startHostsSourcesActivity);
+ this.binding.content.checkForUpdateImageView.setOnClickListener(v -> this.homeViewModel.update());
+ this.binding.content.updateImageView.setOnClickListener(v -> this.homeViewModel.sync());
+ this.binding.content.logCardView.setOnClickListener(this::startDnsLogActivity);
+ this.binding.content.helpCardView.setOnClickListener(this::startHelpActivity);
+ this.binding.content.supportCardView.setOnClickListener(this::showSupportActivity);
+ }
+
+ private void setUpBottomDrawer() {
+ this.drawerBehavior = BottomSheetBehavior.from(this.binding.bottomDrawer);
+ this.drawerBehavior.setState(STATE_HIDDEN);
+
+ this.onBackPressedCallback = new OnBackPressedCallback(false) {
+ @Override
+ public void handleOnBackPressed() {
+ // Hide drawer if expanded
+ HomeActivity.this.drawerBehavior.setState(STATE_HIDDEN);
+ HomeActivity.this.onBackPressedCallback.setEnabled(false);
+ }
+ };
+ getOnBackPressedDispatcher().addCallback(this.onBackPressedCallback);
+
+ this.binding.bar.setNavigationOnClickListener(v -> {
+ this.drawerBehavior.setState(STATE_HALF_EXPANDED);
+ this.onBackPressedCallback.setEnabled(true);
+ });
+// this.binding.bar.setNavigationIcon(R.drawable.ic_menu_24dp);
+// this.binding.bar.replaceMenu(R.menu.next_actions);
+ }
+
+ private void bindFab() {
+ this.binding.fab.setOnClickListener(v -> this.homeViewModel.toggleAdBlocking());
+ }
+
+ private boolean showFragment(@IdRes int actionId) {
+ if (actionId == R.id.drawer_preferences) {
+ startPrefsActivity();
+ this.drawerBehavior.setState(STATE_HIDDEN);
+ return true;
+ } else if (actionId == R.id.drawer_github_project) {
+ showProjectPage();
+ this.drawerBehavior.setState(STATE_HIDDEN);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Start hosts lists activity.
+ *
+ * @param tab The tab to show.
+ */
+ private void startHostListActivity(int tab) {
+ Intent intent = new Intent(this, ListsActivity.class);
+ intent.putExtra(TAB, tab);
+ startActivity(intent);
+ }
+
+ /**
+ * Start hosts source activity.
+ *
+ * @param view The event source view.
+ */
+ private void startHostsSourcesActivity(View view) {
+ startActivity(new Intent(this, HostsSourcesActivity.class));
+ }
+
+ /**
+ * Start help activity.
+ *
+ * @param view The source event view.
+ */
+ private void startHelpActivity(View view) {
+ startActivity(new Intent(this, HelpActivity.class));
+ }
+
+ /**
+ * Show development project page.
+ */
+ private void showProjectPage() {
+ // Show development page
+ Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(PROJECT_LINK));
+ startActivity(browserIntent);
+ }
+
+ /**
+ * Show support activity.
+ *
+ * @param view The source event view.
+ */
+ private void showSupportActivity(View view) {
+ startActivity(new Intent(this, SupportActivity.class));
+ }
+
+ /**
+ * Start preferences activity.
+ */
+ private void startPrefsActivity() {
+ startActivity(new Intent(this, PrefsActivity.class));
+ }
+
+ /**
+ * Start DNS log activity.
+ *
+ * @param view The source event view.
+ */
+ private void startDnsLogActivity(View view) {
+ startActivity(new Intent(this, LogActivity.class));
+ }
+
+ private void notifyAdBlocked(boolean adBlocked) {
+ int color = adBlocked ? getResources().getColor(R.color.primary, null) : Color.GRAY;
+ this.binding.content.headerFrameLayout.setBackgroundColor(color);
+ this.binding.fab.setImageResource(adBlocked ? R.drawable.ic_pause_24dp : R.drawable.logo);
+ }
+
+ private void notifyError(HostError error) {
+ removeView(this.binding.content.stateTextView);
+ if (error == null) {
+ return;
+ }
+
+ String message = getString(error.getDetailsKey()) + "\n\n" + getString(R.string.error_dialog_help);
+ new MaterialAlertDialogBuilder(this)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setTitle(error.getMessageKey())
+ .setMessage(message)
+ .setPositiveButton(R.string.button_close, (dialog, id) -> dialog.dismiss())
+ .setNegativeButton(R.string.button_help, (dialog, id) -> {
+ dialog.dismiss();
+ startActivity(new Intent(this, HelpActivity.class));
+ })
+ .create()
+ .show();
+ }
+
+ private void showUpdate(View view) {
+ Intent intent = new Intent(this, UpdateActivity.class);
+ startActivity(intent);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/home/HomeViewModel.java b/app/src/main/java/org/adaway/ui/home/HomeViewModel.java
new file mode 100644
index 0000000..8fb8256
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/home/HomeViewModel.java
@@ -0,0 +1,182 @@
+package org.adaway.ui.home;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MediatorLiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.model.error.HostError;
+import org.adaway.model.error.HostErrorException;
+import org.adaway.model.source.SourceModel;
+import org.adaway.model.update.Manifest;
+import org.adaway.model.update.UpdateModel;
+import org.adaway.util.AppExecutors;
+
+import timber.log.Timber;
+
+/**
+ * This class is an {@link AndroidViewModel} for the {@link HomeActivity} cards.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class HomeViewModel extends AndroidViewModel {
+ private static final AppExecutors EXECUTORS = AppExecutors.getInstance();
+
+ private final SourceModel sourceModel;
+ private final AdBlockModel adBlockModel;
+ private final UpdateModel updateModel;
+
+ private final HostsSourceDao hostsSourceDao;
+ private final HostListItemDao hostListItemDao;
+
+ private final MutableLiveData pending;
+ private final MediatorLiveData state;
+ private final MutableLiveData error;
+
+ public HomeViewModel(@NonNull Application application) {
+ super(application);
+ AdAwayApplication awayApplication = (AdAwayApplication) application;
+ this.sourceModel = awayApplication.getSourceModel();
+ this.adBlockModel = awayApplication.getAdBlockModel();
+ this.updateModel = awayApplication.getUpdateModel();
+
+ AppDatabase database = AppDatabase.getInstance(application);
+ this.hostsSourceDao = database.hostsSourceDao();
+ this.hostListItemDao = database.hostsListItemDao();
+
+ this.pending = new MutableLiveData<>(false);
+ this.state = new MediatorLiveData<>();
+ this.state.addSource(this.sourceModel.getState(), this.state::setValue);
+ this.state.addSource(this.adBlockModel.getState(), this.state::setValue);
+ this.error = new MutableLiveData<>();
+ }
+
+ private static boolean isTrue(LiveData liveData) {
+ Boolean value = liveData.getValue();
+ return value != null && value;
+ }
+
+ public LiveData isAdBlocked() {
+ return this.adBlockModel.isApplied();
+ }
+
+ public LiveData isUpdateAvailable() {
+ return this.sourceModel.isUpdateAvailable();
+ }
+
+ public String getVersionName() {
+ return this.updateModel.getVersionName();
+ }
+
+ public LiveData getAppManifest() {
+ return this.updateModel.getManifest();
+ }
+
+ public LiveData getBlockedHostCount() {
+ return this.hostListItemDao.getBlockedHostCount();
+ }
+
+ public LiveData getAllowedHostCount() {
+ return this.hostListItemDao.getAllowedHostCount();
+ }
+
+ public LiveData getRedirectHostCount() {
+ return this.hostListItemDao.getRedirectHostCount();
+ }
+
+ public LiveData getUpToDateSourceCount() {
+ return this.hostsSourceDao.countUpToDate();
+ }
+
+ public LiveData getOutdatedSourceCount() {
+ return this.hostsSourceDao.countOutdated();
+ }
+
+ public LiveData getPending() {
+ return this.pending;
+ }
+
+ public LiveData getState() {
+ return this.state;
+ }
+
+ public LiveData getError() {
+ return this.error;
+ }
+
+ public void checkForAppUpdate() {
+ EXECUTORS.networkIO().execute(this.updateModel::checkForUpdate);
+ }
+
+ public void toggleAdBlocking() {
+ if (isTrue(this.pending)) {
+ return;
+ }
+ EXECUTORS.diskIO().execute(() -> {
+ try {
+ this.pending.postValue(true);
+ if (isTrue(this.adBlockModel.isApplied())) {
+ this.adBlockModel.revert();
+ } else {
+ this.adBlockModel.apply();
+ }
+ } catch (HostErrorException exception) {
+ Timber.w(exception, "Failed to toggle ad blocking.");
+ this.error.postValue(exception.getError());
+ } finally {
+ this.pending.postValue(false);
+ }
+ });
+ }
+
+ public void update() {
+ if (isTrue(this.pending)) {
+ return;
+ }
+ EXECUTORS.networkIO().execute(() -> {
+ try {
+ this.pending.postValue(true);
+ this.sourceModel.checkForUpdate();
+ } catch (HostErrorException exception) {
+ Timber.w(exception, "Failed to update.");
+ this.error.postValue(exception.getError());
+ } finally {
+ this.pending.postValue(false);
+ }
+ });
+ }
+
+ public void sync() {
+ if (isTrue(this.pending)) {
+ return;
+ }
+ EXECUTORS.networkIO().execute(() -> {
+ try {
+ this.pending.postValue(true);
+ this.sourceModel.retrieveHostsSources();
+ this.adBlockModel.apply();
+ } catch (HostErrorException exception) {
+ Timber.w(exception, "Failed to sync.");
+ this.error.postValue(exception.getError());
+ } finally {
+ this.pending.postValue(false);
+ }
+ });
+ }
+
+ public void enableAllSources() {
+ EXECUTORS.diskIO().execute(() -> {
+ if (this.sourceModel.enableAllSources()) {
+ sync();
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/hosts/HostsSourcesActivity.java b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesActivity.java
new file mode 100644
index 0000000..585b3c6
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesActivity.java
@@ -0,0 +1,41 @@
+package org.adaway.ui.hosts;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+
+import org.adaway.R;
+import org.adaway.helper.ThemeHelper;
+
+/**
+ * This activity display hosts list items.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class HostsSourcesActivity extends AppCompatActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ /*
+ * Create fragment
+ */
+ HostsSourcesFragment fragment = new HostsSourcesFragment();
+ /*
+ * Set view content.
+ */
+ setContentView(R.layout.hosts_sources_activity);
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(R.id.hosts_sources_container, fragment)
+ .commit();
+ /*
+ * Configure actionbar.
+ */
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/hosts/HostsSourcesAdapter.java b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesAdapter.java
new file mode 100644
index 0000000..13f9f73
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesAdapter.java
@@ -0,0 +1,208 @@
+package org.adaway.ui.hosts;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.DiffUtil;
+import androidx.recyclerview.widget.ListAdapter;
+import androidx.recyclerview.widget.RecyclerView;
+
+import org.adaway.R;
+import org.adaway.db.entity.HostsSource;
+
+import java.time.Duration;
+import java.time.ZonedDateTime;
+
+/**
+ * This class is a the {@link RecyclerView.Adapter} for the hosts sources view.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class HostsSourcesAdapter extends ListAdapter {
+ /**
+ * This callback is use to compare hosts sources.
+ */
+ private static final DiffUtil.ItemCallback DIFF_CALLBACK =
+ new DiffUtil.ItemCallback() {
+ @Override
+ public boolean areItemsTheSame(@NonNull HostsSource oldSource, @NonNull HostsSource newSource) {
+ return oldSource.getUrl().equals(newSource.getUrl());
+ }
+
+ @Override
+ public boolean areContentsTheSame(@NonNull HostsSource oldSource, @NonNull HostsSource newSource) {
+ // NOTE: if you use equals, your object must properly override Object#equals()
+ // Incorrectly returning false here will result in too many animations.
+ return oldSource.equals(newSource);
+ }
+ };
+
+ /**
+ * This callback is use to call view actions.
+ */
+ @NonNull
+ private final HostsSourcesViewCallback viewCallback;
+ private static final String[] QUANTITY_PREFIXES = new String[]{"k", "M", "G"};
+
+ /**
+ * Constructor.
+ *
+ * @param viewCallback The view callback.
+ */
+ HostsSourcesAdapter(@NonNull HostsSourcesViewCallback viewCallback) {
+ super(DIFF_CALLBACK);
+ this.viewCallback = viewCallback;
+ }
+
+ /**
+ * Get the approximate delay from a date to now.
+ *
+ * @param context The application context.
+ * @param from The date from which computes the delay.
+ * @return The approximate delay.
+ */
+ private static String getApproximateDelay(Context context, ZonedDateTime from) {
+ // Get resource for plurals
+ Resources resources = context.getResources();
+ // Get current date in UTC timezone
+ ZonedDateTime now = ZonedDateTime.now();
+ // Get delay between from and now in minutes
+ long delay = Duration.between(from, now).toMinutes();
+ // Check if delay is lower than an hour
+ if (delay < 60) {
+ return resources.getString(R.string.hosts_source_few_minutes);
+ }
+ // Get delay in hours
+ delay /= 60;
+ // Check if delay is lower than a day
+ if (delay < 24) {
+ int hours = (int) delay;
+ return resources.getQuantityString(R.plurals.hosts_source_hours, hours, hours);
+ }
+ // Get delay in days
+ delay /= 24;
+ // Check if delay is lower than a month
+ if (delay < 30) {
+ int days = (int) delay;
+ return resources.getQuantityString(R.plurals.hosts_source_days, days, days);
+ }
+ // Get delay in months
+ int months = (int) delay / 30;
+ return resources.getQuantityString(R.plurals.hosts_source_months, months, months);
+ }
+
+ @NonNull
+ @Override
+ public HostsSourcesAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
+ View view = layoutInflater.inflate(R.layout.hosts_sources_card, parent, false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ HostsSource source = this.getItem(position);
+ holder.enabledCheckBox.setChecked(source.isEnabled());
+ holder.enabledCheckBox.setOnClickListener(view -> viewCallback.toggleEnabled(source));
+ holder.labelTextView.setText(source.getLabel());
+ holder.urlTextView.setText(source.getUrl());
+ holder.updateTextView.setText(getUpdateText(source));
+ holder.sizeTextView.setText(getHostCount(source));
+ holder.itemView.setOnClickListener(view -> viewCallback.edit(source));
+ }
+
+ private String getUpdateText(HostsSource source) {
+ // Get context
+ Context context = this.viewCallback.getContext();
+ // Check if source is enabled
+ if (!source.isEnabled()) {
+ return context.getString(R.string.hosts_source_disabled);
+ }
+ // Check modification dates
+ boolean lastOnlineModificationDefined = source.getOnlineModificationDate() != null;
+ boolean lastLocalModificationDefined = source.getLocalModificationDate() != null;
+ // Declare update text
+ String updateText;
+ // Check if last online modification date is known
+ if (lastOnlineModificationDefined) {
+ // Get last online modification delay
+ String approximateDelay = getApproximateDelay(context, source.getOnlineModificationDate());
+ if (!lastLocalModificationDefined) {
+ updateText = context.getString(R.string.hosts_source_last_update, approximateDelay);
+ } else if (source.getOnlineModificationDate().isAfter(source.getLocalModificationDate())) {
+ updateText = context.getString(R.string.hosts_source_need_update, approximateDelay);
+ } else {
+ updateText = context.getString(R.string.hosts_source_up_to_date, approximateDelay);
+ }
+ } else {
+ if (lastLocalModificationDefined) {
+ String approximateDelay = getApproximateDelay(context, source.getLocalModificationDate());
+ updateText = context.getString(R.string.hosts_source_installed, approximateDelay);
+ } else {
+ updateText = context.getString(R.string.hosts_source_unknown_status);
+ }
+ }
+ return updateText;
+ }
+
+ private String getHostCount(HostsSource source) {
+ // Note: NumberFormat.getCompactNumberInstance is Java 12 only
+ // Check empty source
+ int size = source.getSize();
+ if (size <= 0 || !source.isEnabled()) {
+ return "";
+ }
+ // Compute size decimal length
+ int length = 1;
+ while (size > 10) {
+ size /= 10;
+ length++;
+ }
+ // Compute prefix to use
+ int prefixIndex = (length - 1) / 3 - 1;
+ // Return formatted count
+ Context context = this.viewCallback.getContext();
+ size = source.getSize();
+ if (prefixIndex < 0) {
+ return context.getString(R.string.hosts_count, Integer.toString(size));
+ } else if (prefixIndex >= QUANTITY_PREFIXES.length) {
+ prefixIndex = QUANTITY_PREFIXES.length - 1;
+ size = 13;
+ }
+ size = Math.toIntExact(Math.round(size / Math.pow(10, (prefixIndex + 1) * 3D)));
+ return context.getString(R.string.hosts_count, size + QUANTITY_PREFIXES[prefixIndex]);
+ }
+
+ /**
+ * This class is a the {@link RecyclerView.ViewHolder} for the hosts sources view.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ final CheckBox enabledCheckBox;
+ final TextView labelTextView;
+ final TextView urlTextView;
+ final TextView updateTextView;
+ final TextView sizeTextView;
+
+ /**
+ * Constructor.
+ *
+ * @param itemView The hosts sources view.
+ */
+ ViewHolder(View itemView) {
+ super(itemView);
+ this.enabledCheckBox = itemView.findViewById(R.id.sourceEnabledCheckBox);
+ this.labelTextView = itemView.findViewById(R.id.sourceLabelTextView);
+ this.urlTextView = itemView.findViewById(R.id.sourceUrlTextView);
+ this.updateTextView = itemView.findViewById(R.id.sourceUpdateTextView);
+ this.sizeTextView = itemView.findViewById(R.id.sourceSizeTextView);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/hosts/HostsSourcesFragment.java b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesFragment.java
new file mode 100644
index 0000000..6c2a9b9
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesFragment.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.hosts;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+
+import org.adaway.R;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.ui.adblocking.ApplyConfigurationSnackbar;
+import org.adaway.ui.source.SourceEditActivity;
+
+import static org.adaway.ui.source.SourceEditActivity.SOURCE_ID;
+
+/**
+ * This class is a {@link Fragment} to display and manage hosts sources.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class HostsSourcesFragment extends Fragment implements HostsSourcesViewCallback {
+ /**
+ * The view model (null if view is not created).
+ */
+ private HostsSourcesViewModel mViewModel;
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ // Get activity
+ Activity activity = requireActivity();
+ // Initialize view model
+ this.mViewModel = new ViewModelProvider(this).get(HostsSourcesViewModel.class);
+ LifecycleOwner lifecycleOwner = getViewLifecycleOwner();
+ // Create fragment view
+ View view = inflater.inflate(R.layout.hosts_sources_fragment, container, false);
+ /*
+ * Configure snackbar.
+ */
+ // Get lists layout to attached snackbar to
+ CoordinatorLayout coordinatorLayout = view.findViewById(R.id.coordinator);
+ // Create apply snackbar
+ ApplyConfigurationSnackbar applySnackbar = new ApplyConfigurationSnackbar(coordinatorLayout, true, true);
+ // Bind snakbar to view models
+ this.mViewModel.getHostsSources().observe(lifecycleOwner, applySnackbar.createObserver());
+ /*
+ * Configure recycler view.
+ */
+ // Store recycler view
+ RecyclerView recyclerView = view.findViewById(R.id.hosts_sources_list);
+ recyclerView.setHasFixedSize(true);
+ // Defile recycler layout
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(activity);
+ recyclerView.setLayoutManager(linearLayoutManager);
+ // Create recycler adapter
+ HostsSourcesAdapter adapter = new HostsSourcesAdapter(this);
+ recyclerView.setAdapter(adapter);
+ // Bind adapter to view model
+ this.mViewModel.getHostsSources().observe(lifecycleOwner, adapter::submitList);
+ /*
+ * Add floating action button.
+ */
+ // Get floating action button
+ FloatingActionButton button = view.findViewById(R.id.hosts_sources_add);
+ // Set click listener to display menu add entry
+ button.setOnClickListener(actionButton -> startSourceEdition(null));
+ // Return fragment view
+ return view;
+ }
+
+ @Override
+ public void toggleEnabled(HostsSource source) {
+ this.mViewModel.toggleSourceEnabled(source);
+ }
+
+ @Override
+ public void edit(HostsSource source) {
+ startSourceEdition(source);
+ }
+
+ private void startSourceEdition(@Nullable HostsSource source) {
+ Intent intent = new Intent(requireContext(), SourceEditActivity.class);
+ if (source != null) {
+ intent.putExtra(SOURCE_ID, source.getId());
+ }
+ startActivity(intent);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/hosts/HostsSourcesViewCallback.java b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesViewCallback.java
new file mode 100644
index 0000000..b25aebc
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesViewCallback.java
@@ -0,0 +1,33 @@
+package org.adaway.ui.hosts;
+
+import android.content.Context;
+
+import org.adaway.db.entity.HostsSource;
+
+/**
+ * This class is represents the {@link HostsSourcesFragment} callback.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public interface HostsSourcesViewCallback {
+ /**
+ * Get the application context.
+ *
+ * @return The application context.
+ */
+ Context getContext();
+
+ /**
+ * Toggle host source enable status.
+ *
+ * @param source The hosts source to toggle status.
+ */
+ void toggleEnabled(HostsSource source);
+
+ /**
+ * Start an action.
+ *
+ * @param source The hosts source to start the action.
+ */
+ void edit(HostsSource source);
+}
diff --git a/app/src/main/java/org/adaway/ui/hosts/HostsSourcesViewModel.java b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesViewModel.java
new file mode 100644
index 0000000..7b1c4eb
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/hosts/HostsSourcesViewModel.java
@@ -0,0 +1,38 @@
+package org.adaway.ui.hosts;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.util.AppExecutors;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * This class is an {@link AndroidViewModel} for the {@link HostsSourcesFragment}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class HostsSourcesViewModel extends AndroidViewModel {
+ private static final Executor EXECUTOR = AppExecutors.getInstance().diskIO();
+ private final HostsSourceDao hostsSourceDao;
+
+ public HostsSourcesViewModel(@NonNull Application application) {
+ super(application);
+ this.hostsSourceDao = AppDatabase.getInstance(application).hostsSourceDao();
+ }
+
+ public LiveData> getHostsSources() {
+ return this.hostsSourceDao.loadAll();
+ }
+
+ public void toggleSourceEnabled(HostsSource source) {
+ EXECUTOR.execute(() -> this.hostsSourceDao.toggleEnabled(source));
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/ListsActivity.java b/app/src/main/java/org/adaway/ui/lists/ListsActivity.java
new file mode 100644
index 0000000..6d7116e
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/ListsActivity.java
@@ -0,0 +1,185 @@
+package org.adaway.ui.lists;
+
+import static android.content.Intent.ACTION_SEARCH;
+
+import android.app.SearchManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.widget.SearchView;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.viewpager2.widget.ViewPager2;
+
+import com.google.android.material.bottomnavigation.BottomNavigationView;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+
+import org.adaway.R;
+import org.adaway.helper.ThemeHelper;
+import org.adaway.ui.adblocking.ApplyConfigurationSnackbar;
+
+/**
+ * This activity display hosts list items.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class ListsActivity extends AppCompatActivity {
+ /**
+ * The tab to display argument.
+ */
+ public static final String TAB = "org.adaway.lists.tab";
+ /**
+ * The blocked hosts tab index.
+ */
+ public static final int BLOCKED_HOSTS_TAB = 0;
+ /**
+ * The allowed hosts tab index.
+ */
+ public static final int ALLOWED_HOSTS_TAB = 1;
+ /**
+ * The redirected hosts tab index.
+ */
+ public static final int REDIRECTED_HOSTS_TAB = 2;
+ /**
+ * The view model.
+ */
+ private ListsViewModel listsViewModel;
+ /**
+ * The back press callback.
+ */
+ private OnBackPressedCallback onBackPressedCallback;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ /*
+ * Set view content.
+ */
+ setContentView(R.layout.lists_fragment);
+ /*
+ * Configure actionbar.
+ */
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ /*
+ * Configure back press callback.
+ */
+ this.onBackPressedCallback = new OnBackPressedCallback(false) {
+ @Override
+ public void handleOnBackPressed() {
+ ListsActivity.this.listsViewModel.clearSearch();
+ ListsActivity.this.onBackPressedCallback.setEnabled(false);
+ }
+ };
+ getOnBackPressedDispatcher().addCallback(this.onBackPressedCallback);
+ /*
+ * Configure tabs.
+ */
+ // Get view pager
+ ViewPager2 viewPager = findViewById(R.id.lists_view_pager);
+ // Create pager adapter
+ ListsFragmentPagerAdapter pagerAdapter = new ListsFragmentPagerAdapter(this);
+ // Set view pager adapter
+ viewPager.setAdapter(pagerAdapter);
+ // Get navigation view
+ BottomNavigationView navigationView = findViewById(R.id.navigation);
+ // Add view pager on page listener to set selected tab according the selected page
+ viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+ @Override
+ public void onPageSelected(int position) {
+ navigationView.getMenu().getItem(position).setChecked(true);
+ pagerAdapter.ensureActionModeCanceled();
+ }
+ });
+ // Add navigation view item selected listener to change view pager current item
+ navigationView.setOnItemSelectedListener(item -> {
+ if (item.getItemId() == R.id.lists_navigation_blocked) {
+ viewPager.setCurrentItem(0);
+ return true;
+ } else if (item.getItemId() == R.id.lists_navigation_allowed) {
+ viewPager.setCurrentItem(1);
+ return true;
+ } else if (item.getItemId() == R.id.lists_navigation_redirected) {
+ viewPager.setCurrentItem(2);
+ return true;
+ }
+ return false;
+ });
+ // Display requested tab
+ Intent intent = getIntent();
+ int tab = intent.getIntExtra(TAB, BLOCKED_HOSTS_TAB);
+ viewPager.setCurrentItem(tab);
+ /*
+ * Configure add action button.
+ */
+ // Get the add action button
+ FloatingActionButton addActionButton = findViewById(R.id.lists_add);
+ // Set add action button listener
+ addActionButton.setOnClickListener(clickedView -> {
+ // Get current fragment position
+ int currentItemPosition = viewPager.getCurrentItem();
+ // Add item to the current fragment
+ pagerAdapter.addItem(currentItemPosition);
+ });
+ /*
+ * Configure snackbar.
+ */
+ // Get lists layout to attached snackbar to
+ CoordinatorLayout coordinatorLayout = findViewById(R.id.coordinator);
+ // Create apply snackbar
+ ApplyConfigurationSnackbar applySnackbar = new ApplyConfigurationSnackbar(coordinatorLayout, false, false);
+ // Bind snackbar to view models
+ this.listsViewModel = new ViewModelProvider(this).get(ListsViewModel.class);
+ this.listsViewModel.getModelChanged().observe(this, applySnackbar.createObserver());
+ // Get the intent, verify the action and get the query
+ handleQuery(intent);
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ setIntent(intent);
+ handleQuery(intent);
+ }
+
+ private void handleQuery(Intent intent) {
+ if (ACTION_SEARCH.equals(intent.getAction())) {
+ String query = intent.getStringExtra(SearchManager.QUERY);
+ this.listsViewModel.search(query);
+ this.onBackPressedCallback.setEnabled(true);
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.list_menu, menu);
+ // Get the SearchView and set the searchable configuration
+ SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
+ if (searchManager != null) {
+ SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
+ searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
+ searchView.setIconifiedByDefault(false);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if (item.getItemId() == R.id.menu_toggle_source) {
+ this.listsViewModel.toggleSources();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/ListsFilter.java b/app/src/main/java/org/adaway/ui/lists/ListsFilter.java
new file mode 100644
index 0000000..46cd7fc
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/ListsFilter.java
@@ -0,0 +1,33 @@
+package org.adaway.ui.lists;
+
+/**
+ * This class represents the filter to apply to host lists.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class ListsFilter {
+ public static final ListsFilter ALL = new ListsFilter(true, "");
+ /**
+ * Whether included hosts from sources or not.
+ */
+ public final boolean sourcesIncluded;
+ /**
+ * The query filter to apply to hosts name (wildcard based).
+ */
+ public final String query;
+ /**
+ * The query filter to apply to hosts name (sql like format).
+ */
+ public final String sqlQuery;
+
+ public ListsFilter(boolean sourcesIncluded, String query) {
+ this.sourcesIncluded = sourcesIncluded;
+ this.query = query;
+ this.sqlQuery = convertToLikeQuery(query);
+ }
+
+ private static String convertToLikeQuery(String query) {
+ return "%" + query.replace("*", "%")
+ .replace("?", "_") + "%";
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/ListsFragmentPagerAdapter.java b/app/src/main/java/org/adaway/ui/lists/ListsFragmentPagerAdapter.java
new file mode 100644
index 0000000..1a95653
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/ListsFragmentPagerAdapter.java
@@ -0,0 +1,110 @@
+package org.adaway.ui.lists;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+import org.adaway.ui.lists.type.AbstractListFragment;
+import org.adaway.ui.lists.type.AllowedHostsFragment;
+import org.adaway.ui.lists.type.BlockedHostsFragment;
+import org.adaway.ui.lists.type.RedirectedHostsFragment;
+
+import static org.adaway.ui.lists.ListsActivity.BLOCKED_HOSTS_TAB;
+import static org.adaway.ui.lists.ListsActivity.REDIRECTED_HOSTS_TAB;
+import static org.adaway.ui.lists.ListsActivity.ALLOWED_HOSTS_TAB;
+
+/**
+ * This class is a {@link FragmentStateAdapter} to store lists tab fragments.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class ListsFragmentPagerAdapter extends FragmentStateAdapter {
+ /**
+ * The number of fragment.
+ */
+ private static final int FRAGMENT_COUNT = 3;
+ /**
+ * The blacklist fragment (null until first retrieval).
+ */
+ private final AbstractListFragment blacklistFragment;
+ /**
+ * The whitelist fragment (null until first retrieval).
+ */
+ private final AbstractListFragment whitelistFragment;
+ /**
+ * The redirection list fragment (null until first retrieval).
+ */
+ private final AbstractListFragment redirectionListFragment;
+
+ /**
+ * Constructor.
+ *
+ */
+ ListsFragmentPagerAdapter(FragmentActivity fragmentActivity) {
+ super(fragmentActivity);
+ this.blacklistFragment = new BlockedHostsFragment();
+ this.whitelistFragment = new AllowedHostsFragment();
+ this.redirectionListFragment = new RedirectedHostsFragment();
+ }
+
+ @NonNull
+ @Override
+ public Fragment createFragment(int position) {
+ switch (position) {
+ case BLOCKED_HOSTS_TAB:
+ return this.blacklistFragment;
+ case ALLOWED_HOSTS_TAB:
+ return this.whitelistFragment;
+ case REDIRECTED_HOSTS_TAB:
+ return this.redirectionListFragment;
+ default:
+ throw new IllegalStateException("Position " + position + " is not supported.");
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return FRAGMENT_COUNT;
+ }
+
+ /**
+ * Ensure action mode is cancelled.
+ */
+ void ensureActionModeCanceled() {
+ if (this.blacklistFragment != null) {
+ this.blacklistFragment.ensureActionModeCanceled();
+ }
+ if (this.whitelistFragment != null) {
+ this.whitelistFragment.ensureActionModeCanceled();
+ }
+ if (this.redirectionListFragment != null) {
+ this.redirectionListFragment.ensureActionModeCanceled();
+ }
+ }
+
+ /**
+ * Add an item into the requested fragment.
+ *
+ * @param position The fragment position.
+ */
+ void addItem(int position) {
+ switch (position) {
+ case BLOCKED_HOSTS_TAB:
+ if (this.blacklistFragment != null) {
+ this.blacklistFragment.addItem();
+ }
+ break;
+ case ALLOWED_HOSTS_TAB:
+ if (this.whitelistFragment != null) {
+ this.whitelistFragment.addItem();
+ }
+ break;
+ case REDIRECTED_HOSTS_TAB:
+ if (this.redirectionListFragment != null) {
+ this.redirectionListFragment.addItem();
+ }
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/ListsViewCallback.java b/app/src/main/java/org/adaway/ui/lists/ListsViewCallback.java
new file mode 100644
index 0000000..879c1ed
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/ListsViewCallback.java
@@ -0,0 +1,36 @@
+package org.adaway.ui.lists;
+
+import android.view.View;
+
+import org.adaway.db.entity.HostListItem;
+import org.adaway.ui.lists.type.AbstractListFragment;
+
+/**
+ * This class is represents the {@link AbstractListFragment} callback.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public interface ListsViewCallback {
+ /**
+ * Toggle item enable status.
+ *
+ * @param item The list to toggle status.
+ */
+ void toggleItemEnabled(HostListItem item);
+
+ /**
+ * Start an action.
+ *
+ * @param item The list to start the action.
+ * @param sourceView The list related view.
+ * @return true if the action was started, false otherwise.
+ */
+ boolean startAction(HostListItem item, View sourceView);
+
+ /**
+ * Copy an hosts into clipboard.
+ *
+ * @param item The list to copy hosts.
+ */
+ boolean copyHostToClipboard(HostListItem item);
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/ListsViewModel.java b/app/src/main/java/org/adaway/ui/lists/ListsViewModel.java
new file mode 100644
index 0000000..1d843a8
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/ListsViewModel.java
@@ -0,0 +1,160 @@
+package org.adaway.ui.lists;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.paging.Pager;
+import androidx.paging.PagingConfig;
+import androidx.paging.PagingData;
+
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.ListType;
+import org.adaway.ui.lists.type.AbstractListFragment;
+import org.adaway.util.AppExecutors;
+
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+import static androidx.lifecycle.Transformations.switchMap;
+import static androidx.paging.PagingLiveData.getLiveData;
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+import static org.adaway.db.entity.ListType.ALLOWED;
+import static org.adaway.db.entity.ListType.BLOCKED;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+import static org.adaway.ui.lists.ListsFilter.ALL;
+
+/**
+ * This class is an {@link AndroidViewModel} for the {@link AbstractListFragment} implementations.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class ListsViewModel extends AndroidViewModel {
+ private static final Executor EXECUTOR = AppExecutors.getInstance().diskIO();
+ private final HostListItemDao hostListItemDao;
+ private final MutableLiveData filter;
+ private final LiveData> blockedListItems;
+ private final LiveData> allowedListItems;
+ private final LiveData> redirectedListItems;
+ private final MutableLiveData modelChanged;
+
+ public ListsViewModel(@NonNull Application application) {
+ super(application);
+ this.hostListItemDao = AppDatabase.getInstance(application).hostsListItemDao();
+ this.filter = new MutableLiveData<>(ALL);
+ PagingConfig pagingConfig = new PagingConfig(50, 150, true);
+ this.blockedListItems = switchMap(
+ this.filter,
+ filter -> getLiveData(new Pager<>(pagingConfig, () ->
+ this.hostListItemDao.loadList(BLOCKED.getValue(), filter.sourcesIncluded, filter.sqlQuery)
+ ))
+ );
+ this.allowedListItems = switchMap(
+ this.filter,
+ filter -> getLiveData(new Pager<>(pagingConfig, () ->
+ this.hostListItemDao.loadList(ALLOWED.getValue(), filter.sourcesIncluded, filter.sqlQuery)
+ ))
+ );
+ this.redirectedListItems = switchMap(
+ this.filter,
+ filter -> getLiveData(new Pager<>(pagingConfig, () ->
+ this.hostListItemDao.loadList(REDIRECTED.getValue(), filter.sourcesIncluded, filter.sqlQuery)
+ ))
+ );
+ this.modelChanged = new MutableLiveData<>(false);
+ }
+
+ public LiveData> getBlockedListItems() {
+ return this.blockedListItems;
+ }
+
+ public LiveData> getAllowedListItems() {
+ return this.allowedListItems;
+ }
+
+ public LiveData> getRedirectedListItems() {
+ return this.redirectedListItems;
+ }
+
+ public LiveData getModelChanged() {
+ return this.modelChanged;
+ }
+
+ public void toggleItemEnabled(HostListItem item) {
+ item.setEnabled(!item.isEnabled());
+ EXECUTOR.execute(() -> {
+ this.hostListItemDao.update(item);
+ this.modelChanged.postValue(true);
+ });
+ }
+
+ public void addListItem(@NonNull ListType type, @NonNull String host, String redirection) {
+ HostListItem item = new HostListItem();
+ item.setType(type);
+ item.setHost(host);
+ item.setRedirection(redirection);
+ item.setEnabled(true);
+ item.setSourceId(USER_SOURCE_ID);
+ EXECUTOR.execute(() -> {
+ Optional id = this.hostListItemDao.getHostId(host);
+ if (id.isPresent()) {
+ item.setId(id.get());
+ this.hostListItemDao.update(item);
+ } else {
+ this.hostListItemDao.insert(item);
+ }
+ this.modelChanged.postValue(true);
+ });
+ }
+
+ public void updateListItem(@NonNull HostListItem item, @NonNull String host, String redirection) {
+ item.setHost(host);
+ item.setRedirection(redirection);
+ EXECUTOR.execute(() -> {
+ this.hostListItemDao.update(item);
+ this.modelChanged.postValue(true);
+ });
+ }
+
+ public void removeListItem(HostListItem list) {
+ EXECUTOR.execute(() -> {
+ this.hostListItemDao.delete(list);
+ this.modelChanged.postValue(true);
+ });
+ }
+
+ public void search(String query) {
+ ListsFilter currentFilter = getFilter();
+ ListsFilter newFilter = new ListsFilter(currentFilter.sourcesIncluded, query);
+ setFilter(newFilter);
+ }
+
+ public boolean isSearching() {
+ return !getFilter().query.isEmpty();
+ }
+
+ public void clearSearch() {
+ ListsFilter currentFilter = getFilter();
+ ListsFilter newFilter = new ListsFilter(currentFilter.sourcesIncluded, "");
+ setFilter(newFilter);
+ }
+
+ public void toggleSources() {
+ ListsFilter currentFilter = getFilter();
+ ListsFilter newFilter = new ListsFilter(!currentFilter.sourcesIncluded, currentFilter.query);
+ setFilter(newFilter);
+ }
+
+ private ListsFilter getFilter() {
+ ListsFilter filter = this.filter.getValue();
+ return filter == null ? ALL : filter;
+ }
+
+ private void setFilter(ListsFilter filter) {
+ this.filter.setValue(filter);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/type/AbstractListFragment.java b/app/src/main/java/org/adaway/ui/lists/type/AbstractListFragment.java
new file mode 100644
index 0000000..5be0363
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/type/AbstractListFragment.java
@@ -0,0 +1,203 @@
+package org.adaway.ui.lists.type;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.ActionMode;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.paging.PagingData;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import org.adaway.R;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.ui.lists.ListsViewCallback;
+import org.adaway.ui.lists.ListsViewModel;
+import org.adaway.util.Clipboard;
+
+/**
+ * This class is a {@link Fragment} to display and manage lists of {@link org.adaway.ui.lists.ListsActivity}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public abstract class AbstractListFragment extends Fragment implements ListsViewCallback {
+ /**
+ * The view model (null if view is not created).
+ */
+ protected ListsViewModel mViewModel;
+ /**
+ * The current activity (null if view is not created).
+ */
+ protected FragmentActivity mActivity;
+ /**
+ * The current action mode when item is selection (null if no action started).
+ */
+ private ActionMode mActionMode;
+ /**
+ * The action mode callback (null if view is not created).
+ */
+ private ActionMode.Callback mActionCallback;
+ /**
+ * The hosts list related to the current action (null if view is not created).
+ */
+ private HostListItem mActionItem;
+ /**
+ * The view related hosts source of the current action (null if view is not created).
+ */
+ private View mActionSourceView;
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ // Store activity
+ this.mActivity = requireActivity();
+ // Create fragment view
+ View view = inflater.inflate(R.layout.hosts_lists_fragment, container, false);
+ /*
+ * Configure recycler view.
+ */
+ // Store recycler view
+ RecyclerView recyclerView = view.findViewById(R.id.hosts_lists_list);
+ recyclerView.setHasFixedSize(true);
+ // Defile recycler layout
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this.mActivity);
+ recyclerView.setLayoutManager(linearLayoutManager);
+ // Create recycler adapter
+ ListsAdapter adapter = new ListsAdapter(this, isTwoRowsItem());
+ recyclerView.setAdapter(adapter);
+ /*
+ * Create action mode.
+ */
+ // Create action mode callback to display edit/delete menu
+ this.mActionCallback = new ActionMode.Callback() {
+ @Override
+ public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
+ // Get menu inflater
+ MenuInflater inflater = actionMode.getMenuInflater();
+ // Set action mode title
+ actionMode.setTitle(R.string.checkbox_list_context_title);
+ // Inflate edit/delete menu
+ inflater.inflate(R.menu.checkbox_list_context, menu);
+ // Return action created
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
+ // Nothing special to do
+ return false;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
+ // Check action item
+ if (mActionItem == null) {
+ return false;
+ }
+ // Check item identifier
+ if (item.getItemId() == R.id.edit_action) {
+ // Edit action item
+ editItem(mActionItem);
+ // Finish action mode
+ mActionMode.finish();
+ return true;
+ } else if (item.getItemId() == R.id.delete_action) {
+ // Delete action item
+ deleteItem(mActionItem);
+ // Finish action mode
+ mActionMode.finish();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode actionMode) {
+ // Clear view background color
+ if (mActionSourceView != null) {
+ mActionSourceView.setBackgroundColor(Color.TRANSPARENT);
+ }
+ // Clear current source and its view
+ mActionItem = null;
+ mActionSourceView = null;
+ // Clear action mode
+ mActionMode = null;
+ }
+ };
+ /*
+ * Load data.
+ */
+ // Get view model and bind it to the list view
+ this.mViewModel = new ViewModelProvider(this.mActivity).get(ListsViewModel.class);
+ getData().observe(getViewLifecycleOwner(), data -> adapter.submitData(getLifecycle(), data));
+ // Return created view
+ return view;
+ }
+
+ @Override
+ public boolean startAction(HostListItem item, View sourceView) {
+ // Check if there is already a current action
+ if (this.mActionMode != null) {
+ return false;
+ }
+ // Store current source and its view
+ this.mActionItem = item;
+ this.mActionSourceView = sourceView;
+ // Get current item background color
+ int currentItemBackgroundColor = getResources().getColor(R.color.selected_background, null);
+ // Apply background color to view
+ this.mActionSourceView.setBackgroundColor(currentItemBackgroundColor);
+ // Start action mode and store it
+ this.mActionMode = this.mActivity.startActionMode(this.mActionCallback);
+ // Return event consumed
+ return true;
+ }
+
+ @Override
+ public boolean copyHostToClipboard(HostListItem item) {
+ Clipboard.copyHostToClipboard(this.mActivity, item.getHost());
+ return true;
+ }
+
+ /**
+ * Ensure action mode is cancelled.
+ */
+ public void ensureActionModeCanceled() {
+ if (this.mActionMode != null) {
+ this.mActionMode.finish();
+ }
+ }
+
+ protected abstract LiveData> getData();
+
+ protected boolean isTwoRowsItem() {
+ return false;
+ }
+
+ /**
+ * Display a UI to add an item to the list.
+ */
+ public abstract void addItem();
+
+ protected abstract void editItem(HostListItem item);
+
+ protected void deleteItem(HostListItem item) {
+ this.mViewModel.removeListItem(item);
+ }
+
+ @Override
+ public void toggleItemEnabled(HostListItem item) {
+ this.mViewModel.toggleItemEnabled(item);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/type/AllowedHostsFragment.java b/app/src/main/java/org/adaway/ui/lists/type/AllowedHostsFragment.java
new file mode 100644
index 0000000..c5f89cf
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/type/AllowedHostsFragment.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.lists.type;
+
+
+import android.text.Editable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.lifecycle.LiveData;
+import androidx.paging.PagingData;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+import org.adaway.R;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.ListType;
+import org.adaway.ui.dialog.AlertDialogValidator;
+import org.adaway.util.RegexUtils;
+
+/**
+ * This class is a {@link AbstractListFragment} to display and manage allowed hosts.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class AllowedHostsFragment extends AbstractListFragment {
+ @Override
+ protected LiveData> getData() {
+ return this.mViewModel.getAllowedListItems();
+ }
+
+ @Override
+ public void addItem() {
+ // Create dialog view
+ LayoutInflater factory = LayoutInflater.from(this.mActivity);
+ View view = factory.inflate(R.layout.lists_allowed_dialog, null);
+ EditText inputEditText = view.findViewById(R.id.list_dialog_hostname);
+ // Create dialog
+ AlertDialog alertDialog = new MaterialAlertDialogBuilder(this.mActivity)
+ .setCancelable(true)
+ .setTitle(R.string.list_add_dialog_white)
+ .setView(view)
+ // Setup buttons
+ .setPositiveButton(
+ R.string.button_add,
+ (dialog, which) -> {
+ // Close dialog
+ dialog.dismiss();
+ // Check hostname validity
+ String hostname = inputEditText.getText().toString();
+ if (RegexUtils.isValidWildcardHostname(hostname)) {
+ // Insert host to whitelist
+ this.mViewModel.addListItem(ListType.ALLOWED, hostname, null);
+ }
+ }
+ )
+ .setNegativeButton(
+ R.string.button_cancel,
+ (dialog, which) -> dialog.dismiss()
+ )
+ .create();
+ // Show dialog
+ alertDialog.show();
+ // Set button validation behavior
+ inputEditText.addTextChangedListener(
+ new AlertDialogValidator(alertDialog, RegexUtils::isValidWildcardHostname, false)
+ );
+ }
+
+ @Override
+ protected void editItem(HostListItem item) {
+ // Create dialog view
+ LayoutInflater factory = LayoutInflater.from(this.mActivity);
+ View view = factory.inflate(R.layout.lists_allowed_dialog, null);
+ // Set hostname
+ EditText inputEditText = view.findViewById(R.id.list_dialog_hostname);
+ inputEditText.setText(item.getHost());
+ // Move cursor to end of EditText
+ Editable inputEditContent = inputEditText.getText();
+ inputEditText.setSelection(inputEditContent.length());
+ // Create dialog builder
+ AlertDialog alertDialog = new MaterialAlertDialogBuilder(this.mActivity)
+ .setCancelable(true)
+ .setTitle(R.string.list_edit_dialog_white)
+ .setView(view)
+ // Setup buttons
+ .setPositiveButton(
+ R.string.button_save,
+ (dialog, which) -> {
+ // Close dialog
+ dialog.dismiss();
+ // Check hostname validity
+ String hostname = inputEditText.getText().toString();
+ if (RegexUtils.isValidWildcardHostname(hostname)) {
+ // Update list item
+ this.mViewModel.updateListItem(item, hostname, null);
+ }
+ }
+ )
+ .setNegativeButton(
+ R.string.button_cancel,
+ (dialog, which) -> dialog.dismiss()
+ )
+ .create();
+ // Show dialog
+ alertDialog.show();
+ // Set button validation behavior
+ inputEditText.addTextChangedListener(
+ new AlertDialogValidator(alertDialog, RegexUtils::isValidWildcardHostname, true)
+ );
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/type/BlockedHostsFragment.java b/app/src/main/java/org/adaway/ui/lists/type/BlockedHostsFragment.java
new file mode 100644
index 0000000..f37cdc5
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/type/BlockedHostsFragment.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.lists.type;
+
+
+import android.text.Editable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.lifecycle.LiveData;
+import androidx.paging.PagingData;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+import org.adaway.R;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.ui.dialog.AlertDialogValidator;
+import org.adaway.util.RegexUtils;
+
+import static org.adaway.db.entity.ListType.BLOCKED;
+
+/**
+ * This class is a {@link AbstractListFragment} to display and manage blocked hosts.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class BlockedHostsFragment extends AbstractListFragment {
+ @Override
+ protected LiveData> getData() {
+ return this.mViewModel.getBlockedListItems();
+ }
+
+ @Override
+ public void addItem() {
+ // Create dialog view
+ LayoutInflater factory = LayoutInflater.from(this.mActivity);
+ View view = factory.inflate(R.layout.lists_blocked_dialog, null);
+ EditText inputEditText = view.findViewById(R.id.list_dialog_hostname);
+ // Create dialog
+ AlertDialog alertDialog = new MaterialAlertDialogBuilder(this.mActivity)
+ .setCancelable(true)
+ .setTitle(R.string.list_add_dialog_black)
+ .setView(view)
+ // Setup buttons
+ .setPositiveButton(
+ R.string.button_add,
+ (dialog, which) -> {
+ // Close dialog
+ dialog.dismiss();
+ // Check if hostname is valid
+ String hostname = inputEditText.getText().toString();
+ if (RegexUtils.isValidHostname(hostname)) {
+ // Insert host to black list
+ this.mViewModel.addListItem(BLOCKED, hostname, null);
+ }
+ })
+ .setNegativeButton(
+ R.string.button_cancel,
+ (dialog, which) -> dialog.dismiss()
+ )
+ .create();
+ // Show dialog
+ alertDialog.show();
+ // Set button validation behavior
+ inputEditText.addTextChangedListener(
+ new AlertDialogValidator(alertDialog, RegexUtils::isValidHostname, false)
+ );
+ }
+
+ @Override
+ protected void editItem(HostListItem item) {
+ // Create dialog view
+ LayoutInflater factory = LayoutInflater.from(this.mActivity);
+ View view = factory.inflate(R.layout.lists_blocked_dialog, null);
+ // Set hostname
+ EditText inputEditText = view.findViewById(R.id.list_dialog_hostname);
+ inputEditText.setText(item.getHost());
+ // Move cursor to end of EditText
+ Editable inputEditContent = inputEditText.getText();
+ inputEditText.setSelection(inputEditContent.length());
+ // Create dialog
+ AlertDialog alertDialog = new MaterialAlertDialogBuilder(this.mActivity)
+ .setCancelable(true)
+ .setTitle(R.string.list_edit_dialog_black)
+ .setView(view)
+ // Setup buttons
+ .setPositiveButton(
+ R.string.button_save,
+ (dialog, which) -> {
+ // Close dialog
+ dialog.dismiss();
+ // Check hostname validity
+ String hostname = inputEditText.getText().toString();
+ if (RegexUtils.isValidHostname(hostname)) {
+ // Update list item
+ this.mViewModel.updateListItem(item, hostname, null);
+ }
+ })
+ .setNegativeButton(
+ R.string.button_cancel
+ , (dialog, which) -> dialog.dismiss()
+ )
+ .create();
+ // Show dialog
+ alertDialog.show();
+ // Set button validation behavior
+ inputEditText.addTextChangedListener(
+ new AlertDialogValidator(alertDialog, RegexUtils::isValidHostname, true)
+ );
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/adaway/ui/lists/type/ListsAdapter.java b/app/src/main/java/org/adaway/ui/lists/type/ListsAdapter.java
new file mode 100644
index 0000000..472b996
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/type/ListsAdapter.java
@@ -0,0 +1,131 @@
+package org.adaway.ui.lists.type;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.paging.PagingDataAdapter;
+import androidx.recyclerview.widget.DiffUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
+import org.adaway.R;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.ui.lists.ListsViewCallback;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+
+/**
+ * This class is a the {@link RecyclerView.Adapter} for the hosts list view.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class ListsAdapter extends PagingDataAdapter {
+ /**
+ * This callback is use to compare hosts sources.
+ */
+ private static final DiffUtil.ItemCallback DIFF_CALLBACK =
+ new DiffUtil.ItemCallback() {
+ @Override
+ public boolean areItemsTheSame(@NonNull HostListItem oldItem, @NonNull HostListItem newItem) {
+ return (oldItem.getHost().equals(newItem.getHost()));
+ }
+
+ @Override
+ public boolean areContentsTheSame(@NonNull HostListItem oldItem, @NonNull HostListItem newItem) {
+ // NOTE: if you use equals, your object must properly override Object#equals()
+ // Incorrectly returning false here will result in too many animations.
+ return oldItem.equals(newItem);
+ }
+ };
+
+ /**
+ * This callback is use to call view actions.
+ */
+ @NonNull
+ private final ListsViewCallback viewCallback;
+ /**
+ * Whether the list item needs two rows or not.
+ */
+ private final boolean twoRows;
+
+ /**
+ * Constructor.
+ *
+ * @param viewCallback The view callback.
+ * @param twoRows Whether the list items need two rows or not.
+ */
+ ListsAdapter(@NonNull ListsViewCallback viewCallback, boolean twoRows) {
+ super(DIFF_CALLBACK);
+ this.viewCallback = viewCallback;
+ this.twoRows = twoRows;
+ }
+
+ @NonNull
+ @Override
+ public ListsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
+ View view = layoutInflater.inflate(
+ this.twoRows ? R.layout.checkbox_list_two_entries : R.layout.checkbox_list_entry,
+ parent,
+ false
+ );
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ HostListItem item = getItem(position);
+ if (item == null) { // Data might be null if not loaded yet
+ holder.clear();
+ return;
+ }
+ boolean editable = item.getSourceId() == USER_SOURCE_ID;
+ holder.enabledCheckBox.setEnabled(editable);
+ holder.enabledCheckBox.setChecked(item.isEnabled());
+ holder.enabledCheckBox.setOnClickListener(editable ? view -> this.viewCallback.toggleItemEnabled(item) : null);
+ holder.hostTextView.setText(item.getHost());
+ if (this.twoRows) {
+ holder.redirectionTextView.setText(item.getRedirection());
+ }
+ holder.itemView.setOnLongClickListener(editable ?
+ view -> this.viewCallback.startAction(item, holder.itemView) :
+ view -> this.viewCallback.copyHostToClipboard(item));
+ }
+
+ /**
+ * This class is a the {@link RecyclerView.ViewHolder} for the hosts list view.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ final CheckBox enabledCheckBox;
+ final TextView hostTextView;
+ final TextView redirectionTextView;
+
+ /**
+ * Constructor.
+ *
+ * @param itemView The hosts sources view.
+ */
+ ViewHolder(View itemView) {
+ super(itemView);
+ this.enabledCheckBox = itemView.findViewById(R.id.checkbox_list_checkbox);
+ this.hostTextView = itemView.findViewById(R.id.checkbox_list_text);
+ this.redirectionTextView = itemView.findViewById(R.id.checkbox_list_subtext);
+ }
+
+ void clear() {
+ this.enabledCheckBox.setChecked(true);
+ this.enabledCheckBox.setEnabled(false);
+ this.enabledCheckBox.setOnClickListener(null);
+ this.hostTextView.setText("");
+ if (this.redirectionTextView != null) {
+ this.redirectionTextView.setText("");
+ }
+ this.itemView.setOnLongClickListener(null);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/lists/type/RedirectedHostsFragment.java b/app/src/main/java/org/adaway/ui/lists/type/RedirectedHostsFragment.java
new file mode 100644
index 0000000..4261195
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/lists/type/RedirectedHostsFragment.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.lists.type;
+
+import android.text.Editable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.lifecycle.LiveData;
+import androidx.paging.PagingData;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+import org.adaway.R;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.ListType;
+import org.adaway.ui.dialog.AlertDialogValidator;
+import org.adaway.util.RegexUtils;
+
+/**
+ * This class is a {@link AbstractListFragment} to display and manage redirected hosts.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class RedirectedHostsFragment extends AbstractListFragment {
+ @Override
+ protected boolean isTwoRowsItem() {
+ return true;
+ }
+
+ @Override
+ protected LiveData> getData() {
+ return this.mViewModel.getRedirectedListItems();
+ }
+
+ @Override
+ public void addItem() {
+ // Create dialog view
+ LayoutInflater factory = LayoutInflater.from(this.mActivity);
+ View view = factory.inflate(R.layout.lists_redirected_dialog, null);
+ EditText hostnameEditText = view.findViewById(R.id.list_dialog_hostname);
+ EditText ipEditText = view.findViewById(R.id.list_dialog_ip);
+ // Create dialog
+ AlertDialog alertDialog = new MaterialAlertDialogBuilder(this.mActivity)
+ .setCancelable(true)
+ .setTitle(R.string.list_add_dialog_redirect)
+ .setView(view)
+ // Setup buttons
+ .setPositiveButton(
+ R.string.button_add,
+ (dialog, which) -> {
+ // Close dialog
+ dialog.dismiss();
+ // Check if hostname and IP are valid
+ String hostname = hostnameEditText.getText().toString();
+ String ip = ipEditText.getText().toString();
+ if (RegexUtils.isValidHostname(hostname) && RegexUtils.isValidIP(ip)) {
+ // Insert host to redirection list
+ this.mViewModel.addListItem(ListType.REDIRECTED, hostname, ip);
+ }
+ }
+ )
+ .setNegativeButton(
+ R.string.button_cancel,
+ (dialog, which) -> dialog.dismiss()
+ )
+ .create();
+ // Show dialog
+ alertDialog.show();
+ // Set button validation behavior
+ AlertDialogValidator validator = new AlertDialogValidator(
+ alertDialog,
+ input -> {
+ String hostname = hostnameEditText.getText().toString();
+ String ip = ipEditText.getText().toString();
+ return RegexUtils.isValidHostname(hostname) && RegexUtils.isValidIP(ip);
+ },
+ false
+ );
+ hostnameEditText.addTextChangedListener(validator);
+ ipEditText.addTextChangedListener(validator);
+ }
+
+ @Override
+ protected void editItem(HostListItem item) {
+ // Create dialog view
+ LayoutInflater factory = LayoutInflater.from(this.mActivity);
+ View view = factory.inflate(R.layout.lists_redirected_dialog, null);
+ // Set hostname and IP
+ EditText hostnameEditText = view.findViewById(R.id.list_dialog_hostname);
+ EditText ipEditText = view.findViewById(R.id.list_dialog_ip);
+ hostnameEditText.setText(item.getHost());
+ ipEditText.setText(item.getRedirection());
+ // Move cursor to end of EditText
+ Editable hostnameEditContent = hostnameEditText.getText();
+ hostnameEditText.setSelection(hostnameEditContent.length());
+ // Create dialog
+ AlertDialog alertDialog = new MaterialAlertDialogBuilder(this.mActivity)
+ .setCancelable(true)
+ .setTitle(getString(R.string.list_edit_dialog_redirect))
+ .setView(view)
+ // Set buttons
+ .setPositiveButton(R.string.button_save,
+ (dialog, which) -> {
+ // Close dialog
+ dialog.dismiss();
+ // Check hostname and IP validity
+ String hostname = hostnameEditText.getText().toString();
+ String ip = ipEditText.getText().toString();
+ if (RegexUtils.isValidHostname(hostname) && RegexUtils.isValidIP(ip)) {
+ // Update list item
+ this.mViewModel.updateListItem(item, hostname, ip);
+ }
+ }
+ )
+ .setNegativeButton(
+ R.string.button_cancel,
+ (dialog, which) -> dialog.dismiss()
+ )
+ .create();
+ // Show dialog
+ alertDialog.show();
+ // Set button validation behavior
+ AlertDialogValidator validator = new AlertDialogValidator(
+ alertDialog,
+ input -> {
+ String hostname = hostnameEditText.getText().toString();
+ String ip = ipEditText.getText().toString();
+ return RegexUtils.isValidHostname(hostname) && RegexUtils.isValidIP(ip);
+ },
+ true
+ );
+ hostnameEditText.addTextChangedListener(validator);
+ ipEditText.addTextChangedListener(validator);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/adaway/ui/log/LogActivity.java b/app/src/main/java/org/adaway/ui/log/LogActivity.java
new file mode 100644
index 0000000..37a1c23
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/log/LogActivity.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.ui.log;
+
+import static org.adaway.ui.Animations.hideView;
+import static org.adaway.ui.Animations.showView;
+import static java.lang.Boolean.TRUE;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+import org.adaway.R;
+import org.adaway.databinding.LogActivityBinding;
+import org.adaway.databinding.LogRedirectDialogBinding;
+import org.adaway.db.entity.ListType;
+import org.adaway.helper.ThemeHelper;
+import org.adaway.ui.adblocking.ApplyConfigurationSnackbar;
+import org.adaway.ui.dialog.AlertDialogValidator;
+import org.adaway.util.Clipboard;
+import org.adaway.util.RegexUtils;
+
+/**
+ * This class is an {@link android.app.Activity} to show DNS request log entries.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class LogActivity extends AppCompatActivity implements LogViewCallback {
+ private LogActivityBinding binding;
+ /**
+ * The view model (null if activity is not created).
+ */
+ private LogViewModel mViewModel;
+ /**
+ * The snackbar notification (null if activity is not created).
+ */
+ private ApplyConfigurationSnackbar mApplySnackbar;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ /*
+ * Create activity.
+ */
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ this.binding = LogActivityBinding.inflate(getLayoutInflater());
+ setContentView(this.binding.getRoot());
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ // Get view model
+ this.mViewModel = new ViewModelProvider(this).get(LogViewModel.class);
+ /*
+ * Configure swipe layout.
+ */
+ this.binding.swipeRefresh.setOnRefreshListener(this.mViewModel::updateLogs);
+ /*
+ * Configure empty view.
+ */
+ if (this.mViewModel.areBlockedRequestsIgnored()) {
+ this.binding.emptyTextView.append(getString(R.string.log_blocked_requests_ignored));
+ }
+ /*
+ * Configure recycler view.
+ */
+ // Get recycler view
+ this.binding.logList.setHasFixedSize(true);
+ // Defile recycler layout
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ this.binding.logList.setLayoutManager(linearLayoutManager);
+ // Create recycler adapter
+ LogAdapter adapter = new LogAdapter(this);
+ this.binding.logList.setAdapter(adapter);
+ /*
+ * Configure fab.
+ */
+ this.binding.toggleLogRecording.setOnClickListener(v -> this.mViewModel.toggleRecording());
+ this.mViewModel.isRecording().observe(this, recoding ->
+ this.binding.toggleLogRecording.setImageResource(TRUE.equals(recoding) ?
+ R.drawable.ic_pause_24dp :
+ R.drawable.ic_record_24dp
+ )
+ );
+ /*
+ * Configure snackbar.
+ */
+ // Create apply snackbar
+ this.mApplySnackbar = new ApplyConfigurationSnackbar(this.binding.swipeRefresh, false, false);
+ /*
+ * Load data.
+ */
+ // Bind view model to the list view
+ this.mViewModel.getLogs().observe(this, logEntries -> {
+ if (logEntries.isEmpty()) {
+ showView(this.binding.emptyTextView);
+ } else {
+ hideView(this.binding.emptyTextView);
+ }
+ adapter.submitList(logEntries);
+ this.binding.swipeRefresh.setRefreshing(false);
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ // Mark as loading data
+ this.binding.swipeRefresh.setRefreshing(true);
+ // Load initial data
+ this.mViewModel.updateLogs();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater menuInflater = getMenuInflater();
+ menuInflater.inflate(R.menu.log_menu, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == R.id.sort) {
+ this.mViewModel.toggleSort();
+ return true;
+ } else if (item.getItemId() == R.id.delete) {
+ this.mViewModel.clearLogs();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void addListItem(@NonNull String hostName, @NonNull ListType type) {
+ // Check view model and snackbar notification
+ if (this.mViewModel == null || this.mApplySnackbar == null) {
+ return;
+ }
+ // Check type other than redirection
+ if (type != ListType.REDIRECTED) {
+ // Insert list item
+ this.mViewModel.addListItem(hostName, type, null);
+ // Display snackbar notification
+ this.mApplySnackbar.notifyUpdateAvailable();
+ } else {
+ // Create dialog view
+ LayoutInflater inflater = LayoutInflater.from(this);
+ LogRedirectDialogBinding redirectBinding = LogRedirectDialogBinding.inflate(inflater);
+ // Create dialog
+ AlertDialog alertDialog = new MaterialAlertDialogBuilder(this)
+ .setCancelable(true)
+ .setTitle(R.string.log_redirect_dialog_title)
+ .setView(redirectBinding.getRoot())
+ // Setup buttons
+ .setPositiveButton(
+ R.string.button_add,
+ (dialog, which) -> {
+ // Close dialog
+ dialog.dismiss();
+ // Check IP is valid
+ String ip = redirectBinding.redirectIp.getText().toString();
+ if (RegexUtils.isValidIP(ip)) {
+ // Insert list item
+ this.mViewModel.addListItem(hostName, type, ip);
+ // Display snackbar notification
+ this.mApplySnackbar.notifyUpdateAvailable();
+ }
+ }
+ )
+ .setNegativeButton(
+ R.string.button_cancel,
+ (dialog, which) -> dialog.dismiss()
+ )
+ .create();
+ // Show dialog
+ alertDialog.show();
+ // Set button validation behavior
+ redirectBinding.redirectIp.addTextChangedListener(
+ new AlertDialogValidator(alertDialog, RegexUtils::isValidIP, false)
+ );
+ }
+ }
+
+ @Override
+ public void removeListItem(@NonNull String hostName) {
+ if (this.mViewModel != null && this.mApplySnackbar != null) {
+ this.mViewModel.removeListItem(hostName);
+ this.mApplySnackbar.notifyUpdateAvailable();
+ }
+ }
+
+ @Override
+ public void openHostInBrowser(@NonNull String hostName) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse("http://" + hostName));
+ startActivity(intent);
+ }
+
+ @Override
+ public void copyHostToClipboard(@NonNull String hostName) {
+ Clipboard.copyHostToClipboard(this, hostName);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/log/LogAdapter.java b/app/src/main/java/org/adaway/ui/log/LogAdapter.java
new file mode 100644
index 0000000..38fcc7e
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/log/LogAdapter.java
@@ -0,0 +1,107 @@
+package org.adaway.ui.log;
+
+import static android.graphics.PorterDuff.Mode.MULTIPLY;
+import static org.adaway.db.entity.ListType.ALLOWED;
+import static org.adaway.db.entity.ListType.BLOCKED;
+import static org.adaway.db.entity.ListType.REDIRECTED;
+
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.DiffUtil;
+import androidx.recyclerview.widget.ListAdapter;
+import androidx.recyclerview.widget.RecyclerView;
+
+import org.adaway.R;
+import org.adaway.databinding.LogEntryBinding;
+import org.adaway.db.entity.ListType;
+
+/**
+ * This class is a the {@link RecyclerView.Adapter} for the DNS request log view.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class LogAdapter extends ListAdapter {
+ /**
+ * This callback is use to compare hosts sources.
+ */
+ private static final DiffUtil.ItemCallback DIFF_CALLBACK =
+ new DiffUtil.ItemCallback() {
+ @Override
+ public boolean areItemsTheSame(@NonNull LogEntry oldEntry, @NonNull LogEntry newEntry) {
+ return oldEntry.getHost().equals(newEntry.getHost());
+ }
+
+ @Override
+ public boolean areContentsTheSame(@NonNull LogEntry oldEntry, @NonNull LogEntry newEntry) {
+ return oldEntry.equals(newEntry);
+ }
+ };
+
+ /**
+ * The activity view callback.
+ */
+ private final LogViewCallback callback;
+
+ LogAdapter(LogViewCallback callback) {
+ super(DIFF_CALLBACK);
+ this.callback = callback;
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
+ LogEntryBinding binding = LogEntryBinding.inflate(layoutInflater, parent, false);
+ return new ViewHolder(binding);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ // Get log entry
+ LogEntry entry = getItem(position);
+ // Set host name
+ holder.binding.hostnameTextView.setText(entry.getHost());
+ holder.binding.hostnameTextView.setOnClickListener(v -> this.callback.openHostInBrowser(entry.getHost()));
+ holder.binding.hostnameTextView.setOnLongClickListener(v -> {
+ this.callback.copyHostToClipboard(entry.getHost());
+ return true;
+ });
+ // Set type status
+ bindImageView(holder.binding.blockImageView, BLOCKED, entry);
+ bindImageView(holder.binding.allowImageView, ALLOWED, entry);
+ bindImageView(holder.binding.redirectionImageView, REDIRECTED, entry);
+ }
+
+ private void bindImageView(ImageView imageView, ListType type, LogEntry entry) {
+ if (type == entry.getType()) {
+ int primaryColor = this.callback.getColor(R.color.primary);
+ imageView.setColorFilter(primaryColor, MULTIPLY);
+ imageView.setOnClickListener(v -> this.callback.removeListItem(entry.getHost()));
+ } else {
+ imageView.clearColorFilter();
+ imageView.setOnClickListener(v -> this.callback.addListItem(entry.getHost(), type));
+ }
+ }
+
+ /**
+ * This class is a the {@link RecyclerView.ViewHolder} for the log entry view.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ final org.adaway.databinding.LogEntryBinding binding;
+
+ /**
+ * Constructor.
+ *
+ * @param binding The log entry view binding.
+ */
+ ViewHolder(LogEntryBinding binding) {
+ super(binding.getRoot());
+ this.binding = binding;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/log/LogEntry.java b/app/src/main/java/org/adaway/ui/log/LogEntry.java
new file mode 100644
index 0000000..a27e3d6
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/log/LogEntry.java
@@ -0,0 +1,61 @@
+package org.adaway.ui.log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.adaway.db.entity.ListType;
+
+/**
+ * This class represents a DNS request log entry.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class LogEntry implements Comparable {
+ @NonNull
+ private final String host;
+
+ @Nullable
+ private ListType type;
+
+ LogEntry(@NonNull String host, @Nullable ListType type) {
+ this.host = host;
+ this.type = type;
+ }
+
+ @NonNull
+ public String getHost() {
+ return this.host;
+ }
+
+ @Nullable
+ public ListType getType() {
+ return this.type;
+ }
+
+ public void setType(@Nullable ListType type) {
+ this.type = type;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ LogEntry that = (LogEntry) o;
+
+ if (!host.equals(that.host)) return false;
+ return type == that.type;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = host.hashCode();
+ result = 31 * result + (type != null ? type.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public int compareTo(@NonNull LogEntry o) {
+ return this.host.compareTo(o.host);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/log/LogEntrySort.java b/app/src/main/java/org/adaway/ui/log/LogEntrySort.java
new file mode 100644
index 0000000..f1b7bf4
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/log/LogEntrySort.java
@@ -0,0 +1,70 @@
+package org.adaway.ui.log;
+
+import org.adaway.R;
+
+import java.util.Comparator;
+
+/**
+ * This enumerate represents the kind of sort available for {@link LogEntry}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+enum LogEntrySort {
+ ALPHABETICAL {
+ @Override
+ int getName() {
+ return R.string.log_sort_alphabetical;
+ }
+
+ @Override
+ Comparator comparator() {
+ return LogEntry::compareTo;
+ }
+ },
+ TOP_LEVEL_DOMAIN {
+ @Override
+ int getName() {
+ return R.string.log_sort_top_level_domain;
+ }
+
+ @Override
+ Comparator comparator() {
+ return (entry1, entry2) -> {
+ String[] split1 = entry1.getHost().split("\\.");
+ String[] split2 = entry2.getHost().split("\\.");
+
+ int index1 = split1.length - 1;
+ int index2 = split2.length - 1;
+
+ while (index1 >= 0 && index2 >= 0) {
+ String part1 = split1[index1];
+ String part2 = split2[index2];
+
+ int partCompare = part1.compareTo(part2);
+ if (partCompare != 0) {
+ return partCompare;
+ }
+
+ index1--;
+ index2--;
+ }
+
+ return index1 < 0 ? (index2 < 0 ? 0 : -1) : +1;
+ };
+ }
+ };
+
+ /**
+ * Get the sort name.
+ *
+ * @return The sort name resource identifier.
+ */
+ abstract int getName();
+
+ /**
+ * Get the sort comparator.
+ *
+ * @return The sort comparator.
+ */
+ abstract Comparator comparator();
+}
diff --git a/app/src/main/java/org/adaway/ui/log/LogViewCallback.java b/app/src/main/java/org/adaway/ui/log/LogViewCallback.java
new file mode 100644
index 0000000..25def66
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/log/LogViewCallback.java
@@ -0,0 +1,49 @@
+package org.adaway.ui.log;
+
+import androidx.annotation.NonNull;
+
+import org.adaway.db.entity.ListType;
+
+/**
+ * This class is represents the {@link LogActivity} callback.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public interface LogViewCallback {
+ /**
+ * Add a {@link org.adaway.db.entity.HostListItem}.
+ *
+ * @param hostName The item host name.
+ * @param type The item type.
+ */
+ void addListItem(@NonNull String hostName, @NonNull ListType type);
+
+ /**
+ * Remove a {@link org.adaway.db.entity.HostListItem}
+ *
+ * @param hostName The item host name.
+ */
+ void removeListItem(@NonNull String hostName);
+
+ /**
+ * Open an host into the user browser.
+ *
+ * @param hostName The host name to open.
+ */
+ void openHostInBrowser(@NonNull String hostName);
+
+ /**
+ * Copy an host into the clipboard.
+ *
+ * @param hostName The list to copy hosts.
+ */
+ void copyHostToClipboard(@NonNull String hostName);
+
+ /**
+ * Get color value from color identifier.
+ *
+ * @param colorId The color identifier.
+ * @return The related color value.
+ */
+ int getColor(int colorId);
+}
diff --git a/app/src/main/java/org/adaway/ui/log/LogViewModel.java b/app/src/main/java/org/adaway/ui/log/LogViewModel.java
new file mode 100644
index 0000000..286fa95
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/log/LogViewModel.java
@@ -0,0 +1,151 @@
+package org.adaway.ui.log;
+
+import android.app.Application;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostEntryDao;
+import org.adaway.db.dao.HostListItemDao;
+import org.adaway.db.entity.HostListItem;
+import org.adaway.db.entity.ListType;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.model.adblocking.AdBlockModel;
+import org.adaway.util.AppExecutors;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.adaway.db.entity.HostsSource.USER_SOURCE_ID;
+
+/**
+ * This class is an {@link AndroidViewModel} for the {@link LogActivity}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class LogViewModel extends AndroidViewModel {
+ private final AdBlockModel adBlockModel;
+ private final HostListItemDao hostListItemDao;
+ private final HostEntryDao hostEntryDao;
+ private final MutableLiveData> logEntries;
+ private final MutableLiveData recording;
+ private LogEntrySort sort;
+
+ public LogViewModel(@NonNull Application application) {
+ super(application);
+ this.adBlockModel = ((AdAwayApplication) application).getAdBlockModel();
+ this.hostListItemDao = AppDatabase.getInstance(application).hostsListItemDao();
+ this.hostEntryDao = AppDatabase.getInstance(application).hostEntryDao();
+ this.logEntries = new MutableLiveData<>();
+ this.recording = new MutableLiveData<>(this.adBlockModel.isRecordingLogs());
+ this.sort = LogEntrySort.TOP_LEVEL_DOMAIN;
+ }
+
+ public boolean areBlockedRequestsIgnored() {
+ return this.adBlockModel.getMethod() == AdBlockMethod.ROOT;
+ }
+
+ public LiveData> getLogs() {
+ return this.logEntries;
+ }
+
+ public void clearLogs() {
+ this.adBlockModel.clearLogs();
+ this.logEntries.postValue(Collections.emptyList());
+ }
+
+ public void updateLogs() {
+ AppExecutors.getInstance().diskIO().execute(
+ () -> {
+ // Get tcpdump logs
+ List logItems = this.adBlockModel.getLogs()
+ .parallelStream()
+ .map(log -> {
+ ListType type = this.hostEntryDao.getTypeOfHost(log);
+ return new LogEntry(log, type);
+ })
+ .sorted(this.sort.comparator())
+ .collect(Collectors.toList());
+ // Post result
+ this.logEntries.postValue(logItems);
+ }
+ );
+ }
+
+ public void toggleSort() {
+ this.sortDnsRequests(this.sort == LogEntrySort.ALPHABETICAL ?
+ LogEntrySort.TOP_LEVEL_DOMAIN :
+ LogEntrySort.ALPHABETICAL
+ );
+ }
+
+ public LiveData isRecording() {
+ return this.recording;
+ }
+
+ public void toggleRecording() {
+ boolean recording = !this.adBlockModel.isRecordingLogs();
+ this.adBlockModel.setRecordingLogs(recording);
+ this.recording.postValue(recording);
+ }
+
+ public void addListItem(@NonNull String host, @NonNull ListType type, String redirection) {
+ // Create new host list item
+ HostListItem item = new HostListItem();
+ item.setType(type);
+ item.setHost(host);
+ item.setRedirection(redirection);
+ item.setEnabled(true);
+ item.setSourceId(USER_SOURCE_ID);
+ // Insert host list item
+ AppExecutors.getInstance().diskIO().execute(() -> this.hostListItemDao.insert(item));
+ // Update log entries
+ updateLogEntryType(host, type);
+ }
+
+ public void removeListItem(@NonNull String host) {
+ // Delete host list item
+ AppExecutors.getInstance().diskIO().execute(() -> this.hostListItemDao.deleteUserFromHost(host));
+ // Update log entries
+ updateLogEntryType(host, null);
+ }
+
+ private void updateLogEntryType(@NonNull String host, ListType type) {
+ // Get current values
+ List entries = this.logEntries.getValue();
+ if (entries == null) {
+ return;
+ }
+ // Update entry type
+ List updatedEntries = entries.stream()
+ .map(entry -> entry.getHost().equals(host) ? new LogEntry(host, type) : entry)
+ .collect(Collectors.toList());
+ // Post new values
+ this.logEntries.postValue(updatedEntries);
+ }
+
+ private void sortDnsRequests(LogEntrySort sort) {
+ // Save current sort
+ this.sort = sort;
+ // Apply sort to values
+ List entries = this.logEntries.getValue();
+ if (entries != null) {
+ List sortedEntries = new ArrayList<>(entries);
+ sortedEntries.sort(this.sort.comparator());
+ this.logEntries.postValue(sortedEntries);
+ }
+ // Notify user
+ Toast.makeText(
+ getApplication(),
+ this.sort.getName(),
+ Toast.LENGTH_SHORT
+ ).show();
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/PrefsActivity.java b/app/src/main/java/org/adaway/ui/prefs/PrefsActivity.java
new file mode 100644
index 0000000..769e071
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/PrefsActivity.java
@@ -0,0 +1,96 @@
+package org.adaway.ui.prefs;
+
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import org.adaway.R;
+import org.adaway.helper.ThemeHelper;
+
+/**
+ * This activity is the preferences activity.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PrefsActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+ static final String PREFERENCE_NOT_FOUND = "preference not found";
+
+ static void setAppBarTitle(PreferenceFragmentCompat fragment, @StringRes int title) {
+ FragmentActivity activity = fragment.getActivity();
+ if (!(activity instanceof PrefsActivity)) {
+ return;
+ }
+ ActionBar supportActionBar = ((PrefsActivity) activity).getSupportActionBar();
+ if (supportActionBar != null) {
+ supportActionBar.setTitle(title);
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ /*
+ * Set view content.
+ */
+ setContentView(R.layout.prefs_activity);
+ if (savedInstanceState == null) {
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(R.id.settings_container, new PrefsMainFragment())
+ .commit();
+ }
+ /*
+ * Configure actionbar.
+ */
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
+ getSupportFragmentManager().popBackStack();
+ } else {
+ super.onSupportNavigateUp();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onPreferenceStartFragment(@NonNull PreferenceFragmentCompat caller, Preference pref) {
+ // Instantiate the new fragment
+ String fragmentClassName = pref.getFragment();
+ if (fragmentClassName == null) {
+ return false;
+ }
+ Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
+ getClassLoader(),
+ fragmentClassName
+ );
+ Bundle args = pref.getExtras();
+ fragment.setArguments(args);
+ // See https://developer.android.com/guide/topics/ui/settings/organize-your-settings#java
+ //noinspection deprecation
+ fragment.setTargetFragment(caller, 0);
+ // Replace the existing Fragment with the new Fragment
+ getSupportFragmentManager().beginTransaction()
+ .setCustomAnimations(
+ R.animator.fragment_open_enter, R.animator.fragment_open_exit,
+ R.animator.fragment_close_enter, R.animator.fragment_close_exit
+ )
+ .replace(R.id.settings_container, fragment)
+ .addToBackStack(null)
+ .commit();
+ return true;
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/PrefsBackupRestoreFragment.java b/app/src/main/java/org/adaway/ui/prefs/PrefsBackupRestoreFragment.java
new file mode 100644
index 0000000..af53330
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/PrefsBackupRestoreFragment.java
@@ -0,0 +1,115 @@
+package org.adaway.ui.prefs;
+
+import static android.content.Intent.CATEGORY_OPENABLE;
+import static org.adaway.ui.prefs.PrefsActivity.PREFERENCE_NOT_FOUND;
+import static org.adaway.util.Constants.PREFS_NAME;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.CreateDocument;
+import androidx.activity.result.contract.ActivityResultContracts.OpenDocument;
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import org.adaway.R;
+import org.adaway.model.backup.BackupExporter;
+import org.adaway.model.backup.BackupImporter;
+
+/**
+ * This fragment is the preferences fragment for backup and restore block rules.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PrefsBackupRestoreFragment extends PreferenceFragmentCompat {
+ /**
+ * The backup mime type.
+ */
+ private static final String JSON_MIME_TYPE = "application/json";
+ /**
+ * The default backup file name.
+ */
+ private static final String BACKUP_FILE_NAME = "adaway-backup.json";
+ /**
+ * The launcher to start import backup activity.
+ */
+ private ActivityResultLauncher importActivityLauncher;
+ /**
+ * The launcher to start export backup activity.
+ */
+ private ActivityResultLauncher exportActivityLauncher;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ // Configure preferences
+ getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
+ addPreferencesFromResource(R.xml.preferences_backup_restore);
+ // Register for activities
+ registerForImportActivity();
+ registerForExportActivity();
+ // Bind pref actions
+ bindBackupPref();
+ bindRestorePref();
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ PrefsActivity.setAppBarTitle(this, R.string.pref_backup_restore_title);
+ }
+
+ private void registerForImportActivity() {
+ this.importActivityLauncher = registerForActivityResult(new OpenDocument() {
+ @NonNull
+ @Override
+ public Intent createIntent(@NonNull Context context, @NonNull String[] input) {
+ return super.createIntent(context, input)
+ .addCategory(CATEGORY_OPENABLE);
+ }
+ }, backupUri -> {
+ if (backupUri != null) {
+ BackupImporter.importFromBackup(requireContext(), backupUri);
+ }
+ });
+ }
+
+ private void registerForExportActivity() {
+ this.exportActivityLauncher = registerForActivityResult(
+ new CreateDocument(JSON_MIME_TYPE),
+ backupUri -> {
+ if (backupUri != null) {
+ BackupExporter.exportToBackup(requireContext(), backupUri);
+ }
+ });
+ }
+
+ private void bindBackupPref() {
+ Preference backupPreference = findPreference(getString(R.string.pref_backup_key));
+ assert backupPreference != null : PREFERENCE_NOT_FOUND;
+ backupPreference.setOnPreferenceClickListener(preference -> {
+ this.exportActivityLauncher.launch(BACKUP_FILE_NAME);
+ return true;
+ });
+ }
+
+ private void bindRestorePref() {
+ Preference backupPreference = findPreference(getString(R.string.pref_restore_key));
+ assert backupPreference != null : PREFERENCE_NOT_FOUND;
+ backupPreference.setOnPreferenceClickListener(preference -> {
+ String[] mimeTypes;
+ if (Build.VERSION.SDK_INT < 28) {
+ mimeTypes = new String[]{"*/*"};
+ } else if (Build.VERSION.SDK_INT < 29) {
+ mimeTypes = new String[]{JSON_MIME_TYPE, "application/octet-stream"};
+ } else {
+ mimeTypes = new String[]{JSON_MIME_TYPE};
+ }
+ this.importActivityLauncher.launch(mimeTypes);
+ return true;
+ });
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/PrefsMainFragment.java b/app/src/main/java/org/adaway/ui/prefs/PrefsMainFragment.java
new file mode 100644
index 0000000..7ad6997
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/PrefsMainFragment.java
@@ -0,0 +1,81 @@
+package org.adaway.ui.prefs;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import org.adaway.R;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.model.adblocking.AdBlockMethod;
+import org.adaway.util.log.SentryLog;
+
+import static org.adaway.model.adblocking.AdBlockMethod.ROOT;
+import static org.adaway.model.adblocking.AdBlockMethod.VPN;
+import static org.adaway.ui.prefs.PrefsActivity.PREFERENCE_NOT_FOUND;
+import static org.adaway.util.Constants.PREFS_NAME;
+
+/**
+ * This fragment is the preferences main fragment.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PrefsMainFragment extends PreferenceFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ // Configure preferences
+ getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
+ addPreferencesFromResource(R.xml.preferences_main);
+ // Bind pref actions
+ bindThemePrefAction();
+ bindAdBlockMethod();
+ bindTelemetryPrefAction();
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ PrefsActivity.setAppBarTitle(this, R.string.pref_main_title);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ PrefsActivity.setAppBarTitle(this, R.string.pref_main_title);
+ }
+
+ private void bindThemePrefAction() {
+ Preference darkThemePref = findPreference(getString(R.string.pref_dark_theme_mode_key));
+ assert darkThemePref != null : PREFERENCE_NOT_FOUND;
+ darkThemePref.setOnPreferenceChangeListener((preference, newValue) -> {
+ requireActivity().recreate();
+ // Allow preference change
+ return true;
+ });
+ }
+
+ private void bindAdBlockMethod() {
+ Preference rootPreference = findPreference(getString(R.string.pref_root_ad_block_method_key));
+ assert rootPreference != null : PREFERENCE_NOT_FOUND;
+ Preference vpnPreference = findPreference(getString(R.string.pref_vpn_ad_block_method_key));
+ assert vpnPreference != null : PREFERENCE_NOT_FOUND;
+ AdBlockMethod adBlockMethod = PreferenceHelper.getAdBlockMethod(requireContext());
+ rootPreference.setEnabled(adBlockMethod == ROOT);
+ vpnPreference.setEnabled(adBlockMethod == VPN);
+ }
+
+ private void bindTelemetryPrefAction() {
+ Preference enableTelemetryPref = findPreference(getString(R.string.pref_enable_telemetry_key));
+ assert enableTelemetryPref != null : PREFERENCE_NOT_FOUND;
+ enableTelemetryPref.setOnPreferenceChangeListener((preference, newValue) -> {
+ SentryLog.setEnabled(requireActivity().getApplication(), (boolean) newValue);
+ return true;
+ });
+ if (SentryLog.isStub()) {
+ enableTelemetryPref.setEnabled(false);
+ enableTelemetryPref.setSummary(R.string.pref_enable_telemetry_disabled_summary);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/PrefsRootFragment.java b/app/src/main/java/org/adaway/ui/prefs/PrefsRootFragment.java
new file mode 100644
index 0000000..923d047
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/PrefsRootFragment.java
@@ -0,0 +1,284 @@
+package org.adaway.ui.prefs;
+
+import static android.os.Build.VERSION.SDK_INT;
+import static android.provider.Settings.ACTION_SECURITY_SETTINGS;
+import static android.widget.Toast.LENGTH_SHORT;
+import static org.adaway.model.root.MountType.READ_ONLY;
+import static org.adaway.model.root.MountType.READ_WRITE;
+import static org.adaway.model.root.ShellUtils.isWritable;
+import static org.adaway.model.root.ShellUtils.remountPartition;
+import static org.adaway.ui.prefs.PrefsActivity.PREFERENCE_NOT_FOUND;
+import static org.adaway.util.Constants.ANDROID_SYSTEM_ETC_HOSTS;
+import static org.adaway.util.Constants.PREFS_NAME;
+import static org.adaway.util.WebServerUtils.TEST_URL;
+import static org.adaway.util.WebServerUtils.copyCertificate;
+import static org.adaway.util.WebServerUtils.getWebServerState;
+import static org.adaway.util.WebServerUtils.installCertificate;
+import static org.adaway.util.WebServerUtils.isWebServerRunning;
+import static org.adaway.util.WebServerUtils.startWebServer;
+import static org.adaway.util.WebServerUtils.stopWebServer;
+
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
+import android.widget.Toast;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.SwitchPreferenceCompat;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.google.common.net.InetAddresses;
+
+import org.adaway.R;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.ui.dialog.MissingAppDialog;
+import org.adaway.util.AppExecutors;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+
+import timber.log.Timber;
+
+/**
+ * This fragment is the preferences fragment for root ad blocker.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PrefsRootFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
+ /**
+ * The webserver certificate mime type.
+ */
+ private static final String CERTIFICATE_MIME_TYPE = "application/x-x509-ca-cert";
+ /**
+ * The launcher to start open hosts file activity.
+ */
+ private ActivityResultLauncher openHostsFileLauncher;
+ /**
+ * The launcher to prepare web service certificate activity.
+ */
+ private ActivityResultLauncher prepareCertificateLauncher;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ // Configure preferences
+ getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
+ addPreferencesFromResource(R.xml.preferences_root);
+ // Register for activities
+ registerForOpenHostActivity();
+ registerForPrepareCertificateActivity();
+ // Bind pref actions
+ bindOpenHostsFile();
+ bindRedirection();
+ bindWebServerPrefAction();
+ bindWebServerTest();
+ bindWebServerCertificate();
+ // Update current state
+ updateWebServerState();
+ // Register as listener
+ getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ PrefsActivity.setAppBarTitle(this, R.string.pref_root_title);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // Update current state
+ updateWebServerState();
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ // Unregister as listener
+ getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ Context context = requireContext();
+ // Restart web server on icon change
+ if (context.getString(R.string.pref_webserver_icon_key).equals(key) && isWebServerRunning()) {
+ stopWebServer();
+ startWebServer(context);
+ updateWebServerState();
+ }
+ }
+
+ private void registerForOpenHostActivity() {
+ this.openHostsFileLauncher = registerForActivityResult(new StartActivityForResult(), result -> {
+ try {
+ File hostFile = new File(ANDROID_SYSTEM_ETC_HOSTS).getCanonicalFile();
+ remountPartition(hostFile, READ_ONLY);
+ } catch (IOException e) {
+ Timber.e(e, "Failed to get hosts canonical file.");
+ }
+ });
+ }
+
+ private void registerForPrepareCertificateActivity() {
+ this.prepareCertificateLauncher = registerForActivityResult(
+ new ActivityResultContracts.CreateDocument(CERTIFICATE_MIME_TYPE),
+ this::prepareWebServerCertificate
+ );
+ }
+
+ private void bindOpenHostsFile() {
+ Preference openHostsFilePreference = findPreference(getString(R.string.pref_open_hosts_key));
+ assert openHostsFilePreference != null : PREFERENCE_NOT_FOUND;
+ openHostsFilePreference.setOnPreferenceClickListener(this::openHostsFile);
+ }
+
+ private boolean openHostsFile(Preference preference) {
+ try {
+ File hostFile = new File(ANDROID_SYSTEM_ETC_HOSTS).getCanonicalFile();
+ boolean remount = !isWritable(hostFile) && remountPartition(hostFile, READ_WRITE);
+ Intent intent = new Intent()
+ .setAction(Intent.ACTION_VIEW)
+ .setDataAndType(Uri.parse("file://" + hostFile.getAbsolutePath()), "text/plain");
+ if (remount) {
+ this.openHostsFileLauncher.launch(intent);
+ } else {
+ startActivity(intent);
+ }
+ return true;
+ } catch (IOException e) {
+ Timber.e(e, "Failed to get hosts canonical file.");
+ } catch (ActivityNotFoundException e) {
+ MissingAppDialog.showTextEditorMissingDialog(getContext());
+ return false;
+ }
+ return false;
+ }
+
+ private void bindRedirection() {
+ Context context = requireContext();
+ boolean ipv6Enabled = PreferenceHelper.getEnableIpv6(context);
+ Preference ipv4RedirectionPreference = findPreference(getString(R.string.pref_redirection_ipv4_key));
+ assert ipv4RedirectionPreference != null : PREFERENCE_NOT_FOUND;
+ ipv4RedirectionPreference.setOnPreferenceChangeListener(
+ (preference, newValue) -> validateRedirection(Inet4Address.class, (String) newValue)
+ );
+ Preference ipv6RedirectionPreference = findPreference(getString(R.string.pref_redirection_ipv6_key));
+ assert ipv6RedirectionPreference != null : PREFERENCE_NOT_FOUND;
+ ipv6RedirectionPreference.setEnabled(ipv6Enabled);
+ ipv6RedirectionPreference.setOnPreferenceChangeListener(
+ (preference, newValue) -> validateRedirection(Inet6Address.class, (String) newValue)
+ );
+ }
+
+ private boolean validateRedirection(Class extends InetAddress> addressType, String redirection) {
+ boolean valid;
+ try {
+ InetAddress inetAddress = InetAddresses.forString(redirection);
+ valid = addressType.isAssignableFrom(inetAddress.getClass());
+ } catch (IllegalArgumentException exception) {
+ valid = false;
+ }
+ if (!valid) {
+ Toast.makeText(requireContext(), R.string.pref_redirection_invalid, LENGTH_SHORT).show();
+ }
+ return valid;
+ }
+
+ private void bindWebServerPrefAction() {
+ Context context = requireContext();
+ // Start web server when preference is enabled
+ SwitchPreferenceCompat webServerEnabledPref = findPreference(getString(R.string.pref_webserver_enabled_key));
+ assert webServerEnabledPref != null : PREFERENCE_NOT_FOUND;
+ webServerEnabledPref.setOnPreferenceChangeListener((preference, newValue) -> {
+ if (newValue.equals(true)) {
+ // Start web server
+ startWebServer(context);
+ updateWebServerState();
+ return isWebServerRunning();
+ } else {
+ // Stop web server
+ stopWebServer();
+ updateWebServerState();
+ return !isWebServerRunning();
+ }
+ });
+ }
+
+ private void bindWebServerTest() {
+ Preference webServerTest = findPreference(getString(R.string.pref_webserver_test_key));
+ assert webServerTest != null : PREFERENCE_NOT_FOUND;
+ webServerTest.setOnPreferenceClickListener(preference -> {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(TEST_URL));
+ startActivity(intent);
+ return true;
+ });
+ }
+
+ private void bindWebServerCertificate() {
+ Preference webServerTest = findPreference(getString(R.string.pref_webserver_certificate_key));
+ assert webServerTest != null : PREFERENCE_NOT_FOUND;
+ webServerTest.setOnPreferenceClickListener(preference -> {
+ if (SDK_INT < VERSION_CODES.R) {
+ installCertificate(requireContext());
+ } else {
+ this.prepareCertificateLauncher.launch("adaway-webserver-certificate.crt");
+ }
+ return true;
+ });
+ }
+
+ private void prepareWebServerCertificate(Uri uri) {
+ // Check user selected document
+ if (uri == null) {
+ return;
+ }
+ Timber.d("Certificate URI: %s", uri);
+ copyCertificate(requireActivity(), uri);
+ new MaterialAlertDialogBuilder(requireContext())
+ .setCancelable(true)
+ .setTitle(R.string.pref_webserver_certificate_dialog_title)
+ .setMessage(R.string.pref_webserver_certificate_dialog_content)
+ .setPositiveButton(
+ R.string.pref_webserver_certificate_dialog_action,
+ (dialog, which) -> {
+ dialog.dismiss();
+ Intent intent = new Intent(ACTION_SECURITY_SETTINGS);
+ startActivity(intent);
+ })
+ .create()
+ .show();
+ }
+
+ private void updateWebServerState() {
+ Preference webServerTest = findPreference(getString(R.string.pref_webserver_test_key));
+ assert webServerTest != null : PREFERENCE_NOT_FOUND;
+ webServerTest.setSummary(R.string.pref_webserver_state_checking);
+ AppExecutors executors = AppExecutors.getInstance();
+ executors.networkIO().execute(() -> {
+ // Wait for server to start
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ int summaryResId = getWebServerState();
+ executors.mainThread().execute(
+ () -> webServerTest.setSummary(summaryResId)
+ );
+ }
+ );
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/PrefsUpdateFragment.java b/app/src/main/java/org/adaway/ui/prefs/PrefsUpdateFragment.java
new file mode 100644
index 0000000..19f670c
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/PrefsUpdateFragment.java
@@ -0,0 +1,127 @@
+package org.adaway.ui.prefs;
+
+import static android.Manifest.permission.POST_NOTIFICATIONS;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.os.Build.VERSION.SDK_INT;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.provider.Settings.ACTION_APP_NOTIFICATION_SETTINGS;
+import static android.provider.Settings.EXTRA_APP_PACKAGE;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.SwitchPreferenceCompat;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.R;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.model.source.SourceUpdateService;
+import org.adaway.model.update.ApkUpdateService;
+import org.adaway.model.update.UpdateStore;
+
+import static org.adaway.model.update.UpdateStore.ADAWAY;
+import static org.adaway.ui.prefs.PrefsActivity.PREFERENCE_NOT_FOUND;
+import static org.adaway.util.Constants.PREFS_NAME;
+
+/**
+ * This fragment is the preferences fragment for update settings.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PrefsUpdateFragment extends PreferenceFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ // Configure preferences
+ getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
+ addPreferencesFromResource(R.xml.preferences_update);
+ // Bind pref actions
+ bindNotificationPreferencesAction();
+ bindAppUpdatePrefAction();
+ bindAppChannelPrefAction();
+ bindHostsUpdatePrefAction();
+ // Update current state
+ updateNotificationPreferencesState();
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ PrefsActivity.setAppBarTitle(this, R.string.pref_update_title);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateNotificationPreferencesState();
+ }
+
+ private void bindNotificationPreferencesAction() {
+ Context context = requireContext();
+ Preference openNotificationPref = findPreference(getString(R.string.pref_update_open_notification_preferences_key));
+ assert openNotificationPref != null : PREFERENCE_NOT_FOUND;
+ openNotificationPref.setOnPreferenceClickListener(preference -> {
+ Intent settingsIntent = new Intent(ACTION_APP_NOTIFICATION_SETTINGS)
+ .addFlags(FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(EXTRA_APP_PACKAGE, context.getPackageName());
+ context.startActivity(settingsIntent);
+ return true;
+ });
+ }
+
+ private void bindAppUpdatePrefAction() {
+ Context context = requireContext();
+ SwitchPreferenceCompat checkAppDailyPref = findPreference(getString(R.string.pref_update_check_app_daily_key));
+ assert checkAppDailyPref != null : PREFERENCE_NOT_FOUND;
+ checkAppDailyPref.setOnPreferenceChangeListener((preference, newValue) -> {
+ if (Boolean.TRUE.equals(newValue)) {
+ ApkUpdateService.enable(context);
+ } else {
+ ApkUpdateService.disable(context);
+ }
+ return true;
+ });
+ }
+
+ private void bindAppChannelPrefAction() {
+ Context context = requireContext();
+ AdAwayApplication application = (AdAwayApplication) context.getApplicationContext();
+ UpdateStore store = application.getUpdateModel().getStore();
+ Preference includeBetaReleasesPref = findPreference(getString(R.string.pref_update_include_beta_releases_key));
+ assert includeBetaReleasesPref != null : PREFERENCE_NOT_FOUND;
+ includeBetaReleasesPref.setEnabled(store == ADAWAY);
+ }
+
+ private void bindHostsUpdatePrefAction() {
+ Context context = requireContext();
+ Preference checkHostsDailyPref = findPreference(getString(R.string.pref_update_check_hosts_daily_key));
+ assert checkHostsDailyPref != null : PREFERENCE_NOT_FOUND;
+ checkHostsDailyPref.setOnPreferenceChangeListener((preference, newValue) -> {
+ if (Boolean.TRUE.equals(newValue)) {
+ boolean unmeteredNetworkOnly = PreferenceHelper.getUpdateOnlyOnWifi(context);
+ SourceUpdateService.enable(context, unmeteredNetworkOnly);
+ } else {
+ SourceUpdateService.disable(context);
+ }
+ return true;
+ });
+ Preference updateOnlyOnWifiPref = findPreference(this.getString(R.string.pref_update_only_on_wifi_key));
+ assert updateOnlyOnWifiPref != null : PREFERENCE_NOT_FOUND;
+ updateOnlyOnWifiPref.setOnPreferenceChangeListener((preference, newValue) -> {
+ SourceUpdateService.enable(context, Boolean.TRUE.equals(newValue));
+ return true;
+ });
+ }
+
+ private void updateNotificationPreferencesState() {
+ Context context = requireContext();
+ Preference openNotificationPref = findPreference(getString(R.string.pref_update_open_notification_preferences_key));
+ assert openNotificationPref != null : PREFERENCE_NOT_FOUND;
+ boolean notificationsDisabled = SDK_INT >= TIRAMISU && context.checkSelfPermission(POST_NOTIFICATIONS) != PERMISSION_GRANTED;
+ openNotificationPref.setVisible(notificationsDisabled);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/PrefsVpnFragment.java b/app/src/main/java/org/adaway/ui/prefs/PrefsVpnFragment.java
new file mode 100644
index 0000000..6e2ad8a
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/PrefsVpnFragment.java
@@ -0,0 +1,81 @@
+package org.adaway.ui.prefs;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
+import androidx.annotation.NonNull;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import org.adaway.R;
+import org.adaway.ui.prefs.exclusion.PrefsVpnExcludedAppsActivity;
+import org.adaway.vpn.VpnServiceControls;
+
+import static org.adaway.ui.prefs.PrefsActivity.PREFERENCE_NOT_FOUND;
+import static org.adaway.util.Constants.PREFS_NAME;
+
+/**
+ * This fragment is the preferences fragment for VPN ad blocker.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PrefsVpnFragment extends PreferenceFragmentCompat {
+ private ActivityResultLauncher startActivityLauncher;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ // Configure preferences
+ getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
+ addPreferencesFromResource(R.xml.preferences_vpn);
+ // Register for activity
+ registerForStartActivity();
+ // Bind pref actions
+ bindExcludedSystemApps();
+ bindExcludedUserApps();
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ PrefsActivity.setAppBarTitle(this, R.string.pref_vpn_title);
+ }
+
+ private void registerForStartActivity() {
+ this.startActivityLauncher = registerForActivityResult(
+ new StartActivityForResult(),
+ result -> restartVpn()
+ );
+ }
+
+ private void bindExcludedSystemApps() {
+ ListPreference excludeUserAppsPreferences = findPreference(getString(R.string.pref_vpn_excluded_system_apps_key));
+ assert excludeUserAppsPreferences != null : PREFERENCE_NOT_FOUND;
+ excludeUserAppsPreferences.setOnPreferenceChangeListener((preference, newValue) -> {
+ restartVpn();
+ return true;
+ });
+ }
+
+ private void bindExcludedUserApps() {
+ Context context = requireContext();
+ Preference excludeUserAppsPreferences = findPreference(getString(R.string.pref_vpn_excluded_user_apps_key));
+ assert excludeUserAppsPreferences != null : PREFERENCE_NOT_FOUND;
+ excludeUserAppsPreferences.setOnPreferenceClickListener(preference -> {
+ Intent intent = new Intent(context, PrefsVpnExcludedAppsActivity.class);
+ this.startActivityLauncher.launch(intent);
+ return true;
+ });
+ }
+
+ private void restartVpn() {
+ Context context = requireContext();
+ if (VpnServiceControls.isRunning(context)) {
+ VpnServiceControls.stop(context);
+ VpnServiceControls.start(context);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/exclusion/ExcludedAppController.java b/app/src/main/java/org/adaway/ui/prefs/exclusion/ExcludedAppController.java
new file mode 100644
index 0000000..fa759b1
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/exclusion/ExcludedAppController.java
@@ -0,0 +1,26 @@
+package org.adaway.ui.prefs.exclusion;
+
+/**
+ * This fragment is the preferences fragment for VPN ad blocker.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public interface ExcludedAppController {
+ /**
+ * Get installed user applications.
+ * @return The installed user applications.
+ */
+ UserApp[] getUserApplications();
+
+ /**
+ * Exclude applications from VPN.
+ * @param applications The applications to exclude.
+ */
+ void excludeApplications(UserApp... applications);
+
+ /**
+ * Include applications into VPN.
+ * @param applications The application to include.
+ */
+ void includeApplications(UserApp... applications);
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/exclusion/PrefsVpnExcludedAppsActivity.java b/app/src/main/java/org/adaway/ui/prefs/exclusion/PrefsVpnExcludedAppsActivity.java
new file mode 100644
index 0000000..f56adb4
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/exclusion/PrefsVpnExcludedAppsActivity.java
@@ -0,0 +1,131 @@
+package org.adaway.ui.prefs.exclusion;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import org.adaway.R;
+import org.adaway.databinding.VpnExcludedAppActivityBinding;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.helper.ThemeHelper;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * This activity is the activity to select excluded applications from VPN.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PrefsVpnExcludedAppsActivity extends AppCompatActivity implements ExcludedAppController {
+ private UserApp[] userApplications;
+ private UserAppRecycleViewAdapter adapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ /*
+ * Create activity.
+ */
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ VpnExcludedAppActivityBinding binding = VpnExcludedAppActivityBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ /*
+ * Configure recycler view.
+ */
+ // Get recycler view
+ binding.vpnExcludedAppList.setHasFixedSize(true);
+ // Defile recycler layout
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ binding.vpnExcludedAppList.setLayoutManager(linearLayoutManager);
+ // Create recycler adapter
+ this.userApplications = getUserApplications();
+ this.adapter = new UserAppRecycleViewAdapter(this);
+ binding.vpnExcludedAppList.setAdapter(this.adapter);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater menuInflater = getMenuInflater();
+ menuInflater.inflate(R.menu.vpn_excluded_app_menu, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ } else if (item.getItemId() == R.id.select_all) {
+ excludeApplications(this.userApplications);
+ this.adapter.notifyItemRangeChanged(0, this.adapter.getItemCount());
+ return true;
+ } else if (item.getItemId() == R.id.deselect_all) {
+ includeApplications(this.userApplications);
+ this.adapter.notifyItemRangeChanged(0, this.adapter.getItemCount());
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public UserApp[] getUserApplications() {
+ if (this.userApplications == null) {
+ PackageManager packageManager = getPackageManager();
+ ApplicationInfo self = getApplicationInfo();
+ Set excludedApps = PreferenceHelper.getVpnExcludedApps(this);
+
+ this.userApplications = packageManager.getInstalledApplications(0).stream()
+ .filter(applicationInfo -> (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
+ .filter(applicationInfo -> !Objects.equals(applicationInfo.name, self.name))
+ .map(applicationInfo -> new UserApp(
+ packageManager.getApplicationLabel(applicationInfo),
+ applicationInfo.packageName,
+ packageManager.getApplicationIcon(applicationInfo),
+ excludedApps.contains(applicationInfo.packageName)
+ ))
+ .sorted()
+ .toArray(UserApp[]::new);
+ }
+ return this.userApplications;
+ }
+
+ @Override
+ public void excludeApplications(UserApp... applications) {
+ for (UserApp application : applications) {
+ application.excluded = true;
+ }
+ updatePreferences();
+ }
+
+ @Override
+ public void includeApplications(UserApp... applications) {
+ for (UserApp application : applications) {
+ application.excluded = false;
+ }
+ updatePreferences();
+ }
+
+ private void updatePreferences() {
+ Set excludedApplicationPackageNames = Arrays.stream(this.userApplications)
+ .filter(userApp -> userApp.excluded)
+ .map(userApp -> userApp.packageName.toString())
+ .collect(Collectors.toSet());
+ PreferenceHelper.setVpnExcludedApps(this, excludedApplicationPackageNames);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/exclusion/UserApp.java b/app/src/main/java/org/adaway/ui/prefs/exclusion/UserApp.java
new file mode 100644
index 0000000..d943115
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/exclusion/UserApp.java
@@ -0,0 +1,27 @@
+package org.adaway.ui.prefs.exclusion;
+
+import android.graphics.drawable.Drawable;
+
+/**
+ * This class represents an installed user application to exclude / include into the VPN.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class UserApp implements Comparable {
+ final String name;
+ final CharSequence packageName;
+ final Drawable icon;
+ boolean excluded;
+
+ UserApp(CharSequence name, CharSequence packageName, Drawable icon, boolean excluded) {
+ this.name = name.toString();
+ this.packageName = packageName;
+ this.icon = icon;
+ this.excluded = excluded;
+ }
+
+ @Override
+ public int compareTo(UserApp o) {
+ return this.name.compareTo(o.name);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/prefs/exclusion/UserAppRecycleViewAdapter.java b/app/src/main/java/org/adaway/ui/prefs/exclusion/UserAppRecycleViewAdapter.java
new file mode 100644
index 0000000..99d86a9
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/prefs/exclusion/UserAppRecycleViewAdapter.java
@@ -0,0 +1,83 @@
+package org.adaway.ui.prefs.exclusion;
+
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import org.adaway.databinding.VpnExcludedAppEntryBinding;
+
+/**
+ * This class is the {@link RecyclerView.Adapter} for the {@link PrefsVpnExcludedAppsActivity}.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class UserAppRecycleViewAdapter extends RecyclerView.Adapter {
+ private final ExcludedAppController controller;
+
+ /**
+ * Constructor.
+ *
+ * @param controller The user applications.
+ */
+ UserAppRecycleViewAdapter(ExcludedAppController controller) {
+ this.controller = controller;
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
+ VpnExcludedAppEntryBinding binding = VpnExcludedAppEntryBinding.inflate(layoutInflater, parent, false);
+ return new ViewHolder(binding);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ UserApp[] applications = this.controller.getUserApplications();
+ if (position < 0 || position >= applications.length) {
+ return;
+ }
+ UserApp application = applications[position];
+ holder.binding.rowLayout.setOnClickListener(
+ v -> holder.binding.excludedSwitch.setChecked(!holder.binding.excludedSwitch.isChecked())
+ );
+ holder.binding.iconImageView.setImageDrawable(application.icon);
+ holder.binding.nameTextView.setText(application.name);
+ holder.binding.packageTextView.setText(application.packageName);
+ holder.binding.excludedSwitch.setOnCheckedChangeListener(null);
+ holder.binding.excludedSwitch.setChecked(application.excluded);
+ holder.binding.excludedSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ if (isChecked) {
+ this.controller.excludeApplications(application);
+ } else {
+ this.controller.includeApplications(application);
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return this.controller.getUserApplications().length;
+ }
+
+ /**
+ * This class is a the {@link RecyclerView.ViewHolder} for the app list view.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ final VpnExcludedAppEntryBinding binding;
+
+ /**
+ * Constructor.
+ *
+ * @param binding The hosts sources view binding.
+ */
+ ViewHolder(VpnExcludedAppEntryBinding binding) {
+ super(binding.getRoot());
+ this.binding = binding;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/source/SourceEditActivity.java b/app/src/main/java/org/adaway/ui/source/SourceEditActivity.java
new file mode 100644
index 0000000..d5ec4d9
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/source/SourceEditActivity.java
@@ -0,0 +1,257 @@
+package org.adaway.ui.source;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+
+import org.adaway.R;
+import org.adaway.databinding.SourceEditActivityBinding;
+import org.adaway.db.AppDatabase;
+import org.adaway.db.dao.HostsSourceDao;
+import org.adaway.db.entity.HostsSource;
+import org.adaway.helper.ThemeHelper;
+import org.adaway.util.AppExecutors;
+
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+import static java.util.Objects.requireNonNull;
+import static org.adaway.ui.Animations.hideView;
+import static org.adaway.ui.Animations.setHidden;
+import static org.adaway.ui.Animations.setShown;
+import static org.adaway.ui.Animations.showView;
+
+/**
+ * This activity create, edit and delete a hosts source.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class SourceEditActivity extends AppCompatActivity {
+ /**
+ * The source identifier extra.
+ */
+ public static final String SOURCE_ID = "sourceId";
+ /**
+ * The any type mime type.
+ */
+ private static final String ANY_MIME_TYPE = "*/*";
+ private static final Executor DISK_IO_EXECUTOR = AppExecutors.getInstance().diskIO();
+ private static final Executor MAIN_THREAD_EXECUTOR = AppExecutors.getInstance().mainThread();
+
+ private SourceEditActivityBinding binding;
+ private HostsSourceDao hostsSourceDao;
+ private ActivityResultLauncher startActivityLauncher;
+ private boolean editing;
+ private HostsSource edited;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ /*
+ * Set view content.
+ */
+ this.binding = SourceEditActivityBinding.inflate(getLayoutInflater());
+ setContentView(this.binding.getRoot());
+ /*
+ * Configure actionbar.
+ */
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ /*
+ * Get database access.
+ */
+ AppDatabase database = AppDatabase.getInstance(this);
+ this.hostsSourceDao = database.hostsSourceDao();
+ // Register for activity
+ registerForStartActivity();
+ // Set up values
+ checkInitialValueFromIntent();
+ }
+
+ private void registerForStartActivity() {
+ this.startActivityLauncher = registerForActivityResult(new StartActivityForResult(), result -> {
+ Uri uri;
+ Intent data = result.getData();
+ if (result.getResultCode() == RESULT_OK
+ && data != null
+ && (uri = data.getData()) != null) {
+ // Persist read permission
+ getContentResolver().takePersistableUriPermission(uri, FLAG_GRANT_READ_URI_PERMISSION);
+ // Update file location
+ this.binding.fileLocationTextView.setText(uri.toString());
+ this.binding.fileLocationTextView.setError(null);
+ }
+ });
+ }
+
+ private void checkInitialValueFromIntent() {
+ Intent intent = getIntent();
+ int sourceId = intent.getIntExtra(SOURCE_ID, -1);
+ this.editing = sourceId != -1;
+ if (this.editing) {
+ DISK_IO_EXECUTOR.execute(() -> {
+ Optional hostsSource = this.hostsSourceDao.getById(sourceId);
+ hostsSource.ifPresent(source -> {
+ this.edited = source;
+ MAIN_THREAD_EXECUTOR.execute(() -> {
+ applyInitialValues(source);
+ bindLocation();
+ bindFormats();
+ });
+ });
+ });
+ } else {
+ setTitle(R.string.source_edit_add_title);
+ bindLocation();
+ bindFormats();
+ }
+ }
+
+ private void applyInitialValues(HostsSource source) {
+ this.binding.labelEditText.setText(source.getLabel());
+ this.binding.blockFormatButton.setChecked(!source.isAllowEnabled());
+ this.binding.allowFormatButton.setChecked(source.isAllowEnabled());
+ switch (source.getType()) {
+ case URL:
+ this.binding.typeButtonGroup.check(R.id.url_button);
+ this.binding.locationEditText.setText(source.getUrl());
+ break;
+ case FILE:
+ this.binding.typeButtonGroup.check(R.id.file_button);
+ this.binding.fileLocationTextView.setText(source.getUrl());
+ this.binding.fileLocationTextView.setVisibility(VISIBLE);
+ this.binding.urlTextInputLayout.setVisibility(INVISIBLE);
+ break;
+ }
+ this.binding.redirectedHostsCheckbox.setChecked(source.isRedirectEnabled());
+ if (source.isAllowEnabled()) {
+ setHidden(this.binding.redirectedHostsCheckbox);
+ setHidden(this.binding.redirectedHostsWarningTextView);
+ } else {
+ setShown(this.binding.redirectedHostsCheckbox);
+ setShown(this.binding.redirectedHostsWarningTextView);
+ }
+ }
+
+ private void bindLocation() {
+ this.binding.typeButtonGroup.addOnButtonCheckedListener((group, checkedId, isChecked) -> {
+ // Keep always one button checked
+ if (group.getCheckedButtonId() == View.NO_ID) {
+ group.check(checkedId);
+ return;
+ }
+ if (isChecked) {
+ boolean isFile = checkedId == R.id.file_button;
+ this.binding.locationEditText.setText(isFile ? "" : "https://");
+ this.binding.locationEditText.setEnabled(!isFile);
+ if (isFile) {
+ openDocument();
+ }
+ this.binding.urlTextInputLayout.setVisibility(isFile ? INVISIBLE : VISIBLE);
+ this.binding.fileLocationTextView.setVisibility(isFile ? VISIBLE : INVISIBLE);
+ }
+ });
+ this.binding.fileLocationTextView.setOnClickListener(view -> openDocument());
+ }
+
+ private void bindFormats() {
+ this.binding.blockFormatButton.addOnCheckedChangeListener((button, isChecked) -> {
+ if (isChecked) {
+ showView(this.binding.redirectedHostsCheckbox);
+ showView(this.binding.redirectedHostsWarningTextView);
+ } else {
+ hideView(this.binding.redirectedHostsCheckbox);
+ hideView(this.binding.redirectedHostsWarningTextView);
+ }
+ });
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.source_edit_menu, menu);
+ menu.findItem(R.id.delete_action).setVisible(this.editing);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ // Check item identifier
+ if (item.getItemId() == R.id.delete_action) {
+ DISK_IO_EXECUTOR.execute(() -> this.hostsSourceDao.delete(this.edited));
+ finish();
+ return true;
+ } else if (item.getItemId() == R.id.apply_action) {
+ HostsSource source = validate();
+ if (source == null) {
+ return false;
+ }
+ DISK_IO_EXECUTOR.execute(() -> {
+ if (this.editing) {
+ this.hostsSourceDao.delete(this.edited);
+ }
+ this.hostsSourceDao.insert(source);
+ finish();
+ });
+ return true;
+ }
+ return false;
+ }
+
+ private HostsSource validate() {
+ String label = requireNonNull(this.binding.labelEditText.getText()).toString();
+ if (label.isEmpty()) {
+ this.binding.labelEditText.setError(getString(R.string.source_edit_label_required));
+ return null;
+ }
+ String url;
+ if (this.binding.typeButtonGroup.getCheckedButtonId() == R.id.url_button) {
+ url = requireNonNull(this.binding.locationEditText.getText()).toString();
+ if (url.isEmpty()) {
+ this.binding.locationEditText.setError(getString(R.string.source_edit_url_location_required));
+ return null;
+ }
+ if (!HostsSource.isValidUrl(url)) {
+ this.binding.locationEditText.setError(getString(R.string.source_edit_location_invalid));
+ return null;
+ }
+ } else {
+ url = this.binding.fileLocationTextView.getText().toString();
+ if (!HostsSource.isValidUrl(url)) {
+ this.binding.fileLocationTextView.setError(getString(R.string.source_edit_location_invalid));
+ return null;
+ }
+ }
+ HostsSource source = new HostsSource();
+ source.setLabel(label);
+ source.setUrl(url);
+ boolean allowFormat = this.binding.allowFormatButton.isChecked();
+ source.setAllowEnabled(allowFormat);
+ source.setRedirectEnabled(!allowFormat && this.binding.redirectedHostsCheckbox.isChecked());
+ return source;
+ }
+
+ private void openDocument() {
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType(ANY_MIME_TYPE);
+ this.startActivityLauncher.launch(intent);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/support/SupportActivity.java b/app/src/main/java/org/adaway/ui/support/SupportActivity.java
new file mode 100644
index 0000000..0ab3394
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/support/SupportActivity.java
@@ -0,0 +1,87 @@
+package org.adaway.ui.support;
+
+import static android.content.Intent.ACTION_VIEW;
+import static android.net.Uri.parse;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import org.adaway.R;
+
+/**
+ * This class is an activity for users to show their supports to the project.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class SupportActivity extends AppCompatActivity {
+ /**
+ * The support link.
+ */
+ public static final Uri SUPPORT_LINK = parse("https://paypal.me/BruceBUJON");
+ /**
+ * The sponsorship link.
+ */
+ public static final Uri SPONSORSHIP_LINK = parse("https://github.com/sponsors/PerfectSlayer");
+
+ public static void animateHeart(ImageView heartImageView) {
+ PropertyValuesHolder growScaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1F, 1.2F);
+ PropertyValuesHolder growScaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1F, 1.2F);
+ Animator growAnimator = ObjectAnimator.ofPropertyValuesHolder(heartImageView, growScaleX, growScaleY);
+ growAnimator.setDuration(200);
+ growAnimator.setStartDelay(2000);
+
+ PropertyValuesHolder shrinkScaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1.2F, 1F);
+ PropertyValuesHolder shrinkScaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1.2F, 1F);
+ Animator shrinkAnimator = ObjectAnimator.ofPropertyValuesHolder(heartImageView, shrinkScaleX, shrinkScaleY);
+ growAnimator.setDuration(400);
+
+ AnimatorSet animationSet = new AnimatorSet();
+ animationSet.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ animationSet.start();
+ }
+ });
+ animationSet.playSequentially(growAnimator, shrinkAnimator);
+ animationSet.start();
+ }
+
+ public static void bindLink(Context context, View view, Uri uri) {
+ view.setOnClickListener(v -> {
+ Intent browserIntent = new Intent(ACTION_VIEW, uri);
+ context.startActivity(browserIntent);
+ });
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.support_activity);
+
+ ImageView heartImageView = findViewById(R.id.headerImageView);
+ animateHeart(heartImageView);
+ bindPaypal();
+ bindSponsorShip();
+ }
+
+ private void bindPaypal() {
+ bindLink(this, findViewById(R.id.headerImageView), SUPPORT_LINK);
+ bindLink(this, findViewById(R.id.paypalCardView), SUPPORT_LINK);
+ }
+
+ private void bindSponsorShip() {
+ bindLink(this, findViewById(R.id.sponsorshipCardView), SPONSORSHIP_LINK);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/update/CompleteDownloadStatus.java b/app/src/main/java/org/adaway/ui/update/CompleteDownloadStatus.java
new file mode 100644
index 0000000..4bc03d8
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/update/CompleteDownloadStatus.java
@@ -0,0 +1,22 @@
+package org.adaway.ui.update;
+
+import android.content.Context;
+
+import org.adaway.R;
+
+/**
+ * This class represents the application complete update download status.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class CompleteDownloadStatus implements DownloadStatus {
+ @Override
+ public int getProgress() {
+ return 100;
+ }
+
+ @Override
+ public String format(Context context) {
+ return context.getString(R.string.update_complete_label);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/update/DownloadStatus.java b/app/src/main/java/org/adaway/ui/update/DownloadStatus.java
new file mode 100644
index 0000000..b99fdc0
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/update/DownloadStatus.java
@@ -0,0 +1,23 @@
+package org.adaway.ui.update;
+
+import android.content.Context;
+
+/**
+ * This class represents the application update download status.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public interface DownloadStatus {
+ /**
+ * Get the download progress percent.
+ */
+ int getProgress();
+
+ /**
+ * Format status to string.
+ *
+ * @param context The application context.
+ * @return The formatted status.
+ */
+ String format(Context context);
+}
diff --git a/app/src/main/java/org/adaway/ui/update/PendingDownloadStatus.java b/app/src/main/java/org/adaway/ui/update/PendingDownloadStatus.java
new file mode 100644
index 0000000..a9caf31
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/update/PendingDownloadStatus.java
@@ -0,0 +1,52 @@
+package org.adaway.ui.update;
+
+import android.content.Context;
+import android.text.format.Formatter;
+
+import org.adaway.R;
+
+/**
+ * This class represents the application pending update download status.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class PendingDownloadStatus implements DownloadStatus {
+ /**
+ * The downloaded bytes.
+ */
+ final long downloaded;
+ /**
+ * The total bytes to download.
+ */
+ final long total;
+ /**
+ * The download progress percent.
+ */
+ final int progress;
+
+ /**
+ * Constructor.
+ *
+ * @param downloaded The downloaded bytes.
+ * @param total The total bytes to download.
+ */
+ PendingDownloadStatus(long downloaded, long total) {
+ this.downloaded = downloaded;
+ this.total = total;
+ this.progress = (int) (downloaded * 100L / total);
+ }
+
+ @Override
+ public int getProgress() {
+ return this.progress;
+ }
+
+ @Override
+ public String format(Context context) {
+ return context.getString(
+ R.string.update_progress_label,
+ Formatter.formatFileSize(context, this.downloaded),
+ Formatter.formatFileSize(context, this.total)
+ );
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/update/UpdateActivity.java b/app/src/main/java/org/adaway/ui/update/UpdateActivity.java
new file mode 100644
index 0000000..05407ce
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/update/UpdateActivity.java
@@ -0,0 +1,86 @@
+package org.adaway.ui.update;
+
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+import static org.adaway.ui.support.SupportActivity.SPONSORSHIP_LINK;
+import static org.adaway.ui.support.SupportActivity.SUPPORT_LINK;
+import static org.adaway.ui.support.SupportActivity.bindLink;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.lifecycle.ViewModelProvider;
+
+import org.adaway.R;
+import org.adaway.databinding.UpdateActityBinding;
+import org.adaway.helper.ThemeHelper;
+import org.adaway.model.update.Manifest;
+
+/**
+ * This class is the application main activity.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class UpdateActivity extends AppCompatActivity {
+ private UpdateActityBinding binding;
+ private UpdateViewModel updateViewModel;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyTheme(this);
+ this.binding = UpdateActityBinding.inflate(getLayoutInflater());
+ setContentView(this.binding.getRoot());
+
+ this.updateViewModel = new ViewModelProvider(this).get(UpdateViewModel.class);
+ bindListeners();
+ bindManifest();
+ bindProgress();
+ }
+
+ private void bindListeners() {
+ this.binding.updateButton.setOnClickListener(this::startUpdate);
+ bindLink(this, this.binding.updateDonateButton, SUPPORT_LINK);
+ bindLink(this, this.binding.updateSponsorButton, SPONSORSHIP_LINK);
+ }
+
+ private void bindManifest() {
+ this.updateViewModel.getAppManifest().observe(this, manifest -> {
+ if (manifest.updateAvailable) {
+ showUpdate(manifest);
+ } else {
+ markUpToDate(manifest);
+ }
+ });
+ }
+
+ private void bindProgress() {
+ this.updateViewModel.getDownloadProgress().observe(this, progress -> {
+ this.binding.updateButton.setVisibility(INVISIBLE);
+ this.binding.downloadProgressBar.setVisibility(VISIBLE);
+ this.binding.downloadProgressBar.setProgress(progress.getProgress(), true);
+ this.binding.progressTextView.setText(progress.format(this));
+ });
+ }
+
+ private void markUpToDate(Manifest manifest) {
+ this.binding.headerTextView.setText(R.string.update_up_to_date_header);
+ this.binding.updateButton.setVisibility(GONE);
+ this.binding.changelogTextView.setText(manifest.changelog);
+ }
+
+ private void showUpdate(Manifest manifest) {
+ this.binding.headerTextView.setText(R.string.update_update_available_header);
+ this.binding.updateButton.setVisibility(VISIBLE);
+ this.binding.changelogTextView.setText(manifest.changelog);
+ }
+
+ private void startUpdate(View view) {
+ this.binding.updateButton.setVisibility(INVISIBLE);
+ this.binding.downloadProgressBar.setVisibility(VISIBLE);
+ this.updateViewModel.update();
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/update/UpdateViewModel.java b/app/src/main/java/org/adaway/ui/update/UpdateViewModel.java
new file mode 100644
index 0000000..c558d62
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/update/UpdateViewModel.java
@@ -0,0 +1,105 @@
+package org.adaway.ui.update;
+
+import static android.app.DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR;
+import static android.app.DownloadManager.COLUMN_STATUS;
+import static android.app.DownloadManager.COLUMN_TOTAL_SIZE_BYTES;
+import static android.app.DownloadManager.STATUS_FAILED;
+import static android.app.DownloadManager.STATUS_RUNNING;
+import static android.app.DownloadManager.STATUS_SUCCESSFUL;
+
+import android.app.Application;
+import android.app.DownloadManager;
+import android.database.Cursor;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.model.update.Manifest;
+import org.adaway.model.update.UpdateModel;
+import org.adaway.ui.adware.AdwareViewModel;
+import org.adaway.util.AppExecutors;
+
+import java.util.concurrent.Executor;
+
+import timber.log.Timber;
+
+/**
+ * This class is an {@link AndroidViewModel} for the {@link UpdateActivity} cards.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class UpdateViewModel extends AdwareViewModel {
+ private static final Executor NETWORK_IO = AppExecutors.getInstance().networkIO();
+ private final UpdateModel updateModel;
+ private final MutableLiveData downloadProgress;
+
+ public UpdateViewModel(@NonNull Application application) {
+ super(application);
+ this.updateModel = ((AdAwayApplication) application).getUpdateModel();
+ this.downloadProgress = new MutableLiveData<>();
+ }
+
+ public LiveData getAppManifest() {
+ return this.updateModel.getManifest();
+ }
+
+ public void update() {
+ long downloadId = this.updateModel.update();
+ NETWORK_IO.execute(() -> trackProgress(downloadId));
+ }
+
+ public MutableLiveData getDownloadProgress() {
+ return this.downloadProgress;
+ }
+
+ private void trackProgress(long downloadId) {
+ DownloadManager downloadManager = getApplication().getSystemService(DownloadManager.class);
+ DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
+ boolean finishDownload = false;
+ while (!finishDownload) {
+ // Add wait before querying download manager
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ Timber.d(e, "Failed to wait before querying download manager.");
+ Thread.currentThread().interrupt();
+ this.downloadProgress.postValue(null);
+ return;
+ }
+ // Query download manager
+ try (Cursor cursor = downloadManager.query(query)) {
+ if (!cursor.moveToFirst()) {
+ Timber.d("Download item was not found");
+ continue;
+ }
+ // Check download status
+ int statusColumnIndex = cursor.getColumnIndex(COLUMN_STATUS);
+ int status = cursor.getInt(statusColumnIndex);
+ switch (status) {
+ case STATUS_FAILED:
+ finishDownload = true;
+ this.downloadProgress.postValue(null);
+ break;
+ case STATUS_RUNNING:
+ int totalSizeColumnIndex = cursor.getColumnIndex(COLUMN_TOTAL_SIZE_BYTES);
+ long total = cursor.getLong(totalSizeColumnIndex);
+ if (total > 0) {
+ int bytesDownloadedColumnIndex = cursor.getColumnIndex(COLUMN_BYTES_DOWNLOADED_SO_FAR);
+ long downloaded = cursor.getLong(bytesDownloadedColumnIndex);
+ this.downloadProgress.postValue(new PendingDownloadStatus(downloaded, total));
+ }
+ break;
+ case STATUS_SUCCESSFUL:
+ this.downloadProgress.postValue(new CompleteDownloadStatus());
+ finishDownload = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/welcome/WelcomeActivity.java b/app/src/main/java/org/adaway/ui/welcome/WelcomeActivity.java
new file mode 100644
index 0000000..213244a
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/welcome/WelcomeActivity.java
@@ -0,0 +1,155 @@
+package org.adaway.ui.welcome;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.ImageView;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.viewpager2.widget.ViewPager2;
+
+import org.adaway.R;
+import org.adaway.databinding.WelcomeActivityBinding;
+import org.adaway.ui.home.HomeActivity;
+
+import static org.adaway.ui.Animations.hideView;
+import static org.adaway.ui.Animations.showView;
+
+/**
+ * This class is a welcome activity to run first time setup on the user device.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class WelcomeActivity extends AppCompatActivity implements WelcomeNavigable {
+ private WelcomeActivityBinding binding;
+ private WelcomePagerAdapter pagerAdapter;
+ private ImageView[] dotImageViews;
+ private OnBackPressedCallback onBackPressedCallback;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ this.binding = WelcomeActivityBinding.inflate(getLayoutInflater());
+ setContentView(this.binding.getRoot());
+ buildPager();
+ bindBackButton();
+ bindNextButton();
+ bindDots();
+ bindBackPress();
+ }
+
+ private void buildPager() {
+ this.pagerAdapter = new WelcomePagerAdapter(this);
+ this.binding.viewPager.setAdapter(this.pagerAdapter);
+ this.binding.viewPager.setUserInputEnabled(false);
+ }
+
+ private void bindNextButton() {
+ this.binding.nextButton.setOnClickListener(view -> goNext());
+ }
+
+ private void bindBackButton() {
+ this.binding.backButton.setOnClickListener(view -> goBack());
+ }
+
+ private void bindDots() {
+ this.dotImageViews = new ImageView[]{
+ this.binding.dot1ImageView,
+ this.binding.dot2ImageView,
+ this.binding.dot3ImageView
+ };
+ highlightDot(this.binding.viewPager.getCurrentItem());
+ this.binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+ @Override
+ public void onPageSelected(int position) {
+ highlightDot(position);
+ }
+ });
+ }
+
+ private void highlightDot(int position) {
+ for (int index = 0; index < this.dotImageViews.length; index++) {
+ if (index == position) {
+ this.dotImageViews[index].setImageResource(R.drawable.dot);
+ this.dotImageViews[index].animate().alpha(0.7F).scaleX(1.2F).scaleY(1.2F);
+ } else {
+ this.dotImageViews[index].setImageResource(R.drawable.dot_outline);
+ this.dotImageViews[index].animate().alpha(0.5F).scaleX(1F).scaleY(1F);
+ }
+ }
+ }
+
+ private void bindBackPress() {
+ this.onBackPressedCallback = new OnBackPressedCallback(false) {
+ @Override
+ public void handleOnBackPressed() {
+ goBack();
+ }
+ };
+ getOnBackPressedDispatcher().addCallback(this.onBackPressedCallback);
+ this.binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+ @Override
+ public void onPageSelected(int position) {
+ WelcomeActivity.this.onBackPressedCallback.setEnabled(position > 0);
+ }
+ });
+ }
+
+ @Override
+ public void allowNext() {
+ if (this.binding.viewPager.getCurrentItem() == this.pagerAdapter.getItemCount() - 1) {
+ this.binding.nextButton.setText(R.string.welcome_finish_button);
+ } else {
+ this.binding.nextButton.setText(R.string.welcome_next_button);
+ }
+ showView(this.binding.nextButton);
+ }
+
+ @Override
+ public void blockNext() {
+ hideView(this.binding.nextButton);
+ }
+
+ private void allowBack() {
+ showView(this.binding.backButton);
+ }
+
+ private void blockBack() {
+ hideView(this.binding.backButton);
+ }
+
+ private void goNext() {
+ int currentItem = this.binding.viewPager.getCurrentItem();
+ int count = this.pagerAdapter.getItemCount();
+ if (currentItem >= count - 1) {
+ startHomeActivity();
+ return;
+ }
+ currentItem++;
+ this.binding.viewPager.setCurrentItem(currentItem);
+ allowBack();
+ if (this.pagerAdapter.createFragment(currentItem).canGoNext()) {
+ allowNext();
+ } else {
+ blockNext();
+ }
+ }
+
+ private void goBack() {
+ int currentItem = this.binding.viewPager.getCurrentItem();
+ if (currentItem == 0) {
+ return;
+ }
+ this.binding.viewPager.setCurrentItem(currentItem - 1);
+ if (currentItem <= 1) {
+ blockBack();
+ }
+ allowNext();
+ }
+
+ private void startHomeActivity() {
+ startActivity(new Intent(this, HomeActivity.class));
+ finish();
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/welcome/WelcomeFragment.java b/app/src/main/java/org/adaway/ui/welcome/WelcomeFragment.java
new file mode 100644
index 0000000..668d564
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/welcome/WelcomeFragment.java
@@ -0,0 +1,30 @@
+package org.adaway.ui.welcome;
+
+import androidx.fragment.app.Fragment;
+
+/**
+ * This class is the base fragment to all setup fragments.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public abstract class WelcomeFragment extends Fragment {
+ private boolean goNext = false;
+
+ protected void allowNext() {
+ this.goNext = true;
+ getNavigable().allowNext();
+ }
+
+ protected void blockNext() {
+ this.goNext = false;
+ getNavigable().blockNext();
+ }
+
+ protected boolean canGoNext() {
+ return this.goNext;
+ }
+
+ private WelcomeNavigable getNavigable() {
+ return (WelcomeNavigable) getActivity();
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/welcome/WelcomeMethodFragment.java b/app/src/main/java/org/adaway/ui/welcome/WelcomeMethodFragment.java
new file mode 100644
index 0000000..68d1086
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/welcome/WelcomeMethodFragment.java
@@ -0,0 +1,126 @@
+package org.adaway.ui.welcome;
+
+import static android.app.Activity.RESULT_OK;
+import static org.adaway.model.adblocking.AdBlockMethod.ROOT;
+import static org.adaway.model.adblocking.AdBlockMethod.UNDEFINED;
+import static org.adaway.model.adblocking.AdBlockMethod.VPN;
+import static java.lang.Boolean.TRUE;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.VpnService;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.topjohnwu.superuser.Shell;
+
+import org.adaway.R;
+import org.adaway.databinding.WelcomeMethodLayoutBinding;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.util.log.SentryLog;
+
+/**
+ * This class is a fragment to setup the ad blocking method.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class WelcomeMethodFragment extends WelcomeFragment {
+ private WelcomeMethodLayoutBinding binding;
+ private ActivityResultLauncher prepareVpnLauncher;
+ @ColorInt
+ private int cardColor;
+ @ColorInt
+ private int cardEnabledColor;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ this.binding = WelcomeMethodLayoutBinding.inflate(inflater, container, false);
+ this.prepareVpnLauncher = registerForActivityResult(new StartActivityForResult(), result -> {
+ if (result.getResultCode() == RESULT_OK) {
+ notifyVpnEnabled();
+ } else {
+ notifyVpnDisabled();
+ }
+ });
+
+ this.binding.rootCardView.setOnClickListener(this::checkRoot);
+ this.binding.vpnCardView.setOnClickListener(this::enableVpnService);
+
+ this.cardColor = getResources().getColor(R.color.cardBackground, null);
+ this.cardEnabledColor = getResources().getColor(R.color.cardEnabledBackground, null);
+ return this.binding.getRoot();
+ }
+
+ private void checkRoot(@Nullable View view) {
+ notifyVpnDisabled();
+ Shell.getShell();
+ if (TRUE.equals(Shell.isAppGrantedRoot())) {
+ notifyRootEnabled();
+ } else {
+ notifyRootDisabled(true);
+ }
+ }
+
+ private void enableVpnService(@Nullable View view) {
+ notifyRootDisabled(false);
+ Context context = getContext();
+ if (context == null) {
+ return;
+ }
+ // Check user authorization
+ Intent prepareIntent = VpnService.prepare(context);
+ if (prepareIntent == null) {
+ notifyVpnEnabled();
+ } else {
+ this.prepareVpnLauncher.launch(prepareIntent);
+ }
+ }
+
+ private void notifyRootEnabled() {
+ SentryLog.recordBreadcrumb("Enable root ad-blocking method");
+ PreferenceHelper.setAbBlockMethod(requireContext(), ROOT);
+ this.binding.rootCardView.setCardBackgroundColor(this.cardEnabledColor);
+ this.binding.vpnCardView.setCardBackgroundColor(this.cardColor);
+ allowNext();
+ }
+
+ private void notifyRootDisabled(boolean showDialog) {
+ PreferenceHelper.setAbBlockMethod(requireContext(), UNDEFINED);
+ this.binding.rootCardView.setCardBackgroundColor(this.cardColor);
+ this.binding.vpnCardView.setCardBackgroundColor(this.cardColor);
+ if (showDialog) {
+ blockNext();
+ new MaterialAlertDialogBuilder(requireContext())
+ .setTitle(R.string.welcome_root_missing_title)
+ .setMessage(R.string.welcome_root_missile_description)
+ .setPositiveButton(R.string.button_close, null)
+ .create()
+ .show();
+ }
+ }
+
+ private void notifyVpnEnabled() {
+ SentryLog.recordBreadcrumb("Enable vpn ad-blocking method");
+ PreferenceHelper.setAbBlockMethod(requireContext(), VPN);
+ this.binding.rootCardView.setCardBackgroundColor(this.cardColor);
+ this.binding.vpnCardView.setCardBackgroundColor(this.cardEnabledColor);
+ allowNext();
+ }
+
+ private void notifyVpnDisabled() {
+ PreferenceHelper.setAbBlockMethod(requireContext(), UNDEFINED);
+ this.binding.rootCardView.setCardBackgroundColor(this.cardColor);
+ this.binding.vpnCardView.setCardBackgroundColor(this.cardColor);
+ blockNext();
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/welcome/WelcomeNavigable.java b/app/src/main/java/org/adaway/ui/welcome/WelcomeNavigable.java
new file mode 100644
index 0000000..380dea2
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/welcome/WelcomeNavigable.java
@@ -0,0 +1,11 @@
+package org.adaway.ui.welcome;
+
+/**
+ * This interface represents step to navigate to during the setup.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public interface WelcomeNavigable {
+ void allowNext();
+ void blockNext();
+}
diff --git a/app/src/main/java/org/adaway/ui/welcome/WelcomePagerAdapter.java b/app/src/main/java/org/adaway/ui/welcome/WelcomePagerAdapter.java
new file mode 100644
index 0000000..6255c8c
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/welcome/WelcomePagerAdapter.java
@@ -0,0 +1,43 @@
+package org.adaway.ui.welcome;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+/**
+ * This class is a pager adapter to create setup step fragments.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class WelcomePagerAdapter extends FragmentStateAdapter {
+ private final WelcomeMethodFragment welcomeMethodFragment;
+ private final WelcomeSyncFragment welcomeSyncFragment;
+ private final WelcomeSupportFragment welcomeSupportFragment;
+
+ WelcomePagerAdapter(@NonNull FragmentActivity fragmentManager) {
+ super(fragmentManager);
+ this.welcomeMethodFragment = new WelcomeMethodFragment();
+ this.welcomeSyncFragment = new WelcomeSyncFragment();
+ this.welcomeSupportFragment = new WelcomeSupportFragment();
+ }
+
+ @NonNull
+ @Override
+ public WelcomeFragment createFragment(int position) {
+ switch (position) {
+ case 0:
+ return this.welcomeMethodFragment;
+ case 1:
+ return this.welcomeSyncFragment;
+ case 2:
+ return this.welcomeSupportFragment;
+ default:
+ throw new IllegalStateException("Position " + position + " is not supported.");
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return 3;
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/welcome/WelcomeSupportFragment.java b/app/src/main/java/org/adaway/ui/welcome/WelcomeSupportFragment.java
new file mode 100644
index 0000000..0ec00d4
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/welcome/WelcomeSupportFragment.java
@@ -0,0 +1,76 @@
+package org.adaway.ui.welcome;
+
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+import static org.adaway.ui.support.SupportActivity.SPONSORSHIP_LINK;
+import static org.adaway.ui.support.SupportActivity.SUPPORT_LINK;
+import static org.adaway.ui.support.SupportActivity.animateHeart;
+import static org.adaway.ui.support.SupportActivity.bindLink;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.adaway.databinding.WelcomeSupportLayoutBinding;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.util.log.SentryLog;
+
+/**
+ * This class is a fragment to inform user how to support the application development.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class WelcomeSupportFragment extends WelcomeFragment {
+ private WelcomeSupportLayoutBinding binding;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ this.binding = WelcomeSupportLayoutBinding.inflate(inflater, container, false);
+
+ animateHeart(this.binding.headerImageView);
+ bindSupport();
+ customizeSecondOption();
+
+ return this.binding.getRoot();
+ }
+
+ @Override
+ protected boolean canGoNext() {
+ return true;
+ }
+
+ private void customizeSecondOption() {
+ if (SentryLog.isStub()) {
+ showAndBindSponsorship();
+ } else {
+ bindTelemetry();
+ }
+ }
+
+ private void bindSupport() {
+ Context context = requireContext();
+ bindLink(context, this.binding.headerImageView, SUPPORT_LINK);
+ bindLink(context, this.binding.headerTextView, SUPPORT_LINK);
+ bindLink(context, this.binding.paypalCardView, SUPPORT_LINK);
+ }
+
+ private void bindTelemetry() {
+ this.binding.telemetryCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ PreferenceHelper.setTelemetryEnabled(requireContext(), isChecked);
+ SentryLog.setEnabled(requireActivity().getApplication(), isChecked);
+ });
+ }
+
+ private void showAndBindSponsorship() {
+ this.binding.telemetryTextView.setVisibility(INVISIBLE);
+ this.binding.telemetryCheckBox.setVisibility(INVISIBLE);
+ this.binding.sponsorshipCardView.setVisibility(VISIBLE);
+ bindLink(requireContext(), this.binding.sponsorshipCardView, SPONSORSHIP_LINK);
+ }
+}
diff --git a/app/src/main/java/org/adaway/ui/welcome/WelcomeSyncFragment.java b/app/src/main/java/org/adaway/ui/welcome/WelcomeSyncFragment.java
new file mode 100644
index 0000000..843053c
--- /dev/null
+++ b/app/src/main/java/org/adaway/ui/welcome/WelcomeSyncFragment.java
@@ -0,0 +1,117 @@
+package org.adaway.ui.welcome;
+
+import static android.Manifest.permission.POST_NOTIFICATIONS;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.os.Build.VERSION.SDK_INT;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.view.View.VISIBLE;
+import static org.adaway.ui.Animations.hideView;
+import static org.adaway.ui.Animations.showView;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.ViewModelProvider;
+
+import org.adaway.R;
+import org.adaway.databinding.WelcomeSyncLayoutBinding;
+import org.adaway.model.error.HostError;
+import org.adaway.ui.home.HomeViewModel;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * This class is a fragment to first sync the main hosts source.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class WelcomeSyncFragment extends WelcomeFragment {
+ private WelcomeSyncLayoutBinding binding;
+ private HomeViewModel homeViewModel;
+ private ActivityResultLauncher activityResultLauncher;
+ private boolean requestPostNotificationsPermission;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ this.binding = WelcomeSyncLayoutBinding.inflate(inflater, container, false);
+ this.activityResultLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {});
+ bindRetry();
+ bindNotifications();
+
+ this.homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
+ LifecycleOwner lifecycleOwner = getViewLifecycleOwner();
+ this.homeViewModel.isAdBlocked().observe(lifecycleOwner, adBlocked -> {
+ if (adBlocked) {
+ notifySynced();
+ }
+ });
+ this.homeViewModel.getError().observe(lifecycleOwner, this::notifyError);
+ this.homeViewModel.sync();
+
+ return this.binding.getRoot();
+ }
+
+ private void bindRetry() {
+ this.binding.retryImageView.setOnClickListener(this::retry);
+ this.binding.errorTextView.setOnClickListener(this::retry);
+ }
+
+ private void bindNotifications() {
+ if (SDK_INT < TIRAMISU || requireActivity().checkSelfPermission(POST_NOTIFICATIONS) == PERMISSION_GRANTED) {
+ this.requestPostNotificationsPermission = false;
+ } else {
+ this.binding.notificationsTextView.setVisibility(VISIBLE);
+ this.requestPostNotificationsPermission = true;
+ new Timer(true).schedule(new TimerTask() {
+ @Override
+ public void run() {
+ requestPostNotificationsPermission();
+ }
+ }, 10_000);
+ }
+ }
+
+ private void notifySynced() {
+ this.homeViewModel.enableAllSources();
+ this.binding.headerTextView.setText(R.string.welcome_synced_header);
+ hideView(this.binding.progressBar);
+ showView(this.binding.syncedImageView);
+ allowNext();
+ requestPostNotificationsPermission();
+ }
+
+ private void notifyError(HostError error) {
+ String errorMessage = getResources().getText(error.getMessageKey()).toString();
+ String syncError = getResources().getText(R.string.welcome_sync_error).toString();
+ String retryMessage = String.format(syncError, errorMessage);
+ this.binding.errorTextView.setText(retryMessage);
+ hideView(this.binding.progressBar);
+ showView(this.binding.errorImageView);
+ showView(this.binding.retryImageView);
+ showView(this.binding.errorTextView);
+ }
+
+ private void retry(@SuppressWarnings("unused") View view) {
+ hideView(this.binding.errorImageView);
+ hideView(this.binding.retryImageView);
+ hideView(this.binding.errorTextView);
+ showView(this.binding.progressBar);
+ this.homeViewModel.sync();
+ }
+
+ private void requestPostNotificationsPermission() {
+ if (SDK_INT >= TIRAMISU && this.requestPostNotificationsPermission) {
+ this.requestPostNotificationsPermission = false;
+ this.activityResultLauncher.launch(POST_NOTIFICATIONS);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/util/AppExecutors.java b/app/src/main/java/org/adaway/util/AppExecutors.java
new file mode 100644
index 0000000..684a455
--- /dev/null
+++ b/app/src/main/java/org/adaway/util/AppExecutors.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.adaway.util;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+/**
+ * Global executor pools for the whole application.
+ *
+ * Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind
+ * webservice requests).
+ * Source: https://github.com/googlecodelabs/android-build-an-app-architecture-components/blob/7364e9013419952b00aa582553aa1466c1a1dede/app/src/main/java/com/example/android/sunshine/AppExecutors.java
+ */
+public class AppExecutors {
+
+ // For Singleton instantiation
+ private static final Object LOCK = new Object();
+ private static AppExecutors sInstance;
+ private final Executor diskIO;
+ private final Executor mainThread;
+ private final Executor networkIO;
+
+ private AppExecutors(Executor diskIO, Executor networkIO, Executor mainThread) {
+ this.diskIO = diskIO;
+ this.networkIO = networkIO;
+ this.mainThread = mainThread;
+ }
+
+ public static AppExecutors getInstance() {
+ if (sInstance == null) {
+ synchronized (LOCK) {
+ sInstance = new AppExecutors(
+ Executors.newSingleThreadExecutor(),
+ Executors.newFixedThreadPool(3),
+ new MainThreadExecutor()
+ );
+ }
+ }
+ return sInstance;
+ }
+
+ public Executor diskIO() {
+ return diskIO;
+ }
+
+ public Executor networkIO() {
+ return networkIO;
+ }
+
+ public Executor mainThread() {
+ return mainThread;
+ }
+
+ private static class MainThreadExecutor implements Executor {
+ private Handler mainThreadHandler = new Handler(Looper.getMainLooper());
+
+ @Override
+ public void execute(@NonNull Runnable command) {
+ mainThreadHandler.post(command);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/adaway/util/Clipboard.java b/app/src/main/java/org/adaway/util/Clipboard.java
new file mode 100644
index 0000000..fbbdded
--- /dev/null
+++ b/app/src/main/java/org/adaway/util/Clipboard.java
@@ -0,0 +1,38 @@
+package org.adaway.util;
+
+import static android.widget.Toast.LENGTH_SHORT;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.widget.Toast;
+
+import org.adaway.R;
+
+/**
+ * This class manages the clipboard interactions.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class Clipboard {
+ private Clipboard() {
+
+ }
+
+ /**
+ * Copy a host into the clipboard for the user.
+ *
+ * @param context The application context.
+ * @param host The host to copy to the clipboard
+ */
+ public static void copyHostToClipboard(Context context, String host) {
+ ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+ ClipData clipData = ClipData.newPlainText("Host", host);
+ clipboard.setPrimaryClip(clipData);
+ Toast.makeText(
+ context,
+ context.getString(R.string.clipboard_host_copied),
+ LENGTH_SHORT
+ ).show();
+ }
+}
diff --git a/app/src/main/java/org/adaway/util/Constants.java b/app/src/main/java/org/adaway/util/Constants.java
new file mode 100644
index 0000000..31d1305
--- /dev/null
+++ b/app/src/main/java/org/adaway/util/Constants.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.util;
+
+public class Constants {
+ public static final String PREFS_NAME = "preferences";
+
+ public static final String LOCALHOST_IPV4 = "127.0.0.1";
+ public static final String LOCALHOST_IPV6 = "::1";
+ public static final String BOGUS_IPV4 = "0.0.0.0";
+ public static final String LOCALHOST_HOSTNAME = "localhost";
+
+ public static final String HOSTS_FILENAME = "hosts";
+ public static final String DEFAULT_HOSTS_FILENAME = "default_hosts";
+ public static final String LINE_SEPARATOR = System.getProperty("line.separator", "\n");
+
+ public static final String COMMAND_CHOWN = "chown 0:0";
+ public static final String COMMAND_CHMOD_644 = "chmod 644";
+
+ public static final String ANDROID_SYSTEM_ETC_HOSTS = "/system/etc/" + HOSTS_FILENAME;
+}
diff --git a/app/src/main/java/org/adaway/util/RegexUtils.java b/app/src/main/java/org/adaway/util/RegexUtils.java
new file mode 100644
index 0000000..495aa2a
--- /dev/null
+++ b/app/src/main/java/org/adaway/util/RegexUtils.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.util;
+
+import com.google.common.net.InetAddresses;
+import com.google.common.net.InternetDomainName;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import timber.log.Timber;
+
+public class RegexUtils {
+ private static final Pattern WILDCARD_PATTERN = Pattern.compile("[*?]");
+
+ /**
+ * Check whether a hostname is valid.
+ *
+ * @param hostname The hostname to validate.
+ * @return return {@code true} if hostname is valid, {@code false} otherwise.
+ */
+ public static boolean isValidHostname(String hostname) {
+ return InternetDomainName.isValid(hostname);
+ }
+
+ /**
+ * Check whether a wildcard hostname is valid.
+ * Wildcard hostname is an hostname with one of the following wildcard:
+ *
+ *
{@code *} for any character sequence,
+ *
{@code ?} for any character
+ *
+ *
+ * Wildcard validation is quite tricky, because wildcards can be placed anywhere and can match with
+ * anything. To make sure we don't dismiss certain valid wildcard host names, we trim wildcards
+ * or replace them with an alphanumeric character for further validation.
+ * We only reject whitelist host names which cannot match against valid host names under any circumstances.
+ *
+ * @param hostname The wildcard hostname to validate.
+ * @return return {@code true} if wildcard hostname is valid, {@code false} otherwise.
+ */
+ public static boolean isValidWildcardHostname(String hostname) {
+ // Clear wildcards from host name then validate it
+ Matcher matcher = WILDCARD_PATTERN.matcher(hostname);
+ String clearedHostname = matcher.replaceAll("");
+ // Replace wildcards from host name by an alphanumeric character
+ String replacedHostname = matcher.replaceAll("a");
+ // Check if any hostname is valid
+ return isValidHostname(clearedHostname) || isValidHostname(replacedHostname);
+ }
+
+ /**
+ * Check if an IP address is valid.
+ *
+ * @param ip The IP to validate.
+ * @return {@code true} if the IP is valid, {@code false} otherwise.
+ */
+ public static boolean isValidIP(String ip) {
+ try {
+ InetAddresses.forString(ip);
+ return true;
+ } catch (IllegalArgumentException exception) {
+ Timber.d(exception, "Invalid IP address: %s.", ip);
+ return false;
+ }
+ }
+
+ /*
+ * Transforms String with * and ? characters to regex String, convert "example*.*" to regex
+ * "^example.*\\..*$", from http://www.rgagnon.com/javadetails/java-0515.html
+ */
+ public static String wildcardToRegex(String wildcard) {
+ StringBuilder regex = new StringBuilder(wildcard.length());
+ regex.append('^');
+ for (int i = 0, is = wildcard.length(); i < is; i++) {
+ char c = wildcard.charAt(i);
+ switch (c) {
+ case '*':
+ regex.append(".*");
+ break;
+ case '?':
+ regex.append(".");
+ break;
+ // escape special regex-characters
+ case '(':
+ case ')':
+ case '[':
+ case ']':
+ case '$':
+ case '^':
+ case '.':
+ case '{':
+ case '}':
+ case '|':
+ case '\\':
+ regex.append("\\");
+ regex.append(c);
+ break;
+ default:
+ regex.append(c);
+ break;
+ }
+ }
+ regex.append('$');
+ return regex.toString();
+ }
+}
diff --git a/app/src/main/java/org/adaway/util/WebServerUtils.java b/app/src/main/java/org/adaway/util/WebServerUtils.java
new file mode 100644
index 0000000..54a6ab0
--- /dev/null
+++ b/app/src/main/java/org/adaway/util/WebServerUtils.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2011-2012 Dominik Schürmann
+ *
+ * This file is part of AdAway.
+ *
+ * AdAway is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AdAway is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AdAway. If not, see .
+ *
+ */
+
+package org.adaway.util;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.AssetManager;
+import android.net.Uri;
+import android.security.KeyChain;
+import android.view.ContextThemeWrapper;
+
+import androidx.annotation.StringRes;
+
+import org.adaway.R;
+import org.adaway.helper.PreferenceHelper;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ConnectException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import javax.net.ssl.SSLHandshakeException;
+import javax.security.cert.CertificateException;
+import javax.security.cert.X509Certificate;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import timber.log.Timber;
+
+import static org.adaway.model.root.ShellUtils.isBundledExecutableRunning;
+import static org.adaway.model.root.ShellUtils.killBundledExecutable;
+import static org.adaway.model.root.ShellUtils.runBundledExecutable;
+
+/**
+ * This class is an utility class to control web server execution.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class WebServerUtils {
+ public static final String TEST_URL = "https://localhost/internal-test";
+ private static final String WEB_SERVER_EXECUTABLE = "webserver";
+ private static final String LOCALHOST_CERTIFICATE = "localhost-2410.crt";
+ private static final String LOCALHOST_CERTIFICATE_KEY = "localhost-2410.key";
+
+ /**
+ * Start the web server in new thread with RootTools
+ *
+ * @param context The application context.
+ */
+ public static void startWebServer(Context context) {
+ Timber.d("Starting web server…");
+
+ Path resourcePath = context.getFilesDir().toPath().resolve(WEB_SERVER_EXECUTABLE);
+ inflateResources(context, resourcePath);
+
+ String parameters = "--resources " + resourcePath.toAbsolutePath() +
+ (PreferenceHelper.getWebServerIcon(context) ? " --icon" : "") +
+ " > /dev/null 2>&1";
+ runBundledExecutable(context, WEB_SERVER_EXECUTABLE, parameters);
+ }
+
+ /**
+ * Stop the web server.
+ */
+ public static void stopWebServer() {
+ killBundledExecutable(WEB_SERVER_EXECUTABLE);
+ }
+
+ /**
+ * Checks if web server is running
+ *
+ * @return true if webs server is running, false otherwise.
+ */
+ public static boolean isWebServerRunning() {
+ return isBundledExecutableRunning(WEB_SERVER_EXECUTABLE);
+ }
+
+ /**
+ * Get the web server state description.
+ *
+ * @return The web server state description.
+ */
+ @StringRes
+ public static int getWebServerState() {
+ OkHttpClient client = new OkHttpClient();
+ Request request = new Request.Builder()
+ .url(TEST_URL)
+ .build();
+ try (Response response = client.newCall(request).execute()) {
+ return response.isSuccessful() ?
+ R.string.pref_webserver_state_running_and_installed :
+ R.string.pref_webserver_state_not_running;
+ } catch (SSLHandshakeException e) {
+ return R.string.pref_webserver_state_running_not_installed;
+ } catch (ConnectException e) {
+ return R.string.pref_webserver_state_not_running;
+ } catch (IOException e) {
+ Timber.w(e, "Failed to test web server.");
+ return R.string.pref_webserver_state_not_running;
+ }
+ }
+
+ /**
+ * Prompt user to install web server certificate.
+ *
+ * @param context The application context.
+ */
+ public static void installCertificate(Context context) {
+ AssetManager assetManager = context.getAssets();
+ try (InputStream inputStream = assetManager.open(LOCALHOST_CERTIFICATE);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
+ byte[] buffer = new byte[1024];
+ int read;
+ while ((read = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, read);
+ }
+ byte[] bytes = outputStream.toByteArray();
+ X509Certificate x509 = X509Certificate.getInstance(bytes);
+ Intent intent = KeyChain.createInstallIntent();
+ intent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509.getEncoded());
+ intent.putExtra(KeyChain.EXTRA_NAME, "AdAway");
+ context.startActivity(intent);
+ } catch (IOException e) {
+ Timber.w(e, "Failed to read certificate.");
+ } catch (CertificateException e) {
+ Timber.w(e, "Failed to parse certificate.");
+ }
+ }
+
+ public static void copyCertificate(ContextThemeWrapper wrapper, Uri uri) {
+ ContentResolver contentResolver = wrapper.getContentResolver();
+ AssetManager assetManager = wrapper.getAssets();
+ try (InputStream inputStream = assetManager.open(LOCALHOST_CERTIFICATE);
+ OutputStream outputStream = contentResolver.openOutputStream(uri)) {
+ if (outputStream == null) {
+ throw new IOException("Failed to open "+uri);
+ }
+ byte[] buffer = new byte[1024];
+ int read;
+ while ((read = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, read);
+ }
+ } catch (IOException e) {
+ Timber.w(e, "Failed to copy certificate.");
+ }
+ }
+
+ private static void inflateResources(Context context, Path target) {
+ AssetManager assetManager = context.getAssets();
+ try {
+ inflateResource(assetManager, LOCALHOST_CERTIFICATE, target);
+ inflateResource(assetManager, LOCALHOST_CERTIFICATE_KEY, target);
+ inflateResource(assetManager, "icon.svg", target);
+ inflateResource(assetManager, "test.html", target);
+ } catch (IOException e) {
+ Timber.w(e, "Failed to inflate web server resources.");
+ }
+ }
+
+ private static void inflateResource(AssetManager assetManager, String resource, Path target) throws IOException {
+ if (!Files.isDirectory(target)) {
+ Files.createDirectories(target);
+ }
+ Path targetFile = target.resolve(resource);
+ if (!Files.isRegularFile(targetFile)) {
+ Files.copy(assetManager.open(resource), targetFile);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/util/log/ApplicationLog.java b/app/src/main/java/org/adaway/util/log/ApplicationLog.java
new file mode 100644
index 0000000..6d0ed8e
--- /dev/null
+++ b/app/src/main/java/org/adaway/util/log/ApplicationLog.java
@@ -0,0 +1,44 @@
+package org.adaway.util.log;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+
+import com.topjohnwu.superuser.Shell;
+
+import org.adaway.helper.PreferenceHelper;
+
+import timber.log.Timber;
+
+/**
+ * This class is an utility class that configures the application log.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class ApplicationLog {
+ /**
+ * Private constructor.
+ */
+ private ApplicationLog() {
+
+ }
+
+ /**
+ * Initialize application logging.
+ *
+ * @param application The application instance.
+ */
+ public static void init(Application application) {
+ if (isApplicationDebuggable(application) || PreferenceHelper.getDebugEnabled(application)) {
+ Shell.enableVerboseLogging = true;
+ Timber.plant(new Timber.DebugTree());
+ } else {
+ Shell.enableVerboseLogging = false;
+ SentryLog.init(application);
+ }
+ }
+
+ private static boolean isApplicationDebuggable(Context context) {
+ return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ }
+}
diff --git a/app/src/main/java/org/adaway/util/log/SentryLog.java b/app/src/main/java/org/adaway/util/log/SentryLog.java
new file mode 100644
index 0000000..1af31be
--- /dev/null
+++ b/app/src/main/java/org/adaway/util/log/SentryLog.java
@@ -0,0 +1,81 @@
+package org.adaway.util.log;
+
+import static io.sentry.SentryLevel.ERROR;
+import static io.sentry.SentryLevel.INFO;
+
+import android.app.Application;
+
+import org.adaway.helper.PreferenceHelper;
+
+import io.sentry.Breadcrumb;
+import io.sentry.Sentry;
+import io.sentry.android.core.SentryAndroid;
+import io.sentry.android.fragment.FragmentLifecycleIntegration;
+import io.sentry.android.timber.SentryTimberIntegration;
+
+/**
+ * This class is a helper to initialize and configuration Sentry.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class SentryLog {
+ /**
+ * Private constructor.
+ */
+ private SentryLog() {
+
+ }
+
+ /**
+ * Initialize Sentry logging client according user preferences.
+ *
+ * @param application The application instance.
+ */
+ public static void init(Application application) {
+ setEnabled(application, PreferenceHelper.getTelemetryEnabled(application));
+ }
+
+ /**
+ * Initialize Sentry logging client.
+ *
+ * @param application The application instance.
+ * @param enabled Whether the application is allowed to send events to Sentry or not.
+ */
+ public static void setEnabled(Application application, boolean enabled) {
+ if (enabled) {
+ // Initialize sentry client manually and bind it to logging
+ SentryAndroid.init(application, options -> {
+ options.addIntegration(new SentryTimberIntegration(ERROR, INFO));
+ options.addIntegration(new FragmentLifecycleIntegration(application, true, false));
+ });
+ }
+ }
+
+ /**
+ * Record a breadcrumb.
+ *
+ * @param message The breadcrumb message.
+ */
+ public static void recordBreadcrumb(String message) {
+ Sentry.configureScope(scope -> {
+ Breadcrumb breadcrumb = new Breadcrumb();
+ breadcrumb.setMessage(message);
+ breadcrumb.setLevel(INFO);
+ scope.addBreadcrumb(breadcrumb);
+ });
+ }
+
+ /**
+ * Check if {@link Sentry} implementation is a stub or not.
+ *
+ * @return {@code true} if the runtime implementation is a stub, {@code false} otherwise.
+ */
+ public static boolean isStub() {
+ try {
+ Sentry.class.getDeclaredField("STUB");
+ return true;
+ } catch (NoSuchFieldException exception) {
+ return false;
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/VpnService.java b/app/src/main/java/org/adaway/vpn/VpnService.java
new file mode 100644
index 0000000..8f1ac03
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/VpnService.java
@@ -0,0 +1,371 @@
+/*
+ * Derived from dns66:
+ * Copyright (C) 2016-2019 Julian Andres Klode
+ *
+ * Derived from AdBuster:
+ * Copyright (C) 2016 Daniel Brodie
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * Contributions shall also be provided under any later versions of the
+ * GPL.
+ */
+package org.adaway.vpn;
+
+import static android.Manifest.permission.POST_NOTIFICATIONS;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static org.adaway.broadcast.Command.START;
+import static org.adaway.broadcast.Command.STOP;
+import static org.adaway.broadcast.CommandReceiver.SEND_COMMAND_ACTION;
+import static org.adaway.helper.NotificationHelper.VPN_RESUME_SERVICE_NOTIFICATION_ID;
+import static org.adaway.helper.NotificationHelper.VPN_RUNNING_SERVICE_NOTIFICATION_ID;
+import static org.adaway.helper.NotificationHelper.VPN_SERVICE_NOTIFICATION_CHANNEL;
+import static org.adaway.vpn.VpnService.NetworkType.CELLULAR;
+import static org.adaway.vpn.VpnService.NetworkType.WIFI;
+import static org.adaway.vpn.VpnStatus.RECONNECTING;
+import static org.adaway.vpn.VpnStatus.RUNNING;
+import static org.adaway.vpn.VpnStatus.STARTING;
+import static org.adaway.vpn.VpnStatus.STOPPED;
+import static org.adaway.vpn.VpnStatus.WAITING_FOR_NETWORK;
+import static java.util.Objects.requireNonNull;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.adaway.R;
+import org.adaway.broadcast.Command;
+import org.adaway.broadcast.CommandReceiver;
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.ui.home.HomeActivity;
+import org.adaway.vpn.worker.VpnWorker;
+
+import java.lang.ref.WeakReference;
+import java.util.HashSet;
+import java.util.Set;
+
+import timber.log.Timber;
+
+/**
+ * This class is the VPN platform service implementation.
+ *
+ * it is in charge of:
+ *
+ *
Accepting service commands,
+ *
Starting / stopping the {@link VpnWorker} thread,
+ *
Publishing notifications and intent about the VPN state,
+ *
Reacting to network connectivity changes.
+ *
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class VpnService extends android.net.VpnService implements Handler.Callback {
+ public static final String VPN_UPDATE_STATUS_INTENT = "org.jak_linux.dns66.VPN_UPDATE_STATUS";
+ public static final String VPN_UPDATE_STATUS_EXTRA = "VPN_STATUS";
+ /*
+ * Notification intent related.
+ */
+ private static final int REQUEST_CODE_START = 43;
+ private static final int REQUEST_CODE_PAUSE = 42;
+ /*
+ * Handler related.
+ */
+ private static final int VPN_STATUS_UPDATE_MESSAGE_TYPE = 0;
+
+ private final MyHandler handler;
+ private final NetworkTypeCallback wifiNetworkCallback;
+ private final NetworkTypeCallback cellularNetworkCallback;
+ private final Set availableNetworkTypes;
+ private final VpnWorker vpnWorker;
+
+ /**
+ * Constructor.
+ */
+ public VpnService() {
+ this.handler = new MyHandler(this);
+ this.wifiNetworkCallback = new NetworkTypeCallback(WIFI);
+ this.cellularNetworkCallback = new NetworkTypeCallback(CELLULAR);
+ this.availableNetworkTypes = new HashSet<>();
+ this.vpnWorker = new VpnWorker(this);
+ }
+
+ /*
+ * VPN Service.
+ */
+
+ @Override
+ public void onCreate() {
+ Timber.d("Creating VPN service…");
+ registerNetworkCallback();
+ }
+
+ @Override
+ public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
+ Timber.d("onStartCommand %s", intent == null ? "null intent" : intent);
+ // Check null intent that happens when system restart the service
+ // https://developer.android.com/reference/android/app/Service#START_STICKY
+ Command command = intent == null ?
+ START :
+ Command.readFromIntent(intent);
+ switch (command) {
+ case START:
+ startVpn();
+ return START_STICKY;
+ case STOP:
+ stopVpn();
+ return START_NOT_STICKY;
+ default:
+ Timber.w("Unknown command: %s", command);
+ return START_NOT_STICKY;
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ Timber.d("Destroying VPN service…");
+ unregisterNetworkCallback();
+ Timber.d("Destroyed VPN service.");
+ }
+
+ /*
+ * Handler callback.
+ */
+
+ @Override
+ public boolean handleMessage(@NonNull Message message) {
+ if (message.what == VPN_STATUS_UPDATE_MESSAGE_TYPE) {
+ updateVpnStatus(VpnStatus.fromCode(message.arg1));
+ }
+ return true;
+ }
+
+ /**
+ * Notify a of the new VPN status.
+ *
+ * @param status The new VPN status.
+ */
+ public void notifyVpnStatus(VpnStatus status) {
+ Message statusMessage = this.handler.obtainMessage(VPN_STATUS_UPDATE_MESSAGE_TYPE, status.toCode(), 0);
+ this.handler.sendMessage(statusMessage);
+ }
+
+ private void startVpn() {
+ Timber.d("Starting VPN service…");
+ PreferenceHelper.setVpnServiceStatus(this, RUNNING);
+ updateVpnStatus(STARTING);
+ this.vpnWorker.start();
+ Timber.i("VPN service started.");
+ }
+
+ private void stopVpn() {
+ Timber.d("Stopping VPN service…");
+ PreferenceHelper.setVpnServiceStatus(this, STOPPED);
+ this.vpnWorker.stop();
+ stopForeground(true);
+ stopSelf();
+ updateVpnStatus(STOPPED);
+ Timber.i("VPN service stopped.");
+ }
+
+ private void waitForNetVpn() {
+ this.vpnWorker.stop();
+ updateVpnStatus(WAITING_FOR_NETWORK);
+ }
+
+ private void reconnect() {
+ updateVpnStatus(RECONNECTING);
+ this.vpnWorker.start();
+ }
+
+ private void updateVpnStatus(VpnStatus status) {
+ Notification notification = getNotification(status);
+ NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
+ switch (status) {
+ case STARTING:
+ case RUNNING:
+ notificationManager.cancel(VPN_RESUME_SERVICE_NOTIFICATION_ID);
+ startForeground(VPN_RUNNING_SERVICE_NOTIFICATION_ID, notification);
+ break;
+ default:
+ if (checkSelfPermission(POST_NOTIFICATIONS) == PERMISSION_GRANTED) {
+ notificationManager.notify(VPN_RESUME_SERVICE_NOTIFICATION_ID, notification);
+ }
+ }
+
+ // TODO BUG - Nobody is listening to this intent
+ // TODO BUG - VpnModel can lister to it to update the MainActivity according its current state
+ Intent intent = new Intent(VPN_UPDATE_STATUS_INTENT);
+ intent.putExtra(VPN_UPDATE_STATUS_EXTRA, status);
+ LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
+ }
+
+ private Notification getNotification(VpnStatus status) {
+ String title = getString(R.string.vpn_notification_title, getString(status.getTextResource()));
+
+ Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
+ PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, FLAG_IMMUTABLE);
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(this, VPN_SERVICE_NOTIFICATION_CHANNEL)
+ .setPriority(IMPORTANCE_LOW)
+ .setContentIntent(contentIntent)
+ .setSmallIcon(R.drawable.logo)
+ .setColorized(true)
+ .setColor(getColor(R.color.notification))
+ .setContentTitle(title);
+ switch (status) {
+ case RUNNING:
+ Intent stopIntent = new Intent(this, CommandReceiver.class)
+ .setAction(SEND_COMMAND_ACTION);
+ STOP.appendToIntent(stopIntent);
+ PendingIntent stopActionIntent = PendingIntent.getBroadcast(this, REQUEST_CODE_PAUSE, stopIntent, FLAG_IMMUTABLE);
+ builder.addAction(
+ R.drawable.ic_pause_24dp,
+ getString(R.string.vpn_notification_action_pause),
+ stopActionIntent
+ ).setOngoing(true);
+ break;
+ case STOPPED:
+ Intent startIntent = new Intent(this, CommandReceiver.class)
+ .setAction(SEND_COMMAND_ACTION);
+ START.appendToIntent(startIntent);
+ PendingIntent startActionIntent = PendingIntent.getBroadcast(this, REQUEST_CODE_START, startIntent, FLAG_IMMUTABLE);
+ builder.addAction(
+ 0,
+ getString(R.string.vpn_notification_action_resume),
+ startActionIntent
+ );
+ break;
+ }
+ return builder.build();
+ }
+
+ private void registerNetworkCallback() {
+ ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
+ NetworkRequest wifiNetworkRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_WIFI)
+ .build();
+ NetworkRequest cellularNetworkRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .build();
+ initializeNetworkTypes(connectivityManager);
+ connectivityManager.registerNetworkCallback(wifiNetworkRequest, this.wifiNetworkCallback, this.handler);
+ connectivityManager.registerNetworkCallback(cellularNetworkRequest, this.cellularNetworkCallback, this.handler);
+
+ }
+
+ private void unregisterNetworkCallback() {
+ ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
+ connectivityManager.unregisterNetworkCallback(this.wifiNetworkCallback);
+ connectivityManager.unregisterNetworkCallback(this.cellularNetworkCallback);
+ }
+
+ private void initializeNetworkTypes(ConnectivityManager connectivityManager) {
+ this.availableNetworkTypes.clear();
+ Network activeNetwork = connectivityManager.getActiveNetwork();
+ if (activeNetwork != null) {
+ NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork);
+ if (networkCapabilities != null) {
+ if (networkCapabilities.hasTransport(TRANSPORT_WIFI)) {
+ this.availableNetworkTypes.add(WIFI);
+ }
+ if (networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
+ this.availableNetworkTypes.add(CELLULAR);
+ }
+ }
+ }
+ Timber.d("Initial network types: %s ", this.availableNetworkTypes);
+ }
+
+ private void addNetworkType(NetworkType type) {
+ boolean noNetwork = this.availableNetworkTypes.isEmpty();
+ this.availableNetworkTypes.add(type);
+ if (noNetwork) {
+ Timber.d("Reconnecting VPN on network %s.", type);
+ reconnect();
+ }
+ }
+
+ private void removeNetworkType(NetworkType type) {
+ this.availableNetworkTypes.remove(type);
+ if (this.availableNetworkTypes.isEmpty()) {
+ Timber.d("Waiting for network…");
+ waitForNetVpn();
+ } else {
+ reconnect();
+ }
+ }
+
+ /**
+ * This class receives network change events to monitor network type available.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ * @see Android Developer Documentation
+ */
+ private class NetworkTypeCallback extends NetworkCallback {
+ private final NetworkType monitoredType;
+
+ NetworkTypeCallback(NetworkType monitoredType) {
+ this.monitoredType = monitoredType;
+ }
+
+ @Override
+ public void onAvailable(@NonNull Network network) {
+ Timber.d("On available %s", this.monitoredType);
+ addNetworkType(this.monitoredType);
+ }
+
+ @Override
+ public void onLost(@NonNull Network network) {
+ Timber.d("On lost %s", this.monitoredType);
+ removeNetworkType(this.monitoredType);
+ }
+ }
+
+ enum NetworkType {
+ CELLULAR,
+ WIFI,
+ }
+
+ /* The handler may only keep a weak reference around, otherwise it leaks */
+ private static class MyHandler extends Handler {
+
+ private final WeakReference callback;
+
+ MyHandler(Callback callback) {
+ super(requireNonNull(Looper.myLooper()));
+ this.callback = new WeakReference<>(callback);
+ }
+
+ @Override
+ public void handleMessage(@NonNull Message msg) {
+ Callback callback = this.callback.get();
+ if (callback != null) {
+ callback.handleMessage(msg);
+ }
+ super.handleMessage(msg);
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/VpnServiceControls.java b/app/src/main/java/org/adaway/vpn/VpnServiceControls.java
new file mode 100644
index 0000000..81e3ce9
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/VpnServiceControls.java
@@ -0,0 +1,100 @@
+package org.adaway.vpn;
+
+import static android.content.Context.CONNECTIVITY_SERVICE;
+import static android.net.NetworkCapabilities.TRANSPORT_VPN;
+import static org.adaway.broadcast.Command.START;
+import static org.adaway.broadcast.Command.STOP;
+import static org.adaway.vpn.VpnStatus.STOPPED;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+
+import org.adaway.helper.PreferenceHelper;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * This utility class allows controlling (start and stop) the AdAway VPN service.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public final class VpnServiceControls {
+ /**
+ * Private constructor.
+ */
+ private VpnServiceControls() {
+
+ }
+
+ /**
+ * Check if the VPN service is currently running.
+ *
+ * @param context The application context.
+ * @return {@code true} if the VPN service is currently running, {@code false} otherwise.
+ */
+ public static boolean isRunning(Context context) {
+ boolean networkVpnCapability = checkAnyNetworkVpnCapability(context);
+ VpnStatus status = PreferenceHelper.getVpnServiceStatus(context);
+ if (status.isStarted() && !networkVpnCapability) {
+ status = STOPPED;
+ PreferenceHelper.setVpnServiceStatus(context, status);
+ }
+ return status.isStarted();
+ }
+
+ /**
+ * Check if the VPN service is started.
+ *
+ * @param context The application context.
+ * @return {@code true} if the VPN service is started, {@code false} otherwise.
+ */
+ public static boolean isStarted(Context context) {
+ return PreferenceHelper.getVpnServiceStatus(context).isStarted();
+ }
+
+ /**
+ * Start the VPN service.
+ *
+ * @param context The application context.
+ * @return {@code true} if the service is started, {@code false} otherwise.
+ */
+ public static boolean start(Context context) {
+ // Check if VPN is already running
+ if (isRunning(context)) {
+ return true;
+ }
+ // Start the VPN service
+ Intent intent = new Intent(context, VpnService.class);
+ START.appendToIntent(intent);
+ boolean started = context.startForegroundService(intent) != null;
+ if (started) {
+ // Start the heartbeat
+ VpnServiceHeartbeat.start(context);
+ }
+ return started;
+ }
+
+ /**
+ * Stop the VPN service.
+ *
+ * @param context The application context.
+ */
+ public static void stop(Context context) {
+ // Stop the heartbeat
+ VpnServiceHeartbeat.stop(context);
+ // Stop the service
+ Intent intent = new Intent(context, VpnService.class);
+ STOP.appendToIntent(intent);
+ context.startService(intent);
+ }
+
+ private static boolean checkAnyNetworkVpnCapability(Context context) {
+ ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
+ return Arrays.stream(connectivityManager.getAllNetworks())
+ .map(connectivityManager::getNetworkCapabilities)
+ .filter(Objects::nonNull)
+ .anyMatch(networkCapabilities -> networkCapabilities.hasTransport(TRANSPORT_VPN));
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/VpnServiceHeartbeat.java b/app/src/main/java/org/adaway/vpn/VpnServiceHeartbeat.java
new file mode 100644
index 0000000..1f0b478
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/VpnServiceHeartbeat.java
@@ -0,0 +1,92 @@
+package org.adaway.vpn;
+
+import static android.content.Context.ACTIVITY_SERVICE;
+import static androidx.work.ExistingPeriodicWorkPolicy.KEEP;
+import static androidx.work.ListenableWorker.Result.success;
+import static java.lang.Integer.MAX_VALUE;
+import static java.util.concurrent.TimeUnit.MINUTES;
+
+import android.app.ActivityManager;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.work.Constraints;
+import androidx.work.NetworkType;
+import androidx.work.PeriodicWorkRequest;
+import androidx.work.WorkManager;
+import androidx.work.Worker;
+import androidx.work.WorkerParameters;
+
+import timber.log.Timber;
+
+/**
+ * This class is a worker to monitor the {@link VpnService} is still running.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class VpnServiceHeartbeat extends Worker {
+ /**
+ * The VPN service heartbeat unique worker name.
+ */
+ private static final String WORK_NAME = "vpnHeartbeat";
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ * @param workerParams The worker parameters.
+ */
+ public VpnServiceHeartbeat(@NonNull Context context, @NonNull WorkerParameters workerParams) {
+ super(context, workerParams);
+ }
+
+ @NonNull
+ @Override
+ public Result doWork() {
+ Context context = getApplicationContext();
+ if (VpnServiceControls.isStarted(context) && !isVpnServiceRunning()) {
+ Timber.i("VPN service is not running. Starting VPN service…");
+ VpnServiceControls.start(context);
+ Timber.i("VPN service started.");
+ }
+ return success();
+ }
+
+ // TODO Use VpnServiceControls.isVpnServiceRunning instead?
+ private boolean isVpnServiceRunning() {
+ String serviceName = VpnService.class.getName();
+ ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
+ // Deprecated as it only return application service. It is fine for this use case.
+ for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(MAX_VALUE)) {
+ if (serviceName.equals(service.service.getClassName())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Start the VPN service monitor.
+ *
+ * @param context The application context.
+ */
+ public static void start(Context context) {
+ PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(VpnServiceHeartbeat.class, 15, MINUTES)
+ .addTag("VPN-heartbeat")
+ .setConstraints(new Constraints.Builder()
+ .setRequiredNetworkType(NetworkType.CONNECTED)
+ .build()
+ )
+ .build();
+ WorkManager.getInstance(context).enqueueUniquePeriodicWork(WORK_NAME, KEEP, workRequest);
+ }
+
+ /**
+ * Stop the VPN service monitor.
+ *
+ * @param context The application context.
+ */
+ public static void stop(Context context) {
+ WorkManager.getInstance(context).cancelUniqueWork(WORK_NAME);
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/VpnStatus.java b/app/src/main/java/org/adaway/vpn/VpnStatus.java
new file mode 100644
index 0000000..4105913
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/VpnStatus.java
@@ -0,0 +1,47 @@
+package org.adaway.vpn;
+
+import androidx.annotation.StringRes;
+
+import org.adaway.R;
+
+import java.util.Arrays;
+
+public enum VpnStatus {
+ STARTING(10, R.string.vpn_notification_starting),
+ RUNNING(11, R.string.vpn_notification_running),
+ STOPPING(20, R.string.vpn_notification_stopping),
+ WAITING_FOR_NETWORK(21, R.string.vpn_notification_waiting_for_net),
+ RECONNECTING(22, R.string.vpn_notification_reconnecting),
+ RECONNECTING_NETWORK_ERROR(23, R.string.vpn_notification_reconnecting_error),
+ STOPPED(0, R.string.vpn_notification_stopped);
+
+ private final int code;
+
+ @StringRes
+ private final int textResource;
+
+ VpnStatus(int code, @StringRes int textResource) {
+ this.code = code;
+ this.textResource = textResource;
+ }
+
+ public static VpnStatus fromCode(int code) {
+ return Arrays.stream(VpnStatus.values())
+ .filter(vpnStatus -> vpnStatus.code == code)
+ .findAny()
+ .orElse(STOPPED);
+ }
+
+ @StringRes
+ public int getTextResource() {
+ return this.textResource;
+ }
+
+ public int toCode() {
+ return this.code;
+ }
+
+ public boolean isStarted() {
+ return this != STOPPED;
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/dns/DnsPacketProxy.java b/app/src/main/java/org/adaway/vpn/dns/DnsPacketProxy.java
new file mode 100644
index 0000000..e0703a1
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/dns/DnsPacketProxy.java
@@ -0,0 +1,278 @@
+/*
+ * Derived from dns66:
+ * Copyright (C) 2016-2019 Julian Andres Klode
+ *
+ * Derived from AdBuster:
+ * Copyright (C) 2016 Daniel Brodie
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * Contributions shall also be provided under any later versions of the
+ * GPL.
+ */
+package org.adaway.vpn.dns;
+
+import android.content.Context;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.db.entity.HostEntry;
+import org.adaway.db.entity.ListType;
+import org.adaway.model.vpn.VpnModel;
+import org.pcap4j.packet.IpPacket;
+import org.pcap4j.packet.IpSelector;
+import org.pcap4j.packet.IpV4Packet;
+import org.pcap4j.packet.IpV6Packet;
+import org.pcap4j.packet.Packet;
+import org.pcap4j.packet.UdpPacket;
+import org.pcap4j.packet.UnknownPacket;
+import org.pcap4j.packet.namednumber.IpNumber;
+import org.xbill.DNS.AAAARecord;
+import org.xbill.DNS.ARecord;
+import org.xbill.DNS.DClass;
+import org.xbill.DNS.Flags;
+import org.xbill.DNS.Message;
+import org.xbill.DNS.Name;
+import org.xbill.DNS.Rcode;
+import org.xbill.DNS.Record;
+import org.xbill.DNS.SOARecord;
+import org.xbill.DNS.Section;
+import org.xbill.DNS.TextParseException;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.function.Consumer;
+
+import timber.log.Timber;
+
+/**
+ * Creates and parses packets, and sends packets to a remote socket or the device using VpnWorker.
+ */
+public class DnsPacketProxy {
+ // Choose a value that is smaller than the time needed to unblock a host.
+ private static final int NEGATIVE_CACHE_TTL_SECONDS = 5;
+ private static final SOARecord NEGATIVE_CACHE_SOA_RECORD;
+
+ static {
+ try {
+ // Let's use a guaranteed invalid hostname here, clients are not supposed to use
+ // our fake values, the whole thing just exists for negative caching.
+ Name name = new Name("adaway.vpn.invalid.");
+ NEGATIVE_CACHE_SOA_RECORD = new SOARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS,
+ name, name, 0, 0, 0, 0, NEGATIVE_CACHE_TTL_SECONDS);
+ } catch (TextParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private final EventLoop eventLoop;
+ private final DnsServerMapper dnsServerMapper;
+ private VpnModel vpnModel;
+
+ public DnsPacketProxy(EventLoop eventLoop, DnsServerMapper dnsServerMapper) {
+ this.eventLoop = eventLoop;
+ this.dnsServerMapper = dnsServerMapper;
+ }
+
+ /**
+ * Initializes the rules database and the list of upstream servers.
+ *
+ * @param context The context we are operating in (for the database).
+ */
+ public void initialize(Context context) {
+ this.vpnModel = (VpnModel) ((AdAwayApplication) context.getApplicationContext()).getAdBlockModel();
+ }
+
+ /**
+ * Handles a responsePayload from an upstream DNS server
+ *
+ * @param requestPacket The original request packet
+ * @param responsePayload The payload of the response
+ */
+ public void handleDnsResponse(IpPacket requestPacket, byte[] responsePayload) {
+ UdpPacket udpOutPacket = (UdpPacket) requestPacket.getPayload();
+ UdpPacket.Builder payLoadBuilder = new UdpPacket.Builder(udpOutPacket)
+ .srcPort(udpOutPacket.getHeader().getDstPort())
+ .dstPort(udpOutPacket.getHeader().getSrcPort())
+ .srcAddr(requestPacket.getHeader().getDstAddr())
+ .dstAddr(requestPacket.getHeader().getSrcAddr())
+ .correctChecksumAtBuild(true)
+ .correctLengthAtBuild(true)
+ .payloadBuilder(
+ new UnknownPacket.Builder().rawData(responsePayload)
+ );
+
+ IpPacket ipOutPacket;
+ if (requestPacket instanceof IpV4Packet) {
+ ipOutPacket = new IpV4Packet.Builder((IpV4Packet) requestPacket)
+ .srcAddr((Inet4Address) requestPacket.getHeader().getDstAddr())
+ .dstAddr((Inet4Address) requestPacket.getHeader().getSrcAddr())
+ .correctChecksumAtBuild(true)
+ .correctLengthAtBuild(true)
+ .payloadBuilder(payLoadBuilder)
+ .build();
+
+ } else {
+ ipOutPacket = new IpV6Packet.Builder((IpV6Packet) requestPacket)
+ .srcAddr((Inet6Address) requestPacket.getHeader().getDstAddr())
+ .dstAddr((Inet6Address) requestPacket.getHeader().getSrcAddr())
+ .correctLengthAtBuild(true)
+ .payloadBuilder(payLoadBuilder)
+ .build();
+ }
+
+ this.eventLoop.queueDeviceWrite(ipOutPacket);
+ }
+
+ /**
+ * Handles a DNS request, by either blocking it or forwarding it to the remote location.
+ *
+ * @param packetData The packet data to read
+ * @throws IOException If some network error occurred
+ */
+ public void handleDnsRequest(byte[] packetData) throws IOException {
+ IpPacket ipPacket;
+ try {
+ ipPacket = (IpPacket) IpSelector.newPacket(packetData, 0, packetData.length);
+ } catch (Exception e) {
+ Timber.i(e, "handleDnsRequest: Discarding invalid IP packet");
+ return;
+ }
+
+ // Check UDP protocol
+ if (ipPacket.getHeader().getProtocol() != IpNumber.UDP) {
+ return;
+ }
+
+ UdpPacket updPacket;
+ Packet udpPayload;
+
+ try {
+ updPacket = (UdpPacket) ipPacket.getPayload();
+ udpPayload = updPacket.getPayload();
+ } catch (Exception e) {
+ Timber.i(e, "handleDnsRequest: Discarding unknown packet type %s", ipPacket.getHeader());
+ return;
+ }
+
+ InetAddress packetAddress = ipPacket.getHeader().getDstAddr();
+ int packetPort = updPacket.getHeader().getDstPort().valueAsInt();
+ Optional dnsAddressOptional = this.dnsServerMapper.getDnsServerFromFakeAddress(packetAddress);
+ if (!dnsAddressOptional.isPresent()) {
+ Timber.w("Cannot find mapped DNS for %s.", packetAddress.getHostAddress());
+ return;
+ }
+ InetAddress dnsAddress = dnsAddressOptional.get();
+
+ if (udpPayload == null) {
+ Timber.i("handleDnsRequest: Sending UDP packet without payload: %s", updPacket);
+
+ // Let's be nice to Firefox. Firefox uses an empty UDP packet to
+ // the gateway to reduce the RTT. For further details, please see
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=888268
+ DatagramPacket outPacket = new DatagramPacket(new byte[0], 0, dnsAddress, packetPort);
+ eventLoop.forwardPacket(outPacket);
+ return;
+ }
+
+ byte[] dnsRawData = udpPayload.getRawData();
+ Message dnsMsg;
+ try {
+ dnsMsg = new Message(dnsRawData);
+ } catch (IOException e) {
+ Timber.i(e, "handleDnsRequest: Discarding non-DNS or invalid packet");
+ return;
+ }
+ if (dnsMsg.getQuestion() == null) {
+ Timber.i("handleDnsRequest: Discarding DNS packet with no query %s", dnsMsg);
+ return;
+ }
+ Name name = dnsMsg.getQuestion().getName();
+ String dnsQueryName = name.toString(true);
+ HostEntry entry = getHostEntry(dnsQueryName);
+ switch (entry.getType()) {
+ case BLOCKED:
+ Timber.i("handleDnsRequest: DNS Name %s blocked!", dnsQueryName);
+ dnsMsg.getHeader().setFlag(Flags.QR);
+ dnsMsg.getHeader().setRcode(Rcode.NOERROR);
+ dnsMsg.addRecord(NEGATIVE_CACHE_SOA_RECORD, Section.AUTHORITY);
+ handleDnsResponse(ipPacket, dnsMsg.toWire());
+ break;
+ case ALLOWED:
+ Timber.i("handleDnsRequest: DNS Name %s allowed, sending to %s.", dnsQueryName, dnsAddress);
+ DatagramPacket outPacket = new DatagramPacket(dnsRawData, 0, dnsRawData.length, dnsAddress, packetPort);
+ this.eventLoop.forwardPacket(outPacket, data -> handleDnsResponse(ipPacket, data));
+ break;
+ case REDIRECTED:
+ Timber.i("handleDnsRequest: DNS Name %s redirected to %s.", dnsQueryName, entry.getRedirection());
+ dnsMsg.getHeader().setFlag(Flags.QR);
+ dnsMsg.getHeader().setFlag(Flags.AA);
+ dnsMsg.getHeader().unsetFlag(Flags.RD);
+ dnsMsg.getHeader().setRcode(Rcode.NOERROR);
+ try {
+ InetAddress address = InetAddress.getByName(entry.getRedirection());
+ Record record;
+ if (address instanceof Inet6Address) {
+ record = new AAAARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS, address);
+ } else {
+ record = new ARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS, address);
+ }
+ dnsMsg.addRecord(record, Section.ANSWER);
+ } catch (UnknownHostException e) {
+ Timber.w(e, "Failed to get inet address for host %s.", dnsQueryName);
+ }
+ handleDnsResponse(ipPacket, dnsMsg.toWire());
+ break;
+ }
+ }
+
+ private HostEntry getHostEntry(String dnsQueryName) {
+ String hostname = dnsQueryName.toLowerCase(Locale.ENGLISH);
+ HostEntry entry = null;
+ if (this.vpnModel != null) {
+ entry = this.vpnModel.getEntry(hostname);
+ }
+ if (entry == null) {
+ entry = new HostEntry();
+ entry.setHost(hostname);
+ entry.setType(ListType.ALLOWED);
+ }
+ return entry;
+ }
+
+ /**
+ * Interface abstracting away VpnWorker.
+ */
+ public interface EventLoop {
+ /**
+ * Forward a packet to the VPN underlying network.
+ *
+ * @param packet The packet to forward.
+ * @throws IOException If the packet could not be forwarded.
+ */
+ void forwardPacket(DatagramPacket packet) throws IOException;
+
+ /**
+ * Forward a packet to the VPN underlying network.
+ *
+ * @param packet The packet to forward.
+ * @param callback The callback to call with the packet response data.
+ * @throws IOException If the packet could not be forwarded.
+ */
+ void forwardPacket(DatagramPacket packet, Consumer callback) throws IOException;
+
+ /**
+ * Write an IP packet to the local TUN device
+ *
+ * @param packet The packet to write (a response to a DNS request)
+ */
+ void queueDeviceWrite(IpPacket packet);
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/dns/DnsQuery.java b/app/src/main/java/org/adaway/vpn/dns/DnsQuery.java
new file mode 100644
index 0000000..d96fa91
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/dns/DnsQuery.java
@@ -0,0 +1,100 @@
+package org.adaway.vpn.dns;
+
+import static android.system.OsConstants.POLLIN;
+
+import android.os.ParcelFileDescriptor;
+import android.system.StructPollfd;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.util.function.Consumer;
+
+import timber.log.Timber;
+
+/**
+ * This class represents a DNS query.
+ *
+ * @author Bruce BUJON
+ */
+class DnsQuery implements AutoCloseable {
+ /**
+ * The socket used to query DNS server.
+ */
+ private final DatagramSocket socket;
+ /**
+ * The callback to call with the query response data.
+ */
+ private final Consumer callback;
+ /**
+ * The pollfd related to the query to poll the OS with.
+ */
+ private final StructPollfd pollfd;
+ /**
+ * The query creation time, UNIX timestamp in seconds).
+ */
+ private final long time;
+
+ /**
+ * Constructor.
+ *
+ * @param socket The socket used to query DNS server.
+ * @param callback The callback to call with the query response data.
+ */
+ DnsQuery(DatagramSocket socket, Consumer callback) {
+ this.socket = socket;
+ this.callback = callback;
+ this.time = System.currentTimeMillis() / 1000;
+ this.pollfd = new StructPollfd();
+ this.pollfd.fd = ParcelFileDescriptor.fromDatagramSocket(this.socket).getFileDescriptor();
+ this.pollfd.events = (short) POLLIN;
+ }
+
+ /**
+ * Check whether a query is older than a timestamp.
+ *
+ * @param timestamp The UNIX timestamp (in seconds) to compare query time with.
+ * @return true if the query is older than the given timestamp, false otherwise.
+ */
+ boolean isOlderThan(long timestamp) {
+ return this.time < timestamp;
+ }
+
+ /**
+ * Get the pollfd related to the query to poll the OS with.
+ * @return The pollfd related to the query to poll the OS with.
+ */
+ StructPollfd getPollfd() {
+ return this.pollfd;
+ }
+
+ /**
+ * Check whether the query is answered, meaning its socket has received data to read.
+ *
+ * @return {@code true} if there is data to read from {@link #socket}, {@code false} otherwise.
+ */
+ boolean isAnswered() {
+ return (this.pollfd.revents & POLLIN) != 0;
+ }
+
+ /**
+ * Read DNS query response and notify callback.
+ */
+ void handleResponse() {
+ try {
+ byte[] responseData = new byte[1024];
+ DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length);
+ this.socket.receive(responsePacket);
+ this.callback.accept(responseData);
+ } catch (IOException e) {
+ Timber.w(e, "Could not handle DNS response.");
+ } finally {
+ close();
+ }
+ }
+
+ @Override
+ public void close() {
+ this.socket.close();
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/dns/DnsQueryQueue.java b/app/src/main/java/org/adaway/vpn/dns/DnsQueryQueue.java
new file mode 100644
index 0000000..460f975
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/dns/DnsQueryQueue.java
@@ -0,0 +1,106 @@
+package org.adaway.vpn.dns;
+
+import android.system.StructPollfd;
+
+import java.net.DatagramSocket;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.function.Consumer;
+
+import timber.log.Timber;
+
+/**
+ * This class represents the running DNS queries queue.
+ * This queue is time and space bound.
+ *
+ * @author Bruce BUJON
+ */
+public class DnsQueryQueue {
+ /**
+ * The maximum number of responses to wait for.
+ */
+ private static final int DNS_MAXIMUM_WAITING = 1024;
+ /**
+ * The maximum time to wait for the response (in seconds).
+ */
+ private static final long DNS_TIMEOUT_SEC = 10;
+ /**
+ * The packet queue (older packets first, in the queue head).
+ */
+ private final Queue queries;
+
+ /**
+ * Constructor.
+ */
+ public DnsQueryQueue() {
+ this.queries = new LinkedList<>();
+ }
+
+ /**
+ * Add DNS query to the queue.
+ *
+ * @param socket The socket used to query DNS server.
+ * @param callback The callback to call with the query response data.
+ */
+ public void addQuery(DatagramSocket socket, Consumer callback) {
+ // Apply time constraint by removing timed out queries
+ clearTimedOutQueries();
+ // Apply space constraint by removing older packet if queue is full
+ ensureFreeSpace();
+ // Add query to the queue
+ DnsQuery query = new DnsQuery(socket, callback);
+ this.queries.add(query);
+ }
+
+ private void ensureFreeSpace() {
+ if (this.queries.size() > DNS_MAXIMUM_WAITING) {
+ DnsQuery oldestQuery = this.queries.remove();
+ Timber.d("Dropping query due to space constraints: %s.", oldestQuery);
+ oldestQuery.close();
+ }
+ }
+
+ private void clearTimedOutQueries() {
+ long now = System.currentTimeMillis() / 1000;
+ while (!this.queries.isEmpty() && this.queries.element().isOlderThan(now - DNS_TIMEOUT_SEC)) {
+ DnsQuery timedOutQuery = this.queries.remove();
+ Timber.d("Query %s timed out.", timedOutQuery);
+ timedOutQuery.close();
+ }
+ }
+
+ /**
+ * Get the number of pending DNS queries.
+ *
+ * @return The number of pending DNS queries.
+ */
+ public int size() {
+ return this.queries.size();
+ }
+
+ /**
+ * Get the query pollfds.
+ *
+ * @return The query pollfds.
+ */
+ public StructPollfd[] getQueryFds() {
+ return this.queries.stream()
+ .map(DnsQuery::getPollfd)
+ .toArray(StructPollfd[]::new);
+ }
+
+ /**
+ * Handle any responded query.
+ */
+ public void handleResponses() {
+ Iterator iterator = this.queries.iterator();
+ while (iterator.hasNext()) {
+ DnsQuery query = iterator.next();
+ if (query.isAnswered()) {
+ iterator.remove();
+ query.handleResponse();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/dns/DnsServerMapper.java b/app/src/main/java/org/adaway/vpn/dns/DnsServerMapper.java
new file mode 100644
index 0000000..5ae337b
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/dns/DnsServerMapper.java
@@ -0,0 +1,307 @@
+package org.adaway.vpn.dns;
+
+import static android.content.Context.CONNECTIVITY_SERVICE;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_VPN;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static java.util.Collections.emptyList;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.VpnService;
+
+import org.adaway.helper.PreferenceHelper;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import timber.log.Timber;
+
+/**
+ * This class is in charge of mapping DNS server addresses between network DNS and fake DNS.
+ *
+ * Fake DNS addresses are registered as VPN interface DNS to capture DNS traffic.
+ * Each original DNS server is directly mapped to one fake address.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class DnsServerMapper {
+ /**
+ * The TEST NET addresses blocks, defined in RFC5735.
+ */
+ private static final String[] TEST_NET_ADDRESS_BLOCKS = {
+ "192.0.2.0/24", // TEST-NET-1
+ "198.51.100.0/24", // TEST-NET-2
+ "203.0.113.0/24" // TEST-NET-3
+ };
+ /**
+ * This IPv6 address prefix for documentation, defined in RFC3849.
+ */
+ private static final String IPV6_ADDRESS_PREFIX_RESERVED_FOR_DOCUMENTATION = "2001:db8::/32";
+ /**
+ * VPN network IPv6 interface prefix length.
+ */
+ private static final int IPV6_PREFIX_LENGTH = 120;
+ /**
+ * The original DNS servers.
+ */
+ private final List dnsServers;
+
+ /**
+ * Constructor.
+ */
+ public DnsServerMapper() {
+ this.dnsServers = new ArrayList<>();
+ }
+
+ /**
+ * Configure the VPN.
+ *
+ * Add interface address per IP family and fake DNS server per system DNS server.
+ *
+ * @param context The application context.
+ * @param builder The builder of the VPN to configure.
+ */
+ public void configureVpn(Context context, VpnService.Builder builder) {
+ // Get DNS servers
+ List dnsServers = getNetworkDnsServers(context);
+ // Configure tunnel network address
+ Subnet ipv4Subnet = addIpv4Address(builder);
+ Subnet ipv6Subnet = hasIpV6DnsServers(context, dnsServers) ? addIpv6Address(builder) : null;
+ // Configure DNS mapping
+ this.dnsServers.clear();
+ for (InetAddress dnsServer : dnsServers) {
+ Subnet subnetForDnsServer = dnsServer instanceof Inet4Address ? ipv4Subnet : ipv6Subnet;
+ if (subnetForDnsServer == null) {
+ continue;
+ }
+ this.dnsServers.add(dnsServer);
+ int serverIndex = this.dnsServers.size();
+ InetAddress dnsAddressAlias = subnetForDnsServer.getAddress(serverIndex);
+ Timber.i("Mapping DNS server %s as %s.", dnsServer, dnsAddressAlias);
+ builder.addDnsServer(dnsAddressAlias);
+ if (dnsServer instanceof Inet4Address) {
+ builder.addRoute(dnsAddressAlias, 32);
+ }
+ }
+ }
+
+ public InetAddress getDefaultDnsServerAddress() {
+ if (this.dnsServers.isEmpty()) {
+ try {
+ return InetAddress.getByName("1.1.1.1");
+ } catch (UnknownHostException e) {
+ throw new IllegalStateException("Failed to parse hardcoded DNS IP address.", e);
+ }
+ }
+ // Return last DNS server added
+ return this.dnsServers.get(this.dnsServers.size() - 1);
+ }
+
+ /**
+ * Get the original DNS server address from fake DNS server address.
+ *
+ * @param fakeDnsAddress The fake DNS address to get the original DNS server address.
+ * @return The original DNS server address, wrapped into an {@link Optional} or {@link Optional#empty()} if it does not exists.
+ */
+ Optional getDnsServerFromFakeAddress(InetAddress fakeDnsAddress) {
+ byte[] address = fakeDnsAddress.getAddress();
+ int index = address[address.length - 1] - 2;
+ if (index < 0 || index >= this.dnsServers.size()) {
+ return Optional.empty();
+ }
+ InetAddress dnsAddress = this.dnsServers.get(index);
+ Timber.d("handleDnsRequest: Incoming packet to %s AKA %d AKA %s", fakeDnsAddress.getHostAddress(), index, dnsAddress.getHostAddress());
+ return Optional.of(dnsAddress);
+ }
+
+ /**
+ * Get the DNS server addresses from the device networks.
+ *
+ * @param context The application context.
+ * @return The DNS server addresses, an empty collection if no network.
+ */
+ private List getNetworkDnsServers(Context context) {
+ ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
+ dumpNetworkInfo(connectivityManager);
+ Network activeNetwork = connectivityManager.getActiveNetwork();
+ if (activeNetwork == null) {
+ return getAnyNonVpnNetworkDns(connectivityManager);
+ } else if (isNotVpnNetwork(connectivityManager, activeNetwork)) {
+ Timber.d("Get DNS servers from active network %s", activeNetwork);
+ return getNetworkDnsServers(connectivityManager, activeNetwork);
+ } else {
+ return getDnsFromNonVpnNetworkWithMatchingTransportType(connectivityManager, activeNetwork);
+ }
+ }
+
+ /**
+ * Dump all network properties to logs.
+ *
+ * @param connectivityManager The connectivity manager.
+ */
+ private void dumpNetworkInfo(ConnectivityManager connectivityManager) {
+ Network activeNetwork = connectivityManager.getActiveNetwork();
+ Timber.d("Dumping network and dns configuration:");
+ for (Network network : connectivityManager.getAllNetworks()) {
+ NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
+ boolean cellular = networkCapabilities != null && networkCapabilities.hasTransport(TRANSPORT_CELLULAR);
+ boolean wifi = networkCapabilities != null && networkCapabilities.hasTransport(TRANSPORT_WIFI);
+ boolean vpn = networkCapabilities != null && networkCapabilities.hasTransport(TRANSPORT_VPN);
+ LinkProperties linkProperties = connectivityManager.getLinkProperties(network);
+ String dnsList = linkProperties == null ? "none" : linkProperties.getDnsServers()
+ .stream()
+ .map(InetAddress::toString)
+ .collect(Collectors.joining(", "));
+ Timber.d(
+ "Network %s %s: %s%s%s with dns %s",
+ network,
+ network.equals(activeNetwork) ? "[default]" : "[other]",
+ cellular ? "cellular" : "",
+ wifi ? "WiFi" : "",
+ vpn ? " VPN" : "",
+ dnsList);
+ }
+ }
+
+ /**
+ * Get the DNS server addresses of any network without VPN capability.
+ *
+ * @param connectivityManager The connectivity manager.
+ * @return The DNS server addresses, an empty collection if no applicable DNS server found.
+ */
+ private List getAnyNonVpnNetworkDns(ConnectivityManager connectivityManager) {
+ for (Network network : connectivityManager.getAllNetworks()) {
+ if (isNotVpnNetwork(connectivityManager, network)) {
+ List dnsServers = getNetworkDnsServers(connectivityManager, network);
+ if (!dnsServers.isEmpty()) {
+ Timber.d("Get DNS servers from non VPN network %s", network);
+ return dnsServers;
+ }
+ }
+ }
+ return emptyList();
+ }
+
+ /**
+ * Get the DNS server addresses of a network with the same transport type as the active network except VPN.
+ *
+ * @param connectivityManager The connectivity manager.
+ * @param activeNetwork The active network to filter similar transport type.
+ * @return The DNS server addresses, an empty collection if no applicable DNS server found.
+ */
+ private List getDnsFromNonVpnNetworkWithMatchingTransportType(
+ ConnectivityManager connectivityManager,
+ Network activeNetwork
+ ) {
+ // Get active network transport
+ NetworkCapabilities activeNetworkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork);
+ if (activeNetworkCapabilities == null) {
+ return emptyList();
+ }
+ int activeNetworkTransport = -1;
+ if (activeNetworkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
+ activeNetworkTransport = TRANSPORT_CELLULAR;
+ } else if (activeNetworkCapabilities.hasTransport(TRANSPORT_WIFI)) {
+ activeNetworkTransport = TRANSPORT_WIFI;
+ }
+ // Check all network to find one without VPN and matching transport
+ for (Network network : connectivityManager.getAllNetworks()) {
+ NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
+ if (networkCapabilities == null) {
+ continue;
+ }
+ if (networkCapabilities.hasTransport(activeNetworkTransport) && !networkCapabilities.hasTransport(TRANSPORT_VPN)) {
+ List dns = getNetworkDnsServers(connectivityManager, network);
+ if (!dns.isEmpty()) {
+ Timber.d("Get DNS servers from non VPN matching type network %s", network);
+ return dns;
+ }
+ }
+ }
+ return emptyList();
+ }
+
+ /**
+ * Get the DNS server addresses of a network.
+ *
+ * @param connectivityManager The connectivity manager.
+ * @param network The network to get DNS server addresses.
+ * @return The DNS server addresses, an empty collection if no network.
+ */
+ private List getNetworkDnsServers(ConnectivityManager connectivityManager, Network network) {
+ LinkProperties linkProperties = connectivityManager.getLinkProperties(network);
+ if (linkProperties == null) {
+ return emptyList();
+ }
+ return linkProperties.getDnsServers();
+ }
+
+ /**
+ * Check a network does not have VPN transport.
+ *
+ * @param connectivityManager The connectivity manager.
+ * @param network The network to check.
+ * @return true if a network is not a VPN, false otherwise.
+ */
+ private boolean isNotVpnNetwork(ConnectivityManager connectivityManager, Network network) {
+ if (network == null) {
+ return false;
+ }
+ NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
+ return networkCapabilities != null && !networkCapabilities.hasTransport(TRANSPORT_VPN);
+ }
+
+ /**
+ * Add IPv4 network address to the VPN.
+ *
+ * @param builder The build of the VPN to configure.
+ * @return The IPv4 address of the VPN network.
+ */
+ private Subnet addIpv4Address(VpnService.Builder builder) {
+ for (String addressBlock : TEST_NET_ADDRESS_BLOCKS) {
+ try {
+ Subnet subnet = Subnet.parse(addressBlock);
+ InetAddress address = subnet.getAddress(0);
+ builder.addAddress(address, subnet.prefixLength);
+ Timber.d("Set %s as IPv4 network address to tunnel interface.", address);
+ return subnet;
+ } catch (IllegalArgumentException e) {
+ Timber.w(e, "Failed to add %s network address to tunnel interface.", addressBlock);
+ }
+ }
+ throw new IllegalStateException("Failed to add any IPv4 address for TEST-NET to tunnel interface.");
+ }
+
+ /**
+ * Add IPv6 network address to the VPN.
+ *
+ * @param builder The build of the VPN to configure.
+ * @return The IPv4 address of the VPN network.
+ */
+ private Subnet addIpv6Address(VpnService.Builder builder) {
+ Subnet subnet = Subnet.parse(IPV6_ADDRESS_PREFIX_RESERVED_FOR_DOCUMENTATION);
+ builder.addAddress(subnet.address, IPV6_PREFIX_LENGTH);
+ Timber.d("Set %s as IPv6 network address to tunnel interface.", subnet.address);
+ return subnet;
+ }
+
+
+ private boolean hasIpV6DnsServers(Context context, Collection dnsServers) {
+ boolean hasIpv6Server = dnsServers.stream()
+ .anyMatch(server -> server instanceof Inet6Address);
+ boolean hasOnlyOnServer = dnsServers.size() == 1;
+ boolean isIpv6Enabled = PreferenceHelper.getEnableIpv6(context);
+ return (isIpv6Enabled || hasOnlyOnServer) && hasIpv6Server;
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/dns/DohPacketProxy.java b/app/src/main/java/org/adaway/vpn/dns/DohPacketProxy.java
new file mode 100644
index 0000000..43a4a88
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/dns/DohPacketProxy.java
@@ -0,0 +1,299 @@
+
+package org.adaway.vpn.dns;
+
+import android.content.Context;
+
+import org.adaway.AdAwayApplication;
+import org.adaway.db.entity.HostEntry;
+import org.adaway.db.entity.ListType;
+import org.adaway.model.vpn.VpnModel;
+import org.adaway.util.AppExecutors;
+import org.adaway.vpn.dns.DnsPacketProxy.EventLoop;
+import org.pcap4j.packet.IpPacket;
+import org.pcap4j.packet.IpSelector;
+import org.pcap4j.packet.IpV4Packet;
+import org.pcap4j.packet.IpV6Packet;
+import org.pcap4j.packet.Packet;
+import org.pcap4j.packet.UdpPacket;
+import org.pcap4j.packet.UnknownPacket;
+import org.pcap4j.packet.namednumber.IpNumber;
+import org.xbill.DNS.AAAARecord;
+import org.xbill.DNS.ARecord;
+import org.xbill.DNS.DClass;
+import org.xbill.DNS.Flags;
+import org.xbill.DNS.Message;
+import org.xbill.DNS.Name;
+import org.xbill.DNS.Rcode;
+import org.xbill.DNS.Record;
+import org.xbill.DNS.SOARecord;
+import org.xbill.DNS.Section;
+import org.xbill.DNS.TextParseException;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+import okhttp3.Cache;
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+import okhttp3.dnsoverhttps.DnsOverHttps;
+import timber.log.Timber;
+
+/**
+ * Creates and parses packets, and sends packets to a remote socket or the device using VpnWorker.
+ */
+public class DohPacketProxy {
+ // Choose a value that is smaller than the time needed to unblock a host.
+ private static final int NEGATIVE_CACHE_TTL_SECONDS = 5;
+ private static final SOARecord NEGATIVE_CACHE_SOA_RECORD;
+
+ private static final Executor EXECUTOR = AppExecutors.getInstance().networkIO();
+
+ static {
+ try {
+ // Let's use a guaranteed invalid hostname here, clients are not supposed to use
+ // our fake values, the whole thing just exists for negative caching.
+ Name name = new Name("adaway.vpn.invalid.");
+ NEGATIVE_CACHE_SOA_RECORD = new SOARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS,
+ name, name, 0, 0, 0, 0, NEGATIVE_CACHE_TTL_SECONDS);
+ } catch (TextParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private final EventLoop eventLoop;
+ private final DnsServerMapper dnsServerMapper;
+ private VpnModel vpnModel;
+ private DnsOverHttps dnsOverHttps;
+
+ public DohPacketProxy(EventLoop eventLoop, DnsServerMapper dnsServerMapper) {
+ this.eventLoop = eventLoop;
+ this.dnsServerMapper = dnsServerMapper;
+ }
+
+ private static InetAddress getByIp(String host) {
+ try {
+ return InetAddress.getByName(host);
+ } catch (UnknownHostException e) {
+ // unlikely
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Initializes the rules database and the list of upstream servers.
+ *
+ * @param context The context we are operating in (for the database).
+ */
+ public void initialize(Context context) {
+ this.vpnModel = (VpnModel) ((AdAwayApplication) context.getApplicationContext()).getAdBlockModel();
+ this.dnsOverHttps = createDnsOverHttps(context);
+ }
+
+ private DnsOverHttps createDnsOverHttps(Context context) {
+ Cache dnsClientCache = new Cache(context.getCacheDir(), 10 * 1024 * 1024L);
+ OkHttpClient dnsClient = new OkHttpClient.Builder().cache(dnsClientCache).build();
+ return new DnsOverHttps.Builder()
+ .client(dnsClient)
+ .url(HttpUrl.get("https://cloudflare-dns.com/dns-query"))
+ .bootstrapDnsHosts(getByIp("1.1.1.1"), getByIp("1.0.0.1"))
+ .includeIPv6(false)
+ .post(true)
+ .build();
+ }
+
+ /**
+ * Handles a responsePayload from an upstream DNS server
+ *
+ * @param requestPacket The original request packet
+ * @param responsePayload The payload of the response
+ */
+ public void handleDnsResponse(IpPacket requestPacket, byte[] responsePayload) {
+ UdpPacket udpOutPacket = (UdpPacket) requestPacket.getPayload();
+ UdpPacket.Builder payLoadBuilder = new UdpPacket.Builder(udpOutPacket)
+ .srcPort(udpOutPacket.getHeader().getDstPort())
+ .dstPort(udpOutPacket.getHeader().getSrcPort())
+ .srcAddr(requestPacket.getHeader().getDstAddr())
+ .dstAddr(requestPacket.getHeader().getSrcAddr())
+ .correctChecksumAtBuild(true)
+ .correctLengthAtBuild(true)
+ .payloadBuilder(
+ new UnknownPacket.Builder().rawData(responsePayload)
+ );
+
+ IpPacket ipOutPacket;
+ if (requestPacket instanceof IpV4Packet) {
+ ipOutPacket = new IpV4Packet.Builder((IpV4Packet) requestPacket)
+ .srcAddr((Inet4Address) requestPacket.getHeader().getDstAddr())
+ .dstAddr((Inet4Address) requestPacket.getHeader().getSrcAddr())
+ .correctChecksumAtBuild(true)
+ .correctLengthAtBuild(true)
+ .payloadBuilder(payLoadBuilder)
+ .build();
+
+ } else {
+ ipOutPacket = new IpV6Packet.Builder((IpV6Packet) requestPacket)
+ .srcAddr((Inet6Address) requestPacket.getHeader().getDstAddr())
+ .dstAddr((Inet6Address) requestPacket.getHeader().getSrcAddr())
+ .correctLengthAtBuild(true)
+ .payloadBuilder(payLoadBuilder)
+ .build();
+ }
+
+ this.eventLoop.queueDeviceWrite(ipOutPacket);
+ }
+
+ /**
+ * Handles a DNS request, by either blocking it or forwarding it to the remote location.
+ *
+ * @param packetData The packet data to read
+ * @throws IOException If some network error occurred
+ */
+ public void handleDnsRequest(byte[] packetData) throws IOException {
+ IpPacket ipPacket;
+ try {
+ ipPacket = (IpPacket) IpSelector.newPacket(packetData, 0, packetData.length);
+ } catch (Exception e) {
+ Timber.i(e, "handleDnsRequest: Discarding invalid IP packet");
+ return;
+ }
+
+ // Check UDP protocol
+ if (ipPacket.getHeader().getProtocol() != IpNumber.UDP) {
+ return;
+ }
+
+ UdpPacket updPacket;
+ Packet udpPayload;
+
+ try {
+ updPacket = (UdpPacket) ipPacket.getPayload();
+ udpPayload = updPacket.getPayload();
+ } catch (Exception e) {
+ Timber.i(e, "handleDnsRequest: Discarding unknown packet type %s", ipPacket.getHeader());
+ return;
+ }
+
+ InetAddress packetAddress = ipPacket.getHeader().getDstAddr();
+ int packetPort = updPacket.getHeader().getDstPort().valueAsInt();
+ Optional dnsAddressOptional = this.dnsServerMapper.getDnsServerFromFakeAddress(packetAddress);
+ if (!dnsAddressOptional.isPresent()) {
+ Timber.w("Cannot find mapped DNS for %s.", packetAddress.getHostAddress());
+ return;
+ }
+ InetAddress dnsAddress = dnsAddressOptional.get();
+
+ if (udpPayload == null) {
+ Timber.i("handleDnsRequest: Sending UDP packet without payload: %s", updPacket);
+
+ // Let's be nice to Firefox. Firefox uses an empty UDP packet to
+ // the gateway to reduce the RTT. For further details, please see
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=888268
+ DatagramPacket outPacket = new DatagramPacket(new byte[0], 0, 0 /* length */, dnsAddress, packetPort);
+ eventLoop.forwardPacket(outPacket);
+ return;
+ }
+
+ byte[] dnsRawData = udpPayload.getRawData();
+ Message dnsMsg;
+ try {
+ dnsMsg = new Message(dnsRawData);
+ } catch (IOException e) {
+ Timber.i(e, "handleDnsRequest: Discarding non-DNS or invalid packet");
+ return;
+ }
+ if (dnsMsg.getQuestion() == null) {
+ Timber.i("handleDnsRequest: Discarding DNS packet with no query %s", dnsMsg);
+ return;
+ }
+ Name name = dnsMsg.getQuestion().getName();
+ String dnsQueryName = name.toString(true);
+ HostEntry entry = getHostEntry(dnsQueryName);
+ switch (entry.getType()) {
+ case BLOCKED:
+ Timber.i("handleDnsRequest: DNS Name %s blocked!", dnsQueryName);
+ dnsMsg.getHeader().setFlag(Flags.QR);
+ dnsMsg.getHeader().setRcode(Rcode.NOERROR);
+ dnsMsg.addRecord(NEGATIVE_CACHE_SOA_RECORD, Section.AUTHORITY);
+ handleDnsResponse(ipPacket, dnsMsg.toWire());
+ break;
+ case ALLOWED:
+ Timber.i("handleDnsRequest: DNS Name %s allowed, sending to %s.", dnsQueryName, dnsAddress);
+ EXECUTOR.execute(() -> queryDohServer(ipPacket, dnsMsg, name));
+ break;
+ case REDIRECTED:
+ Timber.i("handleDnsRequest: DNS Name %s redirected to %s.", dnsQueryName, entry.getRedirection());
+ dnsMsg.getHeader().setFlag(Flags.QR);
+ dnsMsg.getHeader().setFlag(Flags.AA);
+ dnsMsg.getHeader().unsetFlag(Flags.RD);
+ dnsMsg.getHeader().setRcode(Rcode.NOERROR);
+ try {
+ InetAddress address = InetAddress.getByName(entry.getRedirection());
+ Record dnsRecord;
+ if (address instanceof Inet6Address) {
+ dnsRecord = new AAAARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS, address);
+ } else {
+ dnsRecord = new ARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS, address);
+ }
+ dnsMsg.addRecord(dnsRecord, Section.ANSWER);
+ } catch (UnknownHostException e) {
+ Timber.w(e, "Failed to get inet address for host %s.", dnsQueryName);
+ }
+ handleDnsResponse(ipPacket, dnsMsg.toWire());
+ break;
+ }
+ }
+
+ private void queryDohServer(IpPacket ipPacket, Message dnsMsg, Name name) {
+ String dnsQueryName = name.toString(true);
+ InetAddress address = null;
+ try {
+ List addresses = this.dnsOverHttps.lookup(dnsQueryName);
+ if (!addresses.isEmpty()) {
+ address = addresses.get(0);
+ }
+ } catch (UnknownHostException e) {
+ Timber.i(e, "Failed to query DNS Name %s.", dnsQueryName);
+ }
+
+ if (address == null) {
+ Timber.i("No address was found for DNS Name %s.", dnsQueryName);
+ return;
+ }
+
+ Timber.i("handleDnsRequest: DNS Name %s redirected to %s.", dnsQueryName, address);
+ dnsMsg.getHeader().setFlag(Flags.QR);
+ dnsMsg.getHeader().setFlag(Flags.AA);
+ dnsMsg.getHeader().unsetFlag(Flags.RD);
+ dnsMsg.getHeader().setRcode(Rcode.NOERROR);
+ Record dnsRecord;
+ if (address instanceof Inet6Address) {
+ dnsRecord = new AAAARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS, address);
+ } else {
+ dnsRecord = new ARecord(name, DClass.IN, NEGATIVE_CACHE_TTL_SECONDS, address);
+ }
+ dnsMsg.addRecord(dnsRecord, Section.ANSWER);
+ handleDnsResponse(ipPacket, dnsMsg.toWire());
+ }
+
+ private HostEntry getHostEntry(String dnsQueryName) {
+ String hostname = dnsQueryName.toLowerCase(Locale.ENGLISH);
+ HostEntry entry = null;
+ if (this.vpnModel != null) {
+ entry = this.vpnModel.getEntry(hostname);
+ }
+ if (entry == null) {
+ entry = new HostEntry();
+ entry.setHost(hostname);
+ entry.setType(ListType.ALLOWED);
+ }
+ return entry;
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/dns/Subnet.java b/app/src/main/java/org/adaway/vpn/dns/Subnet.java
new file mode 100644
index 0000000..2985dfc
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/dns/Subnet.java
@@ -0,0 +1,67 @@
+package org.adaway.vpn.dns;
+
+import static java.lang.Integer.parseInt;
+import static java.util.Objects.requireNonNull;
+
+import androidx.annotation.NonNull;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * This class represents a sub network.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class Subnet {
+ /**
+ * The subnet address.
+ */
+ final InetAddress address;
+ /**
+ * The subnet prefix length.
+ */
+ final int prefixLength;
+
+ /**
+ * Parse a subnet string representation.
+ *
+ * @param subnet The subnet string representation.
+ * @return The parsed subnet.
+ */
+ static Subnet parse(String subnet) {
+ String[] parts = subnet.split("/");
+ try {
+ return new Subnet(InetAddress.getByName(parts[0]), parseInt(parts[1]));
+ } catch (UnknownHostException e) {
+ throw new IllegalStateException("Failed to parse hardcoded documentation subnet.", e);
+ }
+ }
+
+ private Subnet(InetAddress address, int prefixLength) {
+ this.address = requireNonNull(address, "Subnet address cannot be null.");
+ this.prefixLength = prefixLength;
+ }
+
+ /**
+ * Get an address of the subnet.
+ *
+ * @param index The host index.
+ * @return An address of the subnet.
+ */
+ InetAddress getAddress(int index) {
+ byte[] address = this.address.getAddress();
+ address[address.length - 1] = (byte) (index + 1);
+ try {
+ return InetAddress.getByAddress(address);
+ } catch (UnknownHostException e) {
+ throw new IllegalStateException("Failed to create address " + index + " in subnet " + this);
+ }
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return this.address + "/" + this.prefixLength;
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/worker/VpnBuilder.java b/app/src/main/java/org/adaway/vpn/worker/VpnBuilder.java
new file mode 100644
index 0000000..8813900
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/worker/VpnBuilder.java
@@ -0,0 +1,137 @@
+package org.adaway.vpn.worker;
+
+import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
+import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
+import static android.os.Build.VERSION.SDK_INT;
+import static android.os.Build.VERSION_CODES.Q;
+import static android.system.OsConstants.AF_INET;
+import static android.system.OsConstants.AF_INET6;
+import static java.util.Collections.emptySet;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.net.VpnService;
+import android.os.ParcelFileDescriptor;
+
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.ui.home.HomeActivity;
+import org.adaway.vpn.dns.DnsServerMapper;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import timber.log.Timber;
+
+/**
+ * This utility class is in charge of establishing a new VPN interface.
+ *
+ * @author Bruce BUJON
+ */
+public final class VpnBuilder {
+ /**
+ * Private constructor.
+ */
+ private VpnBuilder() {
+
+ }
+
+ /**
+ * Establish the VPN interface.
+ *
+ * @param service The VPN service to create interface.
+ * @param dnsServerMapper The DNS server mapper used to configure VPN address and routes.
+ * @return The VPN interface.
+ */
+ public static ParcelFileDescriptor establish(VpnService service, DnsServerMapper dnsServerMapper) {
+ Timber.d("Establishing VPN…");
+ VpnService.Builder builder = service.new Builder();
+ // Configure VPN address and DNS servers
+ dnsServerMapper.configureVpn(service, builder);
+ // Exclude applications from VPN according user preferences (all applications goes through VPN by default)
+ excludeApplicationsFromVpn(service, builder);
+ // Allow applications to bypass the VPN by programmatically binding to a network for compatibility
+ builder.allowBypass();
+ // Set file descriptor in blocking mode as worker has a dedicated thread
+ builder.setBlocking(true);
+ // Set the VPN to unmetered
+ if (SDK_INT >= Q) {
+ builder.setMetered(false);
+ }
+ // Explicitly allow both families to prevent a family being blocked if no DNS server is found with it
+ builder.allowFamily(AF_INET);
+ builder.allowFamily(AF_INET6);
+ // Create a new interface.
+ ParcelFileDescriptor pfd = builder
+ .setSession("AdAway")
+ .setConfigureIntent(PendingIntent.getActivity(
+ service,
+ 1,
+ new Intent(service, HomeActivity.class),
+ FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE
+ ))
+ .establish();
+ Timber.i("VPN established.");
+ return pfd;
+ }
+
+ private static void excludeApplicationsFromVpn(Context context, VpnService.Builder builder) {
+ PackageManager packageManager = context.getPackageManager();
+
+ ApplicationInfo self = context.getApplicationInfo();
+ Set excludedApps = PreferenceHelper.getVpnExcludedApps(context);
+ String vpnExcludedSystemApps = PreferenceHelper.getVpnExcludedSystemApps(context);
+ Set webBrowserPackageName = vpnExcludedSystemApps.equals("allExceptBrowsers") ?
+ getWebBrowserPackageName(packageManager) :
+ emptySet();
+
+ List installedApplications = packageManager.getInstalledApplications(0);
+ for (ApplicationInfo applicationInfo : installedApplications) {
+ boolean excluded = false;
+ // Skip itself
+ if (applicationInfo.packageName.equals(self.packageName)) {
+ continue;
+ }
+ // Check system app
+ if ((applicationInfo.flags & FLAG_SYSTEM) != 0) {
+ excluded = vpnExcludedSystemApps.equals("all") ||
+ (vpnExcludedSystemApps.equals("allExceptBrowsers") && !webBrowserPackageName.contains(applicationInfo.packageName));
+ }
+ // Check user excluded applications
+ else if (excludedApps.contains(applicationInfo.packageName)) {
+ excluded = true;
+ }
+ if (excluded) {
+ try {
+ builder.addDisallowedApplication(applicationInfo.packageName);
+ } catch (PackageManager.NameNotFoundException e) {
+ Timber.w(e, "Failed to exclude application %s from VPN.", applicationInfo.packageName);
+ }
+ }
+ }
+ }
+
+ private static Set getWebBrowserPackageName(PackageManager packageManager) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse("https://isabrowser.adaway.org/"));
+ List resolveInfoList = packageManager.queryIntentActivities(intent, 0);
+ Set packageNames = new HashSet<>();
+ for (ResolveInfo resolveInfo : resolveInfoList) {
+ packageNames.add(resolveInfo.activityInfo.packageName);
+ }
+
+ packageNames.add("com.google.android.webview");
+ packageNames.add("com.android.htmlviewer");
+ packageNames.add("com.google.android.backuptransport");
+ packageNames.add("com.google.android.gms");
+ packageNames.add("com.google.android.gsf");
+
+ return packageNames;
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/worker/VpnConnectionMonitor.java b/app/src/main/java/org/adaway/vpn/worker/VpnConnectionMonitor.java
new file mode 100644
index 0000000..c00065f
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/worker/VpnConnectionMonitor.java
@@ -0,0 +1,139 @@
+package org.adaway.vpn.worker;
+
+import static java.lang.Integer.parseInt;
+import static java.util.Objects.requireNonNull;
+
+import android.content.Context;
+
+import org.adaway.vpn.VpnServiceControls;
+
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Enumeration;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import timber.log.Timber;
+
+/**
+ * This class monitors the VPN network interface is still up while the VPN is running.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+public class VpnConnectionMonitor {
+ private static final int CONNECTION_CHECK_DELAY_MS = 10_000;
+ private static final Pattern TUNNEL_PATTERN = Pattern.compile("tun([0-9]+)");
+ /**
+ * The application context.
+ */
+ private final Context context;
+ /**
+ * Whether the monitor is running (true if running, false if stopped).
+ */
+ private final AtomicBoolean running;
+ /**
+ * The network interface to monitor (null if not initialized).
+ */
+ private NetworkInterface networkInterface;
+
+ /**
+ * Constructor.
+ *
+ * @param context The application context.
+ */
+ VpnConnectionMonitor(Context context) {
+ this.context = context;
+ this.running = new AtomicBoolean(true);
+ this.networkInterface = null;
+ }
+
+ private static NetworkInterface findVpnNetworkInterface() {
+ try {
+ NetworkInterface vpnNetworkInterface = null;
+ Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
+ while (networkInterfaces.hasMoreElements()) {
+ NetworkInterface networkInterface = networkInterfaces.nextElement();
+ vpnNetworkInterface = pickLastVpnNetworkInterface(vpnNetworkInterface, networkInterface);
+ }
+ if (vpnNetworkInterface == null) {
+ throw new IllegalStateException("Failed to find a network interface.");
+ }
+ return vpnNetworkInterface;
+ } catch (SocketException e) {
+ throw new IllegalStateException("Failed to find VPN network interface.", e);
+ }
+ }
+
+ private static NetworkInterface pickLastVpnNetworkInterface(NetworkInterface current, NetworkInterface other) {
+ // Ensure other is a tunnel interface, otherwise picks current
+ Matcher otherMatcher = TUNNEL_PATTERN.matcher(other.getName());
+ if (!otherMatcher.matches()) {
+ return current;
+ }
+ // If other is a tunnel interface and no current interface, picks other.
+ if (current == null) {
+ return other;
+ }
+ // Ensure current is still a tunnel interface (it happens to change), otherwise picks other
+ Matcher currentMatcher = TUNNEL_PATTERN.matcher(current.getName());
+ if (!currentMatcher.matches()) {
+ Timber.e("Current interface %s is no more a tunnel interface.", current.getName());
+ return other;
+ }
+ // Compare current and ot then pick the last one
+ int currentTunnelNumber = parseInt(requireNonNull(currentMatcher.group(1)));
+ int otherTunnelNumber = parseInt(requireNonNull(otherMatcher.group(1)));
+ return otherTunnelNumber > currentTunnelNumber ? other : current;
+ }
+
+ /**
+ * Initialize the monitor once the VPN connection is up.
+ */
+ void initialize() {
+ Timber.d("Initializing connection monitor…");
+ this.networkInterface = findVpnNetworkInterface();
+ Timber.d("Connection monitor initialized to watch interface %s.", this.networkInterface.getName());
+ }
+
+ /**
+ * Monitor the VPN network interface is still up while the VPN is running.
+ */
+ void monitor() {
+ try {
+ while (this.running.get()) {
+ if (this.networkInterface != null && !this.networkInterface.isUp()) {
+ stop();
+ Timber.i("VPN network interface %s is down. Starting VPN service…",
+ this.networkInterface == null ? "unset" : this.networkInterface.getName());
+ VpnServiceControls.start(this.context);
+ }
+ try {
+ Thread.sleep(CONNECTION_CHECK_DELAY_MS);
+ } catch (InterruptedException e) {
+ Timber.d("Stop monitoring.");
+ Thread.currentThread().interrupt();
+ break;
+ }
+ }
+ } catch (SocketException e) {
+ Timber.w(e, "Failed to test VPN network interface %s. Starting VPN service…", this.networkInterface.getName());
+ reset();
+ VpnServiceControls.start(this.context);
+ }
+ }
+
+ /**
+ * Reset the connection monitor if the VPN connection changed.
+ */
+ void reset() {
+ this.networkInterface = null;
+ }
+
+ /**
+ * Stop the monitor.
+ */
+ void stop() {
+ this.running.set(false);
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/worker/VpnConnectionThrottler.java b/app/src/main/java/org/adaway/vpn/worker/VpnConnectionThrottler.java
new file mode 100644
index 0000000..8a66270
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/worker/VpnConnectionThrottler.java
@@ -0,0 +1,74 @@
+package org.adaway.vpn.worker;
+
+import static java.lang.Math.max;
+import static java.lang.Math.min;
+
+import timber.log.Timber;
+
+/**
+ * This class limits how often the VPN connection is established.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+class VpnConnectionThrottler {
+ private static final long INITIAL_TIMEOUT_MS = 1_000;
+ private static final long MAXIMUM_TIMEOUT_MS = 128_000;
+ /**
+ * The current timeout before any new connection establishment (in ms).
+ */
+ private long timeout;
+ /**
+ * The last time the throttler was called (timestamp in ms, 0 if not initialized).
+ */
+ private long time;
+
+ /**
+ * Constructor.
+ */
+ VpnConnectionThrottler() {
+ this.time = 0;
+ this.timeout = INITIAL_TIMEOUT_MS;
+ }
+
+ /**
+ * Limit the VPN connection to be established to often.
+ *
+ * @throws InterruptedException If the throttler cannot wait to delay the VPN connection.
+ */
+ void throttle() throws InterruptedException {
+ long now = System.currentTimeMillis();
+ // Check first call
+ if (this.time == 0) {
+ this.time = now;
+ return;
+ }
+ // Compute time between two throttle calls
+ long elapsedTimeBetweenCall = now - this.time;
+ // If the call happens before the time out
+ if (elapsedTimeBetweenCall < this.timeout) {
+ this.time = now;
+ // Increase timeout and wait the remaining time to limit connexion
+ increaseTimeout();
+ long remainingTime = this.timeout - elapsedTimeBetweenCall;
+ Timber.d("Limiting the connexion by wait for %ds.", remainingTime / 1000);
+ Thread.sleep(remainingTime);
+ }
+ // If the call happens after the timeout
+ else {
+ this.time = now;
+ // Decrease the time out (up to restoring it) and do no limit connexion
+ decreaseTimeout(elapsedTimeBetweenCall > MAXIMUM_TIMEOUT_MS);
+ Timber.d("Allowing the connexion right now.");
+ }
+ }
+
+ private void increaseTimeout() {
+ this.timeout = min(this.timeout * 2, MAXIMUM_TIMEOUT_MS);
+ Timber.d("Increasing timeout to %ds", this.timeout / 1000);
+ }
+
+ private void decreaseTimeout(boolean reset) {
+ this.timeout = reset ? INITIAL_TIMEOUT_MS : max(this.timeout / 4, INITIAL_TIMEOUT_MS);
+ Timber.d("Decreasing timeout to %ds.", this.timeout / 1000);
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/worker/VpnNetworkException.java b/app/src/main/java/org/adaway/vpn/worker/VpnNetworkException.java
new file mode 100644
index 0000000..bd7c45b
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/worker/VpnNetworkException.java
@@ -0,0 +1,12 @@
+package org.adaway.vpn.worker;
+
+public class VpnNetworkException extends Exception {
+ public VpnNetworkException(String s) {
+ super(s);
+ }
+
+ public VpnNetworkException(String s, Throwable t) {
+ super(s, t);
+ }
+
+}
diff --git a/app/src/main/java/org/adaway/vpn/worker/VpnWatchdog.java b/app/src/main/java/org/adaway/vpn/worker/VpnWatchdog.java
new file mode 100644
index 0000000..3d61258
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/worker/VpnWatchdog.java
@@ -0,0 +1,182 @@
+/*
+ * Derived from dns66:
+ * Copyright (C) 2016-2019 Julian Andres Klode
+ *
+ * Parsing code derived from AdBuster:
+ * Copyright (C) 2016 Daniel Brodie
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * Contributions shall also be provided under any later versions of the
+ * GPL.
+ */
+package org.adaway.vpn.worker;
+
+import androidx.annotation.NonNull;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.SocketException;
+
+import timber.log.Timber;
+
+/**
+ * Ensures that the connection is alive and sets various timeouts and delays in response.
+ *
+ * The implementation is a bit weird: Success and Failure cases are both handled in the timeout
+ * case. When a packet is received, we simply store the time.
+ *
+ * If poll() times out and we have not seen a packet after we last sent a ping, then we force
+ * a reconnect and increase the reconnect delay.
+ *
+ * If poll() times out and we have seen a packet after we last sent a ping, we increase the
+ * poll() time out, causing the next check to run later, and send a ping packet.
+ */
+
+class VpnWatchdog {
+ // Polling is quadrupled on every success, and values range from 4s to 1h8m.
+ private static final int POLL_TIMEOUT_START = 1000;
+ private static final int POLL_TIMEOUT_END = 4096000;
+ private static final int POLL_TIMEOUT_WAITING = 7000;
+ private static final int POLL_TIMEOUT_GROW = 4;
+
+ // Reconnect penalty ranges from 0s to 5s, in increments of 200 ms.
+ private static final int INIT_PENALTY_START = 0;
+ private static final int INIT_PENALTY_END = 5000;
+ private static final int INIT_PENALTY_INC = 200;
+
+ private int initPenalty = INIT_PENALTY_START;
+ private int pollTimeout = POLL_TIMEOUT_START;
+
+ // Information about when packets where received.
+ private long lastPacketSent;
+ private long lastPacketReceived;
+
+ private boolean enabled;
+ private DatagramPacket checkAlivePacket;
+
+ VpnWatchdog() {
+ // Set default timestamps
+ this.lastPacketSent = 0;
+ this.lastPacketReceived = 0;
+ // Set disable by default
+ this.enabled = false;
+ }
+
+
+ /**
+ * Returns the current poll time out.
+ */
+ int getPollTimeout() {
+ if (!this.enabled) {
+ return -1;
+ }
+ if (this.lastPacketReceived < this.lastPacketSent) {
+ return POLL_TIMEOUT_WAITING;
+ }
+ return this.pollTimeout;
+ }
+
+ /**
+ * Sets the target address ping packets should be sent to.
+ */
+ void setTarget(InetAddress target) {
+ this.checkAlivePacket = new DatagramPacket(new byte[0], 0, 0 /* length */, target, 53);
+ }
+
+ /**
+ * An initialization method. Sleeps the penalty and sends initial packet.
+ *
+ * @param enabled If the watchdog should be enabled.
+ */
+ void initialize(boolean enabled) {
+ Timber.d("initialize: Initializing watchdog");
+
+ this.pollTimeout = POLL_TIMEOUT_START;
+ this.lastPacketSent = 0;
+ this.enabled = enabled;
+
+ if (!this.enabled) {
+ Timber.d("initialize: Disabled.");
+ return;
+ }
+
+ if (this.initPenalty > 0) {
+ Timber.d("init penalty: Sleeping for %dms…", this.initPenalty);
+ try {
+ Thread.sleep(this.initPenalty);
+ } catch (InterruptedException exception) {
+ Timber.d("Failed to wait the initial penalty.");
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+
+ /**
+ * Handles a timeout of poll()
+ *
+ * @throws VpnNetworkException When the watchdog timed out
+ */
+ void handleTimeout() throws VpnNetworkException {
+ if (!this.enabled) {
+ return;
+ }
+ Timber.d("handleTimeout: Milliseconds elapsed between last receive and sent: %dms", (this.lastPacketReceived - this.lastPacketSent));
+ // Receive really timed out
+ if (this.lastPacketReceived < this.lastPacketSent && this.lastPacketSent != 0) {
+ this.initPenalty += INIT_PENALTY_INC;
+ if (this.initPenalty > INIT_PENALTY_END) {
+ this.initPenalty = INIT_PENALTY_END;
+ }
+ throw new VpnNetworkException("Watchdog timed out");
+ }
+ // We received a packet after sending it, so we can be more confident and grow our wait time
+ this.pollTimeout *= POLL_TIMEOUT_GROW;
+ if (this.pollTimeout > POLL_TIMEOUT_END) {
+ this.pollTimeout = POLL_TIMEOUT_END;
+ }
+
+ sendPacket();
+ }
+
+ /**
+ * Handles an incoming packet on a device.
+ *
+ * @param packetData The data of the packet
+ */
+ void handlePacket(byte[] packetData) {
+ if (!this.enabled) {
+ return;
+ }
+ Timber.d("handlePacket: Received packet of length %s", packetData.length);
+ this.lastPacketReceived = System.currentTimeMillis();
+ }
+
+ /**
+ * Sends an empty check-alive packet to the configured target address.
+ *
+ * @throws VpnNetworkException If sending failed and we should restart
+ */
+ void sendPacket() throws VpnNetworkException {
+ if (!this.enabled || this.checkAlivePacket == null) {
+ return;
+ }
+ Timber.d("sendPacket: Sending packet, poll timeout is %d.", this.pollTimeout);
+
+ try (DatagramSocket socket = newDatagramSocket()) {
+ socket.send(this.checkAlivePacket);
+ this.lastPacketSent = System.currentTimeMillis();
+ } catch (IOException e) {
+ throw new VpnNetworkException("Failed to send check-alive packet.", e);
+ }
+ }
+
+ @NonNull
+ DatagramSocket newDatagramSocket() throws SocketException {
+ return new DatagramSocket();
+ }
+}
diff --git a/app/src/main/java/org/adaway/vpn/worker/VpnWorker.java b/app/src/main/java/org/adaway/vpn/worker/VpnWorker.java
new file mode 100644
index 0000000..8c1c8fd
--- /dev/null
+++ b/app/src/main/java/org/adaway/vpn/worker/VpnWorker.java
@@ -0,0 +1,341 @@
+/*
+ * Derived from dns66:
+ * Copyright (C) 2016-2019 Julian Andres Klode
+ *
+ * Derived from AdBuster:
+ * Copyright (C) 2016 Daniel Brodie
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * Contributions shall also be provided under any later versions of the
+ * GPL.
+ */
+package org.adaway.vpn.worker;
+
+import static android.system.OsConstants.ENETUNREACH;
+import static android.system.OsConstants.EPERM;
+import static android.system.OsConstants.POLLIN;
+import static android.system.OsConstants.POLLOUT;
+import static org.adaway.vpn.VpnStatus.RECONNECTING_NETWORK_ERROR;
+import static org.adaway.vpn.VpnStatus.RUNNING;
+import static org.adaway.vpn.VpnStatus.STARTING;
+import static org.adaway.vpn.VpnStatus.STOPPED;
+import static org.adaway.vpn.VpnStatus.STOPPING;
+import static org.adaway.vpn.worker.VpnBuilder.establish;
+
+import android.os.ParcelFileDescriptor;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.StructPollfd;
+
+import org.adaway.helper.PreferenceHelper;
+import org.adaway.vpn.VpnService;
+import org.adaway.vpn.dns.DnsPacketProxy;
+import org.adaway.vpn.dns.DnsQueryQueue;
+import org.adaway.vpn.dns.DnsServerMapper;
+import org.pcap4j.packet.IpPacket;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
+
+import timber.log.Timber;
+
+// TODO Write document
+// TODO It is thread safe
+// TODO Rework status notification
+// TODO Improve exception handling in work()
+public class VpnWorker implements DnsPacketProxy.EventLoop {
+ /**
+ * Maximum packet size is constrained by the MTU, which is given as a signed short.
+ */
+ private static final int MAX_PACKET_SIZE = Short.MAX_VALUE;
+
+ /**
+ * The VPN service, also used as {@link android.content.Context}.
+ */
+ private final VpnService vpnService;
+ /**
+ * The queue of packets to send to the device.
+ */
+ private final Queue deviceWrites;
+ /**
+ * The queue of DNS queries.
+ */
+ private final DnsQueryQueue dnsQueryQueue;
+ // The mapping between fake and real dns addresses
+ private final DnsServerMapper dnsServerMapper;
+ // The object where we actually handle packets.
+ private final DnsPacketProxy dnsPacketProxy;
+
+ // TODO Comment
+ private final VpnConnectionThrottler connectionThrottler;
+ private final VpnConnectionMonitor connectionMonitor;
+
+ // Watch dog that checks our connection is alive.
+ private final VpnWatchdog vpnWatchDog;
+
+ /**
+ * The VPN worker executor (null if not started).
+ */
+ private final AtomicReference executor;
+ /**
+ * The VPN network interface, (null if not established).
+ */
+ private final AtomicReference vpnNetworkInterface;
+
+ /**
+ * Constructor.
+ *
+ * @param vpnService The VPN service, also used as {@link android.content.Context}.
+ */
+ public VpnWorker(VpnService vpnService) {
+ this.vpnService = vpnService;
+ this.deviceWrites = new LinkedList<>();
+ this.dnsQueryQueue = new DnsQueryQueue();
+ this.dnsServerMapper = new DnsServerMapper();
+ this.dnsPacketProxy = new DnsPacketProxy(this, this.dnsServerMapper);
+ this.connectionThrottler = new VpnConnectionThrottler();
+ this.connectionMonitor = new VpnConnectionMonitor(this.vpnService);
+ this.vpnWatchDog = new VpnWatchdog();
+ this.executor = new AtomicReference<>(null);
+ this.vpnNetworkInterface = new AtomicReference<>(null);
+ }
+
+ /**
+ * Start the VPN worker.
+ * Kill the current worker and restart it if already running.
+ */
+ public void start() {
+ Timber.d("Starting VPN thread…");
+ ExecutorService executor = Executors.newFixedThreadPool(2);
+ executor.submit(this::work);
+ executor.submit(this.connectionMonitor::monitor);
+ setExecutor(executor);
+ Timber.i("VPN thread started.");
+ }
+
+ /**
+ * Stop the VPN worker.
+ */
+ public void stop() {
+ Timber.d("Stopping VPN thread.");
+ this.connectionMonitor.reset();
+ forceCloseTunnel();
+ setExecutor(null);
+ Timber.i("VPN thread stopped.");
+ }
+
+ /**
+ * Keep track of the worker executor.
+ * Shut the previous one down in exists.
+ *
+ * @param executor The new worker executor, null if no executor any more.
+ */
+ private void setExecutor(ExecutorService executor) {
+ ExecutorService oldExecutor = this.executor.getAndSet(executor);
+ if (oldExecutor != null) {
+ Timber.d("Shutting down VPN executor…");
+ oldExecutor.shutdownNow();
+ Timber.d("VPN executor shut down.");
+ }
+ }
+
+ /**
+ * Force close the tunnel connection.
+ */
+ private void forceCloseTunnel() {
+ ParcelFileDescriptor networkInterface = this.vpnNetworkInterface.get();
+ if (networkInterface != null) {
+ try {
+ networkInterface.close();
+ } catch (IOException e) {
+ Timber.tag("Failed to close VPN network interface.").w(e);
+ }
+ }
+ }
+
+ private void work() {
+ Timber.d("Starting work…");
+ // Initialize context
+ this.dnsPacketProxy.initialize(this.vpnService);
+ // Initialize the watchdog
+ this.vpnWatchDog.initialize(PreferenceHelper.getVpnWatchdogEnabled(this.vpnService));
+ // Try connecting the vpn continuously
+ while (true) {
+ try {
+ this.connectionThrottler.throttle();
+ this.vpnService.notifyVpnStatus(STARTING);
+ runVpn();
+ Timber.i("Told to stop");
+ this.vpnService.notifyVpnStatus(STOPPING);
+ break;
+ } catch (InterruptedException e) {
+ Timber.d(e, "Failed to wait for connexion throttling.");
+ Thread.currentThread().interrupt();
+ break;
+ } catch (VpnNetworkException | IOException e) {
+ Timber.w(e, "Network exception in vpn thread, reconnecting…");
+ // If an exception was thrown, notify status and try again
+ this.vpnService.notifyVpnStatus(RECONNECTING_NETWORK_ERROR);
+ }
+ }
+ this.vpnService.notifyVpnStatus(STOPPED);
+ Timber.d("Exiting work.");
+ }
+
+ private void runVpn() throws IOException, VpnNetworkException {
+ // Allocate the buffer for a single packet.
+ byte[] packet = new byte[MAX_PACKET_SIZE];
+
+ // Authenticate and configure the virtual network interface.
+ try (ParcelFileDescriptor pfd = establish(this.vpnService, this.dnsServerMapper);
+ // Read and write views of the tunnel device
+ FileInputStream inputStream = new FileInputStream(pfd.getFileDescriptor());
+ FileOutputStream outputStream = new FileOutputStream(pfd.getFileDescriptor())) {
+ // Store reference to network interface to close it externally on demand
+ this.vpnNetworkInterface.set(pfd);
+ // Initialize connection monitor
+ this.connectionMonitor.initialize();
+
+ // Update address to ping with default DNS server
+ this.vpnWatchDog.setTarget(this.dnsServerMapper.getDefaultDnsServerAddress());
+
+ // Now we are connected. Set the flag and show the message.
+ this.vpnService.notifyVpnStatus(RUNNING);
+
+ // We keep forwarding packets till something goes wrong.
+ boolean deviceOpened = true;
+ while (deviceOpened) {
+ deviceOpened = doOne(inputStream, outputStream, packet);
+ }
+ }
+ }
+
+ private boolean doOne(FileInputStream inputStream, FileOutputStream fileOutputStream, byte[] packet)
+ throws IOException, VpnNetworkException {
+ // Create poll FD on tunnel
+ StructPollfd deviceFd = new StructPollfd();
+ deviceFd.fd = inputStream.getFD();
+ deviceFd.events = (short) POLLIN;
+ if (!this.deviceWrites.isEmpty()) {
+ deviceFd.events |= (short) POLLOUT;
+ }
+ // Create poll FD on each DNS query socket
+ StructPollfd[] queryFds = this.dnsQueryQueue.getQueryFds();
+ StructPollfd[] polls = new StructPollfd[1 + queryFds.length];
+ polls[0] = deviceFd;
+ System.arraycopy(queryFds, 0, polls, 1, queryFds.length);
+ boolean deviceReadyToWrite;
+ boolean deviceReadyToRead;
+ try {
+ Timber.d("doOne: Polling %d file descriptors.", polls.length);
+ int numberOfEvents = Os.poll(polls, this.vpnWatchDog.getPollTimeout());
+ // TODO BUG - There is a bug where the watchdog keeps doing timeout if there is no network activity
+ // TODO BUG - 0 Might be a valid value if no current DNS query and everything was already sent back to device
+ if (numberOfEvents == 0) {
+ this.vpnWatchDog.handleTimeout();
+ return true;
+ }
+ deviceReadyToWrite = (deviceFd.revents & POLLOUT) != 0;
+ deviceReadyToRead = (deviceFd.revents & POLLIN) != 0;
+ } catch (ErrnoException e) {
+ throw new IOException("Failed to wait for event on file descriptors. Error number: " + e.errno, e);
+ }
+
+ // Need to do this before reading from the device, otherwise a new insertion there could
+ // invalidate one of the sockets we want to read from either due to size or time out
+ // constraints
+ this.dnsQueryQueue.handleResponses();
+ if (deviceReadyToWrite) {
+ writeToDevice(fileOutputStream);
+ }
+ if (deviceReadyToRead) {
+ return readPacketFromDevice(inputStream, packet) != -1;
+ }
+ return true;
+ }
+
+ private void writeToDevice(FileOutputStream fileOutputStream) throws IOException {
+ Timber.d("Write to device %d packets.", this.deviceWrites.size());
+ try {
+ while (!this.deviceWrites.isEmpty()) {
+ byte[] ipPacketData = this.deviceWrites.poll();
+ fileOutputStream.write(ipPacketData);
+ }
+ } catch (IOException e) {
+ throw new IOException("Failed to write to tunnel output stream.", e);
+ }
+ }
+
+ private int readPacketFromDevice(FileInputStream inputStream, byte[] packet) throws IOException {
+ Timber.d("Read a packet from device.");
+ // Read the outgoing packet from the input stream.
+ int length = inputStream.read(packet);
+ if (length < 0) {
+ // TODO Stream closed. Is there anything else to do?
+ Timber.d("Tunnel input stream closed.");
+ } else if (length == 0) {
+ Timber.d("Read empty packet from tunnel.");
+ } else {
+ byte[] readPacket = Arrays.copyOf(packet, length);
+ vpnWatchDog.handlePacket(readPacket);
+ dnsPacketProxy.handleDnsRequest(readPacket);
+ }
+ return length;
+ }
+
+ @Override
+ public void forwardPacket(DatagramPacket packet) throws IOException {
+ try (DatagramSocket dnsSocket = new DatagramSocket()) {
+ this.vpnService.protect(dnsSocket);
+ dnsSocket.send(packet);
+ } catch (IOException e) {
+ throw new IOException("Failed to forward packet.", e);
+ }
+ }
+
+ @Override
+ public void forwardPacket(DatagramPacket outPacket, Consumer callback) throws IOException {
+ DatagramSocket dnsSocket = null;
+ try {
+ dnsSocket = new DatagramSocket();
+ // Packets to be sent to the real DNS server will need to be protected from the VPN
+ this.vpnService.protect(dnsSocket);
+ dnsSocket.send(outPacket);
+ // Enqueue DNS query
+ this.dnsQueryQueue.addQuery(dnsSocket, callback);
+ } catch (IOException e) {
+ if (dnsSocket != null) {
+ dnsSocket.close();
+ }
+ if (e.getCause() instanceof ErrnoException) {
+ ErrnoException errnoExc = (ErrnoException) e.getCause();
+ if ((errnoExc.errno == ENETUNREACH) || (errnoExc.errno == EPERM)) {
+ throw new IOException("Cannot send message:", e);
+ }
+ }
+ Timber.w(e, "handleDnsRequest: Could not send packet to upstream");
+ }
+ }
+
+ @Override
+ public void queueDeviceWrite(IpPacket ipOutPacket) {
+ byte[] rawData = ipOutPacket.getRawData();
+ // TODO Check why data could be null
+ if (rawData != null) {
+ this.deviceWrites.add(rawData);
+ }
+ }
+}
diff --git a/app/src/main/res/animator/fragment_close_enter.xml b/app/src/main/res/animator/fragment_close_enter.xml
new file mode 100644
index 0000000..d18fdd5
--- /dev/null
+++ b/app/src/main/res/animator/fragment_close_enter.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/animator/fragment_close_exit.xml b/app/src/main/res/animator/fragment_close_exit.xml
new file mode 100644
index 0000000..11d0780
--- /dev/null
+++ b/app/src/main/res/animator/fragment_close_exit.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/animator/fragment_open_enter.xml b/app/src/main/res/animator/fragment_open_enter.xml
new file mode 100644
index 0000000..48ff32d
--- /dev/null
+++ b/app/src/main/res/animator/fragment_open_enter.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/animator/fragment_open_exit.xml b/app/src/main/res/animator/fragment_open_exit.xml
new file mode 100644
index 0000000..c2052a2
--- /dev/null
+++ b/app/src/main/res/animator/fragment_open_exit.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/baseline_block_24.xml b/app/src/main/res/drawable/baseline_block_24.xml
new file mode 100644
index 0000000..8c44535
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_block_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_check_24.xml b/app/src/main/res/drawable/baseline_check_24.xml
new file mode 100644
index 0000000..5291b7f
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_check_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_clear_all_24.xml b/app/src/main/res/drawable/baseline_clear_all_24.xml
new file mode 100644
index 0000000..a7e1cb5
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_clear_all_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_compare_arrows_24.xml b/app/src/main/res/drawable/baseline_compare_arrows_24.xml
new file mode 100644
index 0000000..e03ad53
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_compare_arrows_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_edit_24.xml b/app/src/main/res/drawable/baseline_edit_24.xml
new file mode 100644
index 0000000..56dbeee
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_edit_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_favorite_24.xml b/app/src/main/res/drawable/baseline_favorite_24.xml
new file mode 100644
index 0000000..26161c5
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_favorite_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_search_24.xml b/app/src/main/res/drawable/baseline_search_24.xml
new file mode 100644
index 0000000..083d636
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_search_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_sort_by_alpha_24.xml b/app/src/main/res/drawable/baseline_sort_by_alpha_24.xml
new file mode 100644
index 0000000..c4a3737
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_sort_by_alpha_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/dot.xml b/app/src/main/res/drawable/dot.xml
new file mode 100644
index 0000000..29cc01f
--- /dev/null
+++ b/app/src/main/res/drawable/dot.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/dot_outline.xml b/app/src/main/res/drawable/dot_outline.xml
new file mode 100644
index 0000000..b5f9913
--- /dev/null
+++ b/app/src/main/res/drawable/dot_outline.xml
@@ -0,0 +1,6 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add_black_24px.xml b/app/src/main/res/drawable/ic_add_black_24px.xml
new file mode 100644
index 0000000..1f463d3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add_black_24px.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_add_circle_outline_24dp.xml b/app/src/main/res/drawable/ic_add_circle_outline_24dp.xml
new file mode 100644
index 0000000..24b996a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add_circle_outline_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_brightness_medium_24dp.xml b/app/src/main/res/drawable/ic_brightness_medium_24dp.xml
new file mode 100644
index 0000000..0170cf6
--- /dev/null
+++ b/app/src/main/res/drawable/ic_brightness_medium_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_bug_report_24dp.xml b/app/src/main/res/drawable/ic_bug_report_24dp.xml
new file mode 100644
index 0000000..2629b47
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bug_report_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_cloud_off_24dp.xml b/app/src/main/res/drawable/ic_cloud_off_24dp.xml
new file mode 100644
index 0000000..1bda2dc
--- /dev/null
+++ b/app/src/main/res/drawable/ic_cloud_off_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_collections_bookmark_24dp.xml b/app/src/main/res/drawable/ic_collections_bookmark_24dp.xml
new file mode 100644
index 0000000..1f1e886
--- /dev/null
+++ b/app/src/main/res/drawable/ic_collections_bookmark_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_error_outline_24dp.xml b/app/src/main/res/drawable/ic_error_outline_24dp.xml
new file mode 100644
index 0000000..6a15172
--- /dev/null
+++ b/app/src/main/res/drawable/ic_error_outline_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_get_app_24dp.xml b/app/src/main/res/drawable/ic_get_app_24dp.xml
new file mode 100644
index 0000000..56b2e31
--- /dev/null
+++ b/app/src/main/res/drawable/ic_get_app_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_github_24dp.xml b/app/src/main/res/drawable/ic_github_24dp.xml
new file mode 100644
index 0000000..220ebea
--- /dev/null
+++ b/app/src/main/res/drawable/ic_github_24dp.xml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_github_32dp.xml b/app/src/main/res/drawable/ic_github_32dp.xml
new file mode 100644
index 0000000..005bbbe
--- /dev/null
+++ b/app/src/main/res/drawable/ic_github_32dp.xml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_help_24dp.xml b/app/src/main/res/drawable/ic_help_24dp.xml
new file mode 100644
index 0000000..d775ec8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_help_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_ipv6_24dp.xml b/app/src/main/res/drawable/ic_ipv6_24dp.xml
new file mode 100644
index 0000000..0ff24ba
--- /dev/null
+++ b/app/src/main/res/drawable/ic_ipv6_24dp.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_language_24dp.xml b/app/src/main/res/drawable/ic_language_24dp.xml
new file mode 100644
index 0000000..e7cad55
--- /dev/null
+++ b/app/src/main/res/drawable/ic_language_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_language_red.xml b/app/src/main/res/drawable/ic_language_red.xml
new file mode 100644
index 0000000..bf7144d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_language_red.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_list_red.xml b/app/src/main/res/drawable/ic_list_red.xml
new file mode 100644
index 0000000..b4343bb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_list_red.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_24dp.xml b/app/src/main/res/drawable/ic_menu_24dp.xml
new file mode 100644
index 0000000..a1acf66
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_outline_rule_24.xml b/app/src/main/res/drawable/ic_outline_rule_24.xml
new file mode 100644
index 0000000..67e0652
--- /dev/null
+++ b/app/src/main/res/drawable/ic_outline_rule_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_pause_24dp.xml b/app/src/main/res/drawable/ic_pause_24dp.xml
new file mode 100644
index 0000000..58ea7a9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_pause_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_playlist_add_24dp.xml b/app/src/main/res/drawable/ic_playlist_add_24dp.xml
new file mode 100644
index 0000000..d20768c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_playlist_add_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_record_24dp.xml b/app/src/main/res/drawable/ic_record_24dp.xml
new file mode 100644
index 0000000..564e488
--- /dev/null
+++ b/app/src/main/res/drawable/ic_record_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_remove_circle_outline_24dp.xml b/app/src/main/res/drawable/ic_remove_circle_outline_24dp.xml
new file mode 100644
index 0000000..1d11f46
--- /dev/null
+++ b/app/src/main/res/drawable/ic_remove_circle_outline_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_save_24dp.xml b/app/src/main/res/drawable/ic_save_24dp.xml
new file mode 100644
index 0000000..ad282ce
--- /dev/null
+++ b/app/src/main/res/drawable/ic_save_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_sd_storage_24dp.xml b/app/src/main/res/drawable/ic_sd_storage_24dp.xml
new file mode 100644
index 0000000..cc7dd4d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sd_storage_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_settings_24dp.xml b/app/src/main/res/drawable/ic_settings_24dp.xml
new file mode 100644
index 0000000..c4149ea
--- /dev/null
+++ b/app/src/main/res/drawable/ic_settings_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_settings_backup_restore_24dp.xml b/app/src/main/res/drawable/ic_settings_backup_restore_24dp.xml
new file mode 100644
index 0000000..5accc94
--- /dev/null
+++ b/app/src/main/res/drawable/ic_settings_backup_restore_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_settings_red.xml b/app/src/main/res/drawable/ic_settings_red.xml
new file mode 100644
index 0000000..c10d4d9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_settings_red.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_superuser_24dp.xml b/app/src/main/res/drawable/ic_superuser_24dp.xml
new file mode 100644
index 0000000..2fcee0f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_superuser_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_sync_24dp.xml b/app/src/main/res/drawable/ic_sync_24dp.xml
new file mode 100644
index 0000000..bcf3d16
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sync_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_vpn_key_24dp.xml b/app/src/main/res/drawable/ic_vpn_key_24dp.xml
new file mode 100644
index 0000000..ca2576b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_vpn_key_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/icon_monochrome.xml b/app/src/main/res/drawable/icon_monochrome.xml
new file mode 100644
index 0000000..77b8b4c
--- /dev/null
+++ b/app/src/main/res/drawable/icon_monochrome.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/logo.xml b/app/src/main/res/drawable/logo.xml
new file mode 100644
index 0000000..6ff6608
--- /dev/null
+++ b/app/src/main/res/drawable/logo.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/notifications_off_24.xml b/app/src/main/res/drawable/notifications_off_24.xml
new file mode 100644
index 0000000..f83e9cd
--- /dev/null
+++ b/app/src/main/res/drawable/notifications_off_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/outline_cloud_upload_24.xml b/app/src/main/res/drawable/outline_cloud_upload_24.xml
new file mode 100644
index 0000000..9e42b29
--- /dev/null
+++ b/app/src/main/res/drawable/outline_cloud_upload_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/outline_create_24.xml b/app/src/main/res/drawable/outline_create_24.xml
new file mode 100644
index 0000000..8520bc4
--- /dev/null
+++ b/app/src/main/res/drawable/outline_create_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/outline_delete_24.xml b/app/src/main/res/drawable/outline_delete_24.xml
new file mode 100644
index 0000000..d0e092f
--- /dev/null
+++ b/app/src/main/res/drawable/outline_delete_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/paypal.xml b/app/src/main/res/drawable/paypal.xml
new file mode 100644
index 0000000..1e92e4c
--- /dev/null
+++ b/app/src/main/res/drawable/paypal.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/shadow.xml b/app/src/main/res/drawable/shadow.xml
new file mode 100644
index 0000000..52f776e
--- /dev/null
+++ b/app/src/main/res/drawable/shadow.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/adware_fragment.xml b/app/src/main/res/layout/adware_fragment.xml
new file mode 100644
index 0000000..824fca9
--- /dev/null
+++ b/app/src/main/res/layout/adware_fragment.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/checkbox_list_entry.xml b/app/src/main/res/layout/checkbox_list_entry.xml
new file mode 100644
index 0000000..61057ac
--- /dev/null
+++ b/app/src/main/res/layout/checkbox_list_entry.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/checkbox_list_two_entries.xml b/app/src/main/res/layout/checkbox_list_two_entries.xml
new file mode 100644
index 0000000..0688cae
--- /dev/null
+++ b/app/src/main/res/layout/checkbox_list_two_entries.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/drawer_list_item.xml b/app/src/main/res/layout/drawer_list_item.xml
new file mode 100644
index 0000000..ae2e3a6
--- /dev/null
+++ b/app/src/main/res/layout/drawer_list_item.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/help_activity.xml b/app/src/main/res/layout/help_activity.xml
new file mode 100644
index 0000000..3641b38
--- /dev/null
+++ b/app/src/main/res/layout/help_activity.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/help_fragment.xml b/app/src/main/res/layout/help_fragment.xml
new file mode 100644
index 0000000..2ac2dfa
--- /dev/null
+++ b/app/src/main/res/layout/help_fragment.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/home_activity.xml b/app/src/main/res/layout/home_activity.xml
new file mode 100644
index 0000000..0f9ab02
--- /dev/null
+++ b/app/src/main/res/layout/home_activity.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/home_content.xml b/app/src/main/res/layout/home_content.xml
new file mode 100644
index 0000000..765d019
--- /dev/null
+++ b/app/src/main/res/layout/home_content.xml
@@ -0,0 +1,565 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/hosts_content_fragment.xml b/app/src/main/res/layout/hosts_content_fragment.xml
new file mode 100644
index 0000000..dbc6e1a
--- /dev/null
+++ b/app/src/main/res/layout/hosts_content_fragment.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/hosts_lists_fragment.xml b/app/src/main/res/layout/hosts_lists_fragment.xml
new file mode 100644
index 0000000..3e73e34
--- /dev/null
+++ b/app/src/main/res/layout/hosts_lists_fragment.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/hosts_sources_activity.xml b/app/src/main/res/layout/hosts_sources_activity.xml
new file mode 100644
index 0000000..951a62a
--- /dev/null
+++ b/app/src/main/res/layout/hosts_sources_activity.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/hosts_sources_card.xml b/app/src/main/res/layout/hosts_sources_card.xml
new file mode 100644
index 0000000..18ed93e
--- /dev/null
+++ b/app/src/main/res/layout/hosts_sources_card.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/hosts_sources_dialog.xml b/app/src/main/res/layout/hosts_sources_dialog.xml
new file mode 100644
index 0000000..fc030dc
--- /dev/null
+++ b/app/src/main/res/layout/hosts_sources_dialog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/hosts_sources_fragment.xml b/app/src/main/res/layout/hosts_sources_fragment.xml
new file mode 100644
index 0000000..99f57da
--- /dev/null
+++ b/app/src/main/res/layout/hosts_sources_fragment.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/list_two_entries.xml b/app/src/main/res/layout/list_two_entries.xml
new file mode 100644
index 0000000..71d887c
--- /dev/null
+++ b/app/src/main/res/layout/list_two_entries.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/lists_activity.xml b/app/src/main/res/layout/lists_activity.xml
new file mode 100644
index 0000000..e0fdeb5
--- /dev/null
+++ b/app/src/main/res/layout/lists_activity.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/lists_allowed_dialog.xml b/app/src/main/res/layout/lists_allowed_dialog.xml
new file mode 100644
index 0000000..e88656b
--- /dev/null
+++ b/app/src/main/res/layout/lists_allowed_dialog.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/lists_blocked_dialog.xml b/app/src/main/res/layout/lists_blocked_dialog.xml
new file mode 100644
index 0000000..83d8342
--- /dev/null
+++ b/app/src/main/res/layout/lists_blocked_dialog.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/lists_fragment.xml b/app/src/main/res/layout/lists_fragment.xml
new file mode 100644
index 0000000..a381cfd
--- /dev/null
+++ b/app/src/main/res/layout/lists_fragment.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/lists_redirected_dialog.xml b/app/src/main/res/layout/lists_redirected_dialog.xml
new file mode 100644
index 0000000..a8f439b
--- /dev/null
+++ b/app/src/main/res/layout/lists_redirected_dialog.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/log_activity.xml b/app/src/main/res/layout/log_activity.xml
new file mode 100644
index 0000000..07d2521
--- /dev/null
+++ b/app/src/main/res/layout/log_activity.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/log_entry.xml b/app/src/main/res/layout/log_entry.xml
new file mode 100644
index 0000000..8c42f9e
--- /dev/null
+++ b/app/src/main/res/layout/log_entry.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/log_redirect_dialog.xml b/app/src/main/res/layout/log_redirect_dialog.xml
new file mode 100644
index 0000000..1ad886d
--- /dev/null
+++ b/app/src/main/res/layout/log_redirect_dialog.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/pref_edittext_dialog.xml b/app/src/main/res/layout/pref_edittext_dialog.xml
new file mode 100644
index 0000000..36e7127
--- /dev/null
+++ b/app/src/main/res/layout/pref_edittext_dialog.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/prefs_activity.xml b/app/src/main/res/layout/prefs_activity.xml
new file mode 100644
index 0000000..816e04c
--- /dev/null
+++ b/app/src/main/res/layout/prefs_activity.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/reboot_dialog.xml b/app/src/main/res/layout/reboot_dialog.xml
new file mode 100644
index 0000000..08c50fc
--- /dev/null
+++ b/app/src/main/res/layout/reboot_dialog.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/source_edit_activity.xml b/app/src/main/res/layout/source_edit_activity.xml
new file mode 100644
index 0000000..f0b752e
--- /dev/null
+++ b/app/src/main/res/layout/source_edit_activity.xml
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/support_activity.xml b/app/src/main/res/layout/support_activity.xml
new file mode 100644
index 0000000..488100b
--- /dev/null
+++ b/app/src/main/res/layout/support_activity.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/update_actity.xml b/app/src/main/res/layout/update_actity.xml
new file mode 100644
index 0000000..2a68e0a
--- /dev/null
+++ b/app/src/main/res/layout/update_actity.xml
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/vpn_excluded_app_activity.xml b/app/src/main/res/layout/vpn_excluded_app_activity.xml
new file mode 100644
index 0000000..3946249
--- /dev/null
+++ b/app/src/main/res/layout/vpn_excluded_app_activity.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/vpn_excluded_app_entry.xml b/app/src/main/res/layout/vpn_excluded_app_entry.xml
new file mode 100644
index 0000000..400738d
--- /dev/null
+++ b/app/src/main/res/layout/vpn_excluded_app_entry.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/welcome_activity.xml b/app/src/main/res/layout/welcome_activity.xml
new file mode 100644
index 0000000..dd5d767
--- /dev/null
+++ b/app/src/main/res/layout/welcome_activity.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/welcome_method_layout.xml b/app/src/main/res/layout/welcome_method_layout.xml
new file mode 100644
index 0000000..b090a7e
--- /dev/null
+++ b/app/src/main/res/layout/welcome_method_layout.xml
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/welcome_support_layout.xml b/app/src/main/res/layout/welcome_support_layout.xml
new file mode 100644
index 0000000..6db15ad
--- /dev/null
+++ b/app/src/main/res/layout/welcome_support_layout.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/welcome_sync_layout.xml b/app/src/main/res/layout/welcome_sync_layout.xml
new file mode 100644
index 0000000..84c79b3
--- /dev/null
+++ b/app/src/main/res/layout/welcome_sync_layout.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/checkbox_list_context.xml b/app/src/main/res/menu/checkbox_list_context.xml
new file mode 100644
index 0000000..580e20e
--- /dev/null
+++ b/app/src/main/res/menu/checkbox_list_context.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/home_drawer.xml b/app/src/main/res/menu/home_drawer.xml
new file mode 100644
index 0000000..5e9d8f6
--- /dev/null
+++ b/app/src/main/res/menu/home_drawer.xml
@@ -0,0 +1,14 @@
+
+
diff --git a/app/src/main/res/menu/list_menu.xml b/app/src/main/res/menu/list_menu.xml
new file mode 100644
index 0000000..40c7c1e
--- /dev/null
+++ b/app/src/main/res/menu/list_menu.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/lists_navigation.xml b/app/src/main/res/menu/lists_navigation.xml
new file mode 100644
index 0000000..f402836
--- /dev/null
+++ b/app/src/main/res/menu/lists_navigation.xml
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/log_menu.xml b/app/src/main/res/menu/log_menu.xml
new file mode 100644
index 0000000..096b115
--- /dev/null
+++ b/app/src/main/res/menu/log_menu.xml
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/next_actions.xml b/app/src/main/res/menu/next_actions.xml
new file mode 100644
index 0000000..3a1a886
--- /dev/null
+++ b/app/src/main/res/menu/next_actions.xml
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/source_edit_menu.xml b/app/src/main/res/menu/source_edit_menu.xml
new file mode 100644
index 0000000..3e1b412
--- /dev/null
+++ b/app/src/main/res/menu/source_edit_menu.xml
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/vpn_excluded_app_menu.xml b/app/src/main/res/menu/vpn_excluded_app_menu.xml
new file mode 100644
index 0000000..5d28906
--- /dev/null
+++ b/app/src/main/res/menu/vpn_excluded_app_menu.xml
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi/icon.xml b/app/src/main/res/mipmap-anydpi/icon.xml
new file mode 100644
index 0000000..19ec2c6
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi/icon.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi/icon_round.xml b/app/src/main/res/mipmap-anydpi/icon_round.xml
new file mode 100644
index 0000000..e32fcf9
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi/icon_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi/shortcut_dns_requests.xml b/app/src/main/res/mipmap-anydpi/shortcut_dns_requests.xml
new file mode 100644
index 0000000..aa70404
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi/shortcut_dns_requests.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi/shortcut_preferences.xml b/app/src/main/res/mipmap-anydpi/shortcut_preferences.xml
new file mode 100644
index 0000000..b743ea5
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi/shortcut_preferences.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi/shortcut_your_lists.xml b/app/src/main/res/mipmap-anydpi/shortcut_your_lists.xml
new file mode 100644
index 0000000..2128639
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi/shortcut_your_lists.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/icon.png b/app/src/main/res/mipmap-hdpi/icon.png
new file mode 100755
index 0000000..a000baf
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/icon.png differ
diff --git a/app/src/main/res/mipmap-hdpi/icon_foreground.png b/app/src/main/res/mipmap-hdpi/icon_foreground.png
new file mode 100644
index 0000000..9b6b67c
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/icon_round.png b/app/src/main/res/mipmap-hdpi/icon_round.png
new file mode 100755
index 0000000..5108683
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/icon_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/icon.png b/app/src/main/res/mipmap-mdpi/icon.png
new file mode 100755
index 0000000..6ad4b84
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/icon.png differ
diff --git a/app/src/main/res/mipmap-mdpi/icon_foreground.png b/app/src/main/res/mipmap-mdpi/icon_foreground.png
new file mode 100644
index 0000000..a1a13a4
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/icon_round.png b/app/src/main/res/mipmap-mdpi/icon_round.png
new file mode 100755
index 0000000..4b144b2
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/icon_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/icon.png b/app/src/main/res/mipmap-xhdpi/icon.png
new file mode 100755
index 0000000..6e58ea7
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/icon.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/icon_foreground.png b/app/src/main/res/mipmap-xhdpi/icon_foreground.png
new file mode 100644
index 0000000..2ee0499
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/icon_round.png b/app/src/main/res/mipmap-xhdpi/icon_round.png
new file mode 100755
index 0000000..75c16ca
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/icon_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/icon.png b/app/src/main/res/mipmap-xxhdpi/icon.png
new file mode 100644
index 0000000..a0d75ef
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/icon.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/icon_foreground.png b/app/src/main/res/mipmap-xxhdpi/icon_foreground.png
new file mode 100644
index 0000000..5ba37a0
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/icon_round.png b/app/src/main/res/mipmap-xxhdpi/icon_round.png
new file mode 100755
index 0000000..5d7caf4
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/icon_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/icon.png b/app/src/main/res/mipmap-xxxhdpi/icon.png
new file mode 100755
index 0000000..74dbf9e
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_foreground.png b/app/src/main/res/mipmap-xxxhdpi/icon_foreground.png
new file mode 100644
index 0000000..3da2efe
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_round.png b/app/src/main/res/mipmap-xxxhdpi/icon_round.png
new file mode 100755
index 0000000..06c2f6a
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_round.png differ
diff --git a/app/src/main/res/raw-af/help_faq.html b/app/src/main/res/raw-af/help_faq.html
new file mode 100644
index 0000000..51a8e01
--- /dev/null
+++ b/app/src/main/res/raw-af/help_faq.html
@@ -0,0 +1,32 @@
+
+
+
+Vrae
+
+
Inkomste deur advertensies
+
Daar bestaan 'n miskonsepsie dat indien die gebruiker nie op die advertensie klik nie, die blokkering, nie die webwerf of die program finansieel sal benadeel nie. Dit is egter nie waar nie, program ontwikkelaars verdien ook geld as die advertensie vertoon word. Dit is jou keuse of jy die advertensie wil blokkeer al dan nie. Persoonlik gebruik ek nie programme wat advertensie vertoon nie aangesien ek dit frustrerend vind, dus sal ek nie die programme sonder 'n advertensie blokkeerder installeer nie.
+
+
Hoe werk AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Hoekom moet Android weer begin om veranderinge te implementeer?
+
Java en Android onderhou hulle eie interne DNS geheue. Die bedryfstelsel sal dadelik nuwe gasheer lêers vertoon (verifieer dit met ping op die "command line") jy sal egter Android weer moet begin om die DNS geheue en Java te herbou.
+
+
Hoe om die webbediener in AdAway te gebruik?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Hoe kan ek spesifieke gasheername blokkeer/toelaat?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Nie genoeg spasie op die partisie nie
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Dit blokkeer nie advertensie in Programme XYZ nie!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Gestoorde advertensies
+
Somtyds stoor programme advertensies nadat dit afgelaai is. Dit veroorsaak dan die oorblywende advertensies in sommige programme. Jy kan probeer om die geheue van hierdie programme uit te vee in Android se Program lys en so die probleem op te los.
+
+
Program XYZ werk nie meer nie!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Die terug knoppie in die webleser werk nie meer nie
+
Kan kan AdAway se lokale webbediener aktiveer in voorkeure as 'n omseiling.
+
+
Die terug knoppie in die webleser werk nie meer nie
+
Kan kan AdAway se lokale webbediener aktiveer in voorkeure as 'n omseiling.
+
+
+
diff --git a/app/src/main/res/raw-af/help_s_on_s_off.html b/app/src/main/res/raw-af/help_s_on_s_off.html
new file mode 100644
index 0000000..8ba6ca2
--- /dev/null
+++ b/app/src/main/res/raw-af/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Toestelle
+
AdAway sal nie werk in jou toestel die sogenaamde S-ON stelsel gebruik nie. Hierdie 'eienskap' bestaan gewoonlik op HTC Toestelle en verhoed AdAaway om na die gasheer lêers te skryf.
+
+
S-ON/S-OFF?
+
S=OFF beteken dat die NAND deel van die toestel ontsluit is en geredigeer kan word. Die verstek instelling vit HTC is S-ON, wat beteken dat sekere dele ontoeganklik is en nie geredigeer kan word nie. Verder meer , die egtheid van die kern sagteware word verseker deur die S-ON vlag.
+
+
Het ek S-ON of S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Omseil
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
يوجد سوء فهم في كثير من الأحيان وهو أنه إذا لم ينقر المستخدم على الاعلانات، فبالتالي لن يضرّ الحجب بصاحب الموقع أو صاحب التطبيق من الناحية المادية. هذا مفهومٌ خاطئ، إذ يكسب المطورّون المال أيضاً عن طريق عرض الإعلانات. الأمر يعود إليك إذا كنت ترغب بحجب الإعلانات أم لا. أنا شخصياً لا أستخدم التطبيقات التي تعرض الإعلانات لأنني أجدها مزعجة جداً ، ممّا يعني أنّي لا أقوم بتثبيتها بدون توفّر حاجب للإعلانات.
+
+
كيف يعمل AdAway ?
+
يستخدم AdAway ملف المضيفين لحظر أسماء المضيفين التي تخدم الإعلانات. ملف المضيفين هو ملف موجود في /system/etc/hosts يعيّن أسماء المضيفين إلى عناوين IP. إنها طريقة تقليدية لتعريف اسم المضيف لأزواج عناوين IP دون الاعتماد على نظام اسم المجال (DNS). يتم إعادة توجيه جميع أسماء المضيفين غير المرغوب فيها إلى 127.0.0.1 مما يعني أنها ستشير إلى جهازك الخاص.
+إذا لم يكن ملف المضيفين قابلاً للكتابة ، فإن الحل الاحتياطي هو استخدام خدمة VPN المدمجة. سيقوم بتصفية الاتصالات لأسماء المضيف غير المرغوب فيها والسماح للآخرين بالمرور.
+
+
لماذا يجب على المستخدم إعادة تشغيل الجهاز لكي تأخذ التحديثات مجراها؟
+
الجافا على الأندرويد يحتفظ بالمخزون المؤقت للـ DNS الداخلي الخاص به. نظام التشغيل سيعكس ملفات المضيف الجديدة مباشرةً (التحقق من ذلك مع بينج في سطر الأوامر) لكنك ستحتاج إلى إعادة تشغيل الجهاز لإعادة بناء المخزون المؤقت للـ DNS من الجافا.
+
+
كيفية استخدام خادم الويب في AdAway?
+
AdAway يمكنه أن يعمل أيضاً دون استخدام خادم الويب!
+
يمكنك تشغيل خادم الويب المحلي من إعدادات AdAway للإجابة على طلبات محلية لعنوان الـ IP 127.0.0.1. وهذا يعني أنّ الطلبات من التطبيقات إلى خوادم الإعلانات التي يُعادُ توجيهها إلى 127.0.0.1 سوف يتمّ الردّ عليها من قِبَلِ خادم الويب الخاص بـ AdAway.
+ ترفض بعض التطبيقات العمل عندما لا تكون خوادم الإعلانات قابلة للوصول. بهذه الطريقة ستصبح قابلة للوصول مرة أخرى ، وسيكون الردّ بهيئة صفحة فارغة بدون أيّ صور إعلانية.
+
+
كيف يمكنني منع / السماح لأسماء المواقع محددة؟
+
أضف أسماء المضيف التي تريد حظرها إلى القائمة المحظورة من الشاشة الرئيسية. بالإضافة إلى ذلك ، يمكن إضافة أسماء المضيف التي تريد استبعادها من الحظر إلى الأسماء المسموح بها وأسماء المضيف التي تريد إعادة توجيهها إلى عنوان IP محدد ينتمي إلى تم توجيهها.
+
+
أين يمكنني العثور على المزيد من مصادر ملفات المضيف؟
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
المساحة غير كافية على القرص
+
حاول تغيير مسار ملف المضيف من الإعدادات الى /data/data/hosts (أو /data/hosts) وقم بإعادة تحديث AdAway مجدداً .
+
+
لا يعمل على انظمة الاندرويد من اصدار 4.4+
+
حاول تغيير مسار ملف المضيف من الإعدادات من /data/data/hosts إلى /data/hosts أو /system/etc/hosts وقم بإعادة تحديث AdAway مجدداً .
+
+
إنه لا يحجب الإعلانات في التطبيق س ص ع!
+
قد تكون بعض أسماء المضيف مفقودة في ملفات المضيفات المقدمة منHosts Sources أو يحتوي التطبيق على صور لتقديم إعلانات دون الوصول إلى الإنترنت.
+يمكنك تسجيل طلبات الDNS من (Menu->Log DNS Requests) عن طريق AdAway وذلك لمعرفة أسماء المضيف الإضافية التي يجب حظرها.
+
أضف أسماء المضيفات المريبة إلى القائمة السوداء Blacklist الخاصة بك من خلال الضغط على الإدخالات في السجل Log وبلّغ عن أسماء المضيفات هذه عند التحقق منها في Forum المنتدى Hosts Inbox لـ hosts-file.net.
+
+
إعلانات مخبوءة
+
أحيانا بعض التطبيقات تحفظ الإعلانات بعد التحميل. و ذلك يؤدي إلى بقائها في بعض التطبيقات. تستطيع حذف هذه الإعلانات المخبأة لتلك التطبيقات في قائمة تطبيقات آندرويد لتطويق هذه المشكلة.
+
+
التطبيق XYZ لم يعد يعمل بعد الآن.
+
بعض التطبيقات تحتاج إلى تواصل مع إسم الموقع الذي تم حظره من قِبَل AdAway وإلا فإنها سترفض العمل عندما يكون التواصل متعذّراً مع أسماء مواقعٍ من المفترض أن تُقدّم الإعلانات . يرجى زيارة https://github.com/AdAway/AdAway/wiki/ProblematicApps للحصول على قائمة البرامج المعروفة بهذه المشكلة بالتحديد . وإلا فيرجى محاولة معرفة أسماء المضيف المطلوبة وإضافتها إلى القائمة البيضاء تحت قوائمك والإبلاغ عنها في تعقّب العِلل لـ AdAway.
+
+
زر الرجوع للخلف في المتصفح لا يعمل.
+
تستطيع تفعيل خادم AdAway المحلي من الإعدادات كحل بديل.
+
+
زر الرجوع للخلف في المتصفح لا يعمل.
+
تستطيع تفعيل خادم AdAway المحلي من الإعدادات كحل بديل.
+
+
+
diff --git a/app/src/main/res/raw-ar/help_s_on_s_off.html b/app/src/main/res/raw-ar/help_s_on_s_off.html
new file mode 100644
index 0000000..afac4be
--- /dev/null
+++ b/app/src/main/res/raw-ar/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+مساعدة عن خاصية S-ON
+
+
أجهزة HTC
+
adaway لن يعمل في الاجهزة التي تستخدم خاصية S-on هذه الميزة موجودة في اغلب اجهزة HTC وهي تمنع adaway من العمل
+
+
تشغيل S - ايقاف S
+
عدم وجود S يعني ان القرص غير مقفول و يمكن الكتابة عليه. الاعدادت الافتراضية لاجهزة HTC تجعل S تعمل وهذا يعني ان adaway لن يعمل
+
+
هل لديَّ خاصية S-ON أم S-OFF ؟
+
قم بالإقلاع إلى قائمة الإقلاع على جهازك عن طريق الضغط باستمرار على زر خفض مستوى الصوت أثناء الضغط على الطاقة وسيظهر النص الموجود في الأعلى حالة العلم إما على S-OFF أو S-ON. الرووت الكامل يعني عمومًا S-OFF.
+
يمكن العثور على مزيد من المعلومات على www.addictivetips.com. قد تهمك طرق S-OFF الإضافية نظرًا لأن Unrevokable (في الرابط) ، وهي: Revolutionary و Revone و Firewater و RumRunner و Moonshine و SunShine ...
+
+
العمل
+
الشرط الأساسي: يجب عليك تثبيت Android SDK فعال مع shell ADB على جهاز الكمبيوتر الخاص بك.
+
+
يرجى الذهاب إالى قائمة الإقلاع على جهازك بواسطة الضغط على زرّ خفض الصوت وزرّ التشغيل في آنٍ واحد .
+
يرجى الضغط على زرّ خفض الصوت لتحديد الخيار recovery ومن ثمَّ زرّ التشغيل للإقلاع .
+
يرجى الذهاب إلى "قائمة الأقسام" في ClockworkMod Recovery
+
يرجى اختيار mount /system، mount /sdcard و mount /data.
+
يرجى وصل كابل الـ USB وفتح واجهة سطر الأوامر على حاسوبك .
+
يرجى الدخول إلى الـ adb shell وطباعة ln -s /data/hosts /system/etc/hosts (سيقوم هذا بإنشاء رابط رمزي symbolic link, ممّا يتيح لـ AdAway تحرير ملف المضيف المخزّن داخل /data وفي نفس الوقت يستطيع نظام التشغيل استخدام الملف وكأنه مخزّن داخل /system) .
+
يرجى إعادة تشغيل جهازك وتحديد مسار ملف المضيف إلى /data/hosts في إعدادات AdAway .
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
¿Cómo funciona AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
¿Por qué tengo de reaniciar Android pa que los cambeos faigan efeutu?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Nun hai espaciu abondo na patición
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Nun furrula n'Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
¡Nun bloquia los anuncios na aplicación XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Anuncios na caché
+
Dalcuando delles aplicaciones atroxen na caché los anuncios dempués de baxalos. Esto conduz a que queden anuncios de delles aplicaciones. Pues intentar desaniciar la caché pa eses aplicaciones na llista d'aplicaciones d'Android pa burllase d'esti problema.
+
+
¡L'aplicación XYZ yá nun furrula más!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
El botón Atrás nun ta furrulando nos restoladores web
+
Pues habilitar el sirvidor llocal d'AdAway nes preferencies como una igua alternativa.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ast/help_s_on_s_off.html b/app/src/main/res/raw-ast/help_s_on_s_off.html
new file mode 100644
index 0000000..f50b251
--- /dev/null
+++ b/app/src/main/res/raw-ast/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Ayuda rellacionada con S-ON
+
+
Preseos de HTC
+
AdAway nun funciona cuando tas usando un preséu col llamáu S-ON. Esta «carauterística» esiste en munchos preseos de HTC y evita qu'AdAway escriba nel ficheru hosts.
+
+
¿S-ON / S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
¿Tengo S-ON o S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
AdAway necə işləyir?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Nə üçün effekti görmək üçün Android cihazımı yenidən başlatmalıyam?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
AdAway-də vebserveri necə işlədə bilərəm?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Xüsusu host adlarını necə bloklaya və ya blokdan çıxara bilərəm?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
+
+
Mən başqa host resurslarını hardan əldə edə bilərəm?
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Yaddaşda kifayət qədər yer yoxdur
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-az/help_s_on_s_off.html b/app/src/main/res/raw-az/help_s_on_s_off.html
new file mode 100644
index 0000000..5a78898
--- /dev/null
+++ b/app/src/main/res/raw-az/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Cihazlar
+
Əgər cihazda S-ON varsa, AdAway işləməyəcək. Bu "funksiya" bir çox HTC cihazda mövcuddur və AdAwayın hosts fayllarını yazmasına mane olur
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Існуе часты зман, што калі карыстальнік не націскае на рэкламу, то, заблакаваўшы яе, не нанясе шкоды сайту або праграме ў фінансавым плане. Гэта няправільна: распрацоўшчыкі зарабляюць грошы проста за паказ рэкламы. Блакаваць рэкламу ці не, залежыць толькі ад вас. Асабіста я не стаў бы выкарыстоўваць праграму з рэкламай, бо яна вельмі раздражняе, так што без блакавальнікі рэкламы я б не стаў ўсталёўваць такія праграмы.
+
+
Як працуе AdAway?
+
AdAway выкарыстоўваефайл hosts, каб блакаваць імёны hosts, якія прадастаўляюць рэкламу. hosts - гэта файл, які знаходзіцца ў /system/etc/hosts, які адлюстроўвае імёны hosts у якасці IP-адрасоў. Гэта звычайны спосаб вызначэння імя hosts для пар IP-адрасоў, не абапіраючыся на сістэму даменных імёнаў (DNS). Усе непажаданыя імёны hosts будуць перанакіраваны на 127.0.0.1, гэта азначае, што яны будуць адпраўленыя на вашу прыладу.
+Калі файл hosts немагчыма адрэдагаваць, іншым рашэннем з'яўляецца выкарыстанне ўбудаванай службы VPN. Ён будзе фільтраваць злучэнні з непажаданымі імёнамі hosts і прапускаць іншыя.
+
+
Чаму трэба перазагружаць прыладу, каб змены ўступілі ў сілу?
+
Java у Android мае свой унутраны кэш DNS. Аперацыйная сістэма будзе выкарыстоўваць абноўлены файл hosts адразу ж (можаце ў гэтым пераканацца з дапамогай каманды PING ў камандным радку), але вы павінны перазагрузіць прылада, каб перастварыць кэш DNS ў Java.
+
+
Як выкарыстоўваць вэб-сервер у AdAway?
+
AdAway таксама будзе працаваць і без выкарыстання Вэб-сервера!
+
Вы можаце ўключыць лакальны Вэб-сервер у наладах AdAway для адказаў на запыты да лакальнага IP-адрасе127.0.0.1. Тады на ўсе запыты host з рэкламай, якія перанакіроўваюцца на ваш лакальны IP-адрас 127.0.0.1 будзе адказваць Вэб-сервер AdAway.
+ Пэўныя праграмы адмаўляюцца працаваць, калі не маюць доступу да host з рэкламай. Гэты метад дазволіць запускаць такія праграмы, але замест рэкламы будзе падстаўляцца пустое месца і адсутнічаць выява рэкламы..
+
+
Як я магу заблакаваць/разблакаваць канкрэтныя імёны host?
+
Назву hosts, якія вы хочаце заблакаваць, патрэбна дадаць у Чорны спіс, які знаходзіцца на галоўным экране. Таксама, назву hosts, які не хочаце блакавць, патрэбна дадаць у Белы спіс, а назву hosts, які патрэбна перанакіраваць на пэўны IP-адрас, трэба ўнесці ў Спіс перанакіраванняў.
+
+
diff --git a/app/src/main/res/raw-be/help_problems.html b/app/src/main/res/raw-be/help_problems.html
new file mode 100644
index 0000000..86aa7d2
--- /dev/null
+++ b/app/src/main/res/raw-be/help_problems.html
@@ -0,0 +1,37 @@
+
+
+
+Частыя праблемы
+
+
Капіяванне файла hosts не ўдалося на Android 9+
+
Апошнія версіі Android выкарыстоўваюць раздзел /system даступны толькі для чытання.
+Калі вы выкарыстоўваеце Magisk, для атрымання правоў root, пераканайцеся, што вы ўключылі бессістэмны модуль hosts, затым перазагрузіце.
+
+
Не хапае месца ў дыскавым раздзеле
+
Паспрабуйце змяніць шлях да файлу host у наладах на /data/data/hosts (ці /data/hosts) і прымяніце зноў AdAway.
+
+
Не працуе на Android 4.4+
+
Пераканайцеся, што вы адключылі лёгкі рэжым (раней вядомы як захаванне дадзеных) у наладах Chrome. Гэтая функцыя дазваляе Chrome выкарыстоўваць прыватнае рашэнне DNS і абыходзіць AdAway.
+
+
Не блакуецца рэклама ў пэўнай праграме!
+
Некаторыя імёны hosts могуць адсутнічаць ў адпаведных файлах hosts з Крыніц host або праграма мае камплект выяў для прадастаўлення рэкламы без доступу ў інтэрнэт.
+
+Вы можаце зайсці ў журнал запытаў DNS (Меню-Опции-Журнал запытаў DNS) AdAway, каб высветліць, якія дадатковыя імёны host павінны быць заблaкаваны.
+
Дадайце падазроныя імёны host у ваш Чорны спіс доўгім націскам на запіс у журнале, і пасля праверкі паведаміце аб гэтых імёнах host на форуме Hosts Inbox на hosts-file.net.
+
+
Закэшаваная рэклама
+
Пэўныя праграмы кэшуюць рэкламу пасля загрузкі. З-за гэтага рэклама можа заставацца ў гэтых праграмах. Вы можаце паспрабаваць выдаліць кэш для гэтых праграм у спісе праграм Android для ліквідацыі гэтай праблемы
+
+
Пэўная праграма перастала працаваць!
+
Некаторым праграмам неабходна звязвацца з адрасамі, заблакаванымі AdAway, ці праграма не працуе, калі імёны host якія адлюстроўваюць рэкламу недаступныя. Наведайце https://github.com/AdAway/AdAway/wiki/ProblematicApps, каб азнаёміцца са спісам праграм, якія маюць падобныя праблемы. Альбо высвятліце якія імёны host неабходныя праграмам і дадайце іх у Белы спіс у катэгорыі Вашы спісы і паведаміце аб гэтым багтрэкеры AdAway.
+
+
Не працуе на Android 4.4+
+
Паспрабуйце змяніць шлях да файлу host у наладах з /data/data/hosts на /data/hosts ці /system/etc/hosts і зноў прымяніце AdAway.
+
+
Не працуе кнопка «НАЗАД» ў вэб-браўзерах
+
Вы можаце ўключыць лакальны вэб-сервер AdAway у наладах ў якасці абыходнага шляху.
+
+
+
diff --git a/app/src/main/res/raw-be/help_s_on_s_off.html b/app/src/main/res/raw-be/help_s_on_s_off.html
new file mode 100644
index 0000000..5e42b57
--- /dev/null
+++ b/app/src/main/res/raw-be/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Даведка па S-ON
+
+
Прылады HTC
+
AdAway не працуе на прыладах, якія працуюць у рэжыме S-ON. Гэтая асаблівасць маецца ў многіх прыладах HTC і не дазваляе AdAway змяняць файл hosts.
+
+
S-ON/S-OFF?
+
S-OFF азначае, што частка памяці, званай NAND, адмыкнутая і дазваляе вырабляць запіс. Па-змаўчанню прылады HTC працуюць у рэжыме S-ON, а гэта азначае, што вы не можаце атрымаць доступу да пэўных абласцей памяці. Акрамя таго сцяг S-ON правярае лічбавы подпіс усіх прашывак.
+
+
Мая прылада працуе ў рэжыме S-ON або S-OFF?
+
Загрузіцеся ў меню загрузніка на вашай прыладзе, утрымліваючы кнопку памяншэння гучнасці і адначасова заціскаючы кнопку ўключэння, пасля чаго вы ўбачыце уверсе тэкст, які пакажа статут сцяга - S-OFF або S-ON. Звычайна поўны рут-доступ азначае S-OFF.
+
Больш інфармацыі можна знайсці на www.addictivetips.com. Назвы дадатковых метадаў S-OFF, якія могуць вас зацікавіць, пачынаючы з Unrevokable (па спасылцы): Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Рашэнні
+
Патрабаванне: Вы павінны ўсталяваць працоўны Android SDK з абалонкай ADB на ваш ПК.
+
+
Загрузіцеся ў меню загрузкі прылады, утрымліваючы кнопку памяншэння гучнасці пры заціснутай кнопкі выключэння.
+
Выкарыстоўвайце кнопку памяншэння гучнасці каб выбраць рэжым аднаўлення, затым кнопку уключэння, каб загрузіць яго.
+
У Clockwork Recovery перайсці ў "partitions menu".
+
Выберыце mount /system, mount /sdcard і mount /data.
+
Падключыце ваш тэлефон да ПК праз кабель USB і адкрыйце акно каманднага радка на ПК.
+
Запусціце абалонку ADB і ўвядзіце ln -s /data/hosts /system/etc/hosts (гэта створыць знакавую спасылку, якая дазволіць AdAway рэдагаваць файл hosts, размешчаны па шляху /data, адначасова дазваляючы АС выкарыстаць гэты файл так, як калі б ён размяшчаўся па шляху /system).
+
Перазагрузіце вашую прыладу і усталюйце Шлях да файла hosts на /data/hosts у наладах AdAway.
Има често срещана заблуда, че ако потребителят никога не натиска реклами, тогава блокирането им няма да навреди финансово на сайта или приложението. Това не е така, дивелъпърите печелят пари само като показват реклами. Зависи от Вас дали ще блокирате реклами или не. Лично аз не бих ползвал приложения, които показват реклами, защото ги намирам за много дразнещи и затова не бих ги инсталирал без блокиране на рекламите.
+
+
Как работи AdAway?
+
AdAway използва хост файл, за да блокира имена на хостове, които облужват реклами. Хост файлът може да бъде открит в /system/etc/hosts. Той свързва имена на хостове към IP адреси. Това е традиционен начин за дефиниране на двойка име на хост към IP адрес без да се разчита на Системата за имена на домейните (DNS). Всички нежелани имена на хостове се пренасочват към 127.0.0.1, което означава, че те ще сочат собственото Ви устройство.
+Ако хост файлът не може да бъде редактиран, резервно решение е да се използва VPN услуга. Тя ще филтрира връзките към нежелани имена на хостове и ще позволява на други да преминават.
+
+
Защо трябва да рестартирам Android, за да имат ефект промените?
+
Java на Android поддържа свой собствен вътрешен DNS кеш. Операционната система ще отрази новия hosts файл моментално (потвърдете това с ping или команден ред), но ще трябва да рестартирате Android, за да престроите DNS кеша на Java.
+
+
Как да използвам уебсървъра в AdAway?
+
AdAway също така ще работи без използването на уеб сървъра!
+
Можете да включите локален уеб сървър в предпочитанията на AdAway, за да отговаряте на заявките до локалния IP адрес 127.0.0.1. Това означава, че заявки от приложения към рекламни сървъри, които са пренасочени към 127.0.0.1, ще бъдат отговаряни от уеб сървъра на AdAway.
+ Някои приложения отказват да работят, когато рекламните сървъри не са достъпни. Чрез този метод те ще бъдат достъпни отново, отговаряйки с празна страница и без рекламни изображения.
+
+
Как мога да блокирам/разблокирам определени имена на хостове?
+
Добавете имената на хостовете, които искате да блокирате в списъка Блокирани, намиращ се наначалния екран. В допълнение, имена на хостове, които искате да изключите от блокиране, може да бъдат добавени в Позволени и имена на хостове, които искате да пренасочите към специфичен IP адрес, могат да бъдат открити в Пренасочени.
+
+
diff --git a/app/src/main/res/raw-bg/help_problems.html b/app/src/main/res/raw-bg/help_problems.html
new file mode 100644
index 0000000..16030ba
--- /dev/null
+++ b/app/src/main/res/raw-bg/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Често срещани проблеми
+
+
Копиране на хост файла се провали на Android 9+
+
Последните версии на Android използват само за четене /system дял.
+Ако използвате Magisk като руут решение, уверете се, че сте включили безсистемен хост модул, след това рестартирайте.
+
+
Няма достатъчно място на дяла
+
Пробвайте да промените целевия хост файл в настройките към /data/data/hosts (или /data/hosts) и приложете AdAway отново.
+
+
Chrome все още показва реклами
+
Уверете се, че сте изключили олекотения режим (известен преди като пестене на данни) от настройките на Chrome. Тази функция позволява на Chrome да използва частни DNS решения и да заобиколи AdAway.
+
+
Не спира рекламите в приложението XYZ!
+
Някои имена на хостове може би липсват в предоставените хост файлове от Източници за хостове или приложението е снабдило изображенията, за да предостави реклами, без да има достъп до интернет.
+Може да записвате DNS заявките (Меню->Записване на DNS заявки) от AdAway, за да откриете кои допълнителни имена на хостове трябва да бъдат блокирани.
+
Добавете подозрителните имена на хостове в собствен Черен списък, като продължително натиснете на записите в дневника и докладвате тези имена на хостове, когато сте ги потвърдили в нашия Съгледвач за проблеми в GitHub.
+
+
Кеширани реклами
+
Понякога приложенията кешират реклами след изтегляне. Това води до остатъчни реклами в някои приложения. Може да се опитате да изтриете кеша на тези приложения в Списъка с приложения в Андроид, за да заобиколите този проблем.
+
+
Приложение XYZ вече не работи!
+
Някои приложения имат нужда да комуникират с име на хост, което е блокирано от AdAway или отказват да работят, когато имената на хостовете, които предоставят реклами не са достъпни. Вижте https://github.com/AdAway/AdAway/wiki/ProblematicApps. Това е списък с познати приложения, които имат проблеми. В противен случай, намерете кои имена на хостове са нужни и ги добавете във Вашия Бял списък, намиращ се в Ваши списъци и ги докладвайте на преследвача на проблеми на AdAway.
+
+
Не работи на Android 4.4+
+
Пробвайте да промените целевия хост файл в настройките от /data/data/hosts към /data/hosts или /system/etc/hosts и приложете AdAway отново.
+
+
Бутонът "назад" в мрежовите четци вече не работи!
+
Като заобиколен метод можете да включите местния сървър на AdAwaу от настройките.
+
+
+
diff --git a/app/src/main/res/raw-bg/help_s_on_s_off.html b/app/src/main/res/raw-bg/help_s_on_s_off.html
new file mode 100644
index 0000000..65c567e
--- /dev/null
+++ b/app/src/main/res/raw-bg/help_s_on_s_off.html
@@ -0,0 +1,32 @@
+
+
+
+Помощ, свързана със S-ON
+
+
HTC Устройства
+
AdAway не работи, когато използвате устройство с така наречения S-ON. Тази "функция" съществува на множество HTC устройства и предотвратятва AdAway да пише по hosts файла.
+
+
S-ON/S-OFF?
+
S-OFF означава, че NAND партишъна на устройството е отключен и може да се записва на него. Опцията по подразбиране на HTC устройствата е S-ON, което означава, че не можете да получите достъп до голяма част от системата и не можете да гарантирате постоянен root режим. Освен това, проверката на firmware отново е осигурена от S-ON.
+
+
Имам ли S-ON или S-OFF?
+
Влезте в Boot менюто на Вашето устройство, задържайки копчето за намаляване на звука и копчето за стартиране. Текстът отгоре ще покаже статуса, които може да бъде S-OFF or S-ON. Пълен руут достъп обикновено означава S-OFF.
+
Допълнителна информация може да бъде намерена на www.addictivetips.com. Допълнителни методи за S-OFF след Unrevokable (във връзката) може да ви заинтересуват. Казват се: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Временно решение
+
Необходимо условие: Трябва да инсталирате работещ Android SDK с ADB обвивка на компютъра Ви.
+
+
h
+Влезте в Boot менюто на Вашето устройство, задържайки копчето за намаляване на звука и копчето за стартиране.
+
Натиснете бутона за намаляване на звука, за да изберете режим възстановяване и натиснете бутона за включване, за да го заредите.
+
В режимът за възстановяване "clockwork" отидете в "менюто на дяловете".
+
Изберете mount /system, mount /sdcard и mount /data.
+
Включете USB кабела и отворете командния ред на компютъра Ви.
+
Влезте в adb shell и напишете ln -s /data/hosts /system/etc/hosts (Това създава символна връзка, която позволява на AdAway да редактира host файла, записан в /data, докато позволява на операционната система да използва файла, записан в /system.)
+
Рестартирайте устройството и в настройките на AdAway поставете Целевия хост файл в /data/hosts.
একটি অননুমোদিত ভুল ধারণা রয়েছে যে যদি কোনো ব্যবহারকারী বিজ্ঞাপনগুলিতে ক্লিক করেন না, তাহলে তাদের ব্লক করা কোন সাইট বা অ্যাপ্লিকেশানকে আর্থিকভাবে ক্ষতিগ্রস্ত করবে না এটা ভুল, ডেভেলপাররা শুধু বিজ্ঞাপন প্রদর্শন করে অর্থ উপার্জন করে এটা আপনার উপর নির্ভর করে কিনা আপনি বিজ্ঞাপন ব্লক বা না। ব্যক্তিগতভাবে আমি এমন বিজ্ঞাপনগুলি ব্যবহার করব না যা বিজ্ঞাপন প্রদর্শন করে কারণ আমি তাদের খুব বিরক্তিকর, তাই বিজ্ঞাপন ব্লক ছাড়াই আমি এই অ্যাপ্লিকেশানগুলি ইনস্টল করব না
+
+
AdAway কিভাবে কাজ করে ?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
অ্যাডঅ্যাওয়েতে ওয়েব সার্ভার কিভাবে ব্যবহার করবেন?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
পার্টিশন পর্যাপ্ত নয়
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Android 4.4+ এ কাজ করে না
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
ক্যাশ বিজ্ঞাপনগুলি
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-bn/help_s_on_s_off.html b/app/src/main/res/raw-bn/help_s_on_s_off.html
new file mode 100644
index 0000000..e0590ab
--- /dev/null
+++ b/app/src/main/res/raw-bn/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
এইচটিসি ডিভাইস
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Sovint es diu que, si un usuari no clica els anuncis, els desenvolupadors no reben ingressos. Això és fals, ja que també es reben ingressos mostrant els anuncis. No obstant això, mostrar o amagar els anuncis es decisió vostra.
+
+
Com funciona AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Per què haig de reiniciar Android perquè els canvis facin efecte?
+
El Java d'Android manté la seva llista d'entrades DNS internament. El sistema utilitzarà el nou arxiu hosts immediatament (ho podeu comprovar amb "ping") però, no obstant, haureu de reiniciar Android per reinicialitzar la llista d'entrades de DNS internes.
+
+
Com s'utilitza el servidor web d'AdAway?
+
L'AdAway també funcionarà sense l'ús d'un servidor Web!
+
Podeu habilitar el servidor Web local a les opcions de l'AdAway per respondre les peticions cap a l'adreça local 127.0.0.1. Això significa que totes les peticions de servidors de publicitat redirigits cap a 127.0.0.1 obtindran resposta per part del servidor Web de l'AdAway.
+ Algunes aplicacions poden no funcionar correctament si no troben el servidor de publicitat. Amb aquest mètode s'evita el problema atès que s'envia una pàgina en blanc sense imatges publicitàries.
+
+
Com puc bloquejar noms de màquina específics?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
No hi ha prou espai a la partició
+
Intenteu canviar el fitxer d'amfitrions de destinació a les preferències a /data/data/hosts (o /data/hosts) i torneu a aplicar l'AdAway.
+
+
No funciona a Android 4.4+
+
Intenteu canviar el fitxer d'amfitrions de destinació a les preferències de /data/data/hosts a /data/hosts o /system/etc/hosts i torneu a aplicar l'AdAway.
+
+
No bloqueja els anuncis de l'aplicació X!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Anuncis en memòria cau
+
Algunes aplicacions carreguen anuncis en memòria. Això fa que quedin alguns anuncis en algunes aplicacions. Podeu provar eliminant les dades en memòria d'aquestes aplicacions en el gestor de programari d'Android per solucionar aquest problema.
+
+
L'aplicació X no funciona més.
+
Algunes aplicacions necessiten connexió amb un amfitrió que l'AdAway ha blocat o bé no funcionen correctament si el servidor de publicitat no està disponible. Veieu https://github.com/AdAway/AdAway/wiki/ProblematicApps per obtenir un llistat d'aplicacions amb aquest comportament. D'altra banda, podeu esbrinar quins noms de domini necessiten les aplicacions i els podeu afegir a la llista blanca a llistes i reportar (en anglès) el problema mitjançant el bug tracker of AdAway.
+
+
El botó enrera en els navegadors web no funciona
+
Podeu habilitar el servidor local d'AdAway a les preferències com a solució temporal.
+
+
El botó enrera en els navegadors web no funciona
+
Podeu habilitar el servidor local d'AdAway a les preferències com a solució temporal.
+
+
+
diff --git a/app/src/main/res/raw-ca/help_s_on_s_off.html b/app/src/main/res/raw-ca/help_s_on_s_off.html
new file mode 100644
index 0000000..3facd52
--- /dev/null
+++ b/app/src/main/res/raw-ca/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Ajuda sobre l'S-ON
+
+
Dispositius HTC
+
AdAway no funciona si utilitzeu un dispositiu amb la funció S-ON. Aquesta funció, que evita que AdAway escrigui fitxers hosts, existeix en diversos dispositius HTC.
+
+
S-ON/S-OFF?
+
S-OFF significa que la porció de la memòria NAND del vostre dispositu està desbloquejada i llesta per l'escriptura. L'ajustament per defecte d'HTC és S-ON que significa que no es pot accedir a algunes àrees del sistema i no es pot garantitzar un root permanent. A més a més, es comproven les signatures dels fitxers de firmware.
+
+
Tinc S-ON o S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Solució
+
Pre-requisit: Heu d'instal·lar un SDK d'Android amb una shell ADB en el vostre ordinador personal.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
+
AdAway hauria de funcinar ara.
+
+
+
diff --git a/app/src/main/res/raw-cs/help_faq.html b/app/src/main/res/raw-cs/help_faq.html
new file mode 100644
index 0000000..b1e49bc
--- /dev/null
+++ b/app/src/main/res/raw-cs/help_faq.html
@@ -0,0 +1,32 @@
+
+
+
+Časté otázky
+
+
Vydělávání na reklamách
+
Uživatelé se často mylně domnívají, že pokud nikdy neklikají na reklamy, blokování nijak finančně nepoškodí aplikace nebo navštívené stránky. Toto není pravda, vývojáři vydělávají peníze i pouhým zobrazením reklam. Je pouze na vás, jestli budete reklamy blokovat, nebo ne. Osobně bych nepoužíval aplikace zobrazující reklamy, protože reklama je podle mě velmi otravná, takže bez blokovače reklam bych si tyto aplikace ani nenainstaloval.
+
+
Jak AdAway funguje?
+
AdAway používá soubor hostitelů pro blokování doménových jmen serverů, které slouží k poskytování reklam. Soubor hostitelů je soubor, který naleznete v /system/etc/hosts a který přiřazuje jména hostitelů IP adresám. Toto je tradiční způsob, jak přiřadit jméno hostitele IP adrese bez spoléhání se na Domain Name System (DNS). Všechna nechtěná jména hostitelů jsou přesměrována na 127.0.0.1, tzn. na vlastní zařízení.
+Pokud soubor hostitelů nelze editovat, záložním řešením je použití vestavěné služby VPN. Ta vyfiltruje spojení se servery s nechtěnými doménovými jmény a ostatní spojení zachová.
+
+
Proč je pro uplatnění změn potřeba restartovat zařízení?
+
Java v Androidu si spravuje vlastní interní vyrovnávací paměť DNS. Změny v souboru hostitelů budou v operačním systému provedeny ihned (toto můžete zkontrolovat příkazem ping v terminálu), pro znovuvytvoření vyrovnávací paměti DNS Javy ale musíte zařízení restartovat.
+
+
Jak používat webový server v AdAway?
+
AdAway funguje i bez použití webového serveru!
+
V nastavení AdAway můžete povolit lokální webový server, běžící na lokální IP adrese 127.0.0.1. V tomto případě budou dotazy aplikací na reklamní servery přesměrovány na 127.0.0.1 a zodpovězeny webovým serverem AdAway.
+ Některé aplikace se odmítnou spustit, pokud jsou reklamní servery nedostupné. Při použití této metody budou znovu dostupné, ale budou odpovídat prázdnou stránkou bez reklamních obrázků.
+
+
Jak můžu zablokovat/odblokovat určitá jména hostitelů?
+
Jména hostitelů, která chcete zablokovat, přidejte z domovské obrazovky do seznamu Zablokované. Dále jména hostitelů, která chcete z blokování vyjmout, můžete přidat do Povolené a jména hostitelů, která chcete přesměrovat na určitou IP adresu, patří do Přesměrováné.
+
+
diff --git a/app/src/main/res/raw-cs/help_problems.html b/app/src/main/res/raw-cs/help_problems.html
new file mode 100644
index 0000000..e991f82
--- /dev/null
+++ b/app/src/main/res/raw-cs/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Obvyklé problémy
+
+
Kopírování souboru hostitelů na Androidu 9+ selhalo
+
Poslední verze Androidu používají oddíl /system v módu jen pro čtení.
+Pokud používáte pro ROOT přístup Magisk, ujistěte se, že je modul nesystémoví hostitelé povolen a poté restartujte zařízení.
+
+
Nedostatek místa na oddílu
+
Zkuste v nastavení změnit cílový soubor hostitelů na /data/data/hosts (nebo /data/hosts) a použít AdAway znovu.
+
+
Chrome stále zobrazuje reklamy
+
Ujistěte se, že máte vypnutý zjednodušený režim (dříve nazývaný jako spořič dat) v nastavení Chromu. Tato funkce Chromu umožňuje používat soukromé řešení DNS a obejít tak AdAway.
+
+
Reklamy v aplikaci XYZ nejsou blokovány!
+
Některá jména hostitelů mohou v poskytnutých souborech hostitelů ze Zdrojů hostitelů chybět nebo má aplikace reklamy zabudovány přímo v sobě a tudíž nepotřebuje k jejich zobrazování připojení k internetu.
+Pomocí AdAway můžete zaznamenávat DNS požadavky (Menu->Záznam DNS požadavků) a zjistit tak, která další jména hostitelů mají být zablokována.
+
Přidejte podezřelá jména hostitelů na svou vlastní černou listinu dlouhým podržením vybraného jména hostitele v záznamu a pokud jste ověřili jejich funkčnost, nahlašte je na našem GitHub Issue Trackeru.
+
+
Reklamy v dočasné paměti
+
Občas si aplikace ukládají stažené reklamy do dočasné paměti. To vede k tomu, že v některých aplikacích reklamy můžou zůstat. Pro obejití tohoto problému můžete zkusit vymazat dočasnou paměť u těchto aplikací v Seznamu aplikací systému Android.
+
+
Aplikace XYZ již nefunguje!
+
Některé aplikace potřebují komunikovat s hostitelem, který je blokován pomocí AdAway, nebo dokonce odmítají pracovat, pokud pro ně takový hostitel není dostupný. Podívejte se na https://github.com/dschuermann/ad-away/wiki/ProblematicApps, kde naleznete seznam známých aplikací, které se potýkají s tímto problémem. Anebo si zjistěte, která jména hostitelů je potřeba přestat blokovat a pak je přidejte na svou Bílou listinu ve Vašich seznamech a nahlaste je na AdAway bug tracker.
+
+
Nefunguje na Androidu 4.4+
+
Zkuste v nastavení změnit cílový soubor hostitelů z /data/data/hosts na /data/hosts nebo /system/etc/hosts a použít AdAway znovu.
+
+
Tlačítko zpět ve webovém prohlížeči nefunguje
+
Pro obejití problému můžete v nastavení povolit lokální webový server AdAway.
+
+
+
diff --git a/app/src/main/res/raw-cs/help_s_on_s_off.html b/app/src/main/res/raw-cs/help_s_on_s_off.html
new file mode 100644
index 0000000..f503328
--- /dev/null
+++ b/app/src/main/res/raw-cs/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Nápověda vztahující se k S-ON
+
+
HTC zařízení
+
AdAway nefunguje, pokud používáte zařízení s takzvaným S-ON. Toto "vylepšení" se vyskytuje na mnoha HTC zařízeních a znemožňuje AdAway upravování souboru hostitelů.
+
+
S-ON/S-OFF?
+
S-OFF znamená, že NAND paměť vašeho zařízení je odemčená a lze do ní zapisovat. Výchozí nastavení u HTC zařízení je S-ON, tzn. že nemůžete zapisovat do určitých částí paměti a získat úplný ROOT zařízení. Dále S-ON příznak zajišťuje kontrolu podpisu obrazů firmware.
+
+
Mám S-ON, nebo S-OFF?
+
Zapněte zařízení do tzv. Boot Menu současným držením tlačítek Ztišení hlasitosti a Zapnutí/Vypnutí. Nahoře obrazovky poté uvidíte stav S-OFF nebo S-ON. Úplný ROOT přístup obvykle znamená S-OFF.
+
Pro více informací navštivte stránku www.addictivetips.com. Mohly by vás zajímat i jiné metody získání S-OFF než Unrevokable (viz odkaz), a to např. Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine...
+
+
Obejití problému
+
Předpoklad: Na vašem počítači musíte nainstalovat funkční Android SDK s ADB shellem.
+
+
Zapněte zařízení do tzv. Boot Menu současným držením tlačítek Ztišení hlasitosti a Zapnutí/Vypnutí.
+
Použijte tlačítko Ztišení hlasitosti pro zvolení recovery a poté stiskněte tlačítko Zapnutí/Vypnutí pro přesun do tohoto režimu.
+
V clockwork recovery přejděte do "partitions menu".
+
Zvolte mount /system, mount /sdcard a mount /data.
+
Připojte USB kabel a na počítači otevřete příkazovou řádku.
+
Spusťte adb shell a napište příkaz ln -s /data/hosts /system/etc/hosts (Toto vytvoří symbolický odkaz, který AdAway umožní upravovat soubor hostitelů uložený v /data, zatímco OS bude soubor používat jako by byl uložen v /system.)
+
Restartujte vaše zařízení a v nastavení AdAway nastavte Cílový soubor hostitelů na /data/hosts.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
Hvordan virker AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Hvorfor skal jeg genstarte Android for at ændringerne træder i kraft?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
Hvordan bruger jeg webserveren i AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Hvordan kan jeg blokere/afblokere specifikke hostnavne?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Ikke nok plads på partitionen
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Virker ikke på Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Den blokkerer ikke annoncer fra programmet XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cachede Annoncer
+
Nogle gange har applikationer gemt reklamer efter download. Dette fører til rest reklamer i nogle programmer. Du kan prøve at slette cachen for disse applikationer i Android Application liste at omgå dette problem.
+
+
Programmet XYZ virker ikke mere!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Tilbage-knappen i webbrowsere virker ikke
+
Du kan aktivere AdAways lokale webserver i Indstillinger som en workaround.
+
+
Tilbage-knappen i webbrowsere virker ikke
+
Du kan aktivere AdAways lokale webserver i Indstillinger som en workaround.
+
+
+
diff --git a/app/src/main/res/raw-da/help_s_on_s_off.html b/app/src/main/res/raw-da/help_s_on_s_off.html
new file mode 100644
index 0000000..4d9bc3a
--- /dev/null
+++ b/app/src/main/res/raw-da/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC-enheder
+
AdAway virker ikke når du bruger en enheder med S-ON. Denne 'feature' findes på mange HTC-enheder og gør at AdAway ikke kan skrive til hosts-filen.
+
+
S-ON/S-OFF?
+
S-OFF betyder at NAND-delen af din enhed er ulåst og kan skrives til. Standard-indstillingen for HTC-enheder er S-ON, hvilket betyder at du hverken kan tilgå bestemte områder af filsystemet eller sikre dig en permanent root-adgang. Ydermere, signatur-tjek for dine firmware-images er også påvirket af S-ON.
+
+
Har jeg S-ON eller S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Mulig omvej
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Die oft geäußerte Auffassung, dass ein Nutzer, der nie auf Werbung klickt, einer Webseite oder Anwendung finanziell nicht schadet, wenn Werbung blockiert wird, ist falsch. Denn Entwickler erhalten auch durch das bloße Einblenden von Werbung Geld. Es bleibt Ihre Entscheidung, ob Sie Werbung blockieren oder nicht. Ich persönlich würde keine Anwendungen verwenden, die Werbung anzeigen, da ich sie sehr störend finde, d. h. ohne einen Werbeblocker würde ich diese Anwendungen nicht installieren.
+
+
Wie funktioniert AdAway?
+
AdAway benutzt die Hosts-Datei, um Hostnamen zu blockieren, die Werbung ausliefern. Die Hosts-Datei befindet sich unter /system/etc/hosts und weist Hostnamen eine IP-Adresse zu. Traditionell werden über diese Datei Paare aus IP-Adresse und Hostname definiert, ohne auf das Domain Name System (DNS) zurückzugreifen. Alle unerwünschten Hostnamen werden zu 127.0.0.1 umgeleitet, also auf Ihr eigenes Gerät.
+Wenn die Hosts-Datei nicht beschreibbar ist, besteht eine Ausweichlösung darin, den eingebauten VPN-Dienst zu verwenden. Dieser filtert Verbindungen zu unerwünschten Hostnamen und lässt andere durch.
+
+
Warum muss ich Android neustarten, damit die Änderungen wirksam werden?
+
Java auf Android hat einen eigenen internen DNS-Zwischenspeicher. Zwar übernimmt das Betriebssystem die neue Hosts-Datei sofort (dieses kann man mit einem Ping über die Kommandozeile überprüfen). Jedoch ist es nötig, Android neu zu starten, um auch Javas DNS-Zwischenspeicher zu erneuern.
+
+
Wie verwendet man den Webserver in AdAway?
+
AdAway funktioniert auch ohne den Webserver!
+
Sie können in den Einstellungen von AdAway einen lokalen Webserver aktivieren, um Anfragen an die lokale IP-Adresse 127.0.0.1 zu beantworten. Dadurch werden Anfragen von Anwendungen an Werbeserver, die an 127.0.0.1 umgeleitet werden, nun vom AdAway-Webserver beantwortet.
+ Einige Anwendungen funktionieren nicht, wenn die von ihnen angesprochenen Werbeserver nicht erreichbar sind. Mit dieser Methode erscheinen sie erreichbar, indem sie eine leere Seite anstelle von Werbebildern zurückgeben.
+
+
Wie kann ich bestimmte Hostnamen sperren/entsperren?
+
Host der blockiert werden soll zu Blockieren-Liste vom Desktop und Host der ausgeschlossen werden vom Blockieren zu Erlaubt-Liste, sowie Umleiten-Liste von Hosts zu speziellen IP-Adressen.
+
+
diff --git a/app/src/main/res/raw-de/help_problems.html b/app/src/main/res/raw-de/help_problems.html
new file mode 100644
index 0000000..9137c42
--- /dev/null
+++ b/app/src/main/res/raw-de/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Häufige Probleme
+
+
Kopie der hosts-Datei in Android 9+ schlägt fehl
+
Die neuesten Versionen von Android verwenden eine schreibgeschützte /system Partition.
+Wenn sie Magisk als Root Lösung verwenden, stellen sie sicher das der Punkt "Systemlose Host-Datei" aktiviert ist und starten dann neu.
+
+
Auf der Partition ist nicht genügend Speicherplatz vorhanden
+
Versuchen Sie, das Zielverzeichnis der Hosts-Datei in den Einstellungen auf /data/data/hosts (oder /data/hosts) zu ändern, und wenden Sie AdAway erneut an.
+
+
Funktioniert nicht auf Android 4.4+
+
Versuchen Sie, das Zielverzeichnis der Hosts-Datei in den Einstellungen von /data/data/hosts auf /data/hosts oder /system/etc/hosts umzustellen, und wenden Sie danach AdAway erneut an.
+
+
Die Werbung in Anwendung XYZ wird nicht blockiert!
+
In den bereitgestellten Hosts-Dateien der Hosts-Quellen fehlen möglicherweise einige Hostnamen oder die Anwendung hat die Anzeigen gebündelt, um Werbung bereitzustellen, ohne auf das Internet zuzugreifen.
+Sie können die DNS-Anforderungen (Menü->DNS-Anfragen protokollieren) von AdAway protokollieren lassen, um herauszufinden, welche zusätzlichen Hostnamen gesperrt werden müssen.
+
Fügen Sie die verdächtigen Hostnamen zu Ihrer eigenen Negativliste hinzu, indem Sie länger auf die Einträge im Protokoll drücken und melden Sie diese Hostnamen im Forum Hosts Inbox von hosts-file.net, wenn Sie sie überprüft haben.
+
+
Zwischengespeicherte Werbung
+
Manche Anwendungen speichern Werbung nach dem Herunterladen temporär. Dies führt dazu, dass Werbung in manchen Anwendungen erhalten bleibt. Um dieses Problem zu umgehen, können Sie versuchen, den Zwischenspeicher dieser Anwendungen, in der Anwendungsliste von Android, zu löschen.
+
+
Anwendung XYZ funktioniert nicht mehr richtig!
+
Manche Anwendungen funktionieren nicht, wenn Host-Namen, die Werbung bereitstellen sollen, nicht erreichbar sind, da sie von AdAway blockiert werden. Besuchen Sie https://github.com/AdAway/AdAway/wiki/ProblematicApps, um eine Liste von bekannten Anwendungen einzusehen, die solche Probleme haben. Sie können auch versuchen herauszufinden, welche Hostnamen benötigt werden, und diese Ihrer Positivliste unter Meine Listen hinzufügen. Melden Sie diese bitte zusätzlich im Ticketsystem von AdAway.
+
+
Der Zurückknopf im Browser funktioniert nicht
+
Versuchen Sie, in den Einstellungen das Ziel der Hosts-Datei von /data/data/hosts in /data/hosts oder /system/etc/hosts zu ändern, und wenden Sie AdAway erneut an.
+
+
Der Zurückknopf im Browser funktioniert nicht
+
Als Problemumgehung können Sie den lokalen Webserver von AdAway in den Einstellungen aktivieren.
+
+
+
diff --git a/app/src/main/res/raw-de/help_s_on_s_off.html b/app/src/main/res/raw-de/help_s_on_s_off.html
new file mode 100644
index 0000000..4220062
--- /dev/null
+++ b/app/src/main/res/raw-de/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON-spezifische Hilfe
+
+
HTC-Geräte
+
AdAway funktioniert nicht, wenn Sie ein Gerät mit einem sogenannten S-ON verwenden. Viele HTC-Geräte besitzen diese »Funktion«, welche unterbindet, dass AdAway die Hosts-Datei beschreiben kann.
+
+
S-ON/S-OFF?
+
S-OFF bedeutet, dass der NAND-Bereich des Gerätes entsperrt ist und somit beschrieben werden kann. Die Standardeinstellung bei HTC-Geräten ist S-ON, was wiederum heißt, dass Sie weder auf bestimmte Systembereiche zugreifen können, noch einen dauerhaften Root-Zugriff gewährleistet bekommen. Durch das S-ON-Flag wird außerdem die Signaturprüfung von Firmware-Abbildern sichergestellt.
+
+
Ist mein Gerät im Modus S-ON oder S-OFF?
+
Starten Sie in das Boot-Menü, indem Sie bei gedrückter Lautstärke verringern-Taste Ihr Gerät einschalten. Der Status »S-OFF« oder »S-ON« wird oben im Menü angezeigt. Voller Root-Zugriff ist im Allgemeinen gleichbedeutend mit »S-OFF«.
+
Mehr Informationen hierzu finden Sie unter www.addictivetips.com. Neben der Unrevokable-Methode, um »S-OFF« zu erhalten (siehe Verknüpfung), haben Sie eventuell Interesse an weiteren Methoden. Nennenswert: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Behelfslösung
+
Voraussetzung: Ein auf Ihrem PC installiertes, funktionsfähiges Android-SDK mit ADB-Shell.
+
+
Starten Sie in das Boot-Menü, indem Sie bei gedrückter Leiser-Taste Ihr Gerät einschalten.
+
Betätigen Sie die Leiser-Taste, um zum Menüpunkt »Recovery« zu navigieren. Drücken Sie anschließend den An-/Aus-Schalter, um in den Recovery-Modus zu booten.
+
Wechseln Sie in der Clockwork Recovery ins »Partitions Menu«.
+
Wählen Sie mount /system, mount /sdcard und mount /data aus.
+
Verbinden Sie das Gerät per USB mit dem PC und öffnen Sie ein Kommandozeilenfenster.
+
ADB-Shell starten und ln -s /data/hosts /system/etc/hosts eingeben (Es wird ein symbolischer Verweis erstellt, der es AdAway erlaubt, die Hosts-Datei unter /data zu verändern, während es für das Betriebssystem so aussieht, als wäre sie unter /system vorhanden.)
+
Starten Sie das Gerät neu und legen Sie in den Einstellungen von AdAway das Zielverzeichnis der Hosts-Datei auf /data/hosts fest.
Υπάρχει η λάθος αντίληψη ότι εφόσον ένας χρήστης επιλέγει να μην κάνει ποτέ κλίκ σε διαφημίσεις, αποκλείοντάς τες δεν θα οδηγούσε σε οικονομική ζημιά σε έναν ιστότοπο ή μια εφαρμογή. Αυτό είναι λάθος, γιατί οι προγραμματιστές έχουν έσοδα και μόνο εμφανίζοντας τες. Είναι δική σας απόφαση αν θέλετε να εμποδίσετε την εμφάνιση των διαφημίσεων ή όχι. Προσωπικά δεν θα χρησιμοποιούσα εφαρμογές που εμφανίζουν διαφημίσεις γιατί τις βρίσκω πολύ ενοχλητικές, οπότε χωρίς την εφαρμογή φραγής τους δεν θα τις εγκαθιστούσα.
+
+
Πως λειτουργεί η εφαρμογή AdAway;
+
Το AdAway χρησιμοποιεί το αρχείο hosts για να αποκλείσει hostnames, που προβάλλουν διαφημίσεις. Το αρχείο hosts είναι ένα αρχείο που βρίσκεται στο /system/etc/hosts που αντιστοιχίζει hostnames σε διευθύνσεις IP. Είναι ένας παραδοσιακός τρόπος για να ορίσετε το hostname σε ζεύγη διευθύνσεων IP χωρίς να βασίζεστε στο Domain Name System (DNS). Όλα τα ανεπιθύμητα hostnames ανακατευθύνονται στο 127.0.0.1 πράγμα που σημαίνει ότι οδηγούνται στη δική σας συσκευή.
+Εάν το αρχείο hosts δεν είναι εγγράψιμο, μια εναλλακτική λύση είναι να χρησιμοποιήσετε την ενσωματωμένη υπηρεσία VPN. Θα φιλτράρει τις συνδέσεις σε ανεπιθύμητα hostnames και θα αφήσει άλλους να περάσουν.
+
+
Γιατί χρειάζεται να επανεκκινήσω τη συσκευή μου για να ισχύσουν οι αλλαγές;
+
Η Java στο Android χρησιμοποιεί μια δική της εσωτερική κρυφή μνήμη DNS. Το λειτουργικό σύστημα αντανακλά τις αλλαγές στο αρχείο hosts άμεσα (επαληθεύστε με την εντολή ping σε γραμμή εντολών) αλλά θα χρειαστεί να επανεκκινήσετε το Android για να ενημερώσει την κρυφή μνήμη DNS της Java.
+
+
Πώς χρησιμοποιείται ο διακομιστής ιστοσελίδων στο AdAway;
+
Το AdAway λειτουργεί επίσης και χωρίς τον διακομιστή ιστοσελίδων!
Μπορείτε να ενεργοποιήσετε έναν τοπικό διακομιστή ιστοσελίδων στις ρυθμίσεις του AdAway για να εξυπηρετεί αιτήσεις στην τοπική διεύθυνση IP 127.0.0.1. Αυτό σημαίνει πως αιτήσεις από εφαρμογές προς παρόχους διαφημίσεων οι οποίες ανακατευθύνονται προς το 127.0.0.1 εξυπηρετούνται από τον διακομιστή ιστοσελίδων του AdAway. Μερικές εφαρμογές δεν λειτουργούν αν δεν έχουν πρόσβαση σε παρόχους διαφημίσεων. Με αυτή τη μέθοδο θα είναι πάλι διαθέσιμοι, απαντώντας με μια λευκή σελίδα και χωρίς εικόνες διαφημίσεων.
+
+
Πώς μπορώ να αποκλείσω/άρω τονο αποκλεισμό συγκεκριμένων ονομάτων διακομιστών;
+
Προσθέστε τα hostnames που θέλετε να αποκλείσετε στη λίστα Blocked από την αρχική οθόνη. Επιπλέον, τα hostnames που θέλετε να αποκλείσετε απο τον αποκλεισμό μπορούν να προστεθούν στα Επιτρεπόμενα και ta hostnames που θέλετε να ανακατευθύνετε σε μια συγκεκριμένη διεύθυνση IP ανήκουν στην Ανακατεύθυνση.
+
+
Πού μπορώ να βρω περισσότερες πηγές αρχείων hosts;
Η Αντιγραφή του αρχείου hosts απέτυχε στο Android 9+
+
Οι τελευταίες εκδόσεις του Android χρησιμοποιούν read-only /system partition.
+Αν χρησιμοποιείτε το Magisk ως root solution, βεβαιωθείτε ότι έχετε ενεργοποιήσει το systemless hosts στοιχείο και στη συνέχεια επανεκκινήσετε.
+
+
Δεν υπάρχει επαρκής χώρος στο διαμέρισμα.
+
Προσπαθήστε να αλλάξετε το αρχείο προορισμού hosts στις ρυθμίσεις σε /data/data/hosts (ή /data/hosts) και εφαρμόστε ξανά το AdAway.
+
+
Δεν λειτουργεί στο Android 4.4+
+
Προσπαθήστε να αλλάξετε το αρχείο προορισμού hosts στις ρυθμίσεις από /data/data/hosts σε /data/hosts ή /system/etc/hosts και εφαρμόστε ξανά το AdAway.
+
+
Δεν αποκλείει τις διαφημίσεις στην εφαρμογή XYZ!
+
Ορισμένα hostsnames ενδέχεται να λείπουν στα αρχεία hosts από Hosts Sources ή η εφαρμογή έχει συγκεντρώσει τις εικόνες για να παρέχει διαφημίσεις χωρίς πρόσβαση στο διαδίκτυο.
+Μπορείτε να καταγράψετε τα αιτήματα DNS (Menu->Log DNS Requests) από το AdAway για να μάθετε ποιά επιπλέον hostnames πρέπει να αποκλειστούν.
+
Προσθέστε τα ύποπτα hostnames στη δική σας Μαύρη λίστα πατώντας παρατεταμένα τις καταχωρήσεις στο αρχείο καταγραφής και αναφέρετε αυτά τα hostnames, όταν τα επαληθεύσατε στο Forum Hosts Inbox of hosts-file.net.
+
+
Αποθηκευμένες διαφημίσεις
+
Μερικές φορές οι εφαρμογές αποθηκεύουν τοπικά τις διαφημίσεις αφού τις μεταφορτώσουν. Αυτό οδηγεί σε παραμένουσες διαφημίσεις σε μερικές εφαρμογές. Μπορείτε να δοκιμάσετε να διαγράψετε την κρυφή μνήμη των εφαρμογών αυτών στη λίστα εφαρμογών του Android για να παρακάμψετε αυτό το πρόβλημα.
+
+
Δε λειτουργεί πλέον η εφαρμογή XYZ!
+
Κάποιες εφαρμογές απαιτούν την επικοινωνία μέ ενα διακομιστή που έχει αποκλειστεί από το AdAway ή αρνούνται να λειτουργήσουν όταν οι διακομιστές που εξυπηρετούν διαφημίσεις δεν είναι διαθέσιμοι. Επισκεφτείτε το https://github.com/AdAway/AdAway/wiki/ProblematicApps για μια λίστα γνωστών προβληματικών εφαρμογών. Ειδάλλως, βρείτε ποιοι διακομιστές είναι απαραίτητοι και προσθέστε τους στη Λευκή Λίστα στο Οι Λίστες Σας και αναφέρετέ τους στον ανιχνευτή σφαλμάτων του ΑdAway.
+
+
Το κουμπί "πίσω" στους περιηγητές ιστοσελίδων δεν λειτουργεί
+
Μπορείτε να ενεργοποιήσετε τον τοπικό διακομιστή ιστοσελίδων του AdAway σαν παράκαμψη.
+
+
Το κουμπί "πίσω" στους περιηγητές ιστοσελίδων δεν λειτουργεί
+
Μπορείτε να ενεργοποιήσετε τον τοπικό διακομιστή ιστοσελίδων του AdAway σαν παράκαμψη.
Το AdAway δε λειτουργεί όταν χρησιμοποίεται σε συσκευή με τη ρύθμιση S-ON. Αυτή η λειτουργία υπάρχει σε πολλές συσκευές HTC και αποτρέπει το AdAway απ' το να γράψει στο αρχείο hosts.
+
+
S-ON/S-OFF;
+
Το S-OFF σημαίνει ότι η περιοχή NAND της συσκευής είναι ξεκλειδωμένη και μπορεί να γραφτεί. Η προεπιλεγμένη ρύθμιση για τις συσκευές HTC είναι S-ON, που σημαίνει ότι ούτε έχετε πρόσβαση ούτε μπορείτε να εγγυηθείτε μόνιμα δικαιώματα υπερχρήστη. Επιπλέον, έλεγχος υπογραφών για τις εικόνες του firmware διασφαλίζεται από το S-ON.
+
+
Έχω S-ON ή S-OFF;
+
Boot στο Boot Menu της συσκευή σας, κρατώντας πατημένο το πληκτρο volume down, ενώ πατάτε το πλήκτρο Power Button ταυτόχρονα και το κείμενο στην κορυφή θα εμφανίσει το flag status είτε ως S-OFF ή S-ON. Ένα πλήρης Root σημαίνει γενικά S-OFF.
+
Περισσότερες πληροφορίες μπορούν να βρεθούν στην www.addictivetips.com. Πρόσθετες μέθοδοι S-OFF από Unrevokable (in link) που μπορεί να σας ενδιαφέρουν συγκεκριμένα: Revolutionary, Revone, Firewater, RumRunner, Moonshine, Sunshine…
+
+
Παράκαμψη
+
Προαπαιτούμενο: Χρειάζεται εγκατάσταση του Android SDK με ADB shell στον υπολογιστή σας.
+
+
Boot στο Boot Menu της συσκευής σας πατώντας κρατημένο το volume down κουμπί καθώς πατάτε το κουμπί ενεργοποίησης της συσκευής.
+
Χρησιμοποιήστε το volume down για να επιλέξετε recoveryέπειτα power για να το εκκινήσετε.
+
Στο clockwork recovery πηγαίνετε στο "partions menu".
+
Επιλέξτε mount /system, mount /sdcard και mount /data.
+
Συνδέστε το καλώδιο USB σας και ανοίξτε μια γραμμή εντολών στον υπολογιστή σας.
+
Μπείτε στο adb shell και πληκτρολογήστε In -s /data/hosts /system/etc/hosts (Αυτό δημιουργεί έναν συμβολικό σύνδεσμο, που επιτρέπει στο AdAway να επεξεργαστεί το αρχείο hosts που είναι αποθηκευμένο στο /data ενώ επιτρέπει στο Λειτουργικό να χρησιμοποιεί το αρχείο σαν να ήταν αποθηκευμένο στο /system.)
+
Επανεκκινήστε την συσκευή σας και ορίστε Αρχείο προορισμού hosts σε /data/hosts στις ρυθμίσεις του AdAway.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Chrome still displays ads
+
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-en-rUS/help_s_on_s_off.html b/app/src/main/res/raw-en-rUS/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-en-rUS/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Ne estas sufiĉe dispartigspaco.
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Hay una idea errónea expresada frecuentemente que dice que, si un usuario nunca hace clic en los anuncios, bloquearlos no dañará las finanzas del sitio o la aplicación. Esto no es verdad, los desarrolladores también ganan dinero sólo por mostrar anuncios. Depende de ti si bloqueas los anuncios o no. Personalmente no usaría aplicaciones que muestran anuncios porque me parecen muy molestas, así que sin un bloqueador de anuncios ni siquiera las instalaría.
+
+
¿Cómo funciona AdAway?
+
AdAway usa el archivo hosts para bloquear los nombres de host. El archivo /system/etc/hosts asigna los nombres de host a las direcciones IP. Es un método común para definir pares de nombres de hosts y direcciones IP sin utilizar un sistema de nombres de dominio (DNS). Se redireccionan todos los nombres de hosts no deseados a 127.0.0.1 (es decir, tu propio dispositivo). Si no es posible escribir en el archivo hosts, puedes usar el servicio de VPN integrado como alternativa. Este filtrará las conexiones a los nombres de host no deseados y permitirá que se realicen las demás.
+
+
¿Por qué debo reiniciar Android para que surtan efecto los cambios?
+
Java en Android guarda su propio caché interno de DNS. El sistema operativo mostrará el nuevo archivo host inmediatamente (verifícalo con un ping en la línea de comando) pero deberás reiniciar Android para reconstruir el caché DNS de Java.
+
+
¿Cómo se utiliza el servidor web de AdAway?
+
¡AdAway funcionará sin usar el servidor web!
+
Puedes activar un servidor web local en las preferencias de AdAway para responder pedidos de la dirección IP local 127.0.0.1. Esto significa que los pedidos de las aplicaciones que son redirigidos a127.0.0.1 son respondidos por el servidor web de AdAway.
+ Algunas aplicaciones se rehusan a funcionar cuando los servidores de anuncios no son alcanzables. Con este método serán alcanzables de nuevo, devolviendo una página en blanco sin imágenes de publicidad.
+
+
¿Cómo puedo bloquear/desbloquear nombres de host específicos?
+
Desde la pantalla principal, agrega los nombres de hosts que quieres bloquear a la lista Bloqueados. Además, puedes agregar los nombres de host que no quieres bloquear a la lista Permitidos y los que quieres redirigir a una dirección IP específica a la lista Redireccionados.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
No hay suficiente espacio en la partición
+
Intenta cambiar en las preferencias el archivo hosts de destino a /data/data/hosts (o /data/hosts) y aplica AdAway otra vez.
+
+
No funciona en Andrioid 4.4+
+
Intenta cambiar en las preferencias el archivo hosts de destino de /data/data/hosts a /data/hosts o /system/etc/hosts y aplica AdAway otra vez.
+
+
¡No bloquea anuncios en aplicación XYZ!
+
Algunos nombres de hosts pueden faltar en los archivos de hosts proporcionados de las Fuentes de Hosts o la aplicación ha agrupado las imágenes para proporcionar anuncios sin acceder a Internet.
+Puede registrar las peticiones DNS (Menu->Log DNS Requests) desde AdAway para averiguar qué nombres de hosts adicionales tienen que ser bloqueados.
+
Añada los nombres de hosts sospechosos a su propia Lista negra pulsando las entradas en el Log e informe de estos nombres de hosts cuando los haya verificado en la bandeja de entrada de hosts-file.net.
+
+
Anuncios en Caché
+
A veces las aplicaciones almacenan anuncios en caché después de su descarga. Esto lleva a que queden anuncios en algunas aplicaciones. Puedes tratar de borrar la memoria caché de éstas en la lista de aplicaciones Android para esquivar este problema.
+
+
¡La aplicación XYZ no funciona más!
+
Algunas aplicaciones necesitan comunicarse con un hostname que está bloqueado por AdAway o negarse a trabajar cuando los hostnames que deberían servir anuncios no son accesibles. Ver https://github.com/AdAway/AdAway/wiki/ProblematicApps para obtener una lista de aplicaciones conocidas que tienen problemas. De lo contrario, averigüe qué nombres de hosts se necesitan y añádelos a su Lista blanca en sus Listas y repórtelos al rastreador de errores de AdAway..
+
+
El botón de volver no funciona en navegadores web
+
Puedes activar el servidor web local de AdAway en las preferencias como solución.
+
+
El botón de volver no funciona en navegadores web
+
Puedes activar el servidor web local de AdAway en las preferencias como solución.
+
+
+
diff --git a/app/src/main/res/raw-es-rMX/help_s_on_s_off.html b/app/src/main/res/raw-es-rMX/help_s_on_s_off.html
new file mode 100644
index 0000000..e4cffa5
--- /dev/null
+++ b/app/src/main/res/raw-es-rMX/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Ayuda relacionada al S-ON
+
+
Dispositivos HTC
+
AdAway no funciona cuando utilizas un dispositivo con el tan llamado S-ON. Esta 'característica' existe en varios dispositivos HTC y evita que AdAway escriba el archivo hosts.
+
+
¿S-ON o S-OFF?
+
S-OFF significa que la porción NAND del dispositivo está desbloqueada y se puede escribir en ella. La configuración predeterminada para dispositivos HTC es S-ON, lo que significa que no se puede acceder a ciertas áreas del sistema ni tampoco se puede garantizar el root permanente. Además, la comprobación de la firma para las imágenes de firmware también está garantizada por el indicador S-ON.
+
+
¿Tengo S-ON o S-OFF?
+
Reinicia al Boot Menu en tu dispositivo manteniendo presionando el botón de bajar volumen mientras presionas el botón de encendido y el texto en la parte superior mostrará el estado del indicador como S-OFF o S-ON. Un dispositivo completamente rooteado se mostrará como S-OFF.
+
Puedes encontrar más información en www.addictivetips.com. Métodos S-OFF adicionales con Unrevoked (en el link) pueden interesarte, es decir: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Solución
+
Prerequisito: Usted tiene que instalar un SDK de Android que funciona con el shell de ADB en su PC.
+
+
Ingresa al Menú de Arranque en tu dispositivo presionando el botón de bajar volumen y el botón de encendido a la vez.
+
Utilice el volume abajo para seleccionar el modo recovery y luego presione el botón de encendido para iniciar.
+
En clockwork recovery vaya a "menu de particiones".
+
Seleccione mount /system, mount /sdcard y mount /data.
+
Conecte su cable USB y abra una línea de comandos en su PC.
+
Ingrese al adb shell y escriba ln -s /data/hosts /system/etc/hosts (Esto crea un enlace simbólico, que le permite a AdAway editar el archivo hosts almacenado en /data mientras permite al SO usarlo como si estuviera guardado en /system.)
+
Reinicie su dispositivo y establezca Archivo hosts de destino a /data/hosts en las preferencias de AdAway.
Existe una idea errónea de que si un usuario nunca hace clic en anuncios, bloquearlos no dañará financieramente un sitio o una aplicación. Esto es incorrecto, los desarrolladores también ganan dinero con solo mostrar anuncios. Depende de usted si bloquea los anuncios o no. Personalmente, no usaría aplicaciones que muestren anuncios porque los encuentro muy molestos, así que sin un bloqueador de anuncios no instalaría estas aplicaciones.
+
+
¿Cómo funciona AdAway?
+
AdAway utiliza el archivo hosts para bloquear los nombres de hosts, que proporcionan anuncios. El archivo hosts es un archivo que se encuentra en /system/etc/hosts que asigna los nombres de hosts a las direcciones IP. Es una forma tradicional de definir los nombres de hosts a direcciones IP sin depender del sistema de nombres de dominio (DNS). Todos los nombres de hosts no deseados son redirigidos a 127.0.0.1, lo que significa que apuntarán a tu propio dispositivo.
+Si el archivo hosts no es escribible, una solución de respaldo es usar el servicio VPN incorporado. Filtrará las conexiones a nombres de hosts no deseados y dejará pasar a otros.
+
+
¿Por qué tengo que reiniciar Android para que los cambios surtan efecto?
+
Java sobre Android mantiene su propia caché interna de DNS. El sistema operativo reflejará el nuevo fichero hosts inmediatamente (verifique esto con un ping desde la línea de comandos) pero tendrá que reiniciar Android para reconstruir la caché de DNS de Java.
+
+
¿Cómo usar el servidor web en AdAway?
+
¡AdAway también funcionará sin utilizar el servidor web!
+
Puede habilitar un servidor web local en las preferencias de AdAway para responder las peticiones a la dirección IP local 127.0.0.1. Esto significa que las peticiones de las aplicaciones a los servidores de anuncios que se redirigen a 127.0.0.1 son respondidas por el servidor web de AdAway.
+ Algunas aplicaciones se niegan a trabajar, cuando los servidores de anuncios no son accesibles. Con este método, serán accesibles nuevamente, respondiendo con una página en blanco y sin imágenes de anuncios.
+
+
¿Cómo puedo bloquear/desbloquear nombres de servidor específicos?
+
Añade los nombres de host que quieres bloquear a la lista Bloqueado de la pantalla de inicio. Además, los nombres de host que desees excluir del bloqueo pueden añadirse a la lista Permitido y los nombres de host que desees redirigir a una dirección IP específica pertenecen a la lista Redireccionado.
+
+
¿Dónde puedo encontrar más fuentes de ficheros hosts?
Las últimas versiones de Android utilizan la partición /system de solo lectura.
+Si estás usando Magisk como solución root, asegúrate de habilitar el módulo hosts sin sistema y luego reinicia.
+
+
No hay suficiente espacio en la partición
+
Intenta cambiar el archivo hosts de destino en preferencias a /data/data/hosts (o /data/hosts) y aplicar AdAway nuevamente.
+
+
Chrome todavía muestra anuncios
+
Asegúrate de deshabilitar el modo lite (anteriormente conocido como ahorro de datos) en la configuración de Chrome. Esta función permite a Chrome utilizar una solución DNS privada y evitar AdAway.
+
+
¡No bloquea anuncios en la aplicación XYZ!
+
Es posible que falten algunos nombres de hosts en los archivos hosts proporcionados por las fuentes de hosts o que la aplicación haya agrupado las imágenes para proporcionar anuncios sin acceder a Internet.
+Puede registrar las peticiones DNS (Menú -> Registro de peticiones DNS) desde AdAway para averiguar qué nombres de hosts adicionales deben ser bloqueados.
+
Añade los nombres de host sospechosos a tu propia lista negra presionando largamente las entradas en el registro y reporta estos nombres de hosts cuando los hayas verificado en nuestro registro de problemas en GitHub.
+
+
Anuncios almacenados en caché
+
A veces, las aplicaciones almacenan anuncios en caché después de la descarga. Esto lleva a los anuncios restantes en algunas aplicaciones. Puedes intentar eliminar la memoria caché para estas aplicaciones en la lista de aplicaciones de Android para evitar este problema.
+
+
¡La aplicación XYZ ya no funciona!
+
Algunas aplicaciones deben comunicarse con un nombre de host bloqueado por AdAway o negarse a trabajar cuando no se puede acceder a los nombres de host que deberían servir anuncios. Visite https://github.com/AdAway/AdAway/wiki/ProblematicApps para obtener una lista de aplicaciones conocidas que tienen problemas. De lo contrario, averigüe qué nombres de host se necesitan y agréguelos a su lista blanca en sus listas e informe de ellos al rastreador de errores de AdAway.
+
+
No funciona en Android 4.4+
+
Intente cambiar el archivo de hosts de destino en las preferencias de /data/data/hosts a /data/hosts o /system/etc/hosts y vuelva a aplicar AdAway.
+
+
El botón de retroceso de los navegadores web no funciona
+
Puedes activar el servidor web local de AdAway en las preferencias como una solución alternativa.
+
+
+
diff --git a/app/src/main/res/raw-es/help_s_on_s_off.html b/app/src/main/res/raw-es/help_s_on_s_off.html
new file mode 100644
index 0000000..2ecc4b9
--- /dev/null
+++ b/app/src/main/res/raw-es/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Ayuda relacionada con S-ON
+
+
Dispositivos HTC
+
AdAway no funciona cuando estés usando un dispositivo con el llamado S-ON. Esta 'característica' existe en muchos dispositivos HTC e impide que AdAway escriba en el archivo hosts.
+
+
¿S-ON/S-OFF?
+
S-OFF significa que la parte de la (memoria) NAND del dispositivo está desbloqueada y se puede escribir sobre ella. La configuración predeterminada para los dispositivos HTC es S-ON, lo que significa que usted ni puede acceder a ciertas áreas del sistema, ni puede garantizarse un rooteado permanente. Más aún, la comprobación de firmas para imágenes de firmware está asegurada por el indicativo S-ON.
+
+
¿Tengo S-ON o S-OFF?
+
Arranque en el menú de arranque de su dispositivo manteniendo pulsado el botón de volumen mientras presiona el botón de encendido y el texto de la parte superior mostrará el estado de la bandera como S-OFF o S-ON. Una root completo generalmente significa S-OFF.
+
Puede encontrar más información en www.addictivetips.com. Métodos adicionales de S-OFF ya que Unrevokable (en enlace) puede ser de su interés, es decir: Revolucionario, Revone, Aguardiente, RumRunner, Moonshine, SunShine…
+
+
Solución indirecta
+
Prerrequisito: Tiene que instalar un Android SDK con shell ADB funcional en su PC.
+
+
Arranque en el menú de arranque de su dispositivo manteniendo pulsado el botón de volumen mientras presiona el botón de encendido.
+
Utilice el volumen hacia abajo para seleccionar la recuperación y luego enciéndala para arrancarla.
+
En la recuperación del sistema de reloj vaya a "menú de particiones".
+
Seleccione mount /system, mount /sdcard y mount /data.
+
Conecte su cable USB y abra una línea de comandos en su PC.
+
Ingresa adb shell y escribe ln -s /data/hosts /system/etc/hosts (Esto crea un enlace simbólico que permite a AdAway editar el archivo hosts almacenado en /data mientras que permite al sistema operativo utilizar el archivo como si estuviera almacenado en /system).
+
Reinicia tu dispositivo y establece el archivo hosts de destino en /data/hosts en las preferencias de AdAway.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
Kuidas AdAway töötab?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Miks ma pean Androidi taaskäivitama, et muutused jõustuksid?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
Kuidas kasutada veebiserverit AdAways?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Kuidas ma saan blokeerida/eemaldada blokeeringu kindlatel hostinimedel?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Partitsioonil pole piisavalt ruumi
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Ei toimi Androidi versioonis 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Rakenduses XYZ pole reklaamid blokeeritud!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Puhverdatud reklaamid
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Rakendus XYZ ei tööta enam!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Tagasinupp ei toimi veebibrauserites
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
Tagasinupp ei toimi veebibrauserites
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-et/help_s_on_s_off.html b/app/src/main/res/raw-et/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-et/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Uste oso zabaldua dago erabiltzaileak ez badu inoiz iragarki batean klikatzen, hura blokeatzeak ez diola kalterik egiten gune edo aplikazio bati finantzari dagokionez. Hau okerra da, garatzaileek dirua ere irabazten dute iragarkiak erakutsiz. Zure esku dago iragarkiak blokeatzea edo ez. Nik neuk ez dut iragarkirik erakusten duen aplikaziorik erabiltzen oso eragozgarritzat hartzen ditudalako, hortaz iragarki blokeatzaile bat gabe ez nituzke aplikazio hauek ezarriko.
+
+
Nola egiten du lan AdAway-ek?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Zergaitik berrabiarazi behar dut Android aldaketek eragina izateko?
+
Java -k Android-en bere barneko DNS katxea mantentzen du. Sistema eragileak hostalari izen berriak berehala isladatuko ditu (egiaztatu ping bat eginez agindu lerroan) baina Android berrabiarazi beharko duzu Java-ren DNS katxea berreraikitzeko.
+
+
Nola erabili web-zerbitzaria AdAway-n?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Nola blokeatu/desblokeatu ditzaket hostalari-izen jakinak?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
+
+
diff --git a/app/src/main/res/raw-eu/help_problems.html b/app/src/main/res/raw-eu/help_problems.html
new file mode 100644
index 0000000..9c49d10
--- /dev/null
+++ b/app/src/main/res/raw-eu/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Ohiko arazoak
+
+
Huts egin du ostalari-fitxategia kopiatzeak Android 9+en
+
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Ez dago nahikoa toki partizioan
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Chromek iragarkiak erakusten ditu oraindik ere
+
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
Ez du iragarkirik blokeatzen XYZ aplikazioan!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
+
+
Katxeatutako Iragarkiak
+
Batzuetan aplikazioek iragarkiak katxeatzen dituzte jeitsi ondoren. Honek zenbait aplikazioetan iragarkiak gelditzera eramaten du. Aplikazio hauen katxea ezabatzen saiatu zaitezke Android-en Aplikazio zerrendan arazo hau saihesteko.
+
+
XYZ aplikazioa ez dabil gehiago!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Ez dabil Android 4.4+en
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Web nabigatzaileetako atzera botoiak ez du lan egiten
+
AdAway-ren tokiko web-zerbitzaria gaitu dezakezu hobespenetan aldibaterako konponbide bat bezala.
+
+
+
diff --git a/app/src/main/res/raw-eu/help_s_on_s_off.html b/app/src/main/res/raw-eu/help_s_on_s_off.html
new file mode 100644
index 0000000..8aac845
--- /dev/null
+++ b/app/src/main/res/raw-eu/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Gailuak
+
AdAway-k ez du lan egiten S-ON deituriko gailu bat erabiltzen duzunean. 'ezaugarri' hau HTC gailu askotan aurkitzen da eta AdAway-k hostalari agiria idaztea saihesten du.
+
+
S-ON/S-OFF?
+
S-OFF esanahi du gailuaren NAND zatia desblokeatuta dagoela eta bertan idatzi daitekeela. HTC gailuen berezko ezarpena S-ON da, honek esanahi du ezin duzula sistemako zenbait eremutara sarbiderik izan ezta errotze egonkor bat bermatu. Gainera, firmware irudien sinadura egiaztapena ere segurtaturik dago S-ON ikurrarekin.
+
+
Nik S-ON edo S-OFF dut?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Konponbidea
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
+
AdAway-ek lan egin behar du orain.
+
+
+
diff --git a/app/src/main/res/raw-fa/help_faq.html b/app/src/main/res/raw-fa/help_faq.html
new file mode 100644
index 0000000..a06b3ee
--- /dev/null
+++ b/app/src/main/res/raw-fa/help_faq.html
@@ -0,0 +1,31 @@
+
+
+
+پرسش و پاسخ
+
+
درآمد با تبلیغات
+
این یک باور غلطی میباشد که اگر کاربر هرگز بر روی تبلیغات کلیک ننماید درنتیجه مسدود نمودن آنها به یک سایت و یا برنامه ضرر مالی نخواهد رساند. این اشتباه است، توسعه دهندگان برنامه میتوانند تنها با نمایش تبلیغات کسب درآمد نمایند. این به شما بستگی دارد که جلوی تبلیغات را بگیرید یا نه. من شخصا از برنامه هایی که تبلیغات نشان میدهند استفاده نمیکنم زیرا که آنها بسیار آزاردهنده هستند، بنابراین بدون مسدود کننده تبلیغات من از اینگونه برنامه ها استفاده نمینمایم.
+
+
برنامه AdAway چگونه کار میکند؟
+
AdAway از فایل hosts برای مسدود کردن نام های host که تبلیغات را ارائه می دهند استفاده می کند فایل host فایلی است که در system/etc/hosts/ یافت می شود که نام های host را به آدرس های IP نگاشت می کند این یک روش سنتی برای تعریف نام host به جفت آدرس IP بدون تکیه بر سیستم نام دامنه (DNS) است همه نام های host ناخواسته به 127.0.0.1 منتقل میشوند و به این معنی که آن ها به دستگاه شما اشاره می کنند فایل hosts قابل نوشتن نیست یک راه حل بازگشتی استفاده از سرویس VPN داخلی است که اتصالات به نام های host ناخواسته را فیلتر می کند و به دیگران اجازه می دهد تا از آن عبور کنند
+
+
چرا برای انجام تغییرات باید گوشی خود را خاموش و روشن کنم؟
+
جاوا در اندروید حافظه پنهان DNS داخلی خود را حفظ می کند سیستم عامل گوشی شما فایل hosts جدید را فورا منعکس می کند (این را با پینگ در خط فرمان تایید کنید) اما برای بازسازی حافظه پنهان DNS جاوا باید گوشی خود را خاموش و روشن کنید
+
+
چگونه از وب سرور در AdAway استفاده کنیم؟
+
AdAway همچنین بدون استفاده از وب سرور کار خواهد کرد
+
شما می توانید یک وب سرور محلی را در تنظیمات برگزیده AdAway فعال کنید تا به درخواست ها با آدرس IP محلی 127.0.0.1 پاسخ دهد این به این معناست که درخواست های برنامه ها به سرورهای تبلیغاتی به 127.0.0.1 منتقل می شوند توسط وب سرور AdAway پاسخ داده میشوند
+ وقتی سرورهای تبلیغاتی در دسترس نیستند برخی از برنامه ها که از کار کردن خودداری میکنند با این روش دوباره در دسترس خواهند بود و با صفحه خالی و بدون تصاویر تبلیغاتی پاسخ داده می شوند
+
+
چگونه می توانم نام host خاصی را مسدود یا آزاد کنم؟
+
نام host هایی را که میخواهید مسدود کنید از صفحه اصلی به لیست مسدود شده اضافه کنید و همچنین نام های host مورد نظر که می خواهید از مسدود کردن حذف شوند را به مجاز شده اضافه کنید همچنین نام های host که میخواهید به یک آدرس IP خاص هدایت کنید متعلق به تغییر مسیر هستند
آخرین نسخه های اندروید از پارتیشن سیستم فقط خواندنی استفاده می کنند
+
+اگر از Magisk به عنوان راه حل روت استفاده می کنید مطمئن شوید که ماژول hosts بدون سیستم را فعال کرده و سپس گوشی خود را خاموش و روشن کنید
+
+
فضای کافی در پارتیشن موجود نیست
+
سعی کنید فایل های hosts هدف را در تنظیمات برگزیده به /data/data/hosts (یا /data/hosts) تغییر دهید و دوباره AdAway را انجام دهید
+
+
کروم همچنان تبلیغات را نمایش می دهد
+
مطمئن شوید که حالت ساده (که قبلا به عنوان ذخیره داده شناخته می شد) را در تنظیمات Chrome غیرفعال کرده اید این ویژگی به Chrome اجازه می دهد تا از راه DNS خصوصی استفاده کند و AdAway را دور بزند
+
+
تبلیغات را در برنامه XYZ مسدود نمی کند
+
ممکن است برخی از نام های host در فایل های میزبان ارائه شده در منبع Hosts وجود نداشته باشد یا برنامه تصاویر را برای ارائه تبلیغات بدون دسترسی به اینترنت همراه کرده است
+شما همچنین میتوانید درخواست های DNS (درخواست های منوی گزارش DNS) را به AdAway وارد کنید تا بفهمید کدام نام میزبان اضافی باید مسدود شود
+
با فشار دادن طولانی ورودی ها در گزارش نام host مشکوک را به لیست سیاه خود اضافه کنید و هنگامی که آن ها را در ردیاب مشکل گیت هاب ما تایید کردید این نام ها را گزارش کنید
+
+
تبلیغات در حافظه پنهان ذخیره شده
+
گاهی اوقات برنامه ها پس از دانلود تبلیغات را در حافظه پنهان نگه می دارند این کار باعث باقی ماندن تبلیغات در برخی از برنامه ها می شود برای دور زدن این مشکل می توانید حافظه پنهان این برنامه ها را از لیست برنامه های اندروید حذف کنید
+
+
برنامه XYZ دیگر کار نمی کند
+
برخی از برنامه ها باید با نام host هایی که توسط AdAway مسدود شده ارتباط برقرار کنند یا هنگامی که نام host های مورد نظر که باید تبلیغات را ارائه دهند در دسترس نیستند از کار کردن خودداری کنند به لینک گیت هاب ما به آدرس https://github.com/AdAway/AdAway/wiki/ProblematicApps مراجعه کنید تا لیستی از برنامه های شناخته شده ای که مشکل دارند را دریافت کنید در غیر این صورت متوجه شوید که کدام نام host لازم است و آن ها را به لیست سفید موجود در لیست های خود اضافه کنید و آن ها را به ردیاب اشکال AdAway گزارش دهید
+
+
در اندروید 4.4 به بالا کار نمی کند
+
سعی کنید فایل های hosts هدف را در تنظیمات برگزیده از /data/data/hosts به /data/hosts یا /system/etc/hosts تغییر دهید و دوباره AdAway را انجام دهید
+
+
دکمه برگشت در مرورگر های وب کار نمی کند
+
شما می توانید وب سرور محلی AdAway را در تنظیمات برگزیده به عنوان یک راه حل فعال کنید
+
+
+
diff --git a/app/src/main/res/raw-fa/help_s_on_s_off.html b/app/src/main/res/raw-fa/help_s_on_s_off.html
new file mode 100644
index 0000000..461198e
--- /dev/null
+++ b/app/src/main/res/raw-fa/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
دستگاه های HTC
+
اگر دستگاه شما از S-ON استفاده نماید برنامه AdAway کار نخواهد کرد. این قابلیت در اکثر دستگاه های HTC وجود دارد و جلوی AdAway را برای تغییر فایل hosts میگیرد.
+
+
S-ON/S-OFF?
+
قابلیت S-OFF این معنی را میدهد که NAND portion دستگاه آنلاک شده و قابل ویرایش میباشد. در دستگاه های HTC حالت پیش فرض S-ON میباشد، به این معنی که نه به شما اجازه دسترسی به قسمت هایی از سیستم را میدهد و نه گارانتی روت دائمی میباشد. علاوه بر این بررسی اصالت امضای ایمیج فرمویر توسط S-ON مراقبت میشود.
+
+
من کدامیک از حالت های S-ON یا S-OFF را دارم؟
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
راه حل
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Yleinen harhaluulo on, että jos käyttäjä ei koskaan klikkaa mainoksia, niin niiden estäminen ei haittaa sivua tai sovellusta taloudellisesti. Tämä ei kuitenkaan pidä paikkaansa, sillä kehittäjät tienaavat rahaa myös vain näyttämällä mainoksia. Riippuu itsestäsi haluatko estää mainokset vai et. Henkilökohtaisesti en käyttäisi sovelluksia, jotka näyttävät mainoksia, sillä mainokset ovat mielestäni ärsyttäviä, joten ilman mainostenesto-ohjelmaa en asentaisi kyseisiä sovelluksia.
+
+
Kuinka AdAway toimii?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Miksi minun täytyy käynnistää Android uudelleen ottaakseni muutokset voimaan?
+
Androidin Java ylläpitää omaa sisäistä DNS-välimuistia. Käyttöjärjestelmä kuvastaa uuttaa hosts-tiedostoa heti (varmista se pingillä komentorivillä), mutta sinun täytyy käynnistää Android uudelleen jälleenrakentaaksesi Javan DNS-välimuisti.
+
+
Kuinka AdAwayn web-palvelinta käytetään?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Kuinka voin estää/sallia tiettyjen palvelinten nimet?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Ei tarpeeksi tilaa osiossa
+
Yritä vaihtaa kohde hosts tiedosto asetuksissa /data/data/hosts (tai /data/hosts) tiedostoon ja käynnistä AdAway uudestaan.
+
+
Ei toimi Android 4.4:stä ylemmillä Android versioilla
+
Yritä vaihtaa kohde hosts tiedosto asetuksissa /data/data/hosts tiedostosta /data/hosts taisystem/etc/hosts ja käynnistä AdAway uudelleen.
+
+
Se ei estä mainoksia XYZ-sovelluksesta!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Välimuistiin tallennetut mainokset
+
Joskus sovellukset laittavat mainokset välimuistiin lataamisen jälkeen. Siitä johtuen joissakin sovelluksissa näkyy mainoksia. Voit yrittää poistaa näiden sovellusten välimuistin tämän ongelman kiertämiseksi.
+
+
XYZ-sovellus ei toimi enää!
+
Joidenkin sovellusten tarvitsee kommunikoida AdAwayn estämän palvelimen kanssa tai ne eivät suostu toimimaan, koska palvelimet joista mainosten pitäisi tulla ovat estetty. Katso https://github.com/AdAway/AdAway/wiki/ProblematicApps saadaksesi listan tiedetyistä ohjelmista joilla on ongelmia. Muutoin, ota selvää mitkä palvelimet ovat tarpeen ja lisää ne kohtaan whitelist alla Your List ja ilmoita ne AdAwayn bug trackerille
+
+
Takaisin-painike selaimissa ei toimi.
+
Voit ottaa asetuksista käyttöön AdAwayn paikallisen web-palvelimen väliaikaisena korjauksena.
+
+
Takaisin-painike selaimissa ei toimi.
+
Voit ottaa asetuksista käyttöön AdAwayn paikallisen web-palvelimen väliaikaisena korjauksena.
+
+
+
diff --git a/app/src/main/res/raw-fi/help_s_on_s_off.html b/app/src/main/res/raw-fi/help_s_on_s_off.html
new file mode 100644
index 0000000..5dbfbd0
--- /dev/null
+++ b/app/src/main/res/raw-fi/help_s_on_s_off.html
@@ -0,0 +1,32 @@
+
+
+
+S-ON liittyvä apu.
+
+
HTC-laitteet
+
AdAway ei toimi, kun käytät niin sanottua S-ON-laitetta. tämä 'ominaisuus' on monissa HTC-laitteissa ja estää AdAwayn kirjoittamasta hosts-tiedoston.
+
+
S-ON/S-OFF?
+
S-OFF tarkoittaa, että laitteen NAND-osio on lukitsematon ja siihen voidaan kirjoittaa. HTC-laitteissa oletuksena on S-ON, mikä tarkoittaa, että myöskään sinä et voi käyttää tiettyjä järjestelmän alueita, eikä ole myöskään mahdollista varmistaa pysyvää pääkäyttäjäoikeutta. Tämän lisäksi S-ON -lipulla varmistetaan allekirjoituksen tarkistaminen laiteohjelmiston otoksista .
+
+
Onko minulla S-ON tai S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Kiertotapa
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Käynnistä laitteesi laitteen käynnistys menuun pitämällä painiketta volume alas pohjassa painaen samalla virta painiketta pohjaan.
+
Käytä äänenvoimakkuus alas painiketta valitaksesi recoveryn sen jälkeen virtapainiketta käynnistääksesi laitteen.
+
Clockwork recoveryssä valitse "partitions menu".
+
Valitsemount/ system, mount /sdcard ja mount /data.
+
Kytke USB johto ja avaa komentokehote tietokoneessasi.
+
Avaa adb komentorivi ja kirjoita In -s /data/hosts /system/etc/hosts (Tämä luo symbolisen linkin, joka sallii AdAwayn muokata hosts tiedostoa joka on osiossa /data sallien käyttöjärjestelmän käyttää tiedostoa aivan kuin se tallennettu osioon /system.)
+
Käynnistä laite uudelleen ja aseta Target hosts tiedosto</ /data/hosts osioon AdAwayn asetuksissa.
+
Mayroong isang madalas na sinasabing maling kuru-kuro na kung ang isang user ay hindi kailanman nag-click sa mga ad, ang pagharang sa kanila ay hindi makakasama sa isang site o aplikasyon sa pananalapi. Mali ito, kumikita rin ang mga developer sa pamamagitan lamang ng pagpapakita ng mga ad. Nasa sa iyo kung ha-harangan mo ang mga ad o hindi. Sa personal, hindi ako gagamit ng mga aplikasyon na nagpapakita ng mga ad dahil sa tingin ko ay nakakainis ang mga ito, kaya kung walang ad blocker hindi ko mai-install ang mga aplikasyon na ito.
+
+
Paano gumagana ang AdAway?
+
Ginagamit ng AdAway ang hosts file upang harangan ang mga hostname, na naghahatid ng mga advertisement. Ang file ng host ay isang file na matatagpuan sa /system/etc/hosts na nagmamapa ng mga hostname sa mga IP address. Ito ay isang tradisyonal na paraan upang tukuyin ang hostname sa mga pares ng IP address nang hindi umaasa sa Domain Name System (DNS). Ang lahat ng hindi gustong hostname ay na-redirect sa 127.0.0.1 na nangangahulugang ituturo nila ang iyong sariling device.
+Kung ang file ng mga host ay hindi maisusulat, ang isang fallback na solusyon ay ang paggamit ng builtin na serbisyo ng VPN. Sasalain nito ang mga koneksyon sa mga hindi gustong hostname at hahayaan ang iba na dumaan.
+
+
Bakit kailangan kong i-restart ang Android para gumana ang mga pagbabago?
+
Ang Java sa Android ay nagpapanatili ng sarili nitong panloob na DNS cache. Ipapakita kaagad ng operating system ang bagong hosts file (i-verify iyon gamit ang ping sa command line) ngunit kakailanganin mong i-restart ang Android upang muling buuin ang DNS cache ng Java.
+
+
Paano gamitin ang webserver sa AdAway?
+
Gagana rin ang AdAway nang hindi ginagamit ang webserver!
+
Maaari mong paganahin ang isang lokal na webserver sa mga kagustuhan ng AdAway upang sagutin ang mga kahilingan sa lokal na IP address na 127.0.0.1. Nangangahulugan ito na ang mga kahilingan mula sa mga aplikasyon patungo sa mga server ng ad na na-redirect sa 127.0.0.1 ay sinasagot ng webserver ng AdAway.
+Ang ilang mga aplikasyon ay tumangging gumana, kapag ang mga server ng ad ay hindi maabot. Sa pamamaraang ito, muli silang maaabot, tumutugon nang may blangkong pahina at walang mga imahe ng ad.
+
+
Paano ko mai-block/i-unblock ang mga partikular na hostname?
+
Idagdag ang mga hostname na gusto mong i-block sa Naka-block na listahan mula sa homescreen. Bilang karagdagan, ang mga hostname na gusto mong ibukod mula sa pagba-block ay maaaring idagdag sa Allowed at ang mga hostname na gusto mong i-redirect sa isang partikular na IP address ay nabibilang sa Redirected.
+
+
diff --git a/app/src/main/res/raw-fil/help_problems.html b/app/src/main/res/raw-fil/help_problems.html
new file mode 100644
index 0000000..c3d86b0
--- /dev/null
+++ b/app/src/main/res/raw-fil/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Mga karaniwang problema
+
+
Nabigo ang kopya ng hosts file sa Android 9+
+
Ang mga pinakabagong bersyon ng Android ay gumagamit ng read-only /system partition.
+Kung gumagamit ka ng Magisk bilang root solution, tiyaking enable mo ang systemless hosts module pagkatapos ay i-reboot.
+
+
Walang sapat na space sa partition
+
Subukang palitan ang mga target host file sa preferences sa /data/data/hosts (o /data/hosts) at i-apply muli ang AdAway.
+
+
Nagpapakita pa rin ng mga ad ang Chrome
+
Tiyaking hindi mo pinagana ang lite mode (dating kilala bilang data saver) mula sa Chrome settings. Nagbibigay-daan ang mga feature na ito sa Chrome na gumamit ng pribadong solusyon sa DNS at i-bypass ang AdAway.
+
+
Hindi nito naba-block ang mga ad sa application na XYZ!
+
Ang ilang mga hostname ay maaaring nawawala sa ibinigay na mga file ng host mula sa Hosts Sources o ang aplikasyon ay nag-bundle ng mga larawan upang magbigay ng mga ad nang hindi ina-access ang internet.
+Maaari kang mag-log ng mga kahilingan sa DNS (Menu->Log DNS Requests) mula sa AdAway upang malaman kung aling mga karagdagang hostname ang kailangang i-block.
+
Idagdag ang mga kahina-hinalang hostname sa iyong sariling Blacklist sa pamamagitan ng pagpindot nang matagal sa mga entry sa Log at iulat ang mga hostname na ito kapag na-verify mo na ang mga ito sa aming GitHub issue tracker.
+
+
Cached Advertisements
+
Minsan ang mga aplikasyon ay nag-cache ng mga ad pagkatapos ng pag-download. Ito ay humahantong sa mga natitirang advertisement sa ilang mga applikasyon. Maaari mong subukang burahin ang cache para sa mga aplikasyon na ito sa Android's Application list upang iwasan ang problemang ito.
+
+
Hindi na gumagana ang Application XYZ!
+
Ang ilang mga applikasyon ay kailangang makipag-ugnayan sa isang hostname na na-block ng AdAway o tumangging paganahin kapag ang mga hostname na dapat maghatid ng mga ad ay hindi maabot. Tingnan ang https://github.com/AdAway/AdAway/wiki/ProblematicApps upang makakuha ng listahan ng mga kilalang aplikasyon na may mga problema. Kung hindi, alamin kung aling mga hostname ang kailangan at idagdag ang mga ito sa iyong Whitelist sa ilalim ng Your Lists at iulat ang mga ito sa bug tracker ng AdAway.
+
+
Hindi gumagana sa Android 4.4+
+
Subukang baguhin ang target hosts file sa preferences mula sa /data/data/hosts patungo sa /data/hosts o /system/etc/hosts at muling i-apply ang AdAway.
+
+
Ang back button sa mga web browser ay hindi gumagana
+
Maaari mong paganahin ang lokal na webserver ng AdAway sa preferences bilang isang solusyon.
+
+
+
diff --git a/app/src/main/res/raw-fil/help_s_on_s_off.html b/app/src/main/res/raw-fil/help_s_on_s_off.html
new file mode 100644
index 0000000..020da13
--- /dev/null
+++ b/app/src/main/res/raw-fil/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
Mga producto ng HTC
+
Ang AdAway ay hindi gumagana kapag ang ginagamit mo ay may S-ON. Itong feature ay matatapuan sa maraming produkto ng HTC, ito ay nakakapaghintulot ng pagsulat ng hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Une idée fausse courante veut que si un utilisateur ne clique jamais sur les publicités, alors les bloquer n’ait pas de conséquences pécuniaires pour le site ou l’application. Cela est faux. Les développeurs gagnent aussi de l’argent juste en affichant des publicités. C’est à vous de décider de bloquer ou non les publicités. Personnellement, je n’utiliserais pas d’applications qui affichent des publicités, car je les trouve très agaçantes. Donc sans blocage des publicités, je n’installerais pas ces applications.
+
+
Comment AdAway fonctionne-t-il ?
+
AdAway utilise le fichier hosts pour bloquer les noms d’hôtes qui servent des publicités. Le fichier hosts se situe dans /system/etc/hosts et mappe les noms d’hôtes à des adresses IP. C’est une façon habituelle de définir des paires noms de serveurs/adresses IP sans avoir recours au système de noms de domaine (DNS). Tous les noms d’hôtes indésirables sont redirigés vers 127.0.0.1, c’est-à-dire votre propre appareil.
+S’il est impossible d’écrire dans le fichier hosts, vous pouvez utiliser le service de RPV intégré comme solution de rechange. Il filtrera les connexions vers les noms d’hôte indésirables et laissera passer les autres.
+
+
Pourquoi dois-je redémarrer Android pour que les changements prennent effet ?
+
Java sur Android maintient son propre cache DNS interne. Le système d’exploitation appliquera immédiatement le nouveau fichier hosts (vérifiez-le avec ping en ligne de commande), mais vous devrez redémarrer Android pour reconstruire le cache DNS de Java.
+
+
Comment utiliser le serveur Web d’AdAway ?
+
AdAway fonctionnera aussi sans utiliser le serveur Web.
+
Vous pouvez activer un serveur Web local dans les préférences d’AdAway pour répondre aux requêtes à l’adresse IP locale 127.0.0.1. Ainsi, le serveur Web d’AdAway répondra aux requêtes des applications vers les serveurs de publicités redirigées vers 127.0.0.1.
+ Certaines applications refusent de fonctionner si les serveurs de publicités ne sont pas accessibles. Avec cette méthode, ils le seront de nouveau et répondront par une page blanche et sans images publicitaires.
+
+
Comment puis-je bloquer ou débloquer certains noms d’hôtes ?
+
À partir de l’écran d’accueil, ajoutez à la liste Bloqués le nom des hôtes que vous souhaitez bloquer. De plus, le nom des hôtes que vous souhaitez exclure du blocage peut être ajouté à la liste Autorisés, et le nom des hôtes que vous voulez rediriger vers une adresse IP précise peut être ajouté à la liste Redirigés.
+
+
Où puis-je trouver d’autres sources de fichiers hosts ?
Les dernières versions d’Android utilisent une partition /system en lecture seule.
+Si vous utilisez Magisk comme solution de débridage, assurez-vous d’activer le module « Systemless Hosts », puis redémarrez.
+
+
Il manque d’espace sur la partition
+
Essayez de changer le fichier hosts cible dans les préférences pour /data/data/hosts (ou /data/hosts) et appliquez AdAway de nouveau.
+
+
Chrome affiche encore des publicités
+
Assurez-vous de désactiver le mode simplifié (anciennement économiseur de données) dans les paramètres de Chrome. Cette fonction permet à Chrome d’utiliser une solution de DNS privée et de contourner AdAway.
+
+
Les publicités ne sont pas bloquées dans l’application XYZ.
+
Il pourrait manquer des noms d’hôtes dans les fichiers hosts dessources d’hosts ou l’application a intégré les images afin de servir des publicités sans accéder à Internet.
+Vous pouvez utiliser AdAway pour journaliser les requêtes DNS (Menu->Journaliser les requêtes DNS) et découvrir quels noms d’hôtes supplémentaires doivent être bloqués.
+
Ajoutez les noms d’hôte suspects à votre propre liste noire en appuyant longuement sur les entrées du journal et après les avoir vérifiés, signalez ces noms d’hôte dans notre gestionnaire de problèmes sur GitHub (site en anglais).
+
+
Publicités mises en cache
+
Parfois, les applications mettent dans le cache les publicités après téléchargement. C’est pourquoi, il reste des publicités dans certaines applications. Vous pouvez essayer de supprimer le cache de ces applications dans le gestionnaire d’applications d’Android pour contourner ce problème.
+
+
L’application XYZ ne fonctionne plus.
+
Certaines applications doivent communiquer avec un nom d’hôte qui est bloqué par AdAway ou refusent de fonctionner quand les noms d’hôte qui devraient servir des publicités ne sont pas accessibles. Consultez https://github.com/AdAway/AdAway/wiki/ProblematicApps pour obtenir une liste d’applications connues qui posent des problèmes. Autrement, déterminez quels noms d’hôtes sont nécessaires, ajoutez-les à votre liste blanche dans Vos listes et signalez-les au gestionnaire de bogues d’AdAway.
+
+
Ne fonctionne pas sur Android 4.4+
+
Dans les préférences, essayez de changer le fichier hosts cible de /data/data/hosts à /data/hosts ou /system/etc/hosts, et appliquez AdAway de nouveau.
+
+
Le bouton retour des navigateurs Web ne fonctionne pas
+
Vous pouvez activer le serveur Web local d’AdAway dans les préférences comme palliatif.
+
+
+
diff --git a/app/src/main/res/raw-fr/help_s_on_s_off.html b/app/src/main/res/raw-fr/help_s_on_s_off.html
new file mode 100644
index 0000000..7c5a797
--- /dev/null
+++ b/app/src/main/res/raw-fr/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Aide sur S-ON
+
+
Appareils HTC
+
AdAway ne fonctionne pas si vous utilisez un appareil équipé de S-ON. Cette « fonction » existe sur de nombreux appareils HTC et empêche AdAway d’écrire le fichier hosts.
+
+
S-ON/S-OFF ?
+
S-OFF signifie que la partie NAND de l’appareil est déverrouillée et qu’on peut y écrire. Le réglage par défaut des appareils HTC est S-ON, ce qui signifie que vous ne pouvez ni accéder à certaines parties du système ni obtenir un accès racine permanent. De plus, la vérification de la signature des images du micrologiciel est aussi assurée par S-ON.
+
+
Ai-je S-ON ou S-OFF ?
+
Lancez le menu d’amorçage de votre appareil en appuyant sur le bouton volume bas en même temps que sur le bouton de mise en marche. Le texte en haut affichera l’état du drapeau, soit S-ON soit S-OFF. Un débridage complet de l’appareil entraîne généralement S-OFF.
+
Plus de précisions se trouvent sur www.addictivetips.com (site en anglais). D’autres méthodes S-OFF depuis Unrevokable (dans le lien) pourraient vous intéresser : Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Palliatif
+
Prérequis : vous devez installer une trousse SDK Android fonctionnelle avec « ADB shell » sur votre ordinateur.
+
+
Lancez le menu d’amorçage de votre appareil en appuyant sur le bouton volume bas en même temps que sur le bouton de mise en marche.
+
Utilisez volume bas pour sélectionner recovery, puis appuyez sur le bouton de mise en marche pour redémarrer en mode récupération.
+
Dans « clockwork recovery », allez dans « partitions menu ».
+
Sélectionnez mount /system, mount /sdcard et mount /data.
+
Branchez votre câble USB et ouvrez une ligne de commande sur votre ordinateur.
+
Saisissez « adb shell » et tapez ln -s /data/hosts /system/etc/hosts (cela crée un lien symbolique qui permet à AdAway de modifier le fichier hosts enregistré dans /data tout en permettant au SE d’utiliser le fichier comme s’il était enregistré dans /system).
+
Redémarrez votre appareil, puis définissez Fichier hosts cible à data/hosts dans les préférences d’AdAway.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
Como funciona AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Porqué teño que reiniciar Android para que xurda efecto?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-gl/help_s_on_s_off.html b/app/src/main/res/raw-gl/help_s_on_s_off.html
new file mode 100644
index 0000000..8a6ddcd
--- /dev/null
+++ b/app/src/main/res/raw-gl/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
Dispositivos HTC
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-hi/help_s_on_s_off.html b/app/src/main/res/raw-hi/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-hi/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
+
AdAway should work now.
+
+
+
diff --git a/app/src/main/res/raw-hr/help_faq.html b/app/src/main/res/raw-hr/help_faq.html
new file mode 100644
index 0000000..5d2ab6c
--- /dev/null
+++ b/app/src/main/res/raw-hr/help_faq.html
@@ -0,0 +1,32 @@
+
+
+
+Česta pitanja
+
+
Zarada od oglasa
+
Postoji općenito nerazumijevanje da ukoliko korisnik nikada ne klika na oglase, tada se blokiranje istih neće negativno financijski odraziti na stranicu ili aplikaciju. To je pogrešno, razvijatelji isto tako zarađuju novac samim prikazom oglasa. Na vama je hoćete li, ili nećete blokirati oglase. Osobno ne bih koristio aplikacije koje prikazuju oglase jer ih smatram vrlo iritantnima, stoga bez blokatora oglasa ne bih instalirao aplikacije te vrste.
+
+
Kako AdAway radi?
+
AdAway koristi datoteku poslužitelja za blokiranje naziva poslužitelja koji dostavljaju oglase. Datoteka poslužitelja može se pronaći u /system/etc/hosts , a mapira nazive poslužitelja na IP adrese. To je tradicionalan način za određivanja naziva poslužitelja uparivanjem s parovima IP adresa bez oslanjanja na DNS (Domain Name System). Svi neželjeni nazivi poslužitelja se preusmjeravaju na 127.0.0.1, što znači da će biti usmjereni na vaš uređaj.
+Ako datoteka poslužitelja nije zapisiva, pričuvno rješenje je korištenje VPN usluge. Filtrirat će povezivanja s neželjenim nazivima poslužitelja i ostale propustiti.
+
+
Zašto moram ponovno pokrenuti Android kako bi se promjene primijenile?
+
Java na Androidu ima svoju unutrašnju DNS predmemoriju. Operativni sustav će primijeniti novu datoteku poslužitelja odmah (to možete provjeriti pomoću ping naredbe u naredbenom redku), ali je potrebno ponovno pokrenuti Android kako bi se DNS predmemorija Jave ponovno izgradila.
+
+
Kako koristiti web poslužitelj u AdAwayu?
+
AdAway isto može raditi bez web poslužitelja!
+
Možete omogućiti lokalnog web poslužitelja u postavkama AdAwaya kako bi preusmjerio zahtjeve na lokalnu IP adresu 127.0.0.1. o znači da zahtjevi aplikacije prema poslužiteljima za oglase su preusmjereni na 127.0.0.1 odgovaraju AdAway web poslužitelju.
+ Neke aplikacije odbijaju raditi kada poslužitelji oglašavanja nisu dostupni. Ovim načinom postati će opet dostupni, prikazom prazne stranice bez slika oglasa.
+
+
Kako mogu blokirati/odblokirati određene nazive poslužitelja?
+
Dodajte nazive poslužitelja koje želite blokirati u popisu Blokirani iz vašeg Početnog zaslona. Dodatno, nazive poslužitelja koje želite isključiti iz blokiranja možete dodati u popis Dopušteni a nazive poslužitelja koje želite preusmjeriti na određenu IP adresu pripadaju u popis Preusmjereni.
+
+
diff --git a/app/src/main/res/raw-hr/help_problems.html b/app/src/main/res/raw-hr/help_problems.html
new file mode 100644
index 0000000..bde0c98
--- /dev/null
+++ b/app/src/main/res/raw-hr/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Učestali problemi
+
+
Neuspjelo kopiranje datoteke poslužitelja na Androidu 9+
+
Posljednja inačica Androida koristi /system particiju samo s dozvolama čitanja.
+Ako koristite Magisk kao root rješenje, omogućite systemless modul poslužitelja i ponovno pokrenite uređaj.
+
+
Nedovoljno prostora na particiji
+
Pokušajte promijeniti odredište datoteke poslužitelja u postavkama u /data/data/hosts (ili /data/hosts) pa ponovno preuzmite i primijenite datoteku poslužitelja.
+
+
Chrome još uvijek prikazuje oglase
+
Provjerite jeste li onemogućili Lagan način (prije poznat kao podatkovni poslužitelj) iz Chrome postavki. Ova značajka omogućuje Chromu korištenje privatnih DNS rješenja i zaobilaženje AdAwaya.
+
+
Ne blokira oglase u aplikaciji XYZ!
+
Određeni nazivi poslužitelja mogu nedostajati u datoteci poslužitelja u postavkama Izvori poslužitelja ili aplikacija ima ugrađene slike kako bi pružile oglase bez pristupa internetu.
+Možete zapisivati DNS zahtjeve u (Izbornik -> Zapisuj DNS zahtjeve) iz AdAwaya kako bi saznali koji se dodatni poslužitelj treba blokirati.
+
Dodajte sumnjive nazive poslužitelja na vaš vlastiti Popis blokiranih dugim pritiskom unosa u Zapisu i prijavite te nazive poslužitelja nakon što ste ih provjerili na naš GitHub pratitelj grešaka.
+
+
Oglasi spremljeni u predmemoriju
+
Ponekad aplikacije spremaju oglase u predmemoriju nakon što ih preuzmu. To dovodi do ostajanja oglasa u nekim aplikacijama. Možete pokušati obrisati predmemoriju tih aplikacija u popisu aplikacija unutar Android sustava kako biste zaobišli taj problem.
+
+
Aplikacija XYZ više ne radi!
+
Određenim aplikacijama je potrebna komunikacija s nazivima poslužitelja koje je blokirao AdAway ili odbijaju raditi kada nazivi poslužitelja koji poslužuju reklame nisu dostupni. Pogledajte https://github.com/AdAway/AdAway/wiki/ProblematicApps kako bi dobili popis poznatih problematičnih aplikacija. U suprotnome, potražite koji nazivi poslužitelja su potrebni i dodajte ih u vaš Popis neblokiranih u izborniku Vaši popisi i prijavite ih na AdAway pratitelj grešaka.
+
+
Ne radi na Androidu 4.4+
+
Pokušajte promijeniti odredište datoteke poslužitelja u postavkama iz /data/data/hosts u /data/hosts ili /system/etc/hosts i primijenite AdAway ponovno.
+
+
Tipka za povratak u web pregledniku ne radi
+
Možete omogućiti AdAway lokalni web poslužitelj u postavkama kao zaobilazno rješenje.
+
+
+
diff --git a/app/src/main/res/raw-hr/help_s_on_s_off.html b/app/src/main/res/raw-hr/help_s_on_s_off.html
new file mode 100644
index 0000000..ae7f251
--- /dev/null
+++ b/app/src/main/res/raw-hr/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON pomoć
+
+
HTC uređaji
+
AdAway ne radi kada koristite takozvane S-ON uređaje. Ta "značajka" je prisutna na mnogim HTC uređajima i sprječava AdAway u pisanju datoteke poslužitelja.
+
+
S-ON/S-OFF?
+
S-OFF označava da je NAND dio uređaja otključan i može se zapisivati na njega. Zadana postavka za HTC uređaje je S-ON, što znači da ne možete pristupiti određenim dijelovima sustava, niti vam može jamčiti trajni root pristup. Štoviše, provjera potpisa za slike firmvera isto je osigurana S-ON oznakom.
+
+
Imam li S-ON ili S-OFF?
+
Pokrenite u Boot Menu vaš uređaj držeći tipku smanjivanja glasnoće zvuka i istovremeno držeći tipku isključivanja a tekst na vrhu zaslona će prikazati oznaku stanja kao S-OFF ili kao S-ON. Potpuni root uobičajeno znači S-OFF.
+
Više informacija možete pronaći na www.addictivetips.com. Dodatni S-OFF načini od Unrevokable (na poveznici) vas mogu zanimati, imenima: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Zaobilaženje
+
Preduvjet: instalirani i funkcionalni Android SDK s ADB ljuskom na vašem PC-u.
+
+
Pokrenite u Boot Menu vaš uređaj držeći tipku smanjivanja glasnoće zvuka i istovremeno držeći tipku isključivanja.
+
Koristite tipku smanjivanja glasnoće zvuka za odabir izbornika oporavka zatim tipku isključivanja pokretanje u način oporavka.
+
U Clockwork recoveriju idite na stavku "Partitions menu".
+
Odaberite mount /system, mount /sdcard i mount /data.
+
Priključite USB kabel i otvorite naredbeni redak na svome PC-u.
+
Pokrenite adb ljusku i upišite ln -s /data/hosts /system/etc/hosts (Ovo će stvoriti simboličku poveznicu, koja dopušta AdAwayu uređivanje datoteke poslužitelja pohranjene u /data dopuštajući operativnom sustavu da koristi tu datoteku kao da je pohranjena u /system.)
+
Ponovno pokrenite svoj uređaj i postavite Odredišnu datoteku poslužitelja u /data/hosts u postavkama AdAwaya.
Van egy gyakran elhangzó félreértés mely szerint, ha amúgy se kattintanánk a reklámokra, akkor azzal se ártunk egy oldalnak vagy alkalmazásnak, ha meg se jelenítjük a reklámot. Ez nem igaz, mert a fejlesztők már azért is kaphatnak pénzt, hogy megjelenítik a hirdetést. Az csak a felhasználón múlik, hogy használ-e reklám blokkolót vagy nem.
+
+
Hogy működik az AdAway?
+
Az AdAway hosts file segítségével blokkolja a reklámokat kiszolgáló hostneveket.. A hosts fájl a /system/etc/hosts könyvtárban található fájl, amely a gazdagépneveket IP-címekre térképezi fel. Hagyományos módszer a gazdanév IP-címpárokhoz történő definiálására anélkül, hogy a Domain Name Systemre (DNS) támaszkodna. Az összes nem kívánt gazdagépnév átirányításra kerül a 127.0.0.1 címre, ami azt jelenti, hogy a saját eszközre mutatnak.
+Ha a gazdagépfájl nem írható, akkor egy tartalék megoldás a beépített VPN szolgáltatás használata. Szűri a kapcsolatokat a nem kívánt gazdagépnevekkel, és másokat is átenged.
+
+
Miért kell újraindítani az Androidot, hogy a változások életbe lépjenek?
+
Java az Android rendszeren saját belső DNS tárat tart fenn. Az operációs rendszer azonnal használja az új hosts fájlt (ezt ellenőrizni is lehet pingeléssel), de a DNS cache tárának újraépítéséhez újra kell indítani az Androidot.
+
+
Hogy kell használni a web kiszolgálót az AdAway-ben?
+
Az AdAway a web kiszolgáló használata nélkül is működni fog.
+
Engedélyezni lehet az AdAway beállításainál egy helyi web kiszolgálót , hogy válaszoljon a 127.0.0.1 helyi IP címre érkező kérésekre. Ez olyan kéréseket jelent, amelyeket alkalmazások kezdeményeztek a hirdetés kiszolgálójukhoz, de a 127.0.0.1 címre lettek átirányítva, így az AdAway válaszol ezekre a kérésekre.
+ Néhány alkalmazás nem hajlandó működni, ha a reklám kiszolgálóik nem érhető el. Ezzel a módszerrel újra elérhetőnek hiszi azt, és egy üres oldalt kapnak vissza.
+
+
Hogyan tudok adott kiszolgálókat (hosts) blokkolni/engedélyezni?
+
Add hozzá a blokkolni kívánt hosztneveket a Blokolt listához akezdőlapról. Ezenkívül a blokkolásból kizárni kívánt gazdagépnevek hozzáadhatók a Megengedve és az adott IP-címre átirányítani kívánt hosztnevek a Átirányítvahelyhez.
+
+
diff --git a/app/src/main/res/raw-hu/help_problems.html b/app/src/main/res/raw-hu/help_problems.html
new file mode 100644
index 0000000..e334bbf
--- /dev/null
+++ b/app/src/main/res/raw-hu/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Gyakori problémák
+
+
A hosts fájl másolása nem sikerült Android 9 vagy újabb rendszeren
+
Az újabb Android verziókban a /system partíció csak-olvasható.
+Ha Magisk-ot használ roothoz, nézzen utána, hogy bekapcsolta-e a systemless hosts modult, majd indítsa újra a készüléket.
+
+
Nincs elég hely a partíción
+
Próbálja meg átállítani a cél hosts fájl elérési helyét a beállításokban /data/data/hosts-ra (vagy /data/hosts-ra) és alkalmazza az AdAway-t újra.
+
+
Chrome továbbra is megjeleníti a hirdetéseket
+
Győződjön meg arról, hogy letiltotta az egyszerűsített módot (korábban adatforgalom csökkentés). Ez a funkció lehetővé teszi a Chrome számára a Chrome számára, hogy privát DNS megoldást használjon, és megkerülje az AdAway-t.
+
+
Nem blokkolja a hirdetéseket XYZ alkalmazásban!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Gyorstárazott reklámok
+
Néhány alkalmazás gyorstárazza a reklámokat letöltés után. Így reklámok maradhatnak egyes alkalmazásokban. Megpróbálhatja kitörölni ezen alkalmazások gyorstárát az Android Alkalmazások listájában, hogy ezek a reklámok is eltűnjenek.
+
+
Az XYZ alkalmazás már nem működik!
+
Egyes alkalmazásoknak kommunikálniuk kell az AdAway által blokkolt hosztnévvel, vagy különben megtagadja a munkát, amikor a hosztnév, mely szolgáltatja a reklámokat, nem elérhető. Lásd 1https://github.com/AdAway/AdAway/wiki/ProblematicApps1, hogy tudomást szerezzen az összes problémás alkalmazásról. Ellenkező esetben ki kell tapasztalnia, hogy mely hosztneveket kell hozzáadni a Fehérlistáhoza Saját Listamenüpont alatt, majd jelentheti azAdAway bug tracker-jében.
+
+
Nem működik Android 4.4 vagy újabb verziókon
+
Próbálja meg átállítani a cél hosts fájl elérési helyét a beállításokban /data/data/hosts-ról /data/hosts-ra vagy /system/etc/hosts-ra és alkalmazza az AdAway-t újra.
+
+
A vissza gombok nem működnek a böngészőkben
+
Engedélyezheti az AdAway helyi webszerverét a beállításokban, a probléma megkerüléséhez.
AdAway nem működik S-ON-t használó eszközön. Ez a 'képesség' számos HTC eszközön létezik, és megakadályozza az AdAway alkalmazást a hosts fájl írásában.
+
+
S-ON/S-OFF?
+
Az S-OFF azt jelenti, hogy az eszköz NAND rész nem zárolt, és írható. A HTC eszközök alapértéke S-ON, ami azt jelenti, hogy a rendszer bizonyos részeit nem érheti el és nem lehet állandó root jogot adni. Továbbá a firmware aláírásának ellenőrzése is be van kapcsolva az S-ON jelző miatt.
+
+
Nálam S-ON vagy S-OFF van?
+
Indítsd a készüléket Boot Menu-be a hangerő le gomb nyomva tartásával, miközben lenyomod a bekapcsoló gombot, és a felül lévő szöveg S-OFF vagy S-ON állapotot mutat. A teljes root általában S-OFF állapotot jelent.
+
Bővebb információ a következő oldalon található: www.addictivetips.com. További S-OFF módszerek, mivel az Unrevokable (linkben) érdekelhet, nevezetesen: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Kerülő megoldás
+
Előfeltétel: Telepítened kell egy működő Android SDK-t ADB shell-el a számítógépedre.
+
+
Indítsd a készüléket Boot Menü-be a hangerő le gomb nyomva tartásával, miközben lenyomod a bekapcsoló gombot.
+
A hangerő le gombbal válaszd a recovery-t majd a bekapcsoló gomb az indításhoz.
+
A clockwork recovery-ben lépj a "partíciók menübe".
+
Válaszd ki ezeket: mount /system, mount /sdcard és mount /data.
+
Csatlakoztasd az USB kábelt, és nyiss egy parancssort a számítógépen.
+
adb shell és Enter majd írd be ln -s /data/hosts /system/etc/hosts (Ez létrehoz egy szimbolikus linket, ami lehetővé teszi az AdAway számára a /data helyen tárolt hosts fájlt szerkesztését, miközben azt az OS úgy használhatja, mintha a /systempartíció tárolná.)
+
Indítsd újra az eszközt és állítsd be a Cél hosts fájlt a /data/hosts helyre az AdAway beállításainál.
Terdapat kesalahpahaman yang sering menyatakan bahwa jika pengguna tidak mengklik iklan, kemudian memblokirnya tidak akan merugikan keuangan situs atau aplikasi. Ini salah, pengembang juga memperoleh uang dengan hanya menampilkan iklan. Itu terserah kepada Anda apakah Anda memblokir iklan atau tidak. Secara pribadi saya tidak akan menggunakan aplikasi yang menampilkan iklan karena saya merasakan mereka sangatlah mengganggu, sehingga tanpa pemblokir iklan saya tidak akan memasang aplikasi tersebut.
+
+
Bagaimana cara kerja AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Mengapa saya harus memulai ulang Android untuk mendapatkan perubahan?
+
Java pada Android mengelola DNS cache internalnya sendiri. Sistem operasi akan merefleksikan berkas host yang baru segera (memverifikasi dengan ping pada command line), tetapi Anda harus memulai kembali Android untuk membangun kembali cache DNS dari Java.
+
+
Bagaimana menggunakan web server di AdAway?
+
AdAway juga akan bekerja tanpa menggunakan webserver!
+
Anda dapat mengaktifkan sebuah webserver lokal di preferensi dalam AdAway untuk menjawab permintaan dari alamat IP lokal 127.0.0.1. Ini adalah permintaan dari aplikasi ke server iklan yang akan diteruskan ke 127.0.0.1 yang dijawab oleh webserver AdAway.
+ Beberapa aplikasi menolak untuk bekerja, ketika server iklan tidak dapat dijangkau. Dengan metode ini mereka dapat dijangkau kembali, menjawab dengan sebuah laman kosong dan tidak ada gambar iklan.
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
+
+
Di mana saya dapat menemukan lebih banyak sumber host?
+
+
diff --git a/app/src/main/res/raw-in/help_problems.html b/app/src/main/res/raw-in/help_problems.html
new file mode 100644
index 0000000..14392ce
--- /dev/null
+++ b/app/src/main/res/raw-in/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Masalah yang umum
+
+
Penyalinan berkas hosts gagal pada Android 9+
+
Versi mutahir dari Android menggunakan hanya-baca /system partisi.
+Jika Anda menggunakan Magisk sebagai solusi root, pastikan Anda mengaktifkan systemless modul hosts kemudian mulai ulang.
+
+
Tidak cukup ruang pada partisi
+
Cobalah mengganti target berkas hosts di preferensi ke /data/data/hosts (or /data/hosts) dan terapkan AdAway lagi.
+
+
Tidak dapat bekerja di Android 4.4+
+
Cobalah mengganti target berkas hosts di preferensi dari /data/data/hosts ke /data/hosts atau /system/etc/hosts dan terapkan AdAway lagi.
+
+
iklan tidak dapat di blok pada aplikasi XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Iklan tembolok
+
Kadangkala aplikasimelakukan cache iklan setelah diunduh. Ini menyebabkan iklan yang tersisa pada beberapa aplikasi. Kamu bisa mencoba menghapus cache untuk aplikasi ini dalam daftar Aplikasi Android untuk menghindari masalah ini.
+
+
Aplikasi XYZ tidak lagi berfungsi!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Tombol kembali pada web browser tidak berfungsi
+
Anda dapat mengaktifkan webserver lokal AdAway di preferensi sebagai solusi.
+
+
Tombol kembali pada web browser tidak berfungsi
+
Anda dapat mengaktifkan webserver lokal AdAway di preferensi sebagai solusi.
+
+
+
diff --git a/app/src/main/res/raw-in/help_s_on_s_off.html b/app/src/main/res/raw-in/help_s_on_s_off.html
new file mode 100644
index 0000000..40da9d0
--- /dev/null
+++ b/app/src/main/res/raw-in/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
Perangkat HTC
+
AdAway tidak bekerja ketika Anda menggunakan perangkat dengan apa yang disebut S-ON. 'Fitur' ini ada pada banyak perangkat HTC dan mencegah AdAway menulis file host.
+
+
S-ON/S-OFF?
+
S-OFF berarti bahwa bagian NAND pada perangkat tidak terkunci dan dapat ditulis. Pengaturan standar untuk perangkat HTC adalah S-ON, yang berarti bahwa tidak dapat mengakses area tertentu dari sistem juga tidak bisa menjamin root permanen. Selanjutnya, memeriksa tanda tangan untuk gambar firmware juga dijamin oleh S-ON flag.
+
+
Apakah saya harus S-ON atau S-OFF?
+
Boot ke Menu Boot pada perangkat Anda dengan menekan tombol volume bawah sambil menekan tombol power dan keterangan di atas layar akan menampilkan status mungkin S-OFF atau S-ON. Sebuah root penuh umumnya bertanda S-OFF.
+
Informasi lebih lanjut dapat ditemukan di www.addictivetips.com. Metode S-OFF tambahan pada Unrevokable (di link) mungkin menarik bagi Anda, yaitu : Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Solusi
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Gunakan volume bawah untuk memilih recovery kemudian power untuk menghidupkan itu.
+
Di clockwork recovery pergi ke "menu partisi".
+
Pilih mount /system, mount /sdcard dan mount /data.
+
Masukkan kabel USBmu dan buka sebuah command line pada pcmu.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Mulai ulang perangkat dan tetapkan Target berkas hosts ke /data/hosts di preferensi AdAway.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-is/help_s_on_s_off.html b/app/src/main/res/raw-is/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-is/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Esiste un malinteso diffuso sul fatto che se un utente non clicca mai sulle pubblicità, allora bloccarle non danneggia finanziariamente il sito o l'applicazione. Questo è errato: gli sviluppatori guadagnano denaro anche semplicemente mostrando le pubblicità. Spetta a te decidere se bloccare gli annunci o meno. Personalmente non utilizzerei applicazioni che mostrano annunci perché li trovo molto fastidiosi, quindi senza un programma per bloccare le pubblicità non installerei queste applicazioni.
+
+
Come funziona AdAway?
+
AdAway usa il file hosts per bloccare hostnames che forniscono annunci. Il file hosts si trova in /system/etc/hosts e mappa gli hostnames in indirizzi IP. E' un modo per associare un indirizzo IP al suo hostname senza utilizzare il Domain Name System (DNS). Tutti gli hostnames non desiderati sono reindirizzati a 127.0.0.1, il che significa che punteranno al tuo dispositivo.
+Se il file hosts non è scrivibile, una soluzione alternativa è utilizzare il servizio VPN. Potrà filtrare le connessioni non desiderate, facendo passare le altre.
+
+
Perché devo riavviare Android per rendere effettivi i cambiamenti?
+
Java su Android ha la sua propria cache DNS interna. Il sistema operativo rispecchierà il nuovo file hosts immediatamente (verificalo con un ping tramite linea di comando) ma dovrai riavviare Android per ricostruire la cache DNS di Java.
+
+
Come usare il web server in AdAway?
+
AdAway funziona anche senza usare il web server!
+
Puoi abilitare nelle preferenze di AdAway un web server locale per rispondere alle richieste tramite l'IP locale 127.0.0.1. Questo significa che le richieste dalle applicazioni ai server pubblicitari che vengono inoltrate verso 127.0.0.1 ricevono risposta dal web server di Adaway.
+ Alcune applicazioni infatti si rifiutano di funzionare quando i server pubblicitari non sono raggiungibili. Con questo metodo ritornano di nuovo raggiungibili, fornendo come risposta una pagina bianca e nessuna immagine pubblicitaria.
+
+
Come posso bloccare/sbloccare specifici hostname?
+
Aggiungi gli hostname che vuoi bloccare alla lista Bloccati dalla schermata home. Inoltre, puoi aggiungere gli hostname che vuoi escludere dal blocco alla lista Autorizzati e gli hostname che vuoi reindirizzare ad un indirizzo IP personalizzato alla lista Reindirizzati.
+
+
diff --git a/app/src/main/res/raw-it/help_problems.html b/app/src/main/res/raw-it/help_problems.html
new file mode 100644
index 0000000..8c0db86
--- /dev/null
+++ b/app/src/main/res/raw-it/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Problemi comuni
+
+
Copia del file hosts fallita su Android 9+
+
Le ultime versioni di Android hanno la partizione /system di sola lettura.
+Se stai usando Magisk come root manager assicurati di aver attivato il modulo 'Systemless Hosts' e fai un reboot.
+
+
Spazio insufficiente nella partizione
+
Prova a cambiare il percorso del file hosts nelle preferenze in /data/data/hosts (o /data/hosts) e applica di nuovo AdAway.
+
+
Chrome continua a mostrare le pubblicità
+
Assicurati di disabilitare la modalità lite (precedentemente nota come risparmio dati) dalle impostazioni di Chrome. Questa opzione permette a Chrome di usare i DNS privati ed eludere AdAway.
+
+
Non blocca le pubblicità nell'app XYZ!
+
Alcuni hostname potrebbero mancare nei file hosts forniti da Sorgenti host oppure l'applicazione dispone delle immagini per fornire annunci senza dover accedere a Internet.
+Puoi registrare le richieste DNS (Menù->Log richieste DNS) da AdAway per scoprire quali hostname aggiuntivi devono essere bloccati.
+
Aggiungi gli hostnames sospetti alla tua Blacklist premendo a lungo le voci nel Log e segnala questi hostnames quando li hai verificati nel Forum Hosts Inbox di hosts-file.net.
+
+
Pubblicità conservata nella cache
+
Alcune applicazioni conservano le pubblicità nella cache dopo il download. Questo fa sì che la pubblicità rimanga in alcune app. Provare ad eliminare la cache di queste applicazioni dalla Lista delle Applicazioni in impostazioni Android per risolvere questo problema.
+
+
L'app XYZ non funziona più!
+
Alcune applicazioni devono comunicare con un hostname bloccato da AdAway o rifiutarsi di funzionare quando i nomi degli host, che dovrebbero pubblicare annunci, non sono raggiungibili. Consulta https://github.com/AdAway/AdAway/wiki/ProblematicAppsper ottenere un elenco di applicazioni note che hanno problemi. Altrimenti, scopri quali hostnames sono necessari e aggiungili alla tua Whitelist sotto Le tue listee segnalali al bug tracker di AdAway.
+
+
Non funziona in Android 4.4+
+
Prova a cambiare il percorso del file hosts nelle preferenze da /data/data/hosts a /data/hosts o /system/etc/hosts e applica di nuovo AdAway.
+
+
Il pulsante indietro nei browser non funziona
+
Abilitare il web server locale di AdAway nelle preferenze per aggirare il problema.
AdAway non funziona se usi un dispositivo con il cosiddetto S-ON. Questa "caratteristica" è presente in molti dispositivi HTC e impedisce a AdAway di scrivere il file hosts.
+
+
S-ON/S-OFF?
+
S-OFF significa che la porzione NAND del dispositivo è sbloccata e può essere scritta. L'impostazione predefinita nel dispositivi HTC è S-ON, il che significa che non si può né accedere a determinate aree del sistema, né puoi garantirti il root permanente. Inoltre, anche il controllo della firma per i firmware è assicurato dal flag S-ON.
+
+
Ho S-ON o S-OFF?
+
Accedi al menu di avvio del tuo dispositivo tenendo premuto il pulsante volume giù mentre premi il pulsante di accensione e sul display in alto apparirà l'indicazione dello status come S-OFF o S-ON. Un root completo generalmente comporta S-OFF.
+
Puoi trovare altre informazioni su www.addictivetips.com. Ti potrebbero interessare altri metodi per lo S-OFF oltre Unrevokable (nel link): Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Soluzione
+
Prerequisito: installare una versione funzionante dell'SDK Android con shell ADB sul PC.
+
+
Accedi al menù di avvio del tuo dispositivo tenendo premuto il pulsante volume giù mentre premi il pulsante di accensione.
+
Utilizza volume - per selezionare recovery quindi power per avviarlo.
+
Nella ClockWork Recovery andare al menu "partitions".
+
Seleziona mount /system, mount /sdcard e mount /data.
+
Collega il cavo USB e apri una riga di comando sul PC.
+
Entra nella shell adb e digita ln -s /data/hosts /system/etc/hosts (In questo modo si crea un link simbolico che consente ad AdAway di modificare il file hosts situato in /data, consentendo allo stesso tempo al sistema operativo di usare il medesimo file come se fosse situato in /system).
+
Riavvia il tuo dispositivo e imposta il Percorso file hosts in /data/hosts nelle preferenze di AdAway.
יש תפיסה לא נכונה שאפליקציות / מפתחים / אתרים לא ירוויחו כסף אם אתם תשתמש בחוסם פרסומות בגלל שלא תלחץ עליהם וזה לא נכון הם מרוויחים כסף גם על הצגת פרסומות לא רק על לחיצות
+
+
איך AdAway עובד ?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
למה אני צריך לעשות ריסט למכשיר בשביל ש AdAway תפעל
+
ג'אווה של אנדרואיד שומר DNS על הקאש המערכת תכתוב מחדש את קובץ הרשימות אחרי שתעשה ריסט למכשיר
+
+
איך להשתמש בשרת אינטרנט ב AdAway ?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
איך אני יכול לחסום / להוריד חסימה למסור ספציפי ?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
אין מספיק זיכרון פנוי במחיצה
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
לא עובד עם אנדרואיד 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
זה לא חוסם פרסומות באפליקציות XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
פרסומות בקאש
+
לפעמים הפרסומות נחסמו אבל הפרסומות שכבר הורדו לא יחסמו אתה יכול למחוק את זיכרון הישום במנהל הישומים של המכשיר
+
+
אפליקציות XYZ לא עובדות יותר!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
הכפתור חזרה אינו עובד בדפדפן
+
אתה יכול להפעיל את השרת המקומי של AdAway באפשרויות בתור פתרון זמני.
+
+
הכפתור חזרה אינו עובד בדפדפן
+
אתה יכול להפעיל את השרת המקומי של AdAway באפשרויות בתור פתרון זמני.
+
+
+
diff --git a/app/src/main/res/raw-iw/help_s_on_s_off.html b/app/src/main/res/raw-iw/help_s_on_s_off.html
new file mode 100644
index 0000000..eb5086f
--- /dev/null
+++ b/app/src/main/res/raw-iw/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
מכשירי HTC
+
AdAway לא עובד טוב עם המכשיר שלך בגלל משהו שנקרא S-ON / S-OFF זה משהו שנמצא בהרבה מכשירים של HTC ה S-ON מונע מAdAway לרשום קובץ HOST ובגלל זה יכול להיות ש AdAway לא יעבוד טוב על מכשירך / לא יעבוד בכלל
+
+
S-ON/S-OFF?
+
AdAway לא עובד טוב עם המכשיר שלך בגלל משהו שנקרא S-ON / S-OFF זה משהו שנמצא בהרבה מכשירים של HTC ה S-ON מונע מAdAway לרשום קובץ HOST ובגלל זה יכול להיות ש AdAway לא יעבוד טוב על מכשירך / לא יעבוד בכלל
+
+
יש לך תכונת S-ON או S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
לעקיפת הבעיה
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-km/help_s_on_s_off.html b/app/src/main/res/raw-km/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-km/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
자주 언급되는 오해 중 하나는 사용자가 광고를 절대로 클릭하지 않거나 차단할 경우, 사이트나 앱에 금전적인 피해가 있을 것이라는 것입니다. 이건 거짓이며, 개발자들은 광고를 단순히 표시함으로 돈을 법니다. 광고 차단 여부는 여러분의 선택입니다. 개인적으로 저는 광고를 표시하는 앱이 매우 성가셔서 사용하지 않습니다. 그래서 광고 차단기 없이는 이런 광고가 표시되는 앱들을 설치하지 않을 것입니다.
+
+
AdAway는 어떻게 작동합니까?
+
AdAway는 호스트 파일을 이용하여 광고를 제공하는 호스트이름을 차단합니다. 호스트 파일은 호스트명을 IP 주소에 매핑하는 /system/etc/hosts에 있습니다. 도메인 네임 시스템(DNS)에 의존하지 않고 호스트 이름을 IP 주소로 정의하는 전통적인 방법입니다. 모든 원치 않는 호스트이름은 127.0.0.1로 리다이렉트 되며, 이는 해당 호스트 이름이 사용자 장치로 가리킨다는 것을 의미입니다.
+호스트 파일이 쓰기가 안되는 경우, 예비 솔루션은 내장된 VPN 서비스를 사용하는 것입니다. 원하지 않는 호스트 이름에 대한 연결을 필터링하고 다른 호스트가 통과할 수 있도록 합니다.
+
+
변경 사항을 적용하려면 왜 안드로이드를 재부팅해야 합니까?
+
안드로이드의 자바는 자체 내부 DNS 캐시를 유지합니다. 운영체제는 새로운 호스트 파일을 즉시 반영(명령어 줄에서 핑을 통해 검증)하지만 자바의 DNS 캐시를 재구성하려면 안드로이드를 재시작하셔야 합니다.
+
+
AdAway에서 웹서버를 어떻게 사용합니까?
+
AdAway는 웹서버를 사용하지 않고도 작동합니다!
+
AdAway의 환경 설정에서 로컬 웹서버를 활성화하여 로컬 IP 주소 127.0.0.1 요청에 응답할 수 있습니다. 즉, 앱에서 광고서버로 127.0.0.1로 리다이렉트된 요청은 AdAway의 웹서버로 대신 응답을 해줍니다.
+ 일부 앱에서는 광고 서버에 연결할 수 없을 때 작동을 거부할 수 있습니다. 이 방법을 사용하면 광고 서버에 다시 연결 할 수 있으며, 광고 이미지가 없는 빈 페이지로 회신합니다.
+
+
특정 호스트명을 어떻게 차단/차단해제합니까?
+
홈화면에 있는 차단 됨 목록에서 차단하고 싶은 호스트 이름을 추가합니다. 추가적으로 차단에서 제외할 호스트 이름을 허용 됨에 추가할 수 있으며 특정 IP 주소로 리다이렉트할 호스트 이름을 리다이렉트 됨에 추가할 수 있습니다.
환경설정에서 대상 호스트 파일을 /data/data/hosts 에서 /data/hosts 혹은 /system/etc/hosts 으로 변경한 후 AdAway를 다시 적용하십시오.
+
+
웹 브라우저에서 뒤로 가기 버튼이 작동하지 않음
+
해결 방법으로 환경 설정에서 AdAway의 로컬 서버를 활성화 할 수 있습니다.
+
+
+
diff --git a/app/src/main/res/raw-ko/help_s_on_s_off.html b/app/src/main/res/raw-ko/help_s_on_s_off.html
new file mode 100644
index 0000000..330c4f1
--- /dev/null
+++ b/app/src/main/res/raw-ko/help_s_on_s_off.html
@@ -0,0 +1,33 @@
+
+
+
+S-ON 관련 도움말
+
+
HTC 장치
+
AdAway는 S-ON이라 불리는 기능을 탑재한 기기를 사용 시 작동하지 않습니다. 이 '기능'은 다수의 HTC 기기에 존재하며 AdAway가 호스트 파일 쓰기를 차단합니다.
+
+
S-ON/S-OFF?
+
S-OFF는 NAND 영역이 잠금 해제되었고 쓰기가 가능함을 의미합니다. 기본 설정은 S-ON이며, 이는 시스템의 특정 영역에 대한 접근이 불가하고 영구적인 루팅을 보장할 수 없다는 의미입니다. 게다가 펌웨어 이미지의 서명 확인 또한 S-ON 플래그에 의해 검증됩니다.
+
+
S-ON 또는 S-OFF 중 어떻게 설정되어 있습니까?
+
부팅메뉴 화면으로 전환될 때까지 전원 버튼 누름과 동시에 볼륨 아래 버튼을 누릅니다. 상단에 있는 텍스트가 S-OFF 또는 S-ON로 상태를 표시가 되는데, 완전 권한을 얻은 루팅은 보통 S-OFF를 의미합니다.
+
자세한 내용은 www.addictivetips.com에서 확인할 수 있습니다. 복구가 불가능하기 때문에(링크 참조) 이외의 S-OFF 방법에 관심 있을 수 있습니다. 예를 들어: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
해결 방법
+
필수 구성 요소: ADB shell로 작동하는 안드로이드 SDK를 PC에 설치되어 있어야 합니다.
+
+
부팅메뉴 화면으로 전환될 때까지 전원 버튼 누름과 동시에 볼륨 아래 버튼을 누릅니다.
+
+볼륨 아래를 사용하여 recovery를 선택합니다. 그러고 난 뒤에 power 선택 후 부팅합니다.
+
clockwork 리커버리에서 "partitions menu"로 이동하십시오.
+
+mount /system, mount /sdcard 그리고 mount /data 선택하십시오.
+
USB 단자를 연결하고 연결된 PC에서 명령프롬프트를 실행하십시오.
+
adb shell 진입한 뒤 ln -s /data/hosts /system/etc/hosts를 입력하십시오. (AdAway가 /data에 저장된 호스트 파일을 편집과 동시에 운영체제가 /system에 저장된 것처럼 파일을 사용할 수 있는 심볼릭링크를 생성합니다.)
+
기기를 재부팅하고 AdAway의 환경설정에서 대상 호스트 파일을 /data/hosts로 설정하십시오.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ku/help_s_on_s_off.html b/app/src/main/res/raw-ku/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-ku/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Egzistuoja vienas nesusipratimas, jog jeigu vartotojas niekada nespaudžia ant reklamu, tada jas užblokavus niekuom nepakenks svetainės ar programos kūrejui finansiškai. Tai yra netiesa, kūrėjai taip pat uždirba vien už reklamos peržiūras. Aš asmeniškai niekada nenaudočiau programų kurios rodo reklamas, man tai labai įkyru, tad be reklamos blokuotojo aš nenaudočiau tų programų.
+
+
Kaip veikia AdAway?
+
AdAway naudoja Domeno hosts failą kad galėtų blokuoti reklamų domenus. Hosts failas yra /system/etc/hosts kuris nukreipia domenus į jų IP adresus. Tai yra tradiciškas būdas juos nukreipti nenaudojant DNS sistemos. Visi nenorimi domenai yra nukreipiami 127.0.0.1 tai reiškia kad jie eis per jūsų įrenginį.
+Jei domeno failas nėra redaguojamas, kitas sprendimas yra naudoti įdiegtą VPN funkciją. Ji filtruos nenorimus sujungimus su domenais o kitus praleis.
+
+
Kodėl aš turiu perkrauti Android įrenginį kad įsigaliotų pakeitimai?
+
Java, Android platformoje palaiko savo vidinį DNS slėptuvėje cahce. Operatyvioji sistema pritaiko nauja domeno hosts failą iš karto (patvirtina tai su ping atsako komanda) bet jums reikės perkrauti Android įrenginį kad būtų rekonstruojama Java DNS saugykla.
+
+
Kaip naudoti web serverį su AdAway?
+
AdAway veiks ir nenaudojant web serverio!
+
Jūs galite įjungti lokalų web serverį AdAway nustatymuose kuris atsakys į lokalių IP adresą127.0.0.1. Tai reiškia kad užklausos iš aplikacijų į reklamų serverius kurios bus nukreiptos į 127.0.0.1 bus filtruojamos AdAway web serverio.
+ Kai kurios aplikacijos atsisako veikti kada reklamos serveris yra nepasiekiamas. Su šiuo metodu jos vėl veiks, tačiau atsakys su tuščiu puslapiu, be reklamos ir be reklamos nuotraukos.
+
+
Kaip aš galiu užblokuoti/atblokuoti specifinius domeno adresus?
+
Pridėkite domenų adresus kuriuos jūs norite blokuoti į Užblokuoti sąrašą iš namų ekrano. Papildomai, domenų adresai kuriuos jūs norite išskirti iš blokavimo gali būti pridėti Leidžiami ir domenų adresai kuriuos norite nukreipti į specifišką IP adresą priklauso Nukreipti.
Paskiausios Android versijos nauja tik skaitomą /system particiją.
+Jei naudojate Magisk kaip root sprendimą, įsitikinkite kad įjungėte ne sisteminį domeno hosts modulį ir perkovėte.
+
+
Neužtenka laisvos vietos jūsų pasirinktoje atmintyje
+
Pabandykite pakeisti hosts failą nustatymuose į /data/data/hosts (arba /data/hosts) ir įjungkite AdAway vėl.
+
+
Chrome vistiek rodo reklamas
+
Išjungkite lengvajį lite rėžimą (dar žinomą kaip duomenų mažinimą) iš Chrome nustatymų. Ši funkcija leidžia Chrome naudoti privatų DNS serverį ir apeiti AdAway.
+
+
Man neblokuoja reklamu AYZ programoje!
+
Kai kurie domeno adresai gali būti trūkti pateiktų hosts failų iš Hosts domeno šaltininiai arba applikacijos sujungė nuotraukas kad pateiktų reklamas be interneto prieigos
+Jūs galite įrašyti DNS užklausas (Menu-->Log DNS Užklausos) su AdAway kad matytumėte kokie papildomi domeno adresai gali būti blokuojami.
+
Pridėkite įtariamus domeno adresus į jūsų Juodąjį sąrašą ilgai palaikydami įvedimus Įrašuose Log ir praneškite šiuos adresus kai juos patvirtinote mūsų GitHub probelmų sekėjas issue tracker.
+
+
Reklamos laikinoje atmintyje
+
Kartais aplikacijos išsaugo reklamas po atsisiuntimo. Tai lemia likusias reklamas kai kuriose aplikacijose. Jūs galite bandyti ištrinti saugyklas cache šioms aplikacijoms Android applikacijų saraše kad apeiti šią problemą.
+
+
Programa AYZ nebeveikia!
+
Kai kurios programos privalo komunikuoti su domenų adresais kurie yra blokuojami AdAway arba atsisako veikti kai reklamų naudojami adresai yra nepasiekiami. Žiūrėti https://github.com/AdAway/AdAway/wiki/ProblematicApps kad gautumėte sąrašą žinomų aplikacijų kurios turi problemų. Kitu atvėju, atraskite kurie adresai reikalingi ir juos pridėkite į savo Baltajį sąrašą kurie randasi Jūsų Sarašai ir pateikite juos AdAway klaidų sekėjas.
+
+
Neveikia ant Android 4.4+
+
Pabandykite pakeisti taikomą hosts failą nustatymuose, iš /data/data/hosts į /data/hosts arba /system/etc/hosts ir įjungkite AdAway iš naujo.
+
+
Naršyklėje mygtukas Atgal neveikia
+
Jūs galite įjungti AdAway lokalų web serverį nustatymuose kaip apėjimą.
+
+
+
diff --git a/app/src/main/res/raw-lt/help_s_on_s_off.html b/app/src/main/res/raw-lt/help_s_on_s_off.html
new file mode 100644
index 0000000..90c97ff
--- /dev/null
+++ b/app/src/main/res/raw-lt/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Prietaisai
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Ar aš turiu S-ON arba S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Apėjimas
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ml/help_s_on_s_off.html b/app/src/main/res/raw-ml/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-ml/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Chrome still displays ads
+
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ms/help_s_on_s_off.html b/app/src/main/res/raw-ms/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-ms/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-my/help_s_on_s_off.html b/app/src/main/res/raw-my/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-my/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Det er en ofte sagt misoppfatning at dersom en bruker aldri klikker på reklamer, vil det å blokkere dem ikke skade et nettsted eller app finansielt. Dette er feil, utviklere tjener også penger bare ved å vise reklamer. Det er opp til deg om du vil blokkere reklamer eller ikke. Selv ville jeg ikke brukt reklamer som viser reklamer fordi jeg anser dem for å være veldig irriterende, så uten en reklameblokkerer ville jeg ikke installert de appene.
+
+
Hvordan virker AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Hvorfor må jeg starte Android på nytt for at endringene skal bli tatt i bruk?
+
Java på Android vedlikeholder sitt eget interne DNS-mellomlager. Operativsystemet vil gjenspeile den nye vertsfilen umiddelbart (Dobbeltsjekk det med ping i ledeteksten), men du vil måtte starte Android på nytt for å bygge opp DNS-mellomlageret til Java på nytt.
+
+
Hvordan bruker man nettjeneren i AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Hvordan kan jeg blokkere/ublokkere spesifikke vertsnavn?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Ikke nok plass på partisjonen
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Virker ikke på Android ≥4.4
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Den blokkerer ikke reklamer i ____-appen!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Mellomlagrede reklamer
+
Noen ganger mellomlagrer apper reklamer etter nedlasting. Dette fører til at reklamer blir igjen i noen apper. Du kan prøve å slette mellomlageret til disse appene i Android sin appliste for å omgå dette problemet.
+
+
_____-appen virker ikke lengre!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Tilbake-knappen i nettlesere virker ikke
+
Du kan skru på AdAway sin lokal nettjener i innstillingene som en nødløsning.
+
+
Tilbake-knappen i nettlesere virker ikke
+
Du kan skru på AdAway sin lokal nettjener i innstillingene som en nødløsning.
+
+
+
diff --git a/app/src/main/res/raw-nb-rNO/help_s_on_s_off.html b/app/src/main/res/raw-nb-rNO/help_s_on_s_off.html
new file mode 100644
index 0000000..9a24e71
--- /dev/null
+++ b/app/src/main/res/raw-nb-rNO/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC-enheter
+
AdAway virker ikke når du bruker en enhet som har en såkalt S-ON. Denne "funksjonen" finnes på mange HTC-enheter og hindrer AdAway fra å skrive til vertsfilen.
+
+
S-ON/S-OFF?
+
S-OFF betyr at NAND-området i enheten din er låst opp og at den kan bli skrevet til. Standardinnstillingen for HTC-enheter er S-ON, som betyr at du hverken kan få tilgang til bestemte områder i systemet eller å garantere for en permanent rooting. I tillegg er signatursjekker for systemoppdateringer også avhengige av S-ON-flagget.
+
+
Har jeg S-ON eller S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Nødløsning
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ne/help_s_on_s_off.html b/app/src/main/res/raw-ne/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-ne/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Er is een vaak voorkomende misvatting dat als een gebruiker nooit op reclames klikt, het blokkeren van deze reclames een site of app financieel niet schaad. Dit klopt niet, aangezien ontwikkelaars ook geld verdienen door het alleen tonen van reclames. Het is aan u of u deze wel of niet blokkeert. Persoonlijk zou ik applicaties die reclames tonen niet gebruiken, omdat ik deze hinderlijk vind, dus zonder adblocker zou ik deze applicaties niet eens installeren.
+
+
Hoe werkt AdAway?
+
AdAway gebruikt het hosts bestandom hostnamen te blokkeren die reclames aanbieden. Het hosts-bestand is een bestand in /system/etc/hosts Het zet hostnamen om naar IP-adressen. Het is een veelgebruikte manier om hostnamen naar IP-adressen om te leiden zonder het Domain Name System (DNS) te gebruiken. Alle ongewenste hostnamen worden doorverwezen naar 127.0.0.1.Dit betekent dat ze naar uw eigen apparaat verwijzen.
+Als het host bestand niet kan worden weggeschreven, dan is de ingebouwde VPN service een alternatieve oplossing. Dit zal connecties naar ongewenste host namen filteren en zal anderen door laten gaan.
+
+
Waarom moet ik Android herstarten om veranderingen effect te laten hebben?
+
Java op Android houd zijn eigen interne DNS-cache bij. Het besturingssysteem zal het nieuwe hosts-bestand meteen gebruiken (controleer dit met ping via de command line), maar u zult Android opnieuw moeten opstarten om de DNS-cache van Java opnieuw op te bouwen.
+
+
Hoe gebruik ik de webserver in AdAway?
+
AdAway zal ook werken zonder het gebruik van de webserver!
+
U kunt een lokale webserver inschakelen vanuit de voorkeuren van AdAway om verzoeken te om te leiden naar het lokale IP-adres 127.0.0.1. Dit betekent dat verzoeken van applicaties aan reclameservers die doorverwezen worden naar 127.0.0.1 beantwoord worden door de webserver van AdAway.
+ Sommige applicaties weigeren te werken als reclameservers niet bereikbaar zijn. Met deze methode zullen de servers weer 'bereikbaar' zijn, alleen wordt er geen reclame maar een witte pagina weergegeven.
+
+
Hoe kan ik specifieke hostnamen (de)blokkeren?
+
Voeg de hostnamen die u wilt blokkeren toe aan de Blokkeer lijst van het homescreen. Daarnaast kunt u ook hostnamen die u wilt uitzonderenn van blokkeren toevoegen aan de Toegestane lijst en hostnamen die u wilt doorverwijzen naar een specifiek IP-adres toevoegen aan Doorverwijzing lijst.
Kopieren van het hosts bestand mislukt onder Android 9+
+
De laatste versies van Android maken gebruik van read-only /system partitie.
+Als je Magisk gebruikt als root oplossing, zorg er dan voor dat je de systemless hosts module inschakelt en dan opnieuw opstart.
+
+
Niet genoeg ruimte op partitie
+
Probeer de gekozen locatie van het hosts-bestand in de voorkeuren te veranderen naar /data/data/hosts (of /data/hosts) en pas AdAway opnieuw toe.
+
+
Werkt niet op Android 4.4 en hoger
+
Zorg ervoor dat je de lite mode (voorheen data saver) uitschakelt in de Chrome settings. Deze functionaliteit zorgt ervoor dat Chrome de prive DNS oplossing gebruikt en AdAway negeert.
+
+
AdAway blokkeert geen reclames in applicatie XYZ!
+
Some hostnamen kunnen ontbreken in de standaard hosts files van de Hosts bronnen of the applicatie heeft de afbeeldingen gebundeld om advertenties te laten zien zonder internettoegang.
+U kan DNS verzoeken (Menu->Log DNS Requests) van AdAway loggen om uit te zoeken welke aanvullende bronnen zouden moeten worden geblockt.
+
Voeg de verdachte hostnamen toe aan uw eigen zwarte lijst door de regels in het logbestand lang aan te raken en rapporteer deze hostnamen als ze bevestigd zijn op het forum Hosts Inbox of hosts-file.net.
+
+
Reclames uit cache
+
Soms plaatsen applicaties reclames in hun cache na de download. Dit zorgt ervoor dat er soms reclames in apps achterblijven. U kunt proberen de cache van deze applicaties te verwijderen vanuit de lijst met apps om dit probleem te omzeilen.
+
+
Applicatie XYZ werkt niet meer!
+
Sommige applicaties moeten communiceren met een hostnaam die geblokkeerd is door AdAway en weigeren te werken wanneer de hostnamen die de advertenties doorgeven niet bereikbaar zijn. Zie https://github.com/AdAway/AdAway/wiki/ProblematicApps voor een lijst met bekende apps die deze problemen hebben. U kunt proberen uit te zoeken welke hostnamen nodig zijn en deze toevoegen aan uw witte lijst onder de optie Uw lijsten, en ze melden op de bugtracker van AdAway.
+
+
De terugknop in webbrowsers werkt niet
+
U kunt AdAway's lokale webserver in de voorkeuren inschakelen als een tijdelijke oplossing.
+
+
De terugknop in webbrowsers werkt niet
+
U kunt AdAway's lokale webserver in de voorkeuren inschakelen als een tijdelijke oplossing.
AdAway werkt niet als u een apparaat gebruikt met zogenaamde S-ON. Deze 'functie' bestaat op veel HTC-apparaten en voorkomt dat AdAway het hosts-bestand kan bewerken.
+
+
S-ON/S-OFF?
+
S-OFF betekend dat het NAND-gedeelte van het apparaat is vrijgegeven en dat ernaar geschreven kan worden. De standaard instelling op HTC-apparaten is S-ON, wat betekend dat sommige gedeelten van het systeem niet benaderd kunnen worden en dat een permanente root niet gegarandeerd kan worden. Verder is de handtekeningscontrole voor firmware updates ook geforceerd door S-ON.
+
+
Heb ik S-ON of S-OFF?
+
Start op in het Boot Menu op uw apparaat door het ingedrukt houden van volume down knop samen met de power knop. De tekst bovenaan zal de status S-OFF of S-ON aangeven. Een volledige oor toegang betekent in het algemeen S-OFF.
+
Meer informatie kan worden gevonden op www.addictivetips.com. U kunt wellicht geïnteresseerd zijn in andere methodes om S-OFF te krijgen naast Unrevokable (zie link), namelijk: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine...
+
+
Tijdelijke oplossing
+
Vereiste: U moet een werkende Android SDK met ADB shell installeren op uw computer.
+
+
Kom in het opstartmenu op uw apparaat door tegelijk de onderste volumeknop ingedrukt te houden en de power knop terwijl u uw apparaat opstart.
+
Kom in het opstartmenu op uw apparaat door tegelijk de onderste volumeknop ingedrukt te houden en de power knop terwijl u uw apparaat opstart.
+
In clockwork recovery ga naar "partitions menu".
+
Selecteer mount /system, mount /sdcard en mount /data.
+
Sluit je USB-kabel aan en open een terminalvenster/opdrachtprompt op je computer.
+
Start de adb shell en type ln -s /data/hosts /system/etc/hosts (Dit maakt een symbolische string aan die het AdAway mogelijk maakt om de the hosts file te bewerken opgeslagen in /data en ondertussen het OS het bestand te laten gebruiken alsof het zich bevindt in /system.)
+
Herstart uw apparaat en selecteer Doel hosta bestand op /data/hosts in de voorkeuren van AdAway's.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-no/help_s_on_s_off.html b/app/src/main/res/raw-no/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-no/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Chrome still displays ads
+
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-pa/help_s_on_s_off.html b/app/src/main/res/raw-pa/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-pa/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Istnieje mylne przekonanie, że jeśli użytkownik nie klika na reklamy, to zablokowanie ich nie naraża autora programu na straty finansowe. Jest to nieprawdą, gdyż deweloperzy zarabiają również poprzez samo wyświetlanie reklam. Do Ciebie należy decyzja czy blokować je czy nie.
+Osobiście (autor) nie korzystałbym z aplikacji, które wyświetlają reklamy, ponieważ uważam je za bardzo denerwujące. Tak więc bez blokera reklam nie zainstalowałbym tych aplikacji.
+
+
Jak działa AdAway?
+
AdAway używa pliku hosts do blokowania nazw hostów, które wyświetlają reklamy. Plik hosts jest plikiem znajdującym się w /system/etc/hosts, który mapuje nazwy hostów na adresy IP. Jest to tradycyjny sposób definiowania nazw hostów na pary IP bez polegania na systemie Domain Name System (DNS). Wszystkie niechciane nazwy hostów są przekierowywane do 127.0.0.1, co oznacza, że wskażą na twoje własne urządzenie. Jeżeli plik hosts nie jest zapisywalny, zapasowym rozwiązaniem jest użycie wbudowanego VPN. Przefiltruje połączenia do niechcianych nazw hostów i pozwoli pozostałym przejść.
+
+
Dlaczego powinienem zrestartować system Android, aby zmiany przyniosły efekt?
+
Java w Androidzie utrzymuje własną wewnętrzną podręczną pamięć DNS. System operacyjny od razu wykryje nowy plik hosts (możesz to sprawdzić poleceniem ping w wierszu poleceń). Konieczny będzie jednak restart systemu Android w celu odbudowy pamięci podręcznej DNS Javy.
+
+
Jak użyć lokalnego serwera www w AdAway?
+
AdAway będzie działać również bez korzystania z serwera www!
+
Możesz włączyć lokalny serwer www w preferencjach AdAway, aby odbierać żądania do lokalnego adresu IP 127.0.0.1. Oznacza to, że żądania od aplikacji do serwerów reklamowych, które są przekierowywane do 127.0.0.1, są odbierane przez serwer AdAway.
+ Niektóre aplikacje nie działają, gdy serwery reklam są niedostępne. Dzięki tej metodzie będą ponownie dostępne, odpowiadając pustą stroną i bez reklam.
+
+
Jak mogę zablokować/odblokować określone nazwy hostów?
+
Dodaj nazwy hostów, które chcesz zablokować do listyZablokowanych w swoich listach. Ponadto nazwy hostów, które chcesz wykluczyć z blokowania, można dodać do Dozwolonych, a nazwy hostów, które chcesz przekierować do określonego adresu IP, do Przekierowanych.
+
+
diff --git a/app/src/main/res/raw-pl/help_problems.html b/app/src/main/res/raw-pl/help_problems.html
new file mode 100644
index 0000000..dda8b66
--- /dev/null
+++ b/app/src/main/res/raw-pl/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Typowe problemy
+
+
Kopiowanie pliku hosts nie powiodło się na Androidzie 9+
+
Najnowsze wersje Androida używają partycji /system jako tylko do odczytu.
+Jeśli używasz Magisk jako roota, upewnij się, że włączyłeś bezsystemowy moduł hostów, a następnie uruchom ponownie.
+
+
Brak wystarczającego miejsca na partycji
+
Spróbuj zmienić docelowy plik hosts w preferencjach na /data/data/hosts (lub /data/hosts) i ponownie zastosuj AdAway.
+
+
Nie działa na systemie Android 4.4+
+
Spróbuj zmienić docelowy plik hosts w preferencjach z /data/data/hosts na /data/hosts lub /system/etc/hosts i ponownie zastosuj AdAway.
+
+
Nie blokuje reklam w aplikacji XYZ!
+
Niektóre nazwy hostów mogą być niedostępne w dostarczonych plikach hostów ze źródeł hostów lub aplikacja zawiera załączone treści, aby wyświetlać reklamy bez dostępu do internetu.
+Możesz rejestrować żądania DNS (Menu->Rejestruj żądania DNS) od AdAway, aby dowiedzieć się, które dodatkowe nazwy hostów muszą być blokowane.
+
Dodaj podejrzane nazwy hostów do swojej Czarnej listy przez długie naciśnięcie wpisów w dzienniku i zgłoś te nazwy hostów po ich zweryfikowaniu w temacie Hosts Inbox na forum hosts-file.net.
+
+
Reklamy buforowane
+
Zdarza się, że aplikacje cachują reklamy po pobraniu. Prowadzi to do tego, że pomimo blokowania, reklamy nadal są wyświetlane w niektórych aplikacjach. W celu usunięcia problemu możesz spróbować usunąć pamięć podręczną tych aplikacji.
+
+
Aplikacja XYZ nie działa teraz prawidłowo!
+
Niektóre aplikacje muszą komunikować się z nazwą hosta zablokowaną przez AdAway lub odmówić pracy, gdy nazwy hostów, które powinny wyświetlać reklamy, są niedostępne. Zobacz https://github.com/AdAway/AdAway/wiki/ProblematicApps aby uzyskać listę znanych aplikacji, które mają problemy. W przeciwnym razie sprawdź, które nazwy hostów są potrzebne i dodaj je do Białej listy pod Twoimi listami i zgłoś je do modułu śledzenia błędów AdAway.
+
+
Nie działa przycisk Wstecz w przeglądarkach internetowych
+
Możesz włączyć w opcjach lokalny serwer www jako tymczasowe rozwiązanie problemu.
+
+
Nie działa przycisk Wstecz w przeglądarkach internetowych
+
Możesz włączyć w opcjach lokalny serwer www jako tymczasowe rozwiązanie problemu.
+
+
+
diff --git a/app/src/main/res/raw-pl/help_s_on_s_off.html b/app/src/main/res/raw-pl/help_s_on_s_off.html
new file mode 100644
index 0000000..dc24988
--- /dev/null
+++ b/app/src/main/res/raw-pl/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Pomoc związana z S-ON
+
+
Urządzenia HTC
+
AdAway nie działa, gdy używasz urządzeń z funkcją zwaną S-ON. 'Funkcja' ta występuje w wielu urządzeniach HTC i zabrania aplikacji AdAway nadpisywania pliku hosts.
+
+
S-ON/S-OFF?
+
S-OFF oznacza, że fragment pamięci NAND urządzenia jest odblokowany i może zostać zapisany. Domyślne ustawienie dla urządzeń HTC to S-ON, co oznacza, że ani nie można uzyskać dostępu do niektórych części systemu, ani nie można zagwarantować trwałego roota. Dodatkowo flaga S-ON implikuje sprawdzanie podpisu wgrywanego firmware'u.
+
+
Mam S-ON czy S-OFF?
+
Uruchom urządzenie w trybie menu rozruchu, przytrzymując przycisk zmniejszania głośności i naciskając przycisk zasilania, a tekst na górze pokaże status flagi jako S-OFF lub S-ON. Pełny root na ogół oznacza S-OFF.
+
Więcej informacji można znaleźć na stronie www.addictivetips.com. Dodatkowe metody S-OFF od Unrevokable (w linku) mogą Cię zainteresować, a mianowicie: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
Uruchom w menu rozruchowym urządzenia, przytrzymując przycisk zmniejszania głośności, naciskając jednocześnie przycisk zasilania.
+
Użyj zmniejszania głośności aby wybrać odzyskiwanie a następnie włącz go.
+
Podczas odzyskiwania zegara przejdź do "menu partycji".
+
Wybierz mount /system, mount /sdcard i mount /data.
+
Podłącz przewód USB i otwórz wiersz poleceń na komputerze.
+
Wprowadź adb shell i wpisz ln -s /data/hosts /system/etc/hosts (Tworzy to dowiązanie symboliczne, które pozwala AdAway na edycję pliku hosts przechowywanego w / data, zezwalając systemowi na używanie pliku tak, jakby był on przechowywany w /system.)
+
Uruchom ponownie urządzenie i ustaw Docelowy plik hosts na /data/hosts w preferencjach AdAway.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Chrome still displays ads
+
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ps/help_s_on_s_off.html b/app/src/main/res/raw-ps/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-ps/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Existe um equívoco declarado de que se um usuário nunca clicar em anúncios, logo bloqueá-los não prejudicará um site ou app financeiramente. Isto está errado, os desenvolvedores também ganham dinheiro apenas mostrando anúncios. Depende de você, se você bloqueia os anúncios ou não. Pessoalmente, eu não usaria apps que mostrassem anúncios porque os acho muito irritantes, logo sem um bloqueador de anúncios eu não instalaria estes apps.
+
+
Como AdAway funciona?
+
O AdAway usa o arquivo de hosts para bloquear nomes de hosts que veiculam anúncios. O arquivo hosts é um arquivo encontrado em /system/etc/hosts que mapeia nomes de host para endereços IP. É uma maneira tradicional de definir pares de nome de host para endereço IP sem depender do DNS (Sistema de Nomes de Domínio). Todos os nomes de host indesejados são redirecionados para 127.0.0.1, o que significa que eles apontarão para o seu próprio dispositivo.
+ Se o arquivo hosts não for gravável, uma solução alternativa é usar o serviço VPN interno. Ele filtrará as conexões com nomes de host indesejados e permitirá que outras pessoas passem.
+
+
Por que tenho que reiniciar o Android para as alterações fazerem efeito?
+
Java no Android mantém seu próprio cache DNS interno. O sistema operacional refletirá o novo arquivo hosts imediatamente (verifique isto com uma solicitação na linha de comando), mas você precisará reiniciar o Android para reconstruir o cache DNS de Java.
+
+
Como usar o servidor web no AdAway?
+
AdAway também funcionará sem usar o servidor da web!
+
Você pode ativar um servidor local nas preferências da AdAway para responder a solicitações para o endereço IP local 127.0.0.1. Isso significa que as solicitações de aplicativos para servidores de anúncios redirecionados para 127.0.0.1 são respondidas pelo servidor da AdAway.
+ Alguns aplicativos se recusam a funcionar, quando os servidores de anúncios não estão acessíveis. Com esse método, eles poderão ser acessados novamente, respondendo com uma página em branco e sem imagens de anúncios.
+
+
Como posso bloquear/desbloquear nomes de hosts específicos?
+
Adicione os nomes de host que você deseja bloquear na lista Bloqueado na tela inicial. Além disso, os nomes de host que você deseja excluir do bloqueio podem ser adicionados ao Permitido e os nomes de host que você deseja redirecionar para um endereço IP específico pertencem ao Redirecionado.
Falha na cópia do arquivo hosts no Android 9 ou superior
+
As versões mais recentes do Android usam a partição /system somente leitura.
+Se você estiver usando o Magisk como solução raiz, ative o módulo hosts sem sistema e reinicie.
+
+
Espaço insuficiente na partição
+
Tente alterar o arquivo de hosts de destino em preferências para /data/data/hosts (ou /data/hosts) e aplique AdAway novamente.
+
+
Não funciona no Android 4.4+
+
Tente alterar o arquivo de hosts de destino nas preferências de /data/data/hosts para /data/hosts ou /system/etc/hosts e aplique AdAway novamente.
+
+
Não bloqueia anúncios no app XYZ!
+
Alguns hostnames podem estar ausentes nos arquivos de hosts fornecidos das Fontes de Hosts ou o aplicativo agrupou as imagens para fornecer anúncios sem acessar a Internet.
+Você pode registrar solicitações de DNS (Menu->Registrar solicitações de DNS) a partir do AdAway para descobrir quais nomes de host adicionais devem ser bloqueados.
+
Adicione os nomes de host suspeitos à sua própria Lista Negra pressionando por muito tempo as entradas no Registro e informe esses nomes de host quando os tiver verificado na Caixa de Entrada dos Hosts do Fórum em hosts-file.net.
+
+
Anúncios no Cache
+
Algumas vezes os apps armazenam anúncios no cache após baixados. Isto gera resíduos de anúncios em alguns apps. Você pode tentar excluir o cache destes apps na lista de Apps do Android para contornar este problema.
+
+
App XYZ não está funcionando mais!
+
Alguns aplicativos precisam se comunicar com um nome de host bloqueado pela AdAway ou se recusar a funcionar quando os nomes de host que devem veicular anúncios não podem ser acessados. Consulte https://github.com/AdAway/AdAway/wiki/ProblematicApps para obter uma lista de aplicativos conhecidos que apresentam problemas. Caso contrário, descubra quais nomes de host são necessários e adicione-os à sua Lista Branca em Suas listas e informe-os ao rastreador de erros da AdAway.
+
+
O botão Voltar nos navegadores web não está funcionando
+
Você pode ativar o servidor web local do AdAway nas preferências como uma solução alternativa.
+
+
O botão Voltar nos navegadores web não está funcionando
+
Você pode ativar o servidor web local do AdAway nas preferências como uma solução alternativa.
+
+
+
diff --git a/app/src/main/res/raw-pt-rBR/help_s_on_s_off.html b/app/src/main/res/raw-pt-rBR/help_s_on_s_off.html
new file mode 100644
index 0000000..ffa9b01
--- /dev/null
+++ b/app/src/main/res/raw-pt-rBR/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Ajuda relacionada ao S-ON
+
+
Dispositivos HTC
+
AdAway não funciona quando você está usando um dispositivo com então chamado S-ON. Este 'recurso' existe em muitos dispositivos HTC e evita AdAway de escrever o arquivo hosts.
+
+
S-ON/S-OFF?
+
S-OFF significa que a partição NAND do dispositivo está desbloqueada e pode ser escrita. A definição padrão para dispositivos HTC é S-ON, que significa que você não pode acessar certas áreas do sistema nem garantir um root permanente. Além disto, a verificação de assinatura para imagens de firmware é também assegurada pela bandeira S-ON.
+
+
Tenho S-ON ou S-OFF?
+
Inicialize no Boot Menu no seu dispositivo mantendo pressionado o botão de volume para baixo enquanto pressiona a energia e o texto na parte superior mostrará o status do sinalizador como S-OFF ou S-ON. Uma raiz completa geralmente significa S-OFF.
+
Mais informações podem ser encontradas em www.addictivetips.com. Métodos adicionais S-OFF desde Unrevokable (no link) podem lhe interessar, a saber: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Solução Alternativa
+
Pré-requisito: Você tem que instalar um Android SDK com o shell ADB no seu PC.
+
+
Inicialize no Boot Menu do seu dispositivo pressionando o botão de diminuir o volume enquanto pressiona a energia.
+
Use o volume para baixo para selecionar a recuperação e depois o de ligar para inicializá-la.
+
Na recuperação do clockwork, acesse "menu de partições".
+
Selecione mount /system, mount /sdcard e mount /data.
+
Conecte seu cabo USB e abra uma linha de comando no seu computador.
+
Entre no ADB Shell e digite ln -s /data/hosts /system/etc/hosts (Isso cria um link simbólico que permite que o AdAway edite o arquivo hosts que é guardado em /datapermitindo que o OS use o arquivo como se ele estivesse guardado em /system.)
+
Reinicialize seu dispositivo e defina o Arquivo de Hosts de destino para /data/hosts nas preferências da AdAway.
Existe uma ideia errada muito repetida de que, se um utilizador nunca clicar em anúncios, bloqueá-los não vai prejudicar um site ou aplicação financeiramente. Isto é errado; os programadores também ganham dinheiro apenas por mostrar anúncios. Cabe-lhe a si decidir bloquear anúncios ou não. Pessoalmente, não utilizaria aplicações que mostram anúncios, visto que as acho muito irritantes, portanto, sem um bloqueador de anúncios, não instalaria estas aplicações.
+
+
Como funciona o AdAway?
+
O AdAway usa o ficheiro de hosts para bloquear nomes de hosts que veiculam anúncios. O ficheiro de hosts é um ficheiro encontrado em /system/etc/hosts que mapeia nomes de host para endereços IP. É uma maneira tradicional de definir pares de nome de host para endereços IP sem depender do DNS (Sistema de Nomes de Domínio). Todos os nomes de host indesejados são redirecionados para 127.0.0.1, o que significa que eles irão apontar para o seu próprio dispositivo.
+Se o ficheiro hosts não for gravável, uma solução alternativa é usar o serviço de VPN interno. Ele filtrará as conexões com nomes de host indesejados e permitirá que outros passem.
+
+
Porque tenho de reiniciar o Android para as alterações entrarem em efeito?
+
No Android, o Java mantém a sua própria cache interna de DNS. O sistema operativo refletirá o novo ficheiro de hosts imediatamente (verifique com um ping na linha de comandos), mas terá de reiniciar o Android para reconstruir a cache de DNS do Java.
+
+
Como utilizar o servidor web do AdAway?
+
AdAway também irá funcionar sem utilizar o servidor da Web!
+
Pode ativar um servidor da Web local nas preferências do AdAway para responder aos pedidos para o endereço de IP local 127.0.0.1. Isto significa que os pedidos das aplicações para os servidores da Web que forem redirecionados para 127.0.0.1 serão respondidos pelo servidor da Web do AdAway.
+ Algumas aplicações recusam-se a funcionar quando os servidores de anúncios não se encontram alcançáveis. Com este método, estes irão estar novamente alcançáveis, respondendo com uma página em branco sem imagens de anúncios.
+
+
Como é que eu posso bloquear/desbloquear nomes de hospedeiro específicos?
+
Adicione os nomes de host que deseja bloquear na lista Bloqueado no ecrã inicial. Adicionalmente, os nomes de host que deseja excluir do bloqueio podem ser adicionados ao Permitido e os nomes de host que deseja redirecionar para um endereço IP específico pertencem ao Redirecionado.
+
+
Onde é que eu encontro mais fontes de hospedeiros?
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Espaço insuficiente na partição
+
Tente alterar o ficheiro hosts de destino nas preferências para /data/data/hosts (ou /data/hosts) e aplique o AdAway novamente.
+
+
Não funciona no Android 4.4+
+
Tente alterar o ficheiro hosts de destino nas preferências de /data/data/hosts para /data/hostsou /system/etc/hosts e aplique o AdAway novamente.
+
+
Não bloqueia anúncios na aplicação XYZ!
+
Alguns nomes de hospedeiros podem estar ausentes nos ficheiros de hospedeiros fornecidos das Fontes de Hospedeiros ou a aplicação agrupou as imagens para fornecer anúncios sem aceder à Internet.
+Pode registar pedidos de DNS (Menu->Registar pedidos de DNS) a partir do AdAway para descobrir quais os nomes de hospedeiros adicionais que devem ser bloqueados.
+
Adicione os nomes de hospedeiros suspeitos à sua própria Lista Negra com um premir longo nas entradas no Registo e reporte esses nomes de hospedeiros quando os tiver verificado na Caixa de Entrada dos Hospedeiros (Hosts Inbox) do Fórum em hosts-file.net.
+
+
Anúncios em cache
+
Por vezes, as aplicações colocam anúncios em cache depois de os descarregarem. Isto faz com que fiquem alguns anúncios nalgumas aplicações. Poderá tentar remover a cache destas aplicações na lista de aplicações do Android para resolver este problema.
+
+
A aplicação XYZ já não funciona!
+
Algumas aplicações precisam de comunicar com um nome de hospedeiro que é bloqueado pelo AdAway ou recusa-se a funcionar quando os nomes de hospedeiro que deveriam fornecer os anúncios não estão ao alcance. Consulte https://github.com/AdAway/AdAway/wiki/ProblematicApps para obter uma lista de aplicações conhecidas que têm problemas. Caso contrário, descubra quais os nomes de hospedeiro necessários e adicione-os à sua Lista Branca em As Suas Listas e comunique-as no registo de problemas do AdAway.
+
+
O botão de retroceder nos navegadores web não funciona
+
Em alternativa, pode ativar o servidor web local do AdAway nas preferências.
+
+
O botão de retroceder nos navegadores web não funciona
+
Em alternativa, pode ativar o servidor web local do AdAway nas preferências.
+
+
+
diff --git a/app/src/main/res/raw-pt/help_s_on_s_off.html b/app/src/main/res/raw-pt/help_s_on_s_off.html
new file mode 100644
index 0000000..c1c4a10
--- /dev/null
+++ b/app/src/main/res/raw-pt/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Ajuda relacionada com S-ON
+
+
Dispositivos HTC
+
O AdAway não funciona quando utiliza um dispositivo com o chamado S-ON. Esta "funcionalidade" existe em muitos dispositivos HTC e impede que o AdAway escreva no ficheiro de hosts.
+
+
S-ON/S-OFF?
+
S-OFF significa que a porção NAND do dispositivo está desbloqueada e que pode ser escrita. A definição predefinida para dispositivos HTC é S-ON, o que significa que o utilizador não pode aceder a certas áreas do sistema nem pode garantir root permanente. Além disso, a verificação de assinatura das imagens de firmware também é realizada pela flag S-ON.
+
+
Tenho S-ON ou S-OFF?
+
Inicie no 'Menu de Arranque' do seu dispositivo pressionando o botão de diminuir o volume e o de ligar/desligar ao mesmo tempo e o texto no topo mostrará o estado da "flag" como S-OFF ou S-ON. Um "root" completo geralmente significa S-OFF.
+
Pode ser encontrada mais informação em www.addictivetips.com. Os métodos de S-OFF adicionais desde Unrevokable (na hiperligação) poderão interessar-lhe, nomeadamente: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Solução alternativa
+
Pré-requisito: tem de instalar o Android SDK com a shell ADB no seu PC.
+
+
Inicie no 'Menu de Arranque' do seu dispositivo pressionando o botão de diminuir o volume e o de ligar/desligar ao mesmo tempo.
+
Use diminuir o volume para selecionar recuperar te então ligue para ver o menu de arranque.
+
No ClockworkMod Recovery vá a "menu de partições".
+
Selecione mount /system, mount /sdcard e mount /data.
+
Introduza o cabo USB e abra uma linha de comandos no seu PC.
+
Entre na shell do ADB e introduza ln -s /data/hosts /system/etc/hosts (Isto cria uma hiperligação simbólica, que permite que o AdAway edite o ficheiro hosts guardado em /data ao mesmo tempo que permite que o SO utilize o ficheiro como se estivesse guardado em /system.)
+
Reinicie o seu dispositivo e defina Ficheiro hosts de destino para /data/hosts nas preferências de AdAway.
+
O AdAway deverá agora funcionar.
+
+
+
diff --git a/app/src/main/res/raw-ro/help_faq.html b/app/src/main/res/raw-ro/help_faq.html
new file mode 100644
index 0000000..ccd59ca
--- /dev/null
+++ b/app/src/main/res/raw-ro/help_faq.html
@@ -0,0 +1,32 @@
+
+
+
+Listă cu întrebări frecvente
+
+
Venitul obținut din reclame
+
Există o confuzie legată de banii obținuți din reclame, și anume, dacă un utilizator nu interacționează cu reclamele atunci nici blocarea acestora nu afectează financiar site-ul web sau aplicația în cauză. Acest lucru este greșit deoarece dezvoltatorii primesc bani doar afișând reclamele indiferent dacă se interacționează cu ele sau nu. Personal, eu nu aș folosi aplicații care aleg să afișeze reclame deoarece le consider deranjante, deci fără un alt program de blocare a reclamelor nici măcar nu le-aș fi instalat.
+
+
Cum funcționează AdAway?
+
AdAway folosește fișierul hosts pentru a bloca domeniile care trimit reclame. Fișierul host se găsește în /system/etc/hosts și asociază domeniul cu o adresă IP. Este o metoda tradițională de alocare pentru domenii de adrese IP pereche fără a mai avea nevoie de Sistemul de Nume de Domeniu (DNS). Domeniile nedorite vor fi redirectate către 127.0.0.1 ceea ce înseamnă că vor fi trimise local către dispozitivul dumneavoastră.
+Dacă fișierul hosts nu poate fi suprascris, o soluție de rezervă este utilizarea serverului dedicat VPN. Acesta va filtra pe conexiune domeniile nedorite și va permite trecerea celorlalte.
+
+
De ce trebuie să repornesc Android pentru ca modificările să aibă efect?
+
Java in Android mentine un cache DNS intern. Sistemul de operare va vedea noul fișier hosts imediat după aplicarea modificărilor (se poate verifica acest lucru printr-o comanda ping în consolă) dar o repornire este totuși necesară pentru a reface cache-ul DNS din Java.
+
+
Cum se folosește serverul web în AdAway?
+
AdAway poate funcționa și fără server local!
+
Poți activa serverul local din setările AdAway pentru a răspunde cererilor pe adresa IP locală 127.0.0.1. Așadar cererile aplicațiilor către serverele de reclame for fi redirecționate către 127.0.0.1 fiind gestionate de serverul web AdAway.
+ Unele aplicații pot să nu mai funcționeze dacă nu reușesc să descarce reclamele. Cu această metodă, aplicațiile vor avea răspuns la cereri, răspunsul fiind o pagină goală fără reclame sau imagini.
+
+
Cum pot bloca/debloca domenii mai specifice?
+
Adăugați domeniile pe care doriți să le blocați pe Lista neagră din ecranul principal. Opțional, domeniile pe care doriți să le excludeți din blocare pot fi adăugate pe Lista albă iar domeniile pe care doriți să le redirecționați spre o adresă IP specifică, se află în Lista de redirecționare.
+
+
diff --git a/app/src/main/res/raw-ro/help_problems.html b/app/src/main/res/raw-ro/help_problems.html
new file mode 100644
index 0000000..6b7b644
--- /dev/null
+++ b/app/src/main/res/raw-ro/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Probleme comune
+
+
Copierea fișierului 'hosts' nereușită pe Android 9+
+
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Spațiu insuficient pe partiție
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Încă apar reclame în Chrome
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Nu blochează reclamele în aplicația XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Uneori,aplicatiile salveaza reclamele dupa downloadare. Asta inseamna ca unele aplicatii vor avea reclame ramase nesterse. O solutie este stergerea cache-ului acestor aplicatii din meniul Setari->Aplicatii.
+
+
Aplicația XYZ nu mai funcționează!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Nu funcționează pe Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
The back button in web browsers is not working
+
O soluție ar fi activarea serverului web local AdAway din setări.
+
+
+
diff --git a/app/src/main/res/raw-ro/help_s_on_s_off.html b/app/src/main/res/raw-ro/help_s_on_s_off.html
new file mode 100644
index 0000000..d89fac3
--- /dev/null
+++ b/app/src/main/res/raw-ro/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
Dispozitive HTC
+
AdAway nu funcționează pe dispozitivele cu S-ON. Această 'funcție' este întâlnită pe multe dispozitive HTC și nu permite AdAway să scrie în fișierul hosts.
+
+
S-ON sau S-OFF?
+
S-OFF inseamna ca partitia NAND a dispozitivului este deblocata si poate fi scrisa. Setarea din fabrica a dispozitivelor HTC este S-ON,ceea ce inseamna ca anumite parti ale sistemului nu pot fi accesate si nu exista certitudinea unui root permanent.De asemenea,S-ON face obligatorie verificarea semnaturilor pentru imaginile de sistem.
+
+
Dispozitivul meu este S-ON sau S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Soluție
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Conectați cablul USB și deschideți o linie de comandă pe calculator.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Существует часто встречающееся заблуждение, что если пользователь никогда не нажимает на рекламу, то, заблокировав её, не нанесёт вреда сайту или приложению в финансовом плане. Это неверно, разработчики также зарабатывают деньги просто за показ рекламы. Вам решать, блокировать рекламу или нет. Лично я бы не стал использовать приложения с рекламой, так как считаю, что она очень раздражает, поэтому без блокировщика рекламы я бы не стал устанавливать такие приложения.
+
+
Как работает AdAway?
+
AdAway использует файл hosts для блокировки хостов, которые служат источниками рекламы. Файл hosts расположен по пути /system/etc/hosts и сопоставляет имена хостов с их IP-адресами. Это обычный способ определения пары "имя хоста - адрес IP" без использования системы доменных имён (DNS). Все нежелательные имена хостов будут перенаправлены на адрес 127.0.0.1, что означает, что они будут указывать на ваше собственное устройство.
+Если файл hosts недоступен для записи, запасным решением является использование встроенной службы VPN . Она будет фильтровать подключения к нежелательным именам хостов и пропускать остальные.
+
+
Почему мне нужно перезагружать устройство, чтобы изменения вступили в силу?
+
Java на Android имеет свой внутренний кэш DNS. Операционная система будет использовать обновлённый файл hosts сразу же (проверьте это с помощью команды ping в командной строке), но вы должны перезагрузить устройство, чтобы пересоздать кэш DNS в Java.
+
+
Как использовать веб-сервер в AdAway?
+
AdAway также будет работать и без использования веб-сервера!
+
Вы можете включить локальный веб-сервер в настройках AdAway для ответов на запросы к локальному IP-адресу 127.0.0.1. Это означает, что тогда на все запросы хостов с рекламой, которые перенаправляются на ваш локальный IP-адрес 127.0.0.1, будет отвечать веб-сервер AdAway.
+ Некоторые приложения отказываются работать, если не имеют доступа к хосту с рекламой. Этот метод позволит запускать такие приложения, но вместо рекламы будет подставляться пустое место и отсутствовать изображение рекламы.
+
+
Как я могу заблокировать/разблокировать определенное имя хоста?
+
Добавить имена хостов, которые вы хотите заблокировать, можно в список Блокировано, находящийся на главном экране. Кроме того, имена хостов, которые вы хотите исключить из блокировки, могут быть добавлены в Разрешено, а имена хостов, которые вы хотите перенаправить на определённый IP-адрес, надо внести в Перенаправлено.
+
+
Где я могу найти больше источников списков хостов?
+
+
diff --git a/app/src/main/res/raw-ru/help_problems.html b/app/src/main/res/raw-ru/help_problems.html
new file mode 100644
index 0000000..51ae7f8
--- /dev/null
+++ b/app/src/main/res/raw-ru/help_problems.html
@@ -0,0 +1,37 @@
+
+
+
+Распространенные проблемы
+
+
Ошибка копирования файла hosts на Android 9+
+
Последние версии Android используют раздел /system, доступный только для чтения.
+Если вы используете Magisk для получения прав root, убедитесь, что вы включили бессистемный модуль hosts, а затем перезагрузитесь.
+
+
Не хватает места в дисковом разделе
+
Попробуйте изменить путь к файлу hosts в настройках на /data/data/hosts (или /data/hosts) и снова примените AdAway.
+
+
Chrome по-прежнему отображает рекламу
+
Убедитесь, что у вас отключен Упрощенный режим (ранее известный как Экономия трафика) в настройках Chrome. Из-за этой настройки Chrome использует приватный DNS, который обходит AdAway.
+
+
Не блокируется реклама в том или ином приложении!
+
Некоторые имена хостов могут отсутствовать в соответствующих файлах хостов из Источники хостов или приложение объединило изображения для показа рекламы без доступа к Интернету.
+
+Вы можете зайти в журнал запросов DNS (Меню-> Журнал запросов DNS) AdAway, чтобы выяснить, какие дополнительные имена хостов должны быть заблокированы.
+
Добавьте подозрительные имена хостов в ваш Черный список долгим нажатием на запись в журнале, и после проверки сообщите об этих именах хостов в наш багтрекер на GitHub.
+
+
Кэшированная реклама
+
Иногда приложения кэшируют рекламу после загрузки. Это приводит к тому, что в некоторых приложениях остается реклама. Вы можете попробовать удалить кэш для этих приложений в списке приложений Android для устранения этой проблемы.
+
+
То или иное приложение больше не работает!
+
Некоторым приложениям необходимо связываться с адресами, заблокированными AdAway, или приложения не работают, когда имена хостов отображающих рекламу недоступны. Посетите https://github.com/AdAway/AdAway/wiki/ProblematicApps, чтобы ознакомиться со списком приложений, имеющих подобные проблемы. Либо выясните какие имена хостов необходимы приложениям и добавьте их в Белый список в категории Ваши списки и сообщите об этом на багтрекере AdAway.
+
+
Не работает на Android 4.4+
+
Попробуйте изменить путь к файлу hosts в настройках с /data/data/hosts на /data/hosts или /system/etc/hosts и снова примените AdAway.
+
+
Кнопка "назад" в веб-браузерах не работает
+
Вы можете включить локальный веб-сервер AdAway в настройках в качестве обходного пути.
+
+
+
diff --git a/app/src/main/res/raw-ru/help_s_on_s_off.html b/app/src/main/res/raw-ru/help_s_on_s_off.html
new file mode 100644
index 0000000..a1e2b78
--- /dev/null
+++ b/app/src/main/res/raw-ru/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Справка по S-ON
+
+
Устройства HTC
+
AdAway не работает если вы используете устройство с так называемым S-ON. Эта «функция» существует на многих устройствах HTC и не позволяет AdAway изменять файл hosts.
+
+
S-ON/S-OFF?
+
S-OFF означает, что часть памяти NAND разблокирована, и позволяет производить в нее запись. По умолчанию устройства HTC работают в режиме S-ON, а это означает, что вы не можете получить доступ к определённым областям памяти и не можете гарантировать постоянный root-доступ. Кроме того, проверка цифровых подписей образов прошивок также осуществляется флагом S-ON.
+
+
Моё устройство работает в режиме S-ON или S-OFF?
+
Загрузитесь в меню загрузчика на вашем устройстве, удерживая кнопку уменьшить громкость и одновременно зажимая кнопку включения, после чего вы увидите вверху текст, который покажет статут флага — S-OFF или S-ON. Полный рут-доступ обычно означает S-OFF.
+
Более подробную информацию вы сможете найти на www.addictivetips.com. Дополнительные методоы S-OFF, начиная с Unrevokable (по ссылке), которые могут вас заинтересовать, а именно: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Решение
+
Предварительное условие: Вы должны установить рабочий Android SDK с оболочкой ADB на ваш ПК.
+
+
Загрузитесь в меню загрузки устройства, удерживая кнопку уменьшить громкость одновременно нажимая на кнопку включения.
+
Используйте кнопку уменьшить громкость чтобы выбрать режим восстановления, затем кнопку включения, чтобы загрузить его.
+
В Clockwork Recovery перейдите в "меню разделов".
+
Выберите mount /system, mount /sdcard и mount /data.
+
Подключите ваш телефон к ПК через кабель USB и откройте окно командной строки на ПК.
+
Запустите оболочку ADB и введите ln -s /data/hosts /system/etc/hosts (Это создаст символическую "мягкую" ссылку, которая позволит AdAway редактировать файл hosts, расположенный по пути /data, одновременно позволяя ОС использовать этот файл так, как если бы он находился в /system.)
+
Перезагрузите ваше устройство и установите Путь к файлу hostsв значение /data/hosts в настройках AdAway.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-si/help_s_on_s_off.html b/app/src/main/res/raw-si/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-si/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Užívatelia sa mylne domnievajú, že pokiaľ nikdy neklikajú na reklamy, blokovanie nijak finančne nepoškodí aplikácie alebo webové stránky. To je nesprávne, vývojári taktiež zarábajú jednoduchým zobrazením reklamy. Je iba na vás, či budete reklamy blokovať alebo nie. Osobne by som aplikácie, ktoré reklamy zobrazujú nepoužíval, reklamy mi prídu veľmi otravné, takže bez blokovača reklám by som si tieto aplikácie neinštaloval.
+
+
Ako funguje AdAway?
+
AdAway používa súbor hosts na blokovanie názvov hostiteľa, ktoré poskytujú reklamy. Súbor hosts je súbor, ktorý sa nachádza v /system/etc/hosts, ktorý prevádza názvy serverov na IP adresy. Je to typický spôsob ako definovať párovanie adries a IP bez spoliehania sa na Domain Name System (DNS). Všetky nechcené adresy sú presmerované na 127.0.0.1, čo znamená, že budú ukazovať na vaše zariadenie.
+Ak sa do súboru host nedá zapisovať, použije sa núdzové riešenie v podobe služby VPN. Služba bude filtrovať nechcené pripojenia a ostatné nechá prejsť.
+
+
Prečo musím reštartovať zariadenie aby sa zmeny prejavili?
+
Java na Androide udržiava svoju vlastnú internú DNS cache. Operačný systém bude pracovať s novým hosts súborom okamžite (overiť si to môžete cez ping v príkazovom riadku), ale zariadenie musíte reštartovať kvôli obnoveniu DNS cache Javy.
+
+
Ako používať webserver v AdAway?
+
AdAway funguje aj bez použitia webservera!
+
Lokálny webserver môžete povoliť v nastaveniach AdAway pre odpovedanie na požiadavky na lokálnu IP adresu 127.0.0.1. To znamená, že požiadavky smerujúce z aplikácií na reklamné servery budú presmerované na 127.0.0.1 a odpoveď bude smerovať z webservera AdAway.
+ Niektoré aplikácie odmietajú fungovať, ak reklamné servery nie sú dostupné. S touto metódou sa stanú dostupnými a odpoveďou bude prázdna stránka bez reklamných banerov.
+
+
Ako môžem blokovať/povoliť špecifické adresy?
+
Pridajte adresy, ktoré chcete blokovať do zoznamu Blokované z domovskej obrazovky. Adresy, ktoré chcete vylúčiť z blokovania môžete pridať do zoznamu Povolené a adresy, ktoré chcete presmerovať na špecifickú IP patria do Presmerovania.
Pre najnovší Android nastavte partíciu /system iba na čítanie.
+Ak používate na root Magisk, overte povolenie modulu systemless hosts a reštartujte.
+
+
Nedostatok miesta na partícii
+
Skúste zmeniť umiestnenie hosts súboru v nastaveniach na /data/data/hosts (alebo /data/hosts) a povoľte AdAway znova.
+
+
Nefunguje na Android 4.4+
+
V nastaveniach prehliadača Chrome vypnite zjednodušený režim (predtým známy ako šetrič dát). Táto funkcia umožňuje prehliadaču Chrome používať súkromné riešenie DNS a obchádzať AdAway.
+
+
Neblokuje reklamy v aplikácii XYZ!
+
Niektoré názvy hostiteľov môžu chýbať v poskytnutých súboroch hosts z Zdroje hosts alebo aplikácia obsahuje obrázky, ktoré sa zobrazujú ako reklama bez internetu.
+DNS požiadavky môžete zaznamenať (Menu->Zaznamenať DNS požiadavky) v AdAway a nájdené hosts môžu byť blokované.
+
Podozrivých hostiteľov pridajte na Čiernu listinu dlhým podržaním na položku v zázname a nahláste týchto hostiteľov po overení na našom GitHub issue tracker.
+
+
Reklamy vo vyrovnávacej pamäti
+
Niekedy aplikácie ukladajú reklamy do vyrovnávacej pamäti. To niekedy spôsobuje zobrazovanie reklám v niektorých aplikáciách, Môžete skúsiť vymazať vyrovnávaciu pamäť pre tieto aplikácie Nastaveniach - Aplikácie vo vašom zariadení.
+
+
Aplikácia XYZ už nefunguje!
+
Niektoré aplikácie potrebujú komunikovať s názvami hostiteľa, ktoré sú blokované v AdAway alebo odmietajú fungovať, ak adresy s reklamami nie sú dosiahnuteľné. Na stránke https://github.com/AdAway/AdAway/wiki/ProblematicApps nájdete zoznam známych aplikácií, ktoré majú s týmto problém. Alebo, zistite adresy, ktoré sú potrebné a pridajte ich na vašu Bielu listinu pod Vaše zoznamy a nahláste ich na stránke pre hlásenie chýb v AdAway.
+
+
Nefunguje na Androide 4.4+
+
Skúste zmeniť umiestnenie hosts súboru v nastaveniach z /data/data/hosts na /data/hosts alebo /system/etc/hosts a povoľte AdAway znova.
+
+
Tlačidlo späť v internetovom prehliadači nefunguje
+
Môžete povoliť Miestny webserver v nastaveniach AdAway ako dočasné riešenie.
+
+
+
diff --git a/app/src/main/res/raw-sk/help_s_on_s_off.html b/app/src/main/res/raw-sk/help_s_on_s_off.html
new file mode 100644
index 0000000..7e4b0f0
--- /dev/null
+++ b/app/src/main/res/raw-sk/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Pomocník súvisiaci s S-ON
+
+
HTC zariadenia
+
AdAway nefunguje na S-ON zariadeniach. Táto "funkcia" existuje na veľkom množstve HTC zariadení a bráni AdAway zapisovať hosts súbor.
+
+
S-ON/S-OFF?
+
S-OFF znamená, že NAND partícia na zariadení je odomknutá a je možné do nej zapisovať. Predvolené nastavenie pre HTC zariadenia je S-ON, čo znamená, že nie je možné získať prístup k určitej časti systému. Okrem toho, kontrola podpisu pre firmware obrazy je tiež zabezpečená S-ON značkou.
+
+
Mám S-ON alebo S-OFF?
+
Naštartujte zariadenie do boot menu, stlačte a podržte súčasne tlačidlo na zníženie hlasitosti a tlačidlo napájania, navrchu sa zobrazí stav S-OFF alebo S-ON. Úplný root všeobecne znamená S-OFF.
+
Viac informácií môžete nájsť na www.addictivetips.com. Ďalšie S-OFF metódy od Unrevokable (v odkaze) by vás mohli zaujímať, menovite: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Riešenie
+
Podmienka: Musíte mať nainštalovaný Android SDK s ADB vo vašom PC.
+
+
Naštartujte zariadenie do boot menu, stlačte a podržte súčasne tlačidlo pre zníženie hlasitosti a tlačidlo napájania.
+
Pre označenie recovery použite tlačidlo pre zníženie hlasitosti, potom tlačidlo napájania pre nabootovanie.
+
V CWM prejdite do "partitions menu"
+
Vyberte mount /system , mount /sdcard a mount /data .
+
Pripojte k USB a otvorte príkazový riadok na počítači.
+
Zadajte adb shell and napíšte v -s /data/hosts /system/etc/hosts (Týmto vytvoríte symbolický odkaz, ktorý umožní AdAway upravovať súbor hosts v /data zatiaľ, čo OS používa súbor uložený v /system .)
+
Reštartujte zariadenie a nastavte Umiestnenie hosts súboru na /data/hosts v nastaveniach AdAway.
+
AdAway by teraz mal fungovať.
+
+
+
diff --git a/app/src/main/res/raw-sl/help_faq.html b/app/src/main/res/raw-sl/help_faq.html
new file mode 100644
index 0000000..f740908
--- /dev/null
+++ b/app/src/main/res/raw-sl/help_faq.html
@@ -0,0 +1,32 @@
+
+
+
+Pogosto postavljena vprašanja
+
+
Prihodki od oglaševanja
+
Pogosto mišljenje je, da če uporabnik nikoli ne klikne na oglas, potem blokiranje le-teh ne bo finančno oškodovalo aplikacije. Takšno mišljenje je napačno, saj imajo razvijalci prihodek tudi od prikazovanja oglasov. Ali blokirate oglase ali ne, je vaša odločitev. Osebno, aplikacij ki prikazujejo oglase, ne bi prenašal brez ad blockerja, ker znajo biti zelo nadležne.
+
+
Kako deluje AdAway?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Zakaj moram ponovno zagnati napravo, da so spremembe vidne?
+
Java na Androidu vzdržuje lastno notranje DNS pomnjenje. Operacijski sistem bo spremembe zaznal takoj (prepričajte se z uporabo ukaza ping), kljub temu pa morate napravo ponovno zagnati za ponovno izgradnjo DNS spomina Jave.
+
+
Kako uporabljati spletni strežnik v aplikaciji AdAway?
+
AdAway bo deloval tudi brez uporabe spletnega strežnika<\strong>
+
Lokalnemu spletnemu strežniku lahko v nastavitvah AdAway omogočite odgovarjanje na zahteve na lokalni naslov IP 127.0.0.1. To pomeni, da na zahteve aplikacij do oglasnih strežnikov, ki so preusmerjene na 127.0.0.1, odgovarja spletni strežnik AdAway.
+ Nekatere aplikacije nočejo delovati, ko oglasni strežniki niso dosegljivi. S to metodo bodo spet dosegljivi, odgovorili bodo s prazno stranjo in brez oglasnih slik.
+
+
Kako lahko onemogočim/dovolim specifična imena gostiteljev?
+
Dodajte imena gostiteljev, ki jih želite blokirati, na <clte>Seznam onemogočenih</clte> na <clte>začetnem zaslonu</clte>. Dodatno lahko imena gostiteljev, ki jih želite izključiti iz zaviranja, dodate na <clte>Dovoljena</clte>, imena gostiteljev, ki jih želite preusmeriti na določen naslov IP, pa spadajo na <clte>Preusmerjena</clte>.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Na particiji ni dovolj prostora
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Ne deluje na Android verziji 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Ne blokira oglasov v aplikaciji XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Pomnjeni oglasi
+
Včasih aplikacije pomnijo oglase po prenosu. To vodi k prikazovanju oglasov, kljub blokiranju. Poizkusite lahko z brisanjem pomnilnika teh aplikacij na seznamu aplikacij v nastavitvah naprave.
+
+
Aplikacije XYZ ne deluje več!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Gumb za povratek v brskalnikih ne deluje
+
Kot rešitev lahko vključite AdAway lokalni spletni strežnik v nastavitvah.
+
+
Gumb za povratek v brskalnikih ne deluje
+
Kot rešitev lahko vključite AdAway lokalni spletni strežnik v nastavitvah.
+
+
+
diff --git a/app/src/main/res/raw-sl/help_s_on_s_off.html b/app/src/main/res/raw-sl/help_s_on_s_off.html
new file mode 100644
index 0000000..55ebf80
--- /dev/null
+++ b/app/src/main/res/raw-sl/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC naprave
+
AdAway ne deluje na napravah s takoimenovano funkcijo S-ON. Ta funkcija obstaja na mnogih HTC napravah in preprečuje AdAway-u pisanje v hosts datoteko.
+
+
S-ON/S-OFF?
+
S-OFF pomeni, da je NAND del naprave odklenjen in je pisanje mogoče. Privzeta nastavitev na HTC napravah je S-ON, kar pomeni, da do nekaterih delov sistema ne morete dostopati, prav tako pa ne morate zagotoviti trajnega root dostopa. Preverjanje 'podpisov' slik programske opreme je tudi zagotovljeno z nastavitvijo S-ON.
+
+
Ali imam S-ON ali S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Rešitev
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Chrome still displays ads
+
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-sq/help_s_on_s_off.html b/app/src/main/res/raw-sq/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-sq/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
+
AdAway should work now.
+
+
+
diff --git a/app/src/main/res/raw-sr/help_faq.html b/app/src/main/res/raw-sr/help_faq.html
new file mode 100644
index 0000000..27eaafb
--- /dev/null
+++ b/app/src/main/res/raw-sr/help_faq.html
@@ -0,0 +1,32 @@
+
+
+
+Često Postavljena Pitanja
+
+
Prihodi od reklama
+
Postoji zabluda, da ukoliko korisnik nikada ne klikće na reklame, da se blokiranje istih neće negativno finansijski odraziti na stranicu ili aplikaciju. To je pogrešno jer programeri isto tako zarađuju novac samim prikazom reklama. Vaša je stvar hoćete li ili nećete blokirati reklame. Lično ne bih koristio aplikacije koje prikazuju oglase jer smatram da su vrlo iritantne, tako da bez aplikacije za sprečavanje prikaza reklama aplikacije te vrste ne bih ni instalirao.
+
+
Kako AdAway radi?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Zašto moram ponovo pokrenuti Android da bi promene imale efekta?
+
Java na Androidu održava svoju sopstvenu DNS keš. Operativni Sistem će reflektovati nove hosts fajlove odmah (verifikovati sa pingom na komandnoj liniji) ali ćete morati da restartujete Android da bi obnovili DNS keš Jave.
+
+
Kako koristiti webserver u AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Kako mogu da blokiram/odblokiram posebna imena domena
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Nema dovoljno memorije na particiji
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Ne radi na Androidu 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
Ne blokira reklame na aplikaciji XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Keširane reklame
+
Neke aplikacije keširaju reklame posle preuzimanja. Ovo dovodi do ostajanja reklama u nekim aplikacijama. Možete pokušati da uklonite keš ovih aplikacija u Androidovoj Application listi kako bi zaobišli ovaj problem
+
+
Aplikacija XYZ ne više ne radi!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
"Back" dugme u web browser-u ne radi
+
Možete omogućiti lokalni webserver u podešavanjima kao rešenje.
+
+
"Back" dugme u web browser-u ne radi
+
Možete omogućiti lokalni webserver u podešavanjima kao rešenje.
+
+
+
diff --git a/app/src/main/res/raw-sr/help_s_on_s_off.html b/app/src/main/res/raw-sr/help_s_on_s_off.html
new file mode 100644
index 0000000..2dab61b
--- /dev/null
+++ b/app/src/main/res/raw-sr/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC uređaji
+
AdAway ne radi kada koristite uređjaje sa S-ON-om. Ova "funkcija" postoji na mnogim HTC uređajima i sprečava AdAway da menja host fajl.
+
+
S-ON/S-OFF?
+
S-OFF znači da je NAND deo uređjaja otključan i da se na njega može pisati. Fabrički je podešen S-On na HTC uređajima, što znači da ne možete da pristupite pojedinim oblastima sistema niti možete da garantujete trajni "Root". Štaviše, provera potpisa za sistemske nadogradnje je takođje osiguran S-ON-om.
+
+
Da li ja imam S-ON ili S-OFF?
+
Pokrenite Boot Menu na vašem uređaju držanjem dugmeta volume down dok pritiskate dugme Power i tekst na vrhu će prikazati status S-OFF ili S-ON. Potpun "Root" obično znači S-OFF.
+
Više informacija možete pronaći na www.addictivetips.com. Dodatne S-OFF metode od Unrevokable (na linku) vas mogu zanimati, imenom: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine...
+
+
Rešenje
+
Preduslov: Morate da instalirate Android SDK sa ADB-om na vaš PC
+
+
Pokrenite "Boot Menu" na vašem uređaju držanjem volume down dugme dok pritiskate "power" dugme.
+
Koristite volume down dugme da selektujete recovery, zatim power da udjete u njega.
+
U clockwork recovery-u udjite u "partitions menu".
+
Selektujte mount /system, mount /sdcard i mount /data.
+
Priključite svoje USB kabl i zatim otvoride command line na svom računaru.
+
Otvorite adb shell i ukucajte ln -s /data/hosts /system/etc/hosts (Ovo kreira symbolic link, koji doyvoljava AdAway-u da edituje host file sačuvan u /data istovremeno dozvoljavajući OS-u da koristi fajl kao da je sačuvan u /system.)
+
Restartujte svoj uredjaj i namestite Target hosts file na /data/hosts u AdAway's podešavanjima.
Det finns en vanlig missuppfattning om att en användare som aldrig klickar på annonser inte skadar en webbsida eller applikation ekonomiskt genom att blockera annonser helt. Detta är fel, utvecklare får även betalt för att annonser visas. Det är upp till dig om du blockerar annonser eller ej. Personligen skulle jag inte använda applikationer som visar annonser eftersom jag tycker det är mycket irriterande, så utan en annonsblockerare skulle jag inte installera dessa applikationer.
+
+
Hur fungerar AdAway?
+
AdAway använder värdfilen till att blockera värdnamn som skickar ut annonser. Värdfilen är en fil du hittar i /system/etc/hosts som översätter värdnamn till IP-adresser. Det är ett vanligt sätt att definiera värdnamnet till IP-adress utan att vara beroende av domännamnsystemet (DNS). Alla oönskade värdnamn skickas till 127.0.0.1 vilket innebär att de i stället pekar till din enhet..
+Om värdfilen är skrivskyddad används en inbyggd VPN-tjänst som en reservlösning. Det filtrerar anslutningar till oönskade värdnamn och låter andra gå igenom.
+
+
Varför måste jag starta om Android för att de nya ändringarna ska träda i kraft?
+
Java i Android tar hand om sin egna interna DNS-cache. Operativsystemet kommer att återspegla den nya värdfilen direkt (du kan kontrollera det med ping på kommandoraden) men du måste starta om Android för att återskapa DNS-cachen i Java.
+
+
Hur använder man webbservern i AdAway?
+
AdAway fungerar utan att använda en webbserver!
+
Du kan aktivera en lokal webbserver i inställningarna för AdAway som kan svara på den lokala IP-adressen 127.0.0.1. Detta innebär att förfrågningar till appens annonsservrar skickas till 127.0.0.1 och i stället svarar AdAways webbserver.
+ En del applikationer vägrar fungera när annonsservern inte går att nå. Med denna metod kommer de att bli nåbara igen, men en tom sida utan annonser kommer att visas.
+
+
Hur kan jag blockera/tillåta enskilda värdnamn?
+
Lägg till värdnamn som du vill blockera till Blockerad från hemskärmen. Dessutom kan värdnamn som du vill utesluta från blockering läggas till i Tillåtna och värdnamn som du vill omdirigera till ett specifik IP-adress tillhör Omdirigerad.
+
+
diff --git a/app/src/main/res/raw-sv/help_problems.html b/app/src/main/res/raw-sv/help_problems.html
new file mode 100644
index 0000000..0660b45
--- /dev/null
+++ b/app/src/main/res/raw-sv/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Vanliga problem
+
+
Kopiering av värdfil misslyckades på Android 9+
+
På senaste versionen av Android är /system-partitionen skrivskyddad.
+Om du använder Magisk som din root-hanterare, se då till att du aktiverar modulen systemless hosts och sen startar om.
+
+
Inte tillräckligt med utrymme på partitionen
+
Försök ändra målvärdfilen i inställningar till /data/data/hosts (eller /data/hosts) och verkställ AdAway igen.
+
+
Fungerar ej på Android 4.4+
+
Se till att du inaktiverar lite mode (kallades tidigare för datasparare) från Chrome-inställningar. Den här funktionen gör det möjligt för Chrome att använda privat DNS-lösning och gå förbi AdAway.
+
+
Den blockerar inte annonser i applikationen XYZ!
+
Vissa värdnamn kan saknas i de medföljande värdfilerna från Hosts Sources eller programmet har buntat bilderna för att ge annonser utan att komma åt internet.
+YDu kan logga DNS-förfrågningar (Meny->logga DNS-förfrågningar) från AdAway för att ta reda på vilka ytterligare värdnamn som måste blockeras.
+
Lägg till misstänkta värdnamn i din egen svarta lista genom att länge trycka på posterna i loggen och rapportera dessa värdnamn när du har verifierat dem i vår GitHub issue tracker.
+
+
Cachade annonser
+
Ibland cachar applikationer sina annonser efter hämtning. Detta leder till att annonserna finns kvar i vissa applikationer. Du kan testa att rensa cache för applikationen i Androids Applista för att kringgå detta problem.
+
+
Applikation XYZ fungerar inte längre!
+
En del applikationer måste kommunicera med ett värdnamn som är blockerad av AdAway eller så vägrar de att fungera när värdnamnet som skickar annonser inte går att nå. Gå till https://github.com/AdAway/AdAway/wiki/ProblematicApps för en lista över kända applikationer som har detta problemet. Annars, ta reda på vilka värdnamn som behövs och lägg till dem till din Vitlista under Dina listor och rapportera dem till felsökaren för AdAway.
+
+
Fungerar inte på Android 4.4+
+
Prova med att ändra målvärdfilen i inställningar från /data/data/hosts till /data/hosts eller /system/etc/hosts och verkställ AdAway igen.
+
+
Bakåtknappen i webbläsaren fungerar inte
+
Du kan aktivera AdAways lokala webbserver i inställningarna för att komma förbi problemet.
+
+
+
diff --git a/app/src/main/res/raw-sv/help_s_on_s_off.html b/app/src/main/res/raw-sv/help_s_on_s_off.html
new file mode 100644
index 0000000..f65875d
--- /dev/null
+++ b/app/src/main/res/raw-sv/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON relaterad hjälp
+
+
HTC-enheter
+
AdAway fungerar inte när du använder en enhet med så kallad S-ON. Denna "egenskap" finns på många HTC-enheter och hindrar AdAway från att skriva till värdfilen.
+
+
S-ON/S-OFF?
+
S-OFF betyder att NAND-delen av enheten är upplåst och kan skrivas till. Standardvärdet för HTC-enheter är S-ON, vilket betyder att du inte har tillgång till vissa delar av systemet inte heller kan permanent root garanteras. Vidare är signaturkontroll av mjukvaruavbilder garanterad av S-ON-flaggan.
+
+
Har jag S-ON eller S-OFF?
+
Boota till boot-menyn på enheten genom att hålla nere volym ned-knappen samtidigt med på/av-knappen och texten längst upp på skärmen kommer att visa flaggans status som antingen S-OFF eller S-ON. En total rootning innebär generellt sett S-OFF.
+
Mer information kan hittas på www.addictivetips.com. Fler S-OFF-metoder sedan "Unrevokable" (i länk) kanske intresserar dig, närmare: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Tillfällig lösning
+
Förutsättning: Du måste installera en fungerade Android SDK med ADB på din PC.
+
+
Starta upp i Boot-menyn på din enhet genom att hålla in knappen volym ner medans du trycker på strömknappen.
+
Använd volym ner för att välja recovery sen ström för att starta det.
+
I clockwork recovery gå till "partitions menu".
+
Välj mount /system, mount /sdcard och mount /data.
+
Anslut din USB-kabel och öppna kommandotolken på din PC.
+
Öppna "adb shell" och skriv ln -s /data/hosts /system/etc/hosts (Detta skapar en symbolisk länk, vilket tillåter AdAway att redigera hosts-filen i /data medan operativsystemet tillåts använda filen som om den ligger i /system.)
+
Starta om din enhet och ställ in Målvärdfil till /data/hosts i AdAway's inställningar.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
பகுதிகளாகப் பிரிக்க இடம் போதாது
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
ஆண்ட்ராய்டு 4.4 மற்றும் அதற்கு மேல் வேலை செய்யாது
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ta/help_s_on_s_off.html b/app/src/main/res/raw-ta/help_s_on_s_off.html
new file mode 100644
index 0000000..e5f4f6a
--- /dev/null
+++ b/app/src/main/res/raw-ta/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC சாதனங்கள்
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
ทำไมถึงต้องรีสตาร์ทเพื่อให้มีผลเปลี่ยนแปลง?
+
Java บน Android มีแคช DNS ภายในของตัวเอง ระบบปฏิบัติการจะแสดงแฟ้ม hosts ใหม่ทันที (ตรวจสอบว่ามี ping ในบรรทัดคำสั่ง) แต่คุณจะต้องเริ่มต้นใหม่ Android เพื่อสร้างแคช DNS ของ Java
+
+
วิธีใช้เว็บเซิร์ฟเวอร์ใน AdAway
+
AdAway จะทำงานโดยไม่ใช้เว็บเซิร์ฟเวอร์!
+
คุณสามารถเปิดใช้งานเว็บเซิร์ฟเวอร์ในลักษณะที่ AdAway ต้องการเพื่อตอบรับคำขอไปยังที่อยู่ IP ในเครื่อง 127.0.0.1ซึ่งหมายถึงคำขอจากแอพฯที่ปกติจะส่งไปเว็บโฆษณาจะถูกเปลี่ยนเส้นทางไปยัง 127.0.0.1 ดังนั้นจะทำให้พวกโฆษณาจะไม่สามารถใช้งานได้
+
+
บล็อคหรือปลดบล็อคชื่อโฮสต์?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
AdAway ไม่รองรับการป้องกันโฆษณาในแอพพลิเคชั่น XYZ
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
วิธีแก้ปัญหา
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-tl/help_s_on_s_off.html b/app/src/main/res/raw-tl/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-tl/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Bir kullanıcı hiçbir reklamı zaten tıklamıyor ve reklamları engelliyorsa bunun siteyi ya da uygulamayı zarara sokmayacağı gibi bir yanlış anlaşılma var. Geliştiriciler sadece reklamları göstererek bile para kazanabiliyor. Kişisel olarak ben reklam gösteren uygulamaları kullanmam çünkü çok sinir bozucu olabiliyorlar. Bu yüzden bir reklam engelleyici olmadan bu programları yüklemem.
+
+
AdAway nasıl çalışır?
+
AdAway, reklam sunan ana makine adlarını engellemek için hosts dosyasını kullanır. Hosts dosyası, /system/etc/hosts konumunda bulunan ve ana makine adlarını IP adresleriyle eşleyen bir dosyadır. Etki Alanı Adı Sistemi'ne (DNS) dayanmadan IP adresi çiftlerine anasistem adı tanımlamanın geleneksel bir yoludur. Tüm istenmeyen ana bilgisayar adları 127.0.0.1'e yönlendirilir, bu da kendi cihazınızı gösterecekleri anlamına gelir.
+Hosts dosyası yazılabilir değilse, yerleşik VPN hizmetini kullanmak için bir yedek çözümdür. İstenmeyen ana bilgisayar adlarına bağlantıları filtreleyecek ve başkalarının geçmesine izin verecektir.
+
+
Neden değişikliklerin uygulanması için Androidi yeniden başlatmalıyım?
+
Android üzerinde Java'nın korumalı kendi iç DNS ön belleği vardır. İşletim sistemi yeni sunucu dosyasını hemen oluşturacaktır (komut satırı üzerinde ping ile doğrulanır) fakat Java DNS önbelleğinin yeniden derlenmesi için Android yeniden başlatılmalıdır.
+
+
AdAway içinde web sunucusu nasıl kullanılır?
+
AdAway, web sunucu olmadan da çalışabilmektedir!
+
Yerel IP adresinizden 127.0.0.1 gelen isteklere cevap vermek için AdAway seçeneklerinden yerel web sunucu'yu aktifleştirebilirsiniz. Bu, 127.0.0.1'e yönlendirilmiş uygulama isteklerini AdAway web sunucuları cevaplandıracaktır.
+ Bazı uygulamalar, web sunucuya ulaşılamadığında çalışmamaktadır. Bu yöntemle istek, boş ve reklamsız bir sayfa ile cevaplanır ve böylece web sunucular ulaşılabilir durumda olmaktadır.
+
+
Özel alanadlarını nasıl engelleyip/engelini kaldırabilirim?
+
Engellemek istediğiniz ana makine adlarını ana ekrandan Engellenenler listesine ekleyin. Ayrıca, engellemeden hariç tutmak istediğiniz ana makine adları İzin Verilenlere eklenebilir ve Yönlendirilen'e ait belirli bir IP adresine yönlendirmek istediğiniz ana makine adları eklenebilir.
Hosts dosyasının kopyası Android 9+ sürümünde başarısız
+
Android'in en son sürümlerinde salt okunur /system bölümü kullanılır.
+Kök erişimi çözümü olarak Magisk kullanıyorsanız, sistemsiz hosts modülünü etkinleştirdiğinizden emin olun ve yeniden başlatın.
+
+
Bölümde yeterli alan yok
+
Tercihler doğrultusunda ayarlardan hedef host kaynak dosyasını /data/data/hosts (veya /data/hosts) olarak değiştirin ve AdAway'i tekrar uygulayın.
+
+
Chrome hala reklam gösteriyor
+
Chrome ayarlarından lite modunu (daha önce veri tasarrufu olarak biliniyordu) devre dışı bıraktığınızdan emin olun. Bu özellikler Chrome'un özel DNS çözümünü kullanmasına ve AdAway'i atlatmasına olanak tanır.
+
+
XYZ! uygulamasındaki reklamları engellemez!
+
Bazı ana bilgisayar adları, Hosts Kaynaklarından sağlanan hosts dosyalarında eksik olabilir veya uygulama, internete erişmeden reklam sağlamak için görüntüleri bir araya getirmiştir.
+Hangi ek host adlarının engellenmesi gerektiğini öğrenmek için AdAway'den DNS isteklerini (Menü0->DNS İsteklerini Günlüğe Kaydet) AdAway'den kaydedebilirsiniz.
+
Günlükteki girişlere uzun süre basarak şüpheli ana makine adlarını kendi Kara Listenize ekleyin ve GitHub sorun izleyicimizde doğruladığınız zaman bu ana makine adlarını bildirin.
+
+
Önbelleğe Alınmış Reklamlar
+
Bazen yüklemeden sonra uygulamalar reklamları önbelleğe ekleyebilir. Bu bazı uygulamalarda reklam görülmesine neden olabilir. Bu uygulamaların önbelleklerini Android'in uygulama listesine giderek temizleyebilir ve bu sorunu çözebilirsiniz.
+
+
XYZ uygulaması artık çalışmıyor!
+
Bazı uygulamalar AdAway tarafından engellenmiş sunucu adlarıyla iletişim kurmalıdır, reklam servisi için kullanılan sunucu adına ulaşamazsa çalışmayı reddeder. Bu soruna sahip bilinen uygulamaların listesi için https://github.com/dschuermann/ad-away/wiki/ProblematicApps adresine bakın. Bunun dışında, hangi sunucu adlarının gerekli olduğunu bulun ve Beyazlisteye ekleyin, bu liste Listeleriniz altındadır ve AdAway'in hata izleyicisine bildirin.
+
+
Android 4.4+ sürümlerinde çalışmaz
+
Ayarlardan host kaynak dosya ayarını /data/data/hosts'dan /data/hosts ya da/system/etc/hosts'a değiştirin ve AdAway'i tekrar uygulayın.
+
+
Web tarayıcısında geri tuşu çalışmıyor
+
AdAway'in kendi yerel web sunucusunu geçici çözüm olarak tercihlerden etkinleştirebilirsiniz.
+
+
+
diff --git a/app/src/main/res/raw-tr/help_s_on_s_off.html b/app/src/main/res/raw-tr/help_s_on_s_off.html
new file mode 100644
index 0000000..1d54fba
--- /dev/null
+++ b/app/src/main/res/raw-tr/help_s_on_s_off.html
@@ -0,0 +1,33 @@
+
+
+
+S-ON ile ilgili yardım
+
+
HTC Cihazlar
+
Cihazınızda "S-ON" özelliği kullandığınızda AdAway programı çalışmaz. Bu 'özellik' bir çok HTC markalı cihazda vardır ve AdAway programının sunucu dosyasına (hosts) yazmasını engeller.
+
+
S-ON/S-OFF NEDİR?
+
S-OFF cihazınızda ki NAND bölümünün kilidinin açık olduğu ve üzerine yazılabilir olduğu anlamına gelir. HTC cihazlar için varsayılan ayar S-ON'dur, bu da hem sizin sistemin belli alanlarına erişiminizin olmadığını, hem de kalıcı bir kök erişimini garanti edemeyeceğiniz anlamına gelir. Ayrıca, cihaz yazılımı (firmware) imajları için imza kontrolü de S-ON işaretinin varlığıyla gerçekleştirilir.
+
+
Cihazım S-ON modunda mı yoksa S-OFF modunda mı?
+
Güç tuşuna basarken ses kısma tuşuna basılı tutarak cihazınızda ki Önyükleme Menüsünden önyükleme yapın ve üstteki metin S-OFF veya S-ON olarak durumunu gösterir. Tam bir kök erişimi genellikle S-OFF anlamına gelir
.
+Daha fazla bilgi www.addictivetips.com adresinde bulunabilir. Değiştirilemeyen (bağlantıda) olduğundan sonraki S-OFF yöntemleri ilginizi çekebilir: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Geçici çözüm
+
Önkoşul: Bilgisayarınıza ADB kabuğu ile çalışan bir Android SDK yüklemelisiniz.
+
+
Güç tuşuna basarken ses kısma tuşuna basılı tutarak cihazınızda ki Önyükleme Menüsünden önyükleme yapın.
+
+Kurtarma moduna geçmek için ses kısma ve güç tuşuna basarak cihazınızı başlatın.
+
Clockwork kurtarma modunda "bölümler menüsü" ne gidin.
+
+mount /system, mount /sdcard ve mount /dataseçin.
+
USB kablonuzu takın ve pc'nizde bir komut satırı açın.
+
Adb kabuğunu girin ve ln -s /data /hosts/system/etc/hosts yazın (Bu, AdAway'in /data'da saklanan sunucu dosyasını düzenlerken, İşletim Sistemi'nin dosyayı /system'da depolanmış gibi kullanmasına izin veren sembolik bir bağlantı oluşturur.)
+
Cihazınızı yeniden başlatın ve AdAway'in tercihlerinde Hedef host dosyasını /data/hosts olarak ayarlayın.
Існує одне поширене переконання, що якщо користувач ніколи не натискає на рекламу, то, заблокувавши її, він не завдасть фінансової шкоди сайту чи застосункові. Така думка хибна: розробники також заробляють гроші на самому показі реклами. Блокувати рекламу, чи ні — вирішувати вам. Особисто я не став би використовувати застосунки з рекламою, бо вона дуже дратує, тому без блокувальника реклами я б взагалі не встановлював такі застосунки.
+
+
Як працює AdAway?
+
AdAway використовує файл hosts, щоб блокувати імена хостів, які забезпечують рекламу. Файли hosts - це файл, який знаходится у /system/etc/hosts, який відображає імена хостів як IP-адреси. Це звичайний шлях, щоб визначити ім'я хоста для пар IP-адрес, не покладаючись на систему доменних імен (DNS). Всі небажані імена хостів буде перенаправлено до 127.0.0.1, що означає, що вони будуть направлені до вашого присторю.
+Якщо файл hosts неможливо редагувати, іншим рішенням є використання вбудованої служби VPN. Він буде фільтрувати з'єднання з небажаними іменами хостів і пропускати інші.
+
+
Чому треба перезавантажувати пристрій, щоб зміни вступили в силу?
+
Java в Android має свій внутрішній кеш DNS. Операційна система буде використовувати оновлений файл hosts відразу ж (можете в цьому переконатися за допомогою команди PING в командному рядку), але ви повинні перезавантажити пристрій, щоб наново створити кеш DNS в Java.
+
+
Як використовувати веб-сервер в AdAway?
+
AdAway також буде працювати без використання веб-сервера!
+
Ви можете увімкнути локальний веб-сервер в налаштуваннях AdAway, який буде відповідати на запити до локальної IP-адреси 127.0.0.1. Це означає, що всі запити застосунка до хостів з рекламою, які перенаправляються на ваш локальний IP-адрес 127.0.0.1, будуть оброблятися веб-сервером AdAway.
+ Деякі застосунки відмовляються працювати, якщо хости з рекламою не доступні. Цей метод дозволить запускати такі застосунки, але замість реклами буде пусте місце без зображень з рекламою.
+
+
Як я можу блокувати/розблоковувати конкретне ім'я хоста?
+
Імена хостів, які ви хочете заблокувати потрібно додати до Чорного списку, який знаходиться на головному екрані. Також, імена хостів, які не потрібно блокувати, потрібно додавати в Білий список, а імена хостів, які потрібно перенаправити на конкретний IP-адрес, потрібно внести в Список перенаправлень.
+
+
Де я можу знайти більше списків заблокованих хостів?
+
+
diff --git a/app/src/main/res/raw-uk/help_problems.html b/app/src/main/res/raw-uk/help_problems.html
new file mode 100644
index 0000000..ad4aba4
--- /dev/null
+++ b/app/src/main/res/raw-uk/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Часті проблеми
+
+
Не вдається скопіювати файл hosts на Android 9+
+
В останніх версіях Android розділ /system доступний лише для читання.
+Якщо у вас встановлений рут через Magisk, тоді увімкніть модуль позасистемних хостів (в налаштуваннях Magisk Manager), а потім перезавантажте пристрій.
+
+
Не вистачає місця на розділі
+
Спробуйте змінити шлях до файлу hosts в налаштуваннях на /data/data/hosts (або /data/hosts) і знову застосуйте AdAway.
+
+
Не працює на Андроїд 4.4+
+
Спробуйте змінити шлях до файлу hosts в налаштуваннях з /data/data/hosts на /data/hosts або /system/etc/hosts і знову застосуйте AdAway.
+
+
Не блокується реклама у програмі XYZ!
+
Деякі імена хостів можуть бути відсутні у файлах hosts з Джерел списків хостів, або розробник вбудував зображення-рекламу у застосунок, щоб показувати її без з'єднання з інтернетом.
+Ви можете вести журнал DNS запитів (Меню->Журналювання DNS запитів) в AdAway, щоб дізнатися, які додаткові імена хостів потрібно заблокувати.
+
Додайте підозрілі імена хостів до вашого Чорного списку довгим натисканням на запис у журналі і повідомте про ці імена після того, як ви підтвердите їх на форумі Host Inbox на сайті hosts-file.net.
+
+
Закешована реклама
+
Деякі програми кешують рекламу після завантаження. Через це реклама може залишатися в цих програмах. Ви можете спробувати видалити кеш для цих програм в списку програм Android для усунення цієї проблеми.
+
+
Програма XYZ перестала працювати!
+
Деяким програмам необхідно взаємодіяти з хостами, які блокує AdAway, для нормальної роботи. Вони відмовляються працювати, якщо імена хостів, що служать рекламою, недоступні. Дивіться перелік програм, які мають такі проблеми https://github.com/AdAway/AdAway/wiki/ProblematicApps. Для вирішення проблеми, з'ясуйте необхідні програмі імена хостів і внесіть їх у ваш Білий список в пункті меню Ваш список, після цього відправляйте повідомлення у відстежувач вад AdAway.
+
+
Кнопка «НАЗАД» у веб-браузерах не працює
+
Ви можете увімкнути локальний веб-сервер AdAway в налаштуваннях як обхідний шлях.
+
+
Кнопка «НАЗАД» у веб-браузерах не працює
+
Ви можете увімкнути локальний веб-сервер AdAway в налаштуваннях як обхідний шлях.
+
+
+
diff --git a/app/src/main/res/raw-uk/help_s_on_s_off.html b/app/src/main/res/raw-uk/help_s_on_s_off.html
new file mode 100644
index 0000000..ade25cb
--- /dev/null
+++ b/app/src/main/res/raw-uk/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Допомога стосовно S-ON
+
+
Пристрої HTC
+
AdAway не працює на пристроях, що працюють в режимі S-ON. Ця "особливість" є в багатьох пристроях HTC і не дозволяє AdAway змінювати файл hosts.
+
+
S-ON/S-OFF?
+
S-OFF означає, що частина пам'яті NAND розблокована і дозволяє проводити запис. Усталено пристрої HTC працюють у режимі S-ON, а це означає, що ви не можете отримати доступ до певних областей пам'яті. Крім того, прапорець S-ON перевіряє цифровий підпис усіх прошивок.
+
+
Чи мій пристрій працює у режимі S-ON або S-OFF?
+
Завантажтеся до Меню завантаження на пристрої, утримуючи кнопку зменшення гучності при натисканні кнопки живлення і вгорі з'явиться текст прапорця статусу — S-OFF або S-ON. Повні root права зазвичай означають S-OFF.
+
Докладнішу інформацію можна знайти на www.addictivetips.com. Вас можуть зацікавити додаткові методи створення S-OFF, наприклад, Unrevokable (у посиланні), а також: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Обхід проблеми
+
Вимога: Вам необхідно встановити робочий Android SDK з оболонкою ADB на Ваш комп'ютер.
+
+
Завантажтеся до Меню завантаження пристрою — утримуючи кнопку зменшення гучності увімкніть пристрій кнопкою живлення.
+
Використовуйте кнопку зменшення гучності, щоб вибрати режим відновлення.
+
У режимі clockwork recovery кнопкою зменшення гучності виберіть "partitions menu".
+
Виберіть mount /system, mount /sdcard та mount /data.
+
Підключіть ваш телефон до ПК через кабель USB і відкрийте вікно командного рядка на ПК.
+
Увійдіть в оболонку adb та введіть команду ln -s /data/hosts /system/etc/hosts (це створить символічне посилання, яке дозволить AdAway редагувати файл hosts, що зберігається в /data, дозволяючи операційній системі використовувати файл, мовби він був збережений в /system).
+
Перезавантажте ваш пристрій і в налаштуваннях AdAway змініть значення параметру Шлях до файлу hosts на /data/hosts.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-ur/help_s_on_s_off.html b/app/src/main/res/raw-ur/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-ur/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw-uz/help_s_on_s_off.html b/app/src/main/res/raw-uz/help_s_on_s_off.html
new file mode 100644
index 0000000..10b59ce
--- /dev/null
+++ b/app/src/main/res/raw-uz/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
Có một quan niệm cho rằng nếu người dùng không bao giờ nhấp chuột vào quảng cáo thì việc chặn chúng sẽ không làm trang web hoặc ứng dụng bị tổn thất về mặt tài chính. Điều này thật sai lầm vì các nhà phát triển cũng kiếm được tiền cho dù chỉ hiển thị quảng cáo. Việc chặn quảng cáo hay không tuỳ thuộc vào bạn. Cá nhân tôi sẽ không dùng các ứng dụng có hiển thị quảng cáo bởi vì tôi thấy chúng rất khó chịu, chính vì vậy mà khi không có phần mềm chặn quảng cáo tôi sẽ không cài đặt những ứng dụng này.
+
+
AdAway hoạt động như thế nào?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Tại sao tôi phải khởi động lại Android để thay đổi có hiệu lực?
+
Java trên Android duy trì bộ nhớ đệm DNS bên trong của chính nó. Hệ điều hành sẽ phản xạ tập tin tên miền mới ngay lập tức (xác minh nó với ping trên dòng lệnh) nhưng bạn cần khởi động lại Android để xây dựng lại bộ nhớ đệm DNS của Java.
+
+
Cách sử dụng webserver trong AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
Làm sao có thể chặn/bỏ chặn tên miền cụ thể?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
+
+
diff --git a/app/src/main/res/raw-vi/help_problems.html b/app/src/main/res/raw-vi/help_problems.html
new file mode 100644
index 0000000..0720efe
--- /dev/null
+++ b/app/src/main/res/raw-vi/help_problems.html
@@ -0,0 +1,36 @@
+
+
+
+Các vấn đề phố biến
+
+
Sao chép tệp miền thất bại trên Android 9+
+
Các phiên bản mới nhất của Android sử dụng phân vùng /system chỉ đọc.
+Nếu bạn đang root bằng Magisk, hãy đảm bảo rằng bạn bật mô-đun systemless hosts và khởi động lại.
+
+
Không đủ dung lượng trên phân vùng
+
Hãy thử đổi tệp miền mục tiêu trong cài đặt thành /data/data/hosts (hoặc /data/hosts) và áp dụng lại AdAway.
+
+
Chrome vẫn hiển thị quảng cáo
+
Hãy đảm bảo bạn tắt chế độ lite (trước kia được biết đến là trình tiết kiệm dữ liệu) trong cài đặt của Chrome. Tính năng này cho phép Chrome sử dụng giải pháp DNS riêng và vượt qua AdAway.
+
+
Nó không chặn quảng cáo trong ứng dụng XYZ!
+
Một số tên miền có thể bị thiếu trong các tệp miền được cung cấp từ Nguồn miền hoặc ứng dụng đó đã tích hợp các hình ảnh để cung cấp quảng cáo mà không truy cập internet.
+Bạn có thể ghi nhật ký các yêu cầu DNS (Menu->Ghi nhật ký các yêu cầu DNS) từ AdAway để tìm xem những tên miền bổ sung nào cần phải bị chặn.
+
Thêm các tên miền đáng nghi vào Danh sách đen của bạn bằng cách nhấn giữ các mục trong Nhật ký và báo cáo những tên miền đó khi bạn đã xác minh chúng trong trình theo dõi vấn đề trên GitHub của chúng tôi.
+
+
Các quảng cáo đã tạm lưu
+
Đôi lúc ứng dụng lưu giữ quảng cáo sau khi tải về. Điều này dẫn đến quảng cáo vẫn tồn tại trong một vài ứng dụng. Bạn có thể thử xoá bộ nhớ đệm của những ứng dụng này trong danh sách Ứng dụng của Android để ngăn chặn tình trạng này.
+
+
Ứng dụng XYZ không còn hoạt động nữa!
+
Một số ứng dụng cần giao tiếp với tên miền bị AdAway chặn hoặc từ chối hoạt động khi không truy cập được các tên miền phục vụ quảng cáo. Hãy xem https://github.com/dschuermann/ad-away/wiki/ProblematicApps để xem danh sách các ứng dụng có vấn đề đã biết. Nếu không, hãy tìm hiểu xem những tên miền nào được cần đến và thêm chúng vào Danh sách trắng dưới Danh sách của bạn và báo cáo chúng trong trình theo dõi lỗi của AdAway.
+
+
Không hoạt động trên Android 4.4+
+
Hãy thử đổi tệp miền mục tiêu trong cài đặt từ /data/data/hosts thành /data/hosts hoặc /system/etc/hosts và áp dụng lại AdAway.
+
+
Nút trở về trên trình duyệt hiện không hoạt động
+
Bạn có thể bật webserver cục bộ của AdAway trong tuỳ chỉnh để giải quyết.
+
+
+
diff --git a/app/src/main/res/raw-vi/help_s_on_s_off.html b/app/src/main/res/raw-vi/help_s_on_s_off.html
new file mode 100644
index 0000000..ffe2b0d
--- /dev/null
+++ b/app/src/main/res/raw-vi/help_s_on_s_off.html
@@ -0,0 +1,31 @@
+
+
+
+Trợ giúp liên quan đến S-ON
+
+
Các thiết bị HTC
+
AdAway sẽ không hoạt động khi thiết bị bạn đang sử dụng có S-ON. "Tính năng" này hiện hữu trên nhiều thiết bị HTC và ngăn không cho AdAway ghi tập tin tên miền.
+
+
S-ON/S-OFF?
+
S-OFF có nghĩa là bộ phận NAND của thiết bị được mở khoá và có thể được ghi đè. Cài đặt mặc định cho các thiết bị HTC là S-ON, nghĩa là bạn không thể truy cập một số khu vực cụ thể của hệ thống lẫn khả năng root máy vĩnh viễn. Hơn nữa, việc kiểm tra chữ ký cho các ảnh phần cứng cũng bị hạn chế bởi cờ S-ON.
+
+
Thiết bị của tôi là S-ON hay S-OFF?
+
Khởi động vào Boot Menu trên thiết bị của bạn và giữ nút giảm âm lượng đồng thời với nút nguồn và phần văn bản ở phía trên sẽ hiển thị trạng thái flag là S-OFF hoặc S-ON. Root đầy đủ thường có nghĩa là S-OFF.
+
Thông tin thêm có thể được tìm thấy tại www.addictivetips.com. Bổ sung một số cách S-OFF do không thể bị thu hồi (ở link) có thể làm bạn quan tâm, cụ thể: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Giải pháp
+
Điều kiện tiên quyết: Bạn cần phải cài đặt Android SDK với shell ADB trên PC của bạn.
+
+
Khởi động vào Boot Menu trên thiết bị của bạn và giữ nút giảm âm lượng đồng thời với nút nguồn
+
Sử dụng giảm âm lượng để chọn recovery rồi nguồn để khởi động nó.
+
Trong clockwork recovery, đi đến "menu phân vùng".
+
Chọn mount /system, mount /sdcard và mount /data.
+
Cắm dây USB và mở một dòng lệnh trên PC.
+
Nhập adb shell và đánh vào ln -s /data/hosts /system/etc/hosts (Việc này sẽ tạo một liên kết biểu tượng, nó cho phép AdAway chỉnh sửa tệp miền được lưu trữ trong /data trong khi cũng cho phép HĐH sử dụng tệp đó như thể nó được lưu trữ trong /system.)
+
Khởi động lại thiết bị và đặt Tệp miền mục tiêu thành /data/hosts trong cài đặt của AdAway.
Android 上的 Java 运行时会维护一份内部 DNS 缓存。新增的 hosts 文件内容将会立即生效(可在命令行中使用 ping 验证),但若要使对已有 hosts 条目的修改生效,需要重启 Android 系统以重建 Java 的 DNS 缓存。
+
+
如何在 AdAway 里使用 Web 服务器?
+
即使不使用 Web 服务器功能,AdAway 也能正常工作!
+
你可以在 AdAway 的设置里启用一个本地的 Web 服务器以响应对本地 IP 地址127.0.0.1的请求。对于那些 IP 地址被重定向到127.0.0.1的广告服务器,这意味着 AdAway 的 Web 服务器会代广告服务器响应对它们的请求。
+ 当不能访问广告服务器的时候,一些应用会拒绝正常运行。借助这个功能,广告服务器就又可以被这些应用“访问”了——但它们没有访问到真正的广告服务器,依旧没法获取到广告图片之类的东西,而是只能收到一个空白页面。
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
保证你已经从 Chrome 的设置中禁用了轻量模式(以前叫做节省数据)。启用此功能后,Chrome 会使用私人 DNS 绕过 AdAway。
+
+
它不会阻止应用 XYZ 中的广告!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in the Forum Hosts Inbox of hosts-file.net.
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
解决方案
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
插入USB线并在电脑上打开命令行。
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
There is an oft-stated misconception that if a user never clicks on ads, then blocking them won't hurt a site or application financially. This is wrong, developers also earn money by just displaying ads. It is up to you whether you block ads or not. Personally I would not use applications that display ads because I find them very annoying, so without an ad blocker I would not install these applications.
+
+
How does AdAway work?
+
AdAway uses the hosts file to block hostnames, that serve advertisements. The hosts file is a file found in /system/etc/hosts that maps hostnames to IP addresses. It is a traditional way to define hostname to IP address pairs without relying on the Domain Name System (DNS). All unwanted hostnames are redirected to 127.0.0.1 which means they will point to your own device.
+If the hosts file is not writable, a fallback solution is to use the builtin VPN service. It will filter connections to unwanted hostnames and let others go through.
+
+
Why do I have to restart Android for changes to take effect?
+
Java on Android maintains its own internal DNS cache. The operating system will reflect the new hosts file immediately (verify that with ping on the command line) but you'll need to restart Android to rebuild the DNS cache of Java.
+
+
How to use the webserver in AdAway?
+
AdAway will also work without using the webserver!
+
You can enable a local webserver in preferences of AdAway to answer requests to the local IP address 127.0.0.1. This means requests from applications to ad servers which are redirected to 127.0.0.1 are answered by AdAway's webserver.
+ Some applications refuse to work, when ad servers are not reachable. With this method they will be reachable again, replying with a blank page and no ad images.
+
+
How can I block/unblock specific hostnames?
+
Add the hostnames you want to block to the Blocked list from thehomescreen. Additionally, hostnames you want to exclude from blocking can be added to the Allowed and hostnames you want to redirect to a specific IP address belong to the Redirected.
Latest versions of Android use read-only /system partition.
+If you are using Magisk as root solution, ensure you enable the systemless hosts module then reboot.
+
+
Not enough space on partition
+
Try changing the target hosts file in preferences to /data/data/hosts (or /data/hosts) and apply AdAway again.
+
+
Chrome still displays ads
+
Ensure you disable lite mode (previously known as data saver) from Chrome settings. This features allows Chrome to use private DNS solution and bypass AdAway.
+
+
It does not block ads in application XYZ!
+
Some hostnames may be missing in the provided hosts files from the Hosts Sources or the application has bundled the images to provide ads without accessing the internet.
+You can log DNS requests (Menu->Log DNS Requests) from AdAway to find out which additional hostnames have to be blocked.
+
Add the suspicious hostnames to your own Blacklist by long pressing the entries in the Log and report these hostnames when you have verified them in our GitHub issue tracker.
+
+
Cached Advertisements
+
Sometimes applications cache advertisements after download. This leads to remaining advertisements in some applications. You can try to delete the cache for these applications in Android's Application list to circumvent this problem.
+
+
Application XYZ is not working anymore!
+
Some applications need to communicate with a hostname that is blocked by AdAway or refuse to work when the hostnames which should serve ads are not reachable. See https://github.com/AdAway/AdAway/wiki/ProblematicApps to get a list of known applications that have problems. Otherwise, find out which hostnames are needed and add them to your Whitelist under Your Lists and report them to the bug tracker of AdAway.
+
+
Does not work on Android 4.4+
+
Try changing the target hosts file in preferences from /data/data/hosts to /data/hosts or /system/etc/hosts and apply AdAway again.
+
+
The back button in web browsers is not working
+
You can enable AdAway's local webserver in preferences as a workaround.
+
+
+
diff --git a/app/src/main/res/raw/help_s_on_s_off.html b/app/src/main/res/raw/help_s_on_s_off.html
new file mode 100644
index 0000000..1c02e45
--- /dev/null
+++ b/app/src/main/res/raw/help_s_on_s_off.html
@@ -0,0 +1,32 @@
+
+
+
+S-ON related help
+
+
HTC Devices
+
AdAway does not work when you are using a device with so called S-ON. This 'feature' exists on many HTC devices and prevents AdAway from writing the hosts file.
+
+
S-ON/S-OFF?
+
S-OFF means that the NAND portion of the device is unlocked and can be written to. The default setting for HTC devices is S-ON, which means that neither can you access certain areas of the system nor can you guarantee a permanent root. Furthermore, signature check for firmware images is also ensured by the S-ON flag.
+
+
Do I have S-ON or S-OFF?
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power and the text on top will show the flag status as either S-OFF or S-ON. A full root generally means S-OFF.
+
More information can be found on www.addictivetips.com. Additional S-OFF methods since Unrevokable (in link) might interest you, namely: Revolutionary, Revone, Firewater, RumRunner, Moonshine, SunShine…
+
+
Workaround
+
Prerequisite: You have to install a working Android SDK with ADB shell on your PC.
+
+
+
Boot into the Boot Menu on your device by holding down volume down button while pressing power.
+
Use volume down to select recovery then power to boot it.
+
In clockwork recovery go to "partitions menu".
+
Select mount /system, mount /sdcard and mount /data.
+
Plug in your USB cord and open a command line on your pc.
+
Enter adb shell and type ln -s /data/hosts /system/etc/hosts (This creates a symbolic link, which allows AdAway to edit the hosts file stored in /data while allowing the OS to use the file as if it were stored in /system.)
+
Reboot your device and set Target hosts file to /data/hosts in AdAway's preferences.
+
AdAway should work now.
+
+
+
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
new file mode 100644
index 0000000..6f410ae
--- /dev/null
+++ b/app/src/main/res/values-af/strings.xml
@@ -0,0 +1,97 @@
+
+
+
+ Gaan uit
+ Maak toe
+ Ja
+ Nnn
+ Voeg by
+ Kanselleer
+ Stoor
+ Help
+
+ Alle gas lêers van die omskrewe bronne word afgelaai, en geïntegreer met jou eie lys en dan as een lys geinstalleer in jou sisteem.
+ Aktiveer webbediener
+
+ Redigeer Inskrywing
+ Redigeer
+ Vee uit
+
+
+ Besig met invoering…
+ Besig met Uitvoer…
+ Skep standaard gasheer lêer
+ Opdatering beskikbaar
+ Nuwer Gasheer lêers is beskikbaar
+ Geen internet konneksie
+ Geen internet konneksie beskikbaar nie
+ Bronne nie beskikbaar
+ Geen gasheer bronne bereikbaar nie!
+ Geaktiveer
+ Nuutste Gasheer lêers geaktiveer
+ Afgeskakel
+ Simskakel ontbreek
+ Nie genoeg spasie nie
+ Afgelaaide lêer kon nie gelees word nie.
+ Privaat lêer het misluk
+ Toegang tot partisie as lees/skryf het misluk!
+ Koppeling het misluk
+ Kopieer van gasheer lêers het misluk
+ Kopieering het misluk
+ Toepassing was suksesvol
+ Skep van Simskakel was suksesvol
+ Simskakel skepping het misluk
+ Lees asb. help vir meer informasie.
+ APN volmag gestel!
+ Die internet konneksie werk nie
+ Geen konneksie
+ Besig om af te laai…
+ Besig met toepassing…
+ Witlys en Swartlys word toegepas
+ Besig met ontleding en samesmelting van gas lêers
+ Besig om gas lêers te bou
+ Besig om gas lêers toe te pas
+ Toepassing het misluk
+ Terugkering suksesvol
+ Ommekeer het misluk vir onbekende redes.
+ Terugkeer het misluk!
+ Geen van jou geaktiveerde gasheer bronne is beskikbaar nie! Is jy behoorlik gekoppel aan die internet?
+ Aflaai het misluk
+ Private lêer kan nie geskep word nie.
+ Skep van Privaat Lêer het misluk
+
+ Voeg BA by gas lêer:
+ Hierdie is nie \'n geldige gasheer naam nie!
+ Foutief geformateerde gasheernaam
+ Nie \'n geldige IP nie!
+ Foutief geformateerde IP
+ Besig om te laai…
+
+
+ Verfris
+ Voeg by
+ Help
+
+ S-ON/S-OFF
+ Vrae
+ Probleme
+
+
+ Ad Blokkeerder
+ Geen teks redigeerder geïnstalleer nie
+ Geen lêerbestuurder geinstalleer
+ Tcpdump is \'n hulpmiddel om DNS versoeke te moniteer en in \'n Log lêer te stoor. Jy kan dit in die agtergrond begin, gebruik dan programme wat advertensie vertoon en ontleed die DNS dan na die tyd, deur die log lêer te gebruik. Moontlike advertensie bedieners kan dan na die tyd by jou swartlys gevoeg word.
+
+
+ Home
+ Gaste bronne
+ Your lists
+ Maak Gasheer lêer oop
+ Log DNS requests
+ Scan for adware
+ Voorkeure
+ Help
+
+ Voorkeure
+
+
diff --git a/app/src/main/res/values-af/strings_app.xml b/app/src/main/res/values-af/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-af/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-af/strings_errors.xml b/app/src/main/res/values-af/strings_errors.xml
new file mode 100644
index 0000000..4b3f294
--- /dev/null
+++ b/app/src/main/res/values-af/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ Geen internet konneksie
+ Nie genoeg spasie nie
+
\ No newline at end of file
diff --git a/app/src/main/res/values-af/strings_home.xml b/app/src/main/res/values-af/strings_home.xml
new file mode 100644
index 0000000..a17dd0c
--- /dev/null
+++ b/app/src/main/res/values-af/strings_home.xml
@@ -0,0 +1,9 @@
+
+
+
+ Voorkeure
+
+
+ Lees asb. help vir meer informasie.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-af/strings_hosts.xml b/app/src/main/res/values-af/strings_hosts.xml
new file mode 100644
index 0000000..b937898
--- /dev/null
+++ b/app/src/main/res/values-af/strings_hosts.xml
@@ -0,0 +1,6 @@
+
+
+ Gaste bronne
+
+ nie beskikbaar nie
+
diff --git a/app/src/main/res/values-af/strings_lists.xml b/app/src/main/res/values-af/strings_lists.xml
new file mode 100644
index 0000000..671c808
--- /dev/null
+++ b/app/src/main/res/values-af/strings_lists.xml
@@ -0,0 +1,6 @@
+
+
+ Your lists
+ Gasheer naam:
+ IP (IPv4 of IPv6):
+
diff --git a/app/src/main/res/values-af/strings_log.xml b/app/src/main/res/values-af/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-af/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-af/strings_notification.xml b/app/src/main/res/values-af/strings_notification.xml
new file mode 100644
index 0000000..dae9c3d
--- /dev/null
+++ b/app/src/main/res/values-af/strings_notification.xml
@@ -0,0 +1,4 @@
+
+
+ Opdatering beskikbaar
+
\ No newline at end of file
diff --git a/app/src/main/res/values-af/strings_prefs_backup_restore.xml b/app/src/main/res/values-af/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-af/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-af/strings_prefs_main.xml b/app/src/main/res/values-af/strings_prefs_main.xml
new file mode 100644
index 0000000..63f8b17
--- /dev/null
+++ b/app/src/main/res/values-af/strings_prefs_main.xml
@@ -0,0 +1,6 @@
+
+
+ Voorkeure
+
+ Herstel foute
+
diff --git a/app/src/main/res/values-af/strings_prefs_root.xml b/app/src/main/res/values-af/strings_prefs_root.xml
new file mode 100644
index 0000000..2277b9d
--- /dev/null
+++ b/app/src/main/res/values-af/strings_prefs_root.xml
@@ -0,0 +1,19 @@
+
+
+ Maak Gasheer lêer oop
+ Teiken Gasheer lêers
+ Voordat jy hierdie instelling verander lees Hulp aangaande die funksie.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Doelwit teiken
+
+ Doelwit teiken
+ Versteek her-aansit dialoog
+
+ Herleiding
+
+ Plaaslike Webbediener
+ Aktiveer webbediener
+
diff --git a/app/src/main/res/values-af/strings_prefs_update.xml b/app/src/main/res/values-af/strings_prefs_update.xml
new file mode 100644
index 0000000..bd3f605
--- /dev/null
+++ b/app/src/main/res/values-af/strings_prefs_update.xml
@@ -0,0 +1,5 @@
+
+
+ Kyk daagliks vir opdaterings
+ Kyk daagliks vir opdaterings
+
diff --git a/app/src/main/res/values-af/strings_prefs_vpn.xml b/app/src/main/res/values-af/strings_prefs_vpn.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-af/strings_prefs_vpn.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-af/strings_support.xml b/app/src/main/res/values-af/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-af/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-af/strings_update.xml b/app/src/main/res/values-af/strings_update.xml
new file mode 100644
index 0000000..10b7513
--- /dev/null
+++ b/app/src/main/res/values-af/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ Opdatering beskikbaar
+
diff --git a/app/src/main/res/values-af/strings_welcome.xml b/app/src/main/res/values-af/strings_welcome.xml
new file mode 100644
index 0000000..60aadf6
--- /dev/null
+++ b/app/src/main/res/values-af/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ Kern beskikbare (rooted) Android benodig
+
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
new file mode 100644
index 0000000..29c6aed
--- /dev/null
+++ b/app/src/main/res/values-ar/strings.xml
@@ -0,0 +1,279 @@
+
+
+
+ خروج
+ إغلاق
+ نعم
+ لا
+ إضافة
+ إلغاء
+ حفظ
+ المساعدة
+
+
+ مرحباً!
+ AdAway هو تصميم برامج مجاني ومفتوح المصدر لمنع الإعلانات. إنه يجلب عناوين الشبكات الإعلانية لمنعها من الظهور على جهازك. \nهل تود معرفة المزيد؟ يرجى رؤية المساعدة أدناه!
+ إظهار المزيد من المساعدة
+ حالة التحديث
+ جميع ملفات المضيف ستحمل و ستدمج مع قوائمك و ستثبت في ملف واحد على نظامك.
+ تشغيل حجب الإعلانات
+ إيقاف حجب الإعلانات
+ خادم الويب
+ يعمل
+ موقوف
+ بدء أو إيقاف خادم الويب على المضيف المحلي للرد على طلبات أسماء المضيفين المحظورة.
+ تشغيل خادم الويب
+ إيقاف خادم الويب
+ في بي إن
+ تشغيل
+ توقفت
+ تشغيل أو إيقاف VPN لتصفية الطلبات
+ تفعيل VPN
+ إيقاف VPN
+
+
+ تحرير المدخلة
+ تنفيذ
+ تحرير
+ حذف
+
+
+ استيراد…
+ تم ادخال النسخة الاحتياطية من الذاكرة الخارجية بنجاح.
+ فشل ادخال النسخة الاحتياطية,هل هي بالصيغة الصحيحة؟
+تفقد السجل لمزيد من المعلومات.
+ تصدير…
+ تم أخذ النسخة الإحتياطية بنجاح وتصديرها للملف %sعلى وسيط التخزين الخارجي الخاص بك
+ تعذر تصدير ملف نسخة إحتياطية %s
+
+
+ ملف المضيف
+ ملف المضيف هو ملف نظام يقوم بربط أسماء المضيف مع عناوين الإنترنت بروتوكول .إنه عبارة عن ملف نصّي ويهتم AdAway به ويقوم بإعداده. تبدو بعض الخطوط الأولى فيه كما يلي:
+ جارٍ تحميل محتوى ملف المضيف…
+ فتح ملف المضيف
+
+
+ التأكد من التحديثات
+ جاري تفقد مصدر %sللبحث عن تحديثات
+ جلب المصادر
+ تحميل المصدر %s
+ جاري قراءة المصدر %s
+ جاري نسخ المصدر %s
+ جاري مزامنة قاعدة البيانات
+ إستعادة إعدادات ملف hosts الإفتراضية
+ إستعادة ملف hosts الإفتراضي اكتمل
+ إنشاء ملفات المضيف الأساسية
+ يوجد تحديث متوفر
+ ملفات المضيف الجديدة متوفرة
+ لم يعثر على تحديث للمصدر
+ غير متصل بالشبكة
+ لا يوجد اتصال بالشبكة متوفر
+ الملقمات غير متوفرة
+ لا يمكن الوصول إلى مصادر المضيف!
+ صلاحيات الرووت مرفوضة.
+ اسمح لصلاحيات الرووت من البرنامج المسؤول عن الرووت؟
+ حدث خطأٌ ما
+ للمزيد من المعلومات يرجى التحقّق من الـ logcat
+ مفعل
+ ملفات المضيف الحديثة مفعلة
+ معطل
+ ملف المضيف الإفتراضي مُثبّت
+ تطبيق آحدث المصادر
+ تكوين ملف hosts جديد
+ نسخ ملف hosts جديد
+ التأكد من نسخ ملف hosts
+ تم تحديث ملف hosts بنجاح
+ تم تحديث تكوين في بي إن بنجاح
+ تم تغيير التكوين الخاص بك. تحتاج إلى تطبيقه.
+ تنفيذ
+ جارِ تثبيت ملف المضيف…
+ فشل في تثبيت ملف المضيفات
+
+
+ الارتباط الرمزي إلى هدف ملف المضيفين مفقود
+ symlink من مسارك الى /system/etc/hosts غير موجود او غير صحيح . البرنامج لن يعمل اذا لم يتم تحديد الملف الصحيح . هل تريد محاولة انشاء symlink ؟
+ الارتباط الرمزي مفقود
+ لا توجد مساحة كافية على القرص حاول تغيير المسار من الاعدادت الى /data/data/hosts
+ لا توجد مساحة كافية
+ لا يمكن قراءة الملف الذي تم تنزيله.
+ فشل الملف الخاص
+ فشل تحويل القسم لوضع القراءة/الكتابة!
+ فشل التحويل
+ فشل نسخ ملف المضيفين
+ فشل نسخ ملفات المضيف!
+ فشل النسخ
+ مصادر المضيف المطبّقة
+ تم التنفيذ بنجاح
+ تم التثبيت بنجاح. \nيستوجب إعادة تشغيل الجهاز الآن. \n\nهل تريد إعادة تشغيل جهازك؟ \n(يرجى التأكد من عدم وجود تطبيقات تستخدم بطاقة الذاكرة الآن لتجنّب فقدان أي معلومات!)
+ تم إنشاء الرابط الرمزي بنجاح. \nيستوجب إعادة تشغيل الجهاز الآن. \n\nهل تريد إعادة تشغيل جهازك؟ \n(يرجى التأكد من عدم وجود تطبيقات تستخدم بطاقة الذاكرة الآن لتجنّب فقدان أي معلومات!)
+ الارتباط الرمزي أنشئ بنجاح
+ تعذر إنشاء الوصلة اللينة Symlink بواسطة Android.\n وهذا الفشل غالبًا بسبب \"ميزة\" تُعرف باسم S-ON على HTC هواتف!\n\n الحل هو تشغيل الهاتف في وضع الاسترداد وإنشاء الرابط الترافقي Symlink هناك باستخدام \'ln -s /data/data/hosts /system/etc/hosts\'.\n\n إذا لم يعمل ذلك ، ابحث في الإنترنت عن S-OFF وكذلك في هاتفك.
+ الارتباط الرمزي لم ينشئ
+ يرجى قراءة التعليمات للمزيد من المعلومات.
+ تم تعيين بروكسي APN على جهاز Android الخاص بك! \ n لن تعمل ميزة ADAway بشكل موثوق به عندما تكون على شبكات المحمول مثل 3G. يمكنك إلغاء تنشيط هذا الوكيل بالانتقال إلى APN المحدد (من تطبيق الإعدادات: الشبكة & الإنترنت-> شبكة الهاتف المحمول-> خيارات متقدمة-> أسماء نقاط الوصول) وإزالة القيمة في حقل خادم الوكيل.
+ تعيين وكيل APN!
+ الاتصال بالشبكة لا يعمل
+ غير متصل
+ جارٍ التحميل…
+ يتم التنفيذ…
+ تنفيذ القائمة السوداء والبيضاء
+ تحليل ودمج ملفات المضيف
+ بناء ملفات المضيف
+ تنفيذ ملفات المضيف
+ فشل في تطبيق ملف المضيفين الجديد.
+ لقد فشلت عملية تثبيت ملفات المضيف! حاول تغيير مسار الملفات من الاعدادات الى /data/data/hosts
+ فشل التنفيذ
+ الرجاء تفقد برنامج ادارة الرووت للتأكد من أن صلاحيات الرووت مسموحة.
+ تم استرجاع ملف المضيف الإفتراضي. \nيستوجب إعادة تشغيل الجهاز الآن. \n\nهل تريد إعادة تشغيل جهازك؟ \n(يرجى التأكد من عدم وجود تطبيقات تستخدم بطاقة الذاكرة الآن لتجنّب فقدان أي معلومات!)
+ تم الاسترجاع
+ غير قادر على إعادة ملف المضيفين
+ الاسترجاع فشل لأسباب غير معروفة.
+ فشل الاسترجاع!
+ مصادر المضيف لا يمكن الوصول إليها! هل أنت متصل بالإنترنت؟
+ فشل التحميل
+ فشل كتابة ملف مضيفين خاصين جدد
+ لا يمكن إنشاء ملف خاص.
+ فشل إنشاء ملف خاص
+ تم تفعيل الوضع اللّانظامي. \nيستوجب إعادة تشغيل الجهاز الآن. \n\nهل تريد إعادة تشغيل جهازك؟ \n(يرجى التأكد من عدم وجود تطبيقات تستخدم بطاقة الذاكرة الآن لتجنّب فقدان أي معلومات!)
+ تم التنفيذ بنجاح
+ تم تعطيل الوضع اللّانظامي. \nيستوجب إعادة تشغيل الجهاز الآن. \n\nهل تريد إعادة تشغيل جهازك؟ \n(يرجى التأكد من عدم وجود تطبيقات تستخدم بطاقة الذاكرة الآن لتجنّب فقدان أي معلومات!)
+ تم التعطيل بنجاح
+ تعذر عن تفعيل إعلانات VPN
+ تعذر عن إيقاف إعلانات VPN
+ تمكين وحدة Magisk المضيفة
+ تمكين ميزة المضيفين بدون نظام من Magisk manager. من إعداداته ، قم بتمكين خيار Hostless hosts ثم أعد تشغيل جهازك.
+ تعطيل وحدة Magisk المضيفة
+ تعطيل ميزة المضيفين بدون نظام من Magisk manager. من قائمة الوحدات ، قم بإلغاء تثبيت وحدة Systemless hosts ، ثم أعد تشغيل جهازك.
+
+
+ أدخل عنوان URL لملفات المضيف:
+ اسم الموقع غير صالح!
+ صيغة اسم المضيف غير صحيحية
+ IP غير صالح!
+ صيغة IP غير صحيحة
+ لا تـقـم بإعادة التشغيل وعدم إظهار هذا السؤال في المرة القادمة!
+ تحميل…
+
+
+ تحديث
+ إضافة
+ المساعدة
+ استرجاع النسخة الاحتياطية.
+ استخراج نسخة احتياطية.
+
+
+ S-ON/S-OFF
+ الأسئلة الشائعة
+ المشاكل
+
+
+ الإعلانات المُتسلّلة
+ هنا يمكنك العثور على تطبيقات Adware مثبّتة ، وهي تطبيقات سيئة لا يمكن منعها من قِبَل AdAway . على سبيل المثال تستخدم هذه التطبيقات إشعارات Airpush التي تظهر حتى عند عدم تشغيل التطبيق وتستطيع حتى تغيير نغمة الرنين لجهازك . الحل الوحيد هو حذف هذه التطبيقات التي عُثِرَ عليها من خلال النقر على أسماء التطبيقات في الأسفل .
+ جارٍ الفحص
+ لم يتم العثور على إعلانات مُتسلّلة!
+
+
+ حاجب الإعلانات
+ لا يوجد محرر نصوص مثبت
+ تعذر العثور على محرر نصوص لفتح ملف المضيف. يمكنك تثبيت محرر النصوص JOTA او اي محرر نصوص اخر لتجاوز هذا. هل تريد تثبيت JOTA ؟
+ لا يوجد مدير ملفات مثبت
+ تعذر العثور على مدير ملفات لفتح الملف. يمكنك تثبيت مدير ملفات OI او أي مدير ملفات اخر لتجاوز هذا. هل تريد تثبيت OI؟
+
+
+ Tcpdump
+ Tcpdump هي أداة لمراقبة طلبات DNS وحفظها في ملف سجل. يمكنكم تشغيله في الخلفية، ثم تشغيل التطبيقات التي تعرض الإعلانات على الشاشة، بعد ذلك سيتم تحليل طلبات DNS باستخدام ملف السجل.الأن يمكن إضافة مصدر الإعلانات إلى قائمتك السوداء.
+ إيقاف المُراقبة
+ تشغيل المُراقبة
+ عرض النتائج
+ ترتيب الـ domains
+ محي السّجلّ
+ إضافة المُدخَل للقائمة السوداء
+ إضافة المُدخَل للقائمة البيضاء
+ إضافة المُدخَل إلى قائمة إعادة التوجيه
+
+ تحرير قيمة إعدادات النص
+ فتح القائمة
+ إغلاق القائمة
+
+
+
+ الصفحة الرئيسية
+ مصادر المضيف
+ قوائمك
+ فتح ملفات المضيف
+ سجل طلبات الDNS
+ البحث عن البرامج الداعمة للإعلانات
+ الخيارات
+ المساعدة
+
+
+
+
+ طلبات DNS
+ قوائمك
+ الخيارات
+
+
+ تم تنصيبه قبل %1$s
+ حالي لـ %1$s
+ مطلوب تحديث لـ %1$s
+ آخر تحديث قبل %1$s
+ حالة تحديث غير معروفة
+ معطل
+ بضع دقائق
+
+ إنتهى تقريبا%d
+ دقيقة %d
+ دقيقتان %d
+ القليل %d
+ دقائق %d
+ دقائق %d
+
+
+ إنتهى تقريبا%d
+ ساعة %d
+ ساعتان %d
+ ساعات %d
+ الساعات %d
+ الساعات %d
+
+
+ إنتهى تقريبا %d
+ يوم %d
+ يومان %d
+ بعض الايام %d
+ ايام %d
+ ايام %d
+
+
+ انتهى تقريبا %d
+ شهر واحد %d
+ شهران %d
+ أشهُر %d
+ أشهُر %d
+ أشهُر %d
+
+
+
+ تم نسخ المضيف إلى الحافظة
+
+
+ تشغيل
+ فعال
+ جاري الإيقاف
+ بإنتظار شبكة
+ إعادة الإتصال
+ خطأ بإعادة الإتصال
+ متوقف مؤقتا
+ متوقف
+ إيقاف إعلانات VPN %1$s
+ إيقاف مؤقت
+ إستئناف
+
+
+ صلاحيات AdAway
+ السماح لـ AdAway بالوصول لـ
+ أرسل الأوامر لـ AdAway
+ السماح بإرسال أوامر إلى AdAway مثل تمكين أو تعطيل حظر الإعلانات على مستوى النظام
+
+
diff --git a/app/src/main/res/values-ar/strings_app.xml b/app/src/main/res/values-ar/strings_app.xml
new file mode 100644
index 0000000..6d25748
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ آدواي AdAway
+ مانع إعلانات مفتوح المصدر
+ أيقونة AdAway
+
diff --git a/app/src/main/res/values-ar/strings_errors.xml b/app/src/main/res/values-ar/strings_errors.xml
new file mode 100644
index 0000000..b46c088
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ غير متصل بالشبكة
+ تعذر إنشاء اتصال بالإنترنت. يرجى التحقق من اتصال جهازك.
+ فشل تحميل مصدر المضيفين
+ لا يمكن الوصول إلى أي من مصادر المضيفين المفعلة. يرجى التحقق من أنك متصل بشكل صحيح بالإنترنت.
+
+ فشل إنشاء ملف خاص
+ تعذر إنشاء ملف خاص لبناء مصدر مضيف جديد. يرجى التحقق من المساحة الخالية المتوفرة على جهازك.
+ لا توجد مساحة كافية
+ تعذر نسخ ملف المضيفين إلى قسم النظام لديك. يرجى التحقق من تمكين Magisk systemless module ثم إعادة التشغيل.
+ فشل تثبيت ملف المضيفين الجديد
+ تعذر نسخ ملف المضيفين إلى / قسم النظام. يرجى التحقق من تمكين Magisk systemless module ثم إعادة التشغيل.
+ فشلت إعادة ملف المضيفين
+ غير قادر على استعادة الإعداد الافتراضي لملف المضيفين.
+
+ تعذر عن تفعيل إعلانات VPN
+ يرجى التحقق من إعدادات VPN الخاصة بك للسماح ل VPN التطبيق للبدء.
+ تعذر عن إيقاف إعلانات VPN
+ يرجى التحقق من إعدادات VPN الخاصة بك لتعطيلها يدويًا.
+
diff --git a/app/src/main/res/values-ar/strings_home.xml b/app/src/main/res/values-ar/strings_home.xml
new file mode 100644
index 0000000..9cb8ada
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_home.xml
@@ -0,0 +1,54 @@
+
+
+
+
+ محظور
+ مسموح
+ معاد توجيهه
+
+
+
+ %d المصادر محدث
+ %d المصدر محدث
+ %d المصادر محدثة
+ %d المصادر محدثة
+ %d المصادر محدثة
+ %d المصادر محدثة
+
+
+ %d المصدر بحاجة لتحديث
+ %d المصدر بحاجة لتحديث
+ %d المصادر بحاجة لتحديث
+ %d المصادر بحاجة لتحديث
+ %d المصادر بحاجة لتحديث
+ %d المصادر بحاجة لتحديث
+
+ تحقق من وجود تحديثات المضيفين
+ تحديث ملفات المضيف
+
+
+ إظهار سجل طلب DNS
+
+
+ إظهار التعليمات n والنصائح
+
+
+ إفتح صفحة GitHub
+
+
+ إدعم المشروع
+
+
+ مشروع جيثب
+ الخيارات
+
+
+ إفتح قائمة التوجيه
+ إيقاف/إستئناف منع الإعلانات
+ تحديث الروابط المحظورة
+ أظهر الروابط التي تم طلبها
+
+
+ يرجى قراءة التعليمات للمزيد من المعلومات.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ar/strings_hosts.xml b/app/src/main/res/values-ar/strings_hosts.xml
new file mode 100644
index 0000000..17477b0
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ مصادر المضيف
+
+ لائحة المستخدم
+ لائحة AdAway الرسمية
+ لائحة StevenBlack
+ لائحة Pete Lowe
+
+ غير متوفر
+ %s مضيفين
+
+ إضافة مصدر
+ تحرير مصدر
+ الرابط: (إمّا مصدر https:// أو file://)
+ مصدر رابط المضيف
+
diff --git a/app/src/main/res/values-ar/strings_lists.xml b/app/src/main/res/values-ar/strings_lists.xml
new file mode 100644
index 0000000..356b3ea
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ قوائمك
+ إضافة مضيف
+
+ محظور
+ مسموح
+ معاد توجيهه
+
+ تصفية المضيفين
+ البحث عن اسم المضيف…
+ تبديل المصادر
+
+ إضافة المضيف للقائمة السوداء
+ إضافة المضيف للقائمة البيضاء
+ إضافة عملية إعادة توجيه المضيف
+ تحرير المضيف المُدرج في القائمة السوداء
+ تحرير المضيف المُدرج في القائمة البيضاء
+ تحرير عملية إعادة التوجيه
+ اسم المضيف:
+ مصدر رابط المضيف
+ (يسمح اسخدام رموز البدل * و ?)
+ بروتكول الانترنت (IPv4 أو IPv6):
+
diff --git a/app/src/main/res/values-ar/strings_log.xml b/app/src/main/res/values-ar/strings_log.xml
new file mode 100644
index 0000000..7e87144
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_log.xml
@@ -0,0 +1,12 @@
+
+
+ تشغيل أو إيقاف تسجيل السّجل
+ اضغط على زر التسجيل لبدء تسجيل الطلبات وقم بتصفح الويب أو استخدام بعض التطبيقات، ثم عُد أو اسحب بإصبعك للأسفل لتحديث السجلات.
+ \n\nلن يتم تسجيل الطلبات المحظورة. قم بتعطيل حظر الإعلانات أولاً إذا كنت تريد تسجيلها أيضًا.
+
+
+ ترتيب أبجدي
+ ترتيب Top level domain
+
+ إعادة توجيه الـ domain
+
diff --git a/app/src/main/res/values-ar/strings_notification.xml b/app/src/main/res/values-ar/strings_notification.xml
new file mode 100644
index 0000000..8228e5c
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ تحديثات
+ إشعارات تحديث جديد
+ يوجد تحديث متوفر
+ أحدث الملفات المضيفة المتاحة للتنزيل.
+ تحديث التطبيق متاح
+ إصدار جديد من AdAway متاح للتنزيل.
+
+ في بي إن
+ إشعارات تشغيل VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ar/strings_prefs_backup_restore.xml b/app/src/main/res/values-ar/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..6f9e6c2
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ النسخ الاحتياطي و الإستعادة
+ النسخ الاحتياطي
+ نسخ احتياطي إلى ذاكرة خارجية
+ إستعادة
+ إستعادة نسخة إحتياطية من ملف
+
diff --git a/app/src/main/res/values-ar/strings_prefs_main.xml b/app/src/main/res/values-ar/strings_prefs_main.xml
new file mode 100644
index 0000000..5a5d0a2
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ الخيارات
+
+ عام
+ ثيم داكن
+
+ مضيئ
+ داكن
+ الإعداد الإفتراضي للنظام
+
+ تحديثات تلقائية
+
+ منع إعلانات
+ مانع إعلانات يعتمد على الرووت
+ مانع إعلانات يعتمد على ال VPN
+ تفعيل دعم IPv6
+ قواعد حظر النسخ الاحتياطي / الاستعادة
+
+ التصحيح
+ إرسال تقارير الأعطال
+ إرسال تقارير الأعطال إلى Sentry (sentry.io)
+ غير مدعوم في هذا الإصدار
+ تسجيل التقارير المفصل
+ إعادة التشغيل مطلوبة لتطبيق الإعدادات
+
diff --git a/app/src/main/res/values-ar/strings_prefs_root.xml b/app/src/main/res/values-ar/strings_prefs_root.xml
new file mode 100644
index 0000000..e4ae6d3
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_prefs_root.xml
@@ -0,0 +1,38 @@
+
+
+ مانع إعلانات يعتمد على الرووت
+
+ تثبيت المضيفين
+ فتح ملفات المضيف
+ مسار ملفات المضيف
+ قبل تغيير هذا الإعداد، يجب قراءة التعليمات حول هذه الوظيفة.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ مسار مخصص
+
+ مسار مخصص
+ إخفاء مُحاور إعادة التشغيل
+
+ إعادة التوجيه
+ حدد مكان إعادة توجيه المضيفين المحظورين
+ عنوان إعادة التوجيه IPv4
+ عنوان إعادة التوجيه IPv6
+ إعادة توجيه غير صالحة
+
+ خادم الويب المحلي
+ يستمع خادم الويب المحلي إلى عناوين IP المحلية للرد على طلبات اسم المضيف المحظورة. قد يساعد في حالة تجمد التطبيق عند الاتصالات المحظورة.
+ تفعيل خادم الويب
+ اختبار خادم الويب
+ قم بتثبيت شهادة موقعة ذاتيًا
+ التثبيت اليدوي للشهادة
+ بدءًا من أندرويد 11 (R)، لم يعد بإمكان التطبيق التثبيت التلقائي للمرجع المصدق (CA).
+انتقل إلى إعدادات \"الأمان\" ، و \"بيانات الاعتماد والتشفير\" ثم \"تثبيت شهادة\". من هناك ، اختر \"شهادة CA\" وحدد ملف الشهادة الذي تم تصديره حديثًا.
+ افتح إعدادات \"الأمان\"
+ تدقيق…
+ لا يعمل
+ قيد التشغيل ولكن الشهادة غير مثبتة
+ قيد التشغيل والشهادة مثبتة
+ استبدل المساحة الإعلانية الفارغة بأيقونة التطبيق
+
diff --git a/app/src/main/res/values-ar/strings_prefs_update.xml b/app/src/main/res/values-ar/strings_prefs_update.xml
new file mode 100644
index 0000000..4051005
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ تحديثات
+ الإشعارات معطلة
+ اشعارات التطبيق لن تظهر. اضغط لتفعيلها
+
+ تحديثات التطبيق
+ تحقق من التحديث عند بدء التشغيل
+ تحقق بشكل دوري من التحديثات
+ تضمين إصدارات بيتا
+
+ تحديثات المضيفين
+ تحقق من التحديث عند بدء التشغيل
+ تحقق بشكل دوري من التحديثات
+ مزامنة عند التحديث
+ المزامنة على شبكة غير مقيَّدة فقط
+
diff --git a/app/src/main/res/values-ar/strings_prefs_vpn.xml b/app/src/main/res/values-ar/strings_prefs_vpn.xml
new file mode 100644
index 0000000..59cd7e7
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ مانع إعلانات يعتمد على ال VPN
+
+ التمكين عند بدء تشغيل الجهاز
+ مراقبة الاتصال
+ تحقق بشكل دوري من حالة الشبكة لإعادة تشغيل VPN عند قطع الاتصال.
+
+ التطبيقات المستبعدة
+ إعداد التطبيقات التي يجب ألا تستخدم VPN حتى لا يتم حظر أي اتصالات.
+ استبعد تطبيقات النظام
+
+ None
+ All except browsers
+ All
+
+ استبعد تطبيقات المستخدم
+
+
+ التطبيقات المستبعدة
+ تحديد الكل
+ إلغاء تحديد الكل
+ أيقونة التطبيق
+
diff --git a/app/src/main/res/values-ar/strings_source_edit.xml b/app/src/main/res/values-ar/strings_source_edit.xml
new file mode 100644
index 0000000..092f99e
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ تحرير مصدر
+ إضافة مصدر
+
+ تسمية
+ التسمية مطلوبة
+ نوع
+ URL
+ ملف
+ موقع
+ https://
+ الموقع مطلوب
+ اضغط على ملف لتحديد ملف المصدر
+ موقع غير صالح
+ قائمة التنسيق
+ حظر
+ سماح
+ تطبيق المضيفين الموجهين
+ السماح بالمضيفين الموجهين قد يسبب مشاكل أمان. استخدم هذا الإعداد فقط على مصدر موثوق به حيث يمكن أن يعيد توجيه بعض حركة المرور الحساسة إلى أي خادم يريده.
+
diff --git a/app/src/main/res/values-ar/strings_support.xml b/app/src/main/res/values-ar/strings_support.xml
new file mode 100644
index 0000000..84d5e17
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ الدعم
+ كن راعياً
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ar/strings_update.xml b/app/src/main/res/values-ar/strings_update.xml
new file mode 100644
index 0000000..5fba093
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ تحديث آدواي AdAway
+
+ تحديث متوفر!
+
+
+ أنت لديك آخر إصدار
+ يوجد تحديث متوفر
+ جاري تحديث آدواي AdAway
+ حدث الآن
+ %1$s/%2$s
+ التغييرات الأخيرة
+ سجل التغييرات
+ دعم المشروع
+ التبرع
+ راعي
+
+
+ جاري تنزيل أحدث إصدار من AdAway…
+
diff --git a/app/src/main/res/values-ar/strings_welcome.xml b/app/src/main/res/values-ar/strings_welcome.xml
new file mode 100644
index 0000000..3e2656e
--- /dev/null
+++ b/app/src/main/res/values-ar/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ مرحبا
+ أول خطوة لتحضير التطبيق
+ ثاني خطوة لتحضير التطبيق
+ آخر خطوة لتحضير التطبيق
+
+
+ مرحبًا بك في AdAway !
+ AdAway يقدم لك طريقتين لمنع الإعلانات
+
+ أيقونة الرووت
+ منع إعلانات يعتمد على الرووت
+ أسرع
+ صديق للبطارية
+ الرووت مطلوب
+
+ أيقونة ال VPN
+ مانع إعلانات يعتمد على ال VPN
+ أبطىْ
+ تشغيل في الخلفية
+ توافق
+
+ مطلوب روت للهاتف
+ إما أن su binary لا يمكن العثور عليه أو أنك لم تسمح بإذن الجذر لـ AdAway. يمكن أن يحدث هذا عندما لا يكون جهازك بدون رووت. يمكنك العثور على معلومات حول كيفية عمل رووت لجهازك على wiki.lineageos.org أو مواقع Android الأخرى.
+
+ إحترافي
+ عيوب
+
+
+ تمت المزامنة
+ حصل خطأ أثناء المزامنة
+
+ جاري المزامنة
+ تمت المزامنة
+ AdAway يقوم بتنزيل شبكات الإعلانات لمنعها من المصادر عبر الإنترنت. يمكنك تخصيصها لاحقًا في الإعدادات.
+ أعد محاولة المزامنة
+ فشل مزامنة: %1$s إعادة المحاولة الآن
+ يمكنه إرسال إشعارات لعرض حالة حظر الإعلانات والتحكم فيها، وإعلامك بتحديث التطبيق المتاح (عدد قليل في السنة). قم بتمكينها إذا كنت ترغب في البقاء على اطلاع دائم.
+
+
+ الدعم
+ إدعمني!
+ Adaway هو برنامج مفتوح المصدر اقوم بتطويره في وقت فراغي. اذا أعجبك. كُن حر بإظهار دعمك:
+ تبرع على PayPal
+ هل وجدت مشاكل في التطبيق؟ ولا أنا.
+ قم بتفعيل إرسال تقارير مشاكل التطبيق
+
+
+ رجوع
+ التالي
+ إنتهاء
+
diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml
new file mode 100644
index 0000000..c4cb392
--- /dev/null
+++ b/app/src/main/res/values-ast/strings.xml
@@ -0,0 +1,145 @@
+
+
+
+ Colar
+ Zarrar
+ Sí
+ Non
+ Amestar
+ Encaboxar
+ Guardar
+ Ayuda
+
+
+ ¡Afáyate!
+ Adaway ye un programa gratuitu y de códigu abiertu diseñáu pa bloquiar anuncios. Va en cata de les direiciones de les redes d\'anuncios pa bloquiales nel preséu.\n¿Quies saber más? ¡Mira l\'ayuda d\'embaxo!
+ Tolos ficheros «Hosts» de les fontes defeníes báxense, amiéstense coles tos propies llistes ya instálense como un ficheru «Hosts» nel sistema.
+ Activar el bloquéu d\'anuncios
+ Sirvidor web
+ N\'execución
+ En parada
+ VPN
+
+ Editar entrada
+ Editar
+ Desaniciar
+
+
+ Importando…
+ Esportando…
+
+ El ficheru hosts
+ Cargando\'l conteníu del ficheru hosts…
+ Abrir el ficheru hosts
+
+ Creando ficheru hosts estándar
+ Anovamientu disponible
+ Hai disponible un ficheru hosts más nuevu
+ Ensin conexón d\'internet
+ Ensin conexón d\'internet disponible
+ Fontes non disponibles
+ ¡Nun pue algamase dal fonte d\'agospios!
+ Habilitáu
+ Habilitáronse los ficheros «hosts» más nuevos
+ Deshabilitáu
+ ¡Nun esiste o ye incorreutu l\'enllaz simbólicu dende\'l to oxetivu a /system/etc/hosts! Adaway nun furrulará si nun ta apuntando al ficheru correutu.\n\n¿Quies crear un enllaz simbólicu?
+ Falta l\'enllaz simbólicu
+ ¡Nun hai espaciu abondo na partición!\nIntenta camudar nes preferencies el ficheru «hosts» oxetivu a /data/data/hosts .
+ Nun hai espaciu abondo
+ Nun pudo lleese\'l ficheru baxáu.
+ Fallu nel ficheru priváu
+ ¡Fallu remontando la partición como llectura/escritura!
+ Fallu nel remontaxe
+ ¡Fallu copiando\'l ficheru «hosts»!
+ Copia fallida
+ Aplicadura esitosa
+ Creación esitosa del enllaz simbólicu
+ Fallu na creación d\'enllaz simbólicu
+ Por favor, llei l\'ayuda pa más información.
+ ¡Afitóse\'l proxy APN!
+ La conexón d\'internet nun ta furrulando.
+ Ensin conexón
+ Baxando…
+ Aplicando…
+ Aplicando llista prieta y blanca
+ Analizando y meciendo los ficheros «hosts»
+ Construyendo\'l ficheru «hosts»
+ Aplicando\'l ficheru «hosts»
+ ¡Falló l\'aplicadura del ficheru «hosts» nel sistema!\nIntenta camudar nes preferencies el ficheru «hosts» oxetivu a /data/data/hosts.
+ Falló l\'aplicadura
+ Desfechura esitosa
+ Fallu na desfechura pola mor de razones desconocíes.
+ ¡Fallu na desfechura!
+ ¡Nun s\'algamó dal fonte de «hosts» de to! ¿De xuru que tas coneutáu afayadizamente a internet?
+ Descarga fallida
+ Nun pue crease\'l ficheru priváu.
+ Fallu na creación del ficheru priváu
+
+ Enllaz d\'entrada al ficheru hosts:
+ ¡Esto nun ye un nome d\'agospiu válidu!
+ Nome d\'agospiu mal formáu
+ ¡Esto nun ye una IP válida!
+ IP mal formada
+ Cargando…
+
+
+ Refrescar
+ Amestar
+ Ayuda
+ Importar una copia de seguranza
+ Esportar
+
+
+ S-ON/S-OFF
+ FAQ
+ Problemes
+
+
+ Adware
+ Equí pues alcontrar adware, aplicaciones malicioses qu\'AdAway nun pue bloquiar. Estes aplicaciones camuden el tonu d\'avisu del preséu o usen, por exemplu, avisos Airpush qu\'apaecen magar que l\'aplicación nun tea n\'execución. La única midida pa facer qu\'esto nun pase ye desinstalar eses aplicaciones calcando nos elementos de la llista.
+
+ Bloquiador d\'anuncios
+ Nun hai dal editor de testos instaláu
+ Nun pudo alcontrase dal editor de testos p\'abrir el ficheru «hosts». Pues instalar Jota u otros pa remanar esto.\n\n¿Quies instalar Jota?
+ Nun hai instaláu dal xestor de ficheros
+ Nun pudo alcontrase dal xestor de ficheros. Pues instalar OI File Manager u otros pa remanar esto.\n\n¿Quies instalar OI File Manager?
+
+
+ Tcpdump
+ Tcpdump ye una ferramienta pa monitorizar les solicitúes DNS y guardales nun ficheru de rexistru. Pues anicialu de fondu, executar les aplicaciones qu\'amuesen anuncios y sero analizar les solicitúes DNS usando\'l ficheru de rexistru. Ye posible amestar el sirvidor d\'anuncios a la to llista prieta.
+ Desactivar la supervisión
+ Activar la supervisión
+ Amosar resultaos
+
+
+ Home
+ Fontes de hosts
+ Your lists
+ Abrir ficheru «hosts»
+ Log DNS requests
+ Scan for adware
+ Preferencies
+ Ayuda
+
+ Llistes de to
+ Preferencies
+
+ Desconozse l\'estáu d\'anovamientu
+
+ %d minutu
+ %d minutos
+
+
+ %d hora
+ %d hores
+
+
+ %d día
+ %d díes
+
+
+ %d mes
+ %d meses
+
+
+
diff --git a/app/src/main/res/values-ast/strings_app.xml b/app/src/main/res/values-ast/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-ast/strings_errors.xml b/app/src/main/res/values-ast/strings_errors.xml
new file mode 100644
index 0000000..7dbde44
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ Ensin conexón d\'internet
+ Nun hai espaciu abondo
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ast/strings_home.xml b/app/src/main/res/values-ast/strings_home.xml
new file mode 100644
index 0000000..c922ba9
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferencies
+
+
+ Llei l\'ayuda pa más información, por favor.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ast/strings_hosts.xml b/app/src/main/res/values-ast/strings_hosts.xml
new file mode 100644
index 0000000..0f37f01
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_hosts.xml
@@ -0,0 +1,7 @@
+
+
+ Oríxenes d\'agospios
+
+ non disponible
+ URL: (un recursu https:// o file:// )
+
diff --git a/app/src/main/res/values-ast/strings_lists.xml b/app/src/main/res/values-ast/strings_lists.xml
new file mode 100644
index 0000000..dc9795f
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_lists.xml
@@ -0,0 +1,11 @@
+
+
+ Llistes de to
+
+ Amiestu d\'un agospiu a la llista prieta
+ Amiestu d\'un agospiu a la llista blanca
+ Edición d\'un agospiu na llista prieta
+ Edición d\'un agospiu na llista blanca
+ Nome d\'agospiu:
+ IP (IPv4 o IPv6):
+
diff --git a/app/src/main/res/values-ast/strings_log.xml b/app/src/main/res/values-ast/strings_log.xml
new file mode 100644
index 0000000..6c966ca
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_log.xml
@@ -0,0 +1,6 @@
+
+
+
+ Orde alfabéticu
+
+
diff --git a/app/src/main/res/values-ast/strings_notification.xml b/app/src/main/res/values-ast/strings_notification.xml
new file mode 100644
index 0000000..a7e352d
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_notification.xml
@@ -0,0 +1,6 @@
+
+
+ Anovamientu disponible
+
+ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ast/strings_prefs_backup_restore.xml b/app/src/main/res/values-ast/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ast/strings_prefs_main.xml b/app/src/main/res/values-ast/strings_prefs_main.xml
new file mode 100644
index 0000000..6f3b927
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_prefs_main.xml
@@ -0,0 +1,9 @@
+
+
+ Preferencies
+
+ Xeneral
+ Estilu escuru
+
+ Depuración
+
diff --git a/app/src/main/res/values-ast/strings_prefs_root.xml b/app/src/main/res/values-ast/strings_prefs_root.xml
new file mode 100644
index 0000000..7327f0d
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_prefs_root.xml
@@ -0,0 +1,13 @@
+
+
+ Ficheru hosts
+ Ficheru «hosts» oxetivu
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Oxetivu personalizáu
+
+
+ Redireiciones
+
diff --git a/app/src/main/res/values-ast/strings_prefs_update.xml b/app/src/main/res/values-ast/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ast/strings_prefs_vpn.xml b/app/src/main/res/values-ast/strings_prefs_vpn.xml
new file mode 100644
index 0000000..717b1e6
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_prefs_vpn.xml
@@ -0,0 +1,9 @@
+
+
+ Configura les aplicaciones que nun deberíen usar la VPN pa que nenguna conexón se bloquie.
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-ast/strings_support.xml b/app/src/main/res/values-ast/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ast/strings_update.xml b/app/src/main/res/values-ast/strings_update.xml
new file mode 100644
index 0000000..b5ae7ed
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ Anovamientu disponible
+
diff --git a/app/src/main/res/values-ast/strings_welcome.xml b/app/src/main/res/values-ast/strings_welcome.xml
new file mode 100644
index 0000000..5daf335
--- /dev/null
+++ b/app/src/main/res/values-ast/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ Riquese\'l permisu root
+
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
new file mode 100644
index 0000000..de361e5
--- /dev/null
+++ b/app/src/main/res/values-az/strings.xml
@@ -0,0 +1,147 @@
+
+
+
+ Çıxış
+ Bağla
+ Bəli
+ Xeyr
+ Əlavə Et
+ Ləğv Et
+ Yadda saxla
+ Kömək
+
+
+ Xoş Gəldiniz!
+ AdAway reklamları bloklamaq üçün pulsuz və açıq-köklü tətbiqetmədir. O reklamları bloklamaq üçün cihazınızdakı reklam şəbəkələrini dəyişdirir.\nƏlavə məlumat lazımdır? Aşağıdan köməyə göz gəzdirin!
+ Daha çox kömək göstər
+ Yeniləmə vəziyəti
+ Bütün mənbə faylları yüklənmiş, şəxsi siyahınız ilə birləşdirilmiş və sisteminizdə tam bir host faylı kimi qurulmuşdur.
+ Reklam-bloklamanı aç
+ Reklam-bloklamanı bağla
+ Web serveri
+ Işlənir
+ Dayanmışdır
+ Web serveri aç
+ Web serveri bağla
+ VPN
+ İşləyir
+ Dayanıb
+ VPN Aç
+
+ Girişi Redaktə Et
+ Tətbiq et
+ Redaktə Et
+ Sil
+
+
+ Daxil edilir…
+ Çıxarılır..
+
+ Hosts faylı
+ Hosts faylı host adlarını IP adreslərinə yönləndirən sistem faylıdır. Bu idarəsi AdAway tərəfindən aparılan sadə bir mətn faylıdır. Bu da ilk bir neçə sətir:
+ Hosts fayl məlumatı yüklənir…
+ Hosts faylını aç
+
+ Standart hosts faylı yaradılır
+ Yeni hosts faylları var
+ İnternetə çıxış yoxdur
+ İnternetə çıxış əlçatan deyil
+ Əlçatmaz qaynaqlar
+ Heç bir hosts qaynaqları əlçatan deyil!
+ Root icazəsi verilmədi
+ Root tətbiqinizdən root icazəsi verin
+ Xəta baş verdi
+ Əlavə məlumat üçün logcat\'ə baxın
+ Açıqdır
+ Ən yeni hosts faylları açıldı
+ Bağlıdır
+ Standart hosts faylı quruldu
+ Tətbiq et
+ Hədəfinizdən /system/etc/hosts \'a olan symlink mövcud deyil yaxud səhvdir. Əgər o düzgün fayla hədəflənməyibsə AdAway işləməyəcək.\n\nSymlink yaratmağa cəhd etmək istəyirsiniz?
+ Symlink tapılmır
+ Bölmədə kifayət qədər yer yoxdur!\nSeçimlərdən hosts faylının hədəfini /data/data/hosts \'a dəyişməyə cəhd edin.
+ Kifayət qədər yer yoxdur
+ Yüklənmiş fayl oxunmur
+ Fərdi fayl xətası
+ Bölməni yaz/oxu şəklində yenidən qoşmaq alınmadı!
+ Yenidən qoşma alınmadı
+ Hosts faylını kopyalamaq alınmadı!
+ Kopyalamaq alınmadı
+ Hosts qaynaqları tətbiq edildi
+ Tətbiq uğurla başa çatdı
+ Tətbiqetmə uğurla başa çatdı.\nDəyişikliklərin işləməsi üçün Android\'i yenidən başlatmaq vacib ola bilər.\n\nYenidən başlatmaq istəyirsiniz?\n(Həmin an SD kartı başqa tətbiqin istifadə etmədiyindən əmin olmaq və məlumat itgisinin qarşısını almaq üçün!)
+ Symlink uğurla yaradıldı.\nDəyişikliklərin işləməsi üçün Android\'i yenidən başlatmaq vacib ola bilər.\n\nYenidən başlatmaq istəyirsiniz?\n(Həmin an SD kartı başqa tətbiqin istifadə etmədiyindən əmin olmaq və məlumat itgisinin qarşısını almaq üçün!)
+ Symlink yaratmaq uğurla bitdi
+ İnternet bağlantısı qurula bilmədi.
+ Əlaqə qurulmadı
+ Yüklənir…
+ Tətbiq edilir…
+ Hosts faylını tətbiq et
+ Tətbiqetmək alınmadı
+ Yükləmə alınmadı
+ Fərdi fayl yaradıla bilməz.
+ Fərdi fayl yaratmaq alınmadı
+ Uğurla açıldı
+ Uğurla qapadıldı
+
+ URL\'ni hosts faylına daxil et:
+ Bu host adı etibarsızdır!
+ Host adı düzgün formatda deyil
+ Bu IP etibarsızdır!
+ Yenidən başlatma və bu sualı gələn dəfə göstərmə!
+ Yüklənir…
+
+
+ Yenilə
+ Əlavə Et
+ Kömək
+
+ S-ON/S-OFF
+ FAQ
+ Problemlər
+
+
+ Reklam bloker
+ Menyunu aç
+ Menyunu qapat
+
+
+
+ Ev
+ Hosts resursları
+ Siyahılarınız
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Tənzimləmələr
+ Kömək
+
+
+
+
+ DNS istəkləri
+ Siyahılarınız
+ Tənzimləmələr
+
+ %1$s üçün yenidir
+ %1$s üçün yeniləmə lazımdır
+ Son yeniləmə %1$s əvvəl
+ Bilinməyən yeniləmə vəziyəti
+
+ %d dəqiqə
+ %d dəqiqə
+
+
+ %d saat
+ %d saat
+
+
+ %d gün
+ %d gün
+
+
+ %d ay
+ %d ay
+
+
+
diff --git a/app/src/main/res/values-az/strings_app.xml b/app/src/main/res/values-az/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-az/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-az/strings_errors.xml b/app/src/main/res/values-az/strings_errors.xml
new file mode 100644
index 0000000..1e5bf39
--- /dev/null
+++ b/app/src/main/res/values-az/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ İnternetə çıxış yoxdur
+ Kifayət qədər yer yoxdur
+
\ No newline at end of file
diff --git a/app/src/main/res/values-az/strings_home.xml b/app/src/main/res/values-az/strings_home.xml
new file mode 100644
index 0000000..6ae4eb0
--- /dev/null
+++ b/app/src/main/res/values-az/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Tənzimləmələr
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-az/strings_hosts.xml b/app/src/main/res/values-az/strings_hosts.xml
new file mode 100644
index 0000000..bbea683
--- /dev/null
+++ b/app/src/main/res/values-az/strings_hosts.xml
@@ -0,0 +1,10 @@
+
+
+ Hosts resursları
+
+ əlçatan deyil
+
+ Qaynaq əlavə et
+ Qaynağı dəyiş
+ Hostların kök URL\'ı
+
diff --git a/app/src/main/res/values-az/strings_lists.xml b/app/src/main/res/values-az/strings_lists.xml
new file mode 100644
index 0000000..b294260
--- /dev/null
+++ b/app/src/main/res/values-az/strings_lists.xml
@@ -0,0 +1,15 @@
+
+
+ Siyahılarınız
+
+ Host\'u qara siyahıya at
+ Host\'u ağ siyahıya at
+ Host yönləndirici əlavə et
+ Qara siyahıdakı host\'u dəyiş
+ Ağ siyahıdakı host\'u dəyiş
+ Yönləndirməni dəyiş
+ Host adı:
+ Hostların kök URL\'ı
+ (Wildkart * və ? işarələrinə icazə verilir)
+ IP (IPv4 or IPv6):
+
diff --git a/app/src/main/res/values-az/strings_log.xml b/app/src/main/res/values-az/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-az/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-az/strings_notification.xml b/app/src/main/res/values-az/strings_notification.xml
new file mode 100644
index 0000000..0626048
--- /dev/null
+++ b/app/src/main/res/values-az/strings_notification.xml
@@ -0,0 +1,7 @@
+
+
+
+ Yeniləmələr
+
+ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-az/strings_prefs_backup_restore.xml b/app/src/main/res/values-az/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-az/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-az/strings_prefs_main.xml b/app/src/main/res/values-az/strings_prefs_main.xml
new file mode 100644
index 0000000..9286409
--- /dev/null
+++ b/app/src/main/res/values-az/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Tənzimləmələr
+
diff --git a/app/src/main/res/values-az/strings_prefs_root.xml b/app/src/main/res/values-az/strings_prefs_root.xml
new file mode 100644
index 0000000..7fddad3
--- /dev/null
+++ b/app/src/main/res/values-az/strings_prefs_root.xml
@@ -0,0 +1,13 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Fərdi hədəf
+
+
+ Yönləndirmək
+ Web serveri aç
+
diff --git a/app/src/main/res/values-az/strings_prefs_update.xml b/app/src/main/res/values-az/strings_prefs_update.xml
new file mode 100644
index 0000000..02be844
--- /dev/null
+++ b/app/src/main/res/values-az/strings_prefs_update.xml
@@ -0,0 +1,4 @@
+
+
+ Yeniləmələr
+
diff --git a/app/src/main/res/values-az/strings_prefs_vpn.xml b/app/src/main/res/values-az/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-az/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-az/strings_support.xml b/app/src/main/res/values-az/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-az/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-az/strings_update.xml b/app/src/main/res/values-az/strings_update.xml
new file mode 100644
index 0000000..708cec4
--- /dev/null
+++ b/app/src/main/res/values-az/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ Yeniləmə var
+
diff --git a/app/src/main/res/values-az/strings_welcome.xml b/app/src/main/res/values-az/strings_welcome.xml
new file mode 100644
index 0000000..6e98ea1
--- /dev/null
+++ b/app/src/main/res/values-az/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ Rootlu Android tələb olunur
+
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
new file mode 100644
index 0000000..ba46e44
--- /dev/null
+++ b/app/src/main/res/values-be/strings.xml
@@ -0,0 +1,267 @@
+
+
+
+ Выйсці
+ Закрыць
+ Так
+ Не
+ Дадаць
+ Скасаваць
+ Захаваць
+ Дапамога
+
+
+ Сярдэчна запрашаем!
+ AdAway - гэта бясплатная праграма з адкрытым зыходным кодам для блакіроўкі рэкламы. Яна збірае адрасы з рэкламнай сеткі і блакуе іх на вашай прыладзе.\nХочаце даведацца больш? Чытайце даведку!
+ Паказаць дадатковую дапамогу
+ Статус абнаўленняў
+ Усе файлы hosts, спампаваных з пэўных крыніц, зліваюцца з вашым уласным спісам і ўсталёўваюцца ў вашай сістэме ў выглядзе аднаго файла host
+ Уключыць блакаванне рэкламы
+ Адключыць блакаванне рэкламы
+ Вэб-сервер
+ Працуе
+ Прыпынена
+ Запусціце або спыніце вэб-сервер у лакальнай сеткі, каб адказваць на запыты на заблакаваныя імёны host.
+ Уключыць вэб-сервер
+ Адключыць вэб-сервер
+ VPN
+ Запушчана
+ Спынена
+ Запусціць або спыніць VPN для фільтрацыі запытаў.
+ Уключыць VPN
+ Адключыць VPN
+
+
+ Рэдагаваць запіс
+ Прымяніць
+ Рэдагаваць
+ Выдаліць
+
+
+ Імпарт…
+ Рэзервовая копія паспяхова імпартавана з вашага знешняга сховішча.
+ Не ўдалося імпартаваць рэзервовую копію. Магчыма яе фармат не дакладны? Праверце logcat для падрабязнасцяў.
+ Экспарт…
+ Рэзервовае капіраванне паспяхова экспартавана ў файл \'%s\' на вашым знешнім сховішчы.
+ Не атрымалася экспартаваць файл рэзервовай копіі \'%s\'.
+
+
+ Файл hosts
+ Файл hosts - гэта сістэмны файл, супастаўляючы імёны вузлоў з IP-адрасамі. Гэта звычайны тэкставы файл, змесціва якога апрацоўвае AdAway. Вось яго першыя радкі:
+ Загрузка змесціва файла hosts
+ Адкрыць файл hosts
+
+
+ Праверка абнаўленняў
+ Праверка%s на абнаўленне
+ Атрыманне крыніц
+ Спампоўка крыніцы %s
+ Чытанне крыніцы%s
+ Разбор крыніцы %s
+ Сінхранізацыя базы дадзеных з правіламі
+ Аднаўленне стандартнага файла hosts
+ Стандартны файл hosts адноўлены
+ Стварэнне стандартнага файла hosts
+ Даступна абнаўленне
+ Даступны новыя файлы host
+ Абнаўленняў крыніц не знойдзены
+ Няма злучэння з інтэрнэтам
+ Няма падлучэння да Інтэрнэту
+ Недаступныя крыніцы
+ Няма даступных крыніц host!
+ Доступ root быў адхілены
+ Дазвольце root-доступ з вашай праграмы для root
+ Нешта пайшло не так
+ Праверце logcat для атрымання больш падрабязнай інфармацыі
+ Уключана
+ Выкарыстоўваюцца новыя спісы host
+ Выключана
+ Усталяваны стандартны файл hosts
+ Прымяніць свежыя крыніцы
+ Стварэнне новага файла hosts
+ Капіяванне новага файла hosts
+ Праверка копіі файла hosts
+ Файл hosts паспяхова абноўлены
+ Канфігурацыя VPN паспяхова абноўлена
+ Канфігурацыя зменена. Вам трэба ўжыць яе.
+ Прымяніць
+ Прымяненне новай канфігурацыі
+ Не атрымалася прымяніць новую канфігурацыю.
+
+
+ Адсутнічае сімвалічная спасылка на мэтавай файл hosts
+ Спасылка на ваш /system/etc/hosts няправільная або не існуе! AdAway не будзе працаваць, калі не паказаць правільны файл. Вы хочаце паспрабаваць стварыць спасылку?
+ Спасылка адсутнічае
+ Не хапае месца на раздзеле! Паспрабуйце змяніць шлях да файла ў наладах на /data/data/hosts.
+ Не хапае месца
+ Спампаваны файл не можа быць прачытаны.
+ Збой файла
+ Не атрымалася перамантаваць раздзел для чытання/запісу!
+ Перамантаваць не ўдалося
+ Не атрымалася скапіяваць файл hosts
+ Капіяванне файла hosts не ўдалося!
+ Капіяванне не ўдалося
+ Выкарыстоўваюцца крыніцы hosts
+ Прымяненне прайшло паспяхова
+ Прымяненне прайшло паспяхова.\nМагчыма, спатрэбіцца перазагрузіць Android, каб змены ўступілі ў сілу.\n\nВы хочаце перагрузіць Android?\n(Для прадухілення страты дадзеных пераканайцеся, што ніякія праграмы ў дадзены момант не выкарыстоўваюць карту памяці!)
+ Спасылка створана паспяхова.\nМагчыма, спатрэбіцца перазагрузіць Android, каб змены ўступілі ў сілу.\n\nВы хочаце перагрузіць Android?\n(Для прадухілення страты дадзеных пераканайцеся, што ніякія праграмы ў дадзены момант не выкарыстоўваюць карту памяці!)
+ Спасылка створана паспяхова
+ Android не змог стварыць спасылку.\nМагчыма гэта з-за асаблівасці тэлефонаў HTC, званай S-ON!\n\nРашэнне заключаецца ў загрузцы тэлефона ў рэжыме аднаўлення і стварэння спасылкі пры дапамозе \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nКалі гэта не дапаможа, то трэба шукаць інфармацыю ў інтэрнэце па S-OFF і вашаму тэлефоне.
+ Памылка стварэння спасылкі
+ Калі ласка, чытайце Даведку для атрымання большай інфармацыі.
+ У наладах APN вашага Android паказаны проксі-сервер!\nAdAway не будзе працаваць у мабільных сетках, такіх як 3G. Вы можаце адключыць гэты сервер проксі у наладах выкарыстаннай APN (з праграмы Налад: Сетка і Інтэрнэт -> Мабільная сетка -> Дадаткова -> Кропкі доступу APN) і выдаліць значэнне ў полі Проксі.
+ Выкарыстоўваная кропка доступу працуе праз проксі-сервер!
+ Адсутнічае падключэнне да інтэрнэту.
+ Няма злучэння
+ Спампоўка…
+ Прымяненне…
+ Прымяніць чорны і белы спіс
+ Разбор і аб\'яднанне файлаў са спісамі hosts
+ Пабудова файла hosts
+ Прымяненне файла hosts
+ Не атрымалася прымяніць новы файл hosts.
+ Не атрымалася прымяніць файл Hosts на вашай сістэме!
+Паспрабуйце змяніць шлях да файла Hosts ў наладах на /data/data/hosts
+ Прымяненне не ўдалося
+ Калі ласка, праверце, вашу праграму, якая прадастаўляе root-доступ.
+ Вы вярнуліся да файла Hosts па змаўчанні.\nМагчыма, спатрэбіцца перазагрузіць Android, каб змены ўступілі ў сілу.\n\nВы хочаце перагрузіць Android?\n(Для прадухілення страты дадзеных пераканайцеся, што ніякія праграмы ў дадзены момант не выкарыстоўваюць карту памяці!)
+ Вяртанне адбылося паспяхова
+ Не атрымалася аднавіць файл hosts
+ Аднаўленне не атрымалася па невядомых прычынах.
+ Аднаўленне не атрымалася!
+ Ніводная з вашых актыўных крыніц host недаступная! Вы правільна падлучаныя да інтэрнэту?
+ Памылка спампоўкі
+ Не атрымалася запісаць новы файл hosts
+ Файл не можа быць створаны.
+ Не атрымалася стварыць файл
+ Вы актывавалі бессістэмны рэжым.\nМагчыма, спатрэбіцца перазагрузіць Android, каб змены ўступілі ў сілу.\n\nВы хочаце перагрузіць Android?\n(Для прадухілення страты дадзеных пераканайцеся, што ніякія праграмы ў дадзены момант не выкарыстоўваюць карту памяці!)
+ Актывацыя прайшла паспяхова
+ Вы адключылі бессістэмны рэжым.\nМагчыма, спатрэбіцца перазагрузіць Android, каб змены ўступілі ў сілу.\n\nВы хочаце перагрузіць Android?\n(Для прадухілення страты дадзеных пераканайцеся, што ніякія праграмы ў дадзены момант не выкарыстоўваюць карту памяці!)
+ Паспяхова адключана
+ Не атрымалася ўключыць VPN блакаванне рэкламы.
+ Не атрымалася адключыць VPN блакаванне рэкламы.
+ Уключыць модуль hosts Magisk
+ Уключыць бессістэмную функцыю hosts з мэнэджара Magisk. Сярод яго налад уключыце параметр Бессістемны hosts, затым перазагрузіце вашу прыладу.
+ Адключыць модуль Magisk hosts
+ Адключыць бессістэмную функцыю hosts з мэнэджара Magisk. Сярод яго налад выдаліце модуль Бессістемны hosts, затым перазагрузіце вашу прыладу.
+
+
+ Устаўце URL у файл hosts:
+ Гэта недапушчальнае імя крыніцы!
+ Няправільна адфарматаванае імя host
+ Гэта недапушчальны IP-адрас!
+ Няправільна адфарматаваны IP-адрас
+ Ня перазагружаць і не паказваць гэтае пытанне ў далейшым
+ Загрузка…
+
+
+ Абнавіць
+ Дадаць
+ Дапамога
+ Імпартаваць рэзервовую копію
+ Экспарт рэзервовай копіі
+
+
+ S-ON/S-OFF
+ FAQ
+ Праблемы
+
+
+ Праграмы з рэкламай
+ Пошук праграм з рэкламай, званыя Adware, і якія AdAway не можа заблакаваць. Гэтыя праграмы выкарыстоўваюць, напрыклад, сістэму апавяшчэнняў Airpush, якая паказвае рэкламу нават тады, калі праграма не працуе, ці нават можа змяніць мелодыю вашага званка. Пазбавіцца ад такой рэкламы можна толькі выдаліўшы праграму, названыя ў выніках сканавання, шляхам націску на складнікі спісаў.
+ Сканаванне…
+ Праграм з рэкламай не знойдзена!
+
+
+ Блакавальнік рэкламы
+ Не ўсталяваны тэкставы рэдактар
+ Не знойдзены тэкставы рэдактар для адкрыцця файла hosts. Вы можаце ўсталяваць рэдактар Jota ці іншай тэкставы рэдактар, каб гэта выправіць.\n\nВы жадаеце ўсталяваць рэдактар Jota?
+ Не ўсталяваны файлавы менеджэр
+ Няма файлавага мэнэджара для адкрыцця файла. Вы можаце ўсталяваць OI File Manager ці іншы файлавы менеджэр, каб гэта выправіць.\n\nВы жадаеце ўсталяваць OI File Manager?
+
+
+ Tcpdump
+ Tcpdump гэта інструмент для маніторынгу запытаў DNS і іх захавання ў файле журнала. Запусціце Tcpdump, ён будзе працаваць у фонавым рэжыме да перазагрузкі прылады - запусціце праграму, у якой на экране паказваецца рэклама - прааналізуйце запыты DNS, выкарыстоўваючы файл журнала. Знойдзеныя ў ім падазроныя сервера, магчымыя як крыніцы рэкламы, могуць быць унесены ў чорны спіс.
+ Адключыць маніторынг
+ Уключыць маніторынг
+ Паказаць вынікі
+ Сартаваць дамены
+ Ачысціць журнал
+ Дадаць запіс у Чорны спіс
+ Дадаць запіс у Белы спіс
+ Дадаць запіс у спіс перанакіраванняў
+
+ Рэдагаваць значэнне тэкставай перавагі
+ Адкрыць меню
+ Закрыць меню
+
+
+
+ Галоўная
+ Крыніцы hosts
+ Вашы спісы
+ Адкрыць файл hosts
+ Запісваць запыты DNS
+ Сканаванне Adware
+ Налады
+ Дапамога
+
+
+
+
+ Запыты DNS
+ Вашы спісы
+ Налады
+
+
+ Усталявана %1$s назад
+ Актуальна %1$s
+ Патрабуецца абнаўленне %1$s
+ Апошняе абнаўленне %1$s таму
+ Невядомы статус абнаўлення
+ некалькі хвілін
+
+ %d хвіліна
+ %d хвіліны
+ %d хвілін
+ %d хвілін
+
+
+ %d гадзіна
+ %d гадзіны
+ %d гадзін
+ %d гадзін
+
+
+ %d дзень
+ %d дні
+ %d дзён
+ %d дзён
+
+
+ %d месяц
+ %d месяцы
+ %d месяцаў
+ %d месяцаў
+
+
+
+ пачынаецца
+ актыўна
+ спынена
+ чаканне сеткі
+ перападключэнне
+ памылка перападключэнне
+ прыпынена
+ спынена
+ VPN блакіроўшчыка %1$s
+ Паўза
+ Аднавіць
+
+
+ Дазволы AdAway
+ Дазволіць узаемадзеянне з AdAway
+ Адпраўляць каманды на AdAway
+ Дазволіць адпраўку каманд у AdAway, напрыклад, уключэнне або адключэнне сістэмнай блакіроўкі рэкламы
+
+
diff --git a/app/src/main/res/values-be/strings_app.xml b/app/src/main/res/values-be/strings_app.xml
new file mode 100644
index 0000000..75b320c
--- /dev/null
+++ b/app/src/main/res/values-be/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Блакіроўшчык рэкламы з адкрытым зыходным кодам
+ Лагатып AdAway
+
diff --git a/app/src/main/res/values-be/strings_errors.xml b/app/src/main/res/values-be/strings_errors.xml
new file mode 100644
index 0000000..1574310
--- /dev/null
+++ b/app/src/main/res/values-be/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Няма злучэння з інтэрнэтам
+ Немагчыма ўсталяваць злучэнне з інтэрнэтам. Калі ласка, праверце падлучэнне вашай прылады.
+ Не атрымалася загрузіць крыніцу hosts
+ Ні водная з вашых уключаных крыніц hosts недаступна. Калі ласка, праверце падлучэнне да інтэрнэту.
+
+ Не атрымалася стварыць прыватны файл
+ Не атрымалася стварыць прыватны файл для генерацыі hosts. Пераканайцеся, што на вашай прыладзе ёсць месца.
+ Не хапае месца
+ Не ўдалося капіраваць файл hosts ў сістэмны падзел. Калі ласка, праверце, ці ўключаны сістэмны модуль Magisk, затым перазагрузіце смартфон.
+ Не атрымалася ўсталяваць новы файл hosts.
+ Не ўдалося скапіяваць файл hosts ў раздзел /system. Пераканайцеся, што ў сістэмным модулі Magisk ўключана перазагрузка.
+ Не атрымалася аднавіць файл hosts
+ Немагчыма аднавіць канфігурацыю файла host па змаўчанні.
+
+ Не атрымалася ўключыць VPN блакаванне рэкламы.
+ Калі ласка, праверце налады VPN, каб аўтарызаваць праграму VPN для запуску.
+ Не атрымалася адключыць VPN блакаванне рэкламы.
+ Калі ласка, праверце налады VPN, каб адключыць яго ўручную.
+
diff --git a/app/src/main/res/values-be/strings_home.xml b/app/src/main/res/values-be/strings_home.xml
new file mode 100644
index 0000000..ae9f88d
--- /dev/null
+++ b/app/src/main/res/values-be/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Заблакавана
+ Дазволена
+ Перанакіравана
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+ %d up-to-date sources
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+ %d outdated sources
+ %d outdated sources
+
+ Праверка наяўнасці абнаўленняў hosts
+ Абнаўленне hosts
+
+
+ Паказаць журнал запытаў DNS
+
+
+ Паказаць падказкі
+
+
+ Адкрыць старонку GitHub
+
+
+ Падтрымаць праект
+
+
+ GitHub праект
+ Налады
+
+
+ Адкрыць навігацыйную шторку
+ Прыпыніць/працягнуць блакаванне рэкламы
+ Абнавіць заблакаваныя дамены
+ Паказаць запытаныя дамены
+
+
+ Калі ласка, чытайце Даведку для атрымання большай інфармацыі.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-be/strings_hosts.xml b/app/src/main/res/values-be/strings_hosts.xml
new file mode 100644
index 0000000..6a1b1b9
--- /dev/null
+++ b/app/src/main/res/values-be/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Крыніцы hosts
+
+ Спіс карыстальнікаў
+ AdAway афіцыйны hosts
+ StevenBlack уніфікаваны hosts
+ Pete Lowe blocklist hosts
+
+ недаступны
+ %s hosts
+
+ Дадаць крыніцу
+ Рэдагаваць крыніцу
+ URL: (рэсурс https:// ці file://)
+ URL крыніцы hosts
+
diff --git a/app/src/main/res/values-be/strings_lists.xml b/app/src/main/res/values-be/strings_lists.xml
new file mode 100644
index 0000000..9a19718
--- /dev/null
+++ b/app/src/main/res/values-be/strings_lists.xml
@@ -0,0 +1,23 @@
+
+
+ Вашы спісы
+
+ Заблакавана
+ Дазволена
+ Перанакіравана
+
+ Фільтраваць hosts
+ Пошук назвы host…
+ Пераключыць крыніцы
+
+ Дадаць host у чорны спіс
+ Дадаць host у белы спіс
+ Дадаць перанакіраванне host
+ Рэдагаваць чорны спіс host
+ Рэдагаваць белы спіс host
+ Змяніць перанакіраванне
+ Назва крыніцы:
+ URL крыніцы hosts
+ (Дапускаюцца падстаноўныя сімвалы * і ?)
+ IP (IPv4 ці IPv6):
+
diff --git a/app/src/main/res/values-be/strings_log.xml b/app/src/main/res/values-be/strings_log.xml
new file mode 100644
index 0000000..a748898
--- /dev/null
+++ b/app/src/main/res/values-be/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Сартаваць па алфавіту
+ Сартаванне па найвышэйшаму ўзроўню дамена
+
+ Перанакіраваць дамен
+
diff --git a/app/src/main/res/values-be/strings_notification.xml b/app/src/main/res/values-be/strings_notification.xml
new file mode 100644
index 0000000..6912475
--- /dev/null
+++ b/app/src/main/res/values-be/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Абнаўленне
+ Новыя апавяшчэнні аб абнаўленні
+ Даступна абнаўленне
+ Для спампоўкі даступны новыя файлы hosts.
+ Даступна абнаўленне праграмы
+ Новая версія AdAway даступна для спампоўкі
+
+ VPN
+ Апавяшчэнне VPN запушчана
+
\ No newline at end of file
diff --git a/app/src/main/res/values-be/strings_prefs_backup_restore.xml b/app/src/main/res/values-be/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..5c8c767
--- /dev/null
+++ b/app/src/main/res/values-be/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Рэзервовая копія і аднаўленне
+ Рэзервовая копія
+ Захаваць рэзервовую копію вашых правілаў блакавання на знешні носьбіт
+ Аднаўленне
+ Аднавіць вашыя правілы блакавання з файла рэзервовай копіі
+
diff --git a/app/src/main/res/values-be/strings_prefs_main.xml b/app/src/main/res/values-be/strings_prefs_main.xml
new file mode 100644
index 0000000..a93f303
--- /dev/null
+++ b/app/src/main/res/values-be/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Налады
+
+ Галоўные
+ Цёмная тэма
+
+ Светлая
+ Цёмная
+ Сістэмная
+
+ Аўтаматычнае абнаўленне
+
+ Блакіроўка рэкламы
+ Блакавальнік рэкламы на аснове root
+ Блакавальнік рэкламы на аснове VPN
+ Уключыць падтрымку IPv6
+ Рэзервовая копія / аднаўленне правілаў блакавання
+
+ Рэжым адладкі
+ Адпраўляць справаздачы аб памылках
+ Адпраўляць у Sentry (sentry.io)
+ Не падтрымліваецца ў гэтай зборцы
+ Журнал адладкі
+ Для прымянення патрабуецца перазапуск праграмы
+
diff --git a/app/src/main/res/values-be/strings_prefs_root.xml b/app/src/main/res/values-be/strings_prefs_root.xml
new file mode 100644
index 0000000..505cd78
--- /dev/null
+++ b/app/src/main/res/values-be/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Блакавальнік рэкламы на аснове root
+
+ Усталёўка hosts
+ Адкрыць файл hosts
+ Шлях да файла hosts
+ Прачытайце даведку перад выкарыстаннем гэтай магчымасці
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Карыстацкія налады
+
+ Карыстацкае мэтавае размяшчэнне
+ Схаваць дыялог перазагрузкі пасля прымянення
+
+ Перанакіраванне
+ Вызначыць куды пераадрасоўваць заблакаваныя hosts
+ Перанакіраванне IPv4
+ Перанакіраванне IPv6
+ Няправільнае перанакіраванне
+
+ Лакальны вэб-сервер
+ Лакальны вэб-сервер праслухоўвае лакальныя IP адрасы і адказвае на запыты да заблакаваных hosts. Гэта дапаможа пазбягаць завісанняў пры блакаванні падключэнняў.
+ Уключыць вэб-сервер
+ Тэставы вэб-сервер
+ Усталяваць самападпісаны сертыфікат
+ Ручная ўсталёўка сертыфіката
+ Пачынаючы з Android 11 (R), праграма больш не можа аўтаматычна ўсталёўваць цэнтр сертыфікацыі (CA).\n\nПерайдзіце ў налады «Бяспека», «Шыфраванне і ўліковыя даныя», затым «Усталяваць сертыфікат». Адтуль выберыце «Сертыфікат ЦС» і абярыце новы экспартаваны файл сертыфіката.
+ Адкрыйце налады «Бяспека».
+ Праверка…
+ Не запушчана
+ Запушчаны, але сертыфікат не ўсталяваны
+ Запушчаны, сертыфікат усталяваны
+ Замяніць пустое рэкламнае месца на значок праграмы
+
diff --git a/app/src/main/res/values-be/strings_prefs_update.xml b/app/src/main/res/values-be/strings_prefs_update.xml
new file mode 100644
index 0000000..f23f4d8
--- /dev/null
+++ b/app/src/main/res/values-be/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Абнаўленне
+
+ Абнаўленне праграмы
+ Праверце наяўнасць абнаўленняў пры запуску
+ Перыядычная праверка абнаўленняў
+ Шукаць бэта-версіі
+
+ Абнаўленне hosts
+ Праверце наяўнасць абнаўленняў пры запуску
+ Перыядычная праверка абнаўленняў
+ Сінхранізацыя пры абнаўленні
+ Сінхранізацыя толькі ў неабароненай сеткі
+
diff --git a/app/src/main/res/values-be/strings_prefs_vpn.xml b/app/src/main/res/values-be/strings_prefs_vpn.xml
new file mode 100644
index 0000000..8c5abf4
--- /dev/null
+++ b/app/src/main/res/values-be/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Блакавальнік рэкламы на аснове VPN
+
+ Уключыць пры запуску
+ Праверка злучэнне
+ Перыядычна правярайце стан сеткі, каб перазапусціць VPN пры адключэнні.
+
+ Выключаныя праграмы
+ Наладзьце, якія праграмы не павінны выкарыстоўваць VPN, каб злучэнні не былі заблакаваныя.
+ Выключыць сістэмныя праграмы
+
+ Няма
+ Усе, акрамя браўзэраў
+ Усе
+
+ Выключыце карыстацкія праграмы
+
+
+ Выключаныя праграмы
+ Выбраць усе
+ Зняць выбар усіх
+ Значок праграмы
+
diff --git a/app/src/main/res/values-be/strings_support.xml b/app/src/main/res/values-be/strings_support.xml
new file mode 100644
index 0000000..613ad2d
--- /dev/null
+++ b/app/src/main/res/values-be/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Падтрымаць
+ Стань спонсарам
+
\ No newline at end of file
diff --git a/app/src/main/res/values-be/strings_update.xml b/app/src/main/res/values-be/strings_update.xml
new file mode 100644
index 0000000..a216a32
--- /dev/null
+++ b/app/src/main/res/values-be/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Абнавіць AdAway
+
+ Даступна абнаўленне!
+
+
+ У вас актуальная версія
+ Даступна абнаўленне
+ Абнаўленне AdAway
+ Абнавіць зараз
+ %1$s / %2$s
+ Апошнія змены
+ Спіс змен
+ Падтрымаць распрацоўку
+ Ахвяраваць
+ Спонсар
+
+
+ Ідзе спампоўка апошняй версіі AdAway …
+
diff --git a/app/src/main/res/values-be/strings_welcome.xml b/app/src/main/res/values-be/strings_welcome.xml
new file mode 100644
index 0000000..ffdac8b
--- /dev/null
+++ b/app/src/main/res/values-be/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Сардэчна запрашаем
+ Першы крок
+ Другі крок
+ Апошні крок
+
+
+ Сардэчна запрашаем у AdAway!
+ AdAway падае два метаду блакавання рэкламы. Выберыце той, які вам пасуе:
+
+ Лагатып root
+ Root\n блакіроўка рэкламы
+ Хутчэй
+ Эканоміць батарэю
+ Патрабуюцца рут правы
+
+ Лагатып VPN
+ VPN\nблакіроўка рэкламы
+ Павольней
+ Працуе ў фоне
+ Сумяшчальны
+
+ Для Android патрабуюцца правы Root
+ Альбо двайковы файл su не знойдзены, альбо вы не далі права root для AdAway.\n\nГэта можа здарыцца, калі ваша прылада не мае root-правоў. Вы можаце знайсці інфармацыю аб тым, як атрымаць root правы на вашай прыладзе, на wiki.lineageos.org або іншых сайтах Android.
+
+ Плюсы
+ Мінусы
+
+
+ Сінхранізацыя завершана
+ Памылка пры сінхранізацыі
+
+ Сінхранізацыя
+ Сінхранізавана!
+ AdAway загружае спісы блакавання з анлайн-крыніц. Вы можаце змяніць іх пазней у наладах.
+ Паўтарыць сінхранізацыю
+ Сінхранізацыя не ўдалася: %1$s nПаўтарыць зараз?
+
+
+ Падтрымаць
+ Падтрымай мяне!
+ Гэта бясплатная праграма з адкрытым зыходным кодам. Я займаюся гэтым у вольны час. Так што, калі вам гэта падабаецца, не саромейцеся паказаць сваю падтрымку:
+ Ахвяраваць на PayPal
+ Вам не падабаюцца памылкі? Мне таксама.
+ Уключыць тэлеметрыю для адпраўкі мне справаздач аб збоях
+
+
+ Назад
+ Далей
+ Завершыць
+
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
new file mode 100644
index 0000000..27bdf08
--- /dev/null
+++ b/app/src/main/res/values-bg/strings.xml
@@ -0,0 +1,262 @@
+
+
+
+ Изход
+ Затваряне
+ Да
+ Не
+ Добавяне
+ Отказ
+ Запазване
+ Помощ
+
+
+ Добре дошли!
+ AdAway е безплатно приложение с отворен код, създадено да спира рекламите. То изтегля адресите на рекламните мрежи и спира заявките от устройството към тях.\nИскате ли да научите повече? Потърсете помощ по-долу!
+ Помощ
+ Състояние на обновяване
+ Всички hosts файлове от зададените източници се изтеглят, сливат се с вашите списъци и се инсталират като един host файл във вашата система.
+ Включване блокирането на реклами
+ Изключване блокирането на реклами
+ Уеб сървър
+ Включен
+ Изключен
+ Включване или изключване на местен уеб сървър, отговарящ на заявки към блокирани хостове.
+ Включване на уеб сървър
+ Изключване на уеб сървър
+ VPN
+ Работи
+ Спрян
+ Включване или изключване на VPN, който да филтрира на заявки.
+ Включване на VPN
+ Изключване на VPN
+
+
+ Редактиране
+ Прилагане
+ Редактиране
+ Изтриване
+
+
+ Внасяне…
+ Резервното копие е внесено успешно от външната памет.
+ Грешка при внасяне на резервно копие. Форматът правилен ли е? Проверете дневника за подробности.
+ Изнасяне…
+ Резервното копие е изнесено във файла „%s“ на външното хранилище.
+ Грешка при изнасяне на резервното копие „%s“.
+
+
+ Файлът hosts
+ Файлът hosts е системен файл, който свързва имена на хостове с адреси по IP. Той е обикновен текстов файл, настройката на който се извършва от AdAway. Ето първите няколко реда:
+ Зареждане съдържанието на файла hosts…
+ Отваряне на файла hosts
+
+
+ Проверка за обновяване
+ Проверка за обновяване на %s
+ Извличане на източници
+ Изтегляне на източник%s
+ Прочитане на %s
+ Анализ на %s
+ Синхронизиране на базата данни с правила
+ Връщане към файл с хостове по подразбиране
+ Файлът с хостове по подразбиране е възстановен
+ Създаване на стандартен файл Hosts
+ Налично е обновяване
+ Налични са нови файлове hosts
+ Няма обновен източник
+ Няма връзка с интернет
+ Няма връзка с интернет
+ Не са достипни източници
+ Няма достъпни източници на файлове hosts!
+ Достъпът до суперпотребителя е отказан
+ Дайте достъп до суперпотребителя от съответното приложение
+ Нещо се обърка
+ Проверете дневника за повече подробности
+ Активиран
+ Най-новите Hosts файлове са активирани
+ Деактивиран
+ Hosts файлът по подразбиране е инсталиран
+ Прилагане на последните източници
+ Създаване на нов хост файл
+ Копиране на нов хост файл
+ Проверяване на копието на хост файла
+ Файлът hosts е успешно обновен
+ Настройката на VPN е успешно обновена
+ Настройките са променени. Трябва да бъдат приложени.
+ Прилагане
+ Прилагане на настройки…
+ Грешка при прилагане на настройките.
+
+
+ Символната връзка целта на хост файла липсва
+ Символната връзка от целевия файл към /system/etc/hosts не съществува или е недействителна! AdAway няма да работи ако тя не е правилна.\n\nЖелаете ли да бъде създадена символна връзка?
+ Липсва символна връзка
+ Няма достатъчно място на дяла!\nОпитайте да промените целевия Hosts файл в настройките на /data/data/hosts.
+ Няма достатъчно място
+ Изтегленият файл не може да бъде прочетен.
+ Неуспех с личния файл
+ Неуспешно монтиране на дяла за четене / запис!
+ Повторното монтиране се провали
+ Копирането на хост файла се провали
+ Неуспешно копиране на Hosts файла!
+ Копирането е неуспешно
+ Приложени източници на Hosts
+ Успешно прилагане
+ Успешно прилагане.\nМоже да се наложи да рестартирате Android, за да влязат в сила промените.\n\nИскате ли да рестартирате?\n(За да предотвратите загуба на данни, уверете се, че в момента никое приложение не използва SD картата!)
+ Символичната връзка е създадена успешно.\nМоже да се наложи да рестартирате Android, за да влязат в сила промените.\n\nИскате ли да рестартирате?\n(За да предотвратите загуба на данни, уверете се, че в момента никое приложение не използва SD картата!)
+ Успешно създаване на символична връзка
+ Символната връзка не може да бъде създадена от Android.\nТова се дължи най-вече на „функция“, наречена S-ON при телефоните на HTC!\n\nЕдно от възможните решения е да заредите телефона си в режим на възстановяване и там да създадете символна връзка с командата „ln -s /data/data/hosts /system/etc/hosts“.\n\nАко това и не работи, потърсете в интернет за S-OFF и вашия модел на телефона.
+ Грешка при създаване на символна връзка.
+ Моля, прочетете Помощ за повече информация.
+ Зададено е APN прокси на вашия Android!\nAdAway няма да работи надеждно, когато сте на мобилни мрежи като 3G. Можете да деактивирате това прокси като отидете на вашия избран APN (От Настройки: Мрежа и интернет -> Мобилна мрежа -> Разширени -> Имена на точки за достъп) и премахнете стойността в полето за прокси.
+ APN прокси е зададено!
+ Връзката с интернет не работи.
+ Няма връзка
+ Изтегляне…
+ Прилагане…
+ Прилагане на черния и белия списък
+ Анализ и обединяване на Hosts файловете
+ Изграждане на Hosts файла
+ Прилагане на Hosts файла
+ Прилагането на новия хост файл се провали.
+ Прилагането на Hosts файла във вашата система е неуспешно!\nОпитайте да промените целевия Hosts файл в настройките на /data/data/hosts.
+ Неуспешно прилагане
+ Моля проверете Вашето root приложение за управление, за да сте сигурни, че root правата са дадени.
+ Върнахте Hosts файла по подразбиране.\nМоже да се наложи да рестартирате Android, за да влязат в сила промените.\n\nИскате ли да рестартирате?\n(За да предотвратите загуба на данни, уверете се, че в момента никое приложение не използва SD картата!)
+ Връщането е успешно
+ Хост файлът не може да се върне
+ Връщането се провали по неизвестни причини.
+ Връщането е неуспешно!
+ Нито един от включените източници на Hosts файлове не е достъпен! Правилно ли сте свързани към Интернет?
+ Изтеглянето е неуспешно
+ Записването на нов частен хост файл се провали
+ Личен файл не може да бъде създаден.
+ Неуспешно създаване на личен файл
+ Активирахте безсистемен режим.\nМоже да се наложи да рестартирате Android, за да влязат в сила промените.\n\nИскате ли да рестартирате?\n(За да предотвратите загуба на данни, уверете се, че в момента никое приложение не използва SD картата!)
+ Успешно активиране
+ Деактивирахте безсистемния режим.\nМоже да се наложи да рестартирате Android, за да влязат в сила промените.\n\nИскате ли да рестартирате?\n(За да предотвратите загуба на данни, уверете се, че в момента никое приложение не използва SD картата!)
+ Деактивирането е успешно
+ Включването на VPN блокирането на реклами се провали.
+ Спирането на VPN блокирането на реклами се провали.
+ Включване на хостове от модула Magisk
+ Включване на функцията безсистемни хостове от управлението на Magisk. От неговите настройките включете опцията Безсистемни хостове, след което рестартирайте устройството Ви.
+ Изключване на хостове от модула Magisk
+ Изключване на функцията безсистемни хостове от управлението на Magisk. От списъка на модула, деинсталирайте модула Безсистемни хостове, след което рестартирайте устройството Ви.
+
+
+ Въведете URL на Hosts файла:
+ Това не е валидно име на хост!
+ Неправилно форматирано име на хост
+ Това не е валиден IP адрес!
+ Неправилно форматиран IP адрес
+ Никога да не се рестартира и да не се показва този въпрос следващия път!
+ Зареждане…
+
+
+ Опресняване
+ Добавяне
+ Помощ
+ Внасяне на резервно копие
+ Изнасяне на резервно копие
+
+
+ S-ON/S-OFF
+ Въпроси и отговори
+ Проблеми
+
+
+ Рекламен софтуер
+ Тук може на намерите инсталиран рекламен софтуер, лоши приложения, които не могат да бъдат блокирани от AdAway. Тези приложения използват например изскачащи известия, които се появяват дори когато приложението не работи. Могат дори да променят мелодията ви. Единственото налично противодействие е да деинсталирате тези приложения като натиснете върху елементите в списъка.
+ Сканиране…
+ Не са открити рекламни приложения!
+
+
+ Спира рекламите
+ Не е инсталиран текстов редактор
+ Не е намерен текстов редактор, за да се отвори файла Hosts. Можете да инсталирате Jota или друг текстов редактор.\n\nИскате ли да инсталирате Jota?
+ Не е инсталиран файлов мениджър
+ Не е намерен файлов мениджър, който да отваря файлове. Можете да инсталирате OI File Manager или друг файлов мениджър, който да се справи с това.\n\nИскате ли да инсталирате OI File Manager?
+
+
+ Tcpdump
+ Tcpdump е инструмент за наблюдение на DNS заявките и записването им във файл. Можете да го стартирате във фонов режим, да стартирате приложения, които показват реклами, а след това да анализирате DNS заявките с помощта на този файл. Възможен рекламен сървър може да бъде добавен към вашия черен списък.
+ Изключване на мониторинг
+ Включване на мониторинг
+ Показване на резултатите
+ Сортиране на домейните
+ Изчистване на дневника
+ Добавяне на запис в черния списък
+ Добавяне на запис в белия списък
+ Добавяне на запис в списъка за пренасочване
+
+ Редактиране стойност на предпочитания за текст
+ Отваряне на менюто
+ Затваряне на менюто
+
+
+
+ Начало
+ Източници за Hosts файла
+ Вашите списъци
+ Отваряне на Hosts файла
+ Регистриране на DNS заявките
+ Сканиране за рекламен софтуер
+ Настройки
+ Помощ
+
+
+
+
+ DNS заявки
+ Вашите списъци
+ Настройки
+
+
+ Инсталиран преди %1$s
+ Без обновяване от %1$s
+ За обновяване %1$s
+ Последно обновяване преди %1$s
+ Състоянието на обновяване е неизвестно
+ Изключено
+ няколко минути
+
+ %d минута
+ %d минути
+
+
+ %d час
+ %d часа
+
+
+ %d ден
+ %d дни
+
+
+ %d месец
+ %d месеца
+
+
+
+ Хостът е копиран
+
+
+ стартиране
+ активно
+ спиране
+ изчакване за мрежа
+ повторно свързване
+ грешка при повторно свързване
+ пауза
+ спрян
+ VPN блокер на реклами %1$s
+ Пауза
+ Възстановяване
+
+
+ Разрешения на AdAway
+ Разрешаване на взаимодействие с AdAway
+ Изпращане на команди към AdAway
+ Разрешете изпращането на команди към AdAway като включване или изключване на спирането на реклами на ниво система.
+
+
diff --git a/app/src/main/res/values-bg/strings_app.xml b/app/src/main/res/values-bg/strings_app.xml
new file mode 100644
index 0000000..427e1c5
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Рекламен блокер с отворен код
+ AdAway лого
+
diff --git a/app/src/main/res/values-bg/strings_errors.xml b/app/src/main/res/values-bg/strings_errors.xml
new file mode 100644
index 0000000..51f267a
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Няма връзка с интернет
+ Не може да се установи връзка с Интернет. Моля, проверете свързаността на устройството Ви.
+ Свалянето източника на хостове се провали
+ Никои от Вашите включени източници на хостове са достъпни. Моля, проверете дали сте свързани към Интернет.
+
+ Създаването на частен файл се провали
+ Невъзможно е създаването на частен файл за сглобяване на нов източник на хостове. Моля, проверете свободното пространство на Вашето устройство.
+ Няма достатъчно място
+ Невъзможно е копирането на хост файл на системния партишън. Моля проверете дали безсистемния модул на Magisk е включен и след това рестартирайте.
+ Инсталирането на нов хост файл се провали
+ Копирането на файла hosts в /system е невъзможно. Проверете дали безсистемният модул на Magisk е включен и рестартирайте.
+ Отменянето на хост файла се провали
+ Невъзможно е възстановяването на конфигурацията по подразбиране на хост файла.
+
+ Включването на VPN блокирането на реклами се провали.
+ Моля, проверете Вашите VPN настройки, за да се авторизира VPN на приложението да стартира.
+ Спирането на VPN блокирането на реклами се провали.
+ Моля, проверете Вашите VPN настройки, за да ги изключите ръчно.
+
diff --git a/app/src/main/res/values-bg/strings_home.xml b/app/src/main/res/values-bg/strings_home.xml
new file mode 100644
index 0000000..031ba02
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Блокирани
+ Позволени
+ Пренасочени
+
+
+
+ %d обновен източник
+ %d обновени източника
+
+
+ %d източник за обновяване
+ %d източника за обновяване
+
+ Проверка за актуализации на хостовете
+ Актуализиране на хостовете
+
+
+ Заявки към DNS
+
+
+ Помощ
+
+
+ Страница в GitHub
+
+
+ Даряване
+
+
+ Проект в GitHub
+ Настройки
+
+
+ Отваряне на чекмеджето за навигация
+ Пауза/възобновяване на блокирането на реклами
+ Актуализиране на блокирани домейни
+ Показване на заявените домейни
+
+
+ Моля, прочетете Помощ за повече информация.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bg/strings_hosts.xml b/app/src/main/res/values-bg/strings_hosts.xml
new file mode 100644
index 0000000..ec255dd
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Източници за Hosts файла
+
+ Потребителски списък
+ Официален списък на AdAway
+ Обединени хостове на StevenBlack
+ Списък с блокирани хостове на Pete Lowe
+
+ не е наличен
+ %s хоста
+
+ Добавяне на източник
+ Редактиране на източник
+ URL: (https:// или file:// ресурс)
+ URL адрес на източника на Hosts
+
diff --git a/app/src/main/res/values-bg/strings_lists.xml b/app/src/main/res/values-bg/strings_lists.xml
new file mode 100644
index 0000000..fb4c559
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Вашите списъци
+ Добавяне на hosts
+
+ Блокирани
+ Позволени
+ Пренасочени
+
+ Филтриране на хостове
+ Търсене на име на хост…
+ Превключване на източници
+
+ Добавяне на хост в черния списък
+ Добавяне на хост в белия списък
+ Добавяне на пренасочване на хост
+ Редактиране на хост от черния списък
+ Редактиране на хост от белия списък
+ Редактиране на пренасочване
+ Име на хост:
+ URL адрес на източника на Hosts
+ (Позволени са заместващи символи * и ?)
+ IP (IPv4 или IPv6):
+
diff --git a/app/src/main/res/values-bg/strings_log.xml b/app/src/main/res/values-bg/strings_log.xml
new file mode 100644
index 0000000..593a083
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Превключване на дневника
+ Натиснете бутона за запис, за да започнат да се записват заявките в дневника. Разглеждайте в интернет или използвайте приложения, след това се върнете тук и дръпнете надолу, за да презаредите на дневника.
+ \n\nСпрените заявки нама да присъстват в дневника. Ако желаете да присъстват, тогава първо изключете спирането на рекламите.
+
+ Азбучно сортиране
+ Сортиране на домейн от първо ниво
+
+ Пренасочване на домейн
+
diff --git a/app/src/main/res/values-bg/strings_notification.xml b/app/src/main/res/values-bg/strings_notification.xml
new file mode 100644
index 0000000..8584e67
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Актуализации
+ Уведомления за нови актуализации
+ Налице е актуализация на източник
+ Нови хост файлове са достъпни за сваляне.
+ Налице е актуализация на приложението
+ Нова версия на AdAway е налице за изтегляне.
+
+ VPN
+ Уведомления за работещ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bg/strings_prefs_backup_restore.xml b/app/src/main/res/values-bg/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..fe2e3bd
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Резервно копие и възстановяване
+ Резервно копие
+ Създава резервно копие на правилата във външното хранилище
+ Възстановяване
+ Възстановява правилата от резервно копие
+
diff --git a/app/src/main/res/values-bg/strings_prefs_main.xml b/app/src/main/res/values-bg/strings_prefs_main.xml
new file mode 100644
index 0000000..5ccea96
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Настройки
+
+ Общи
+ Тъмна тема
+
+ Светла
+ Тъмна
+ По подразбиране
+
+ Автоматично обновяване
+
+ Блокиране на реклами
+ Руут базиран блокер на реклами
+ VPN базиран блокер на реклами
+ Включване на IPv6 поддръжка
+ Резерено копие / възстановяване на правила
+
+ Отстраняване на грешки
+ Изпращане на доклади за сривове
+ Докладване до Sentry (sentry.io)
+ Не се поддържа в тази сглобка
+ Подробности в дневника
+ Необходимо е рестартиране на приложението за прилагане
+
diff --git a/app/src/main/res/values-bg/strings_prefs_root.xml b/app/src/main/res/values-bg/strings_prefs_root.xml
new file mode 100644
index 0000000..ffafd12
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Спиране на реклами чрез суперпотребител
+
+ Инсталиране на хостове
+ Отваряне на файла hosts
+ Целеви файл hosts
+ Прочетете Помощ преди да използвате тази функция
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Папка по избор
+
+ Персонализирано целево местоположение
+ Без рестарт след прилагане
+
+ Пренасочване
+ Дефиниране къде да се пренасочват блокирани хостове
+ Пренасочване на IPv4
+ Пренасочване на IPv6
+ Недопустимо пренасочване
+
+ Местен уеб сървър
+ Местният уеб сървър слуша на местен адрес по IP, за да отговори на заявки към блокиран хост. Може да помогне при замръзване на приложение при блокирана реклама.
+ Включване на уеб сървър
+ Тестване на уеб сървър
+ Инсталиране на самоподписан сертификат
+ Ръчно инсталиране на сертификати
+ Започващо от Андроид 11 (R), приложението не може да инсталира авторитарни сертификати (CA) автоматично.\n\nОтидете в настройките за \"Защита\", \"Криптиране & идентификационни данни\", след това \"Инсталиране на сертификат\". От тук изберете \"CA сертификат\" и изберете новият експортиран сертификационен файл.
+ Отворете настройките за \"Сигурност\"
+ Проверка…
+ Не работи
+ Работи, но не е инсталиран сертификат
+ Работи и е инсталиран сертификат
+ Замяна на празно рекламно пространство с иконата на приложението
+
diff --git a/app/src/main/res/values-bg/strings_prefs_update.xml b/app/src/main/res/values-bg/strings_prefs_update.xml
new file mode 100644
index 0000000..8f748ad
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Обновяване
+ Известията са изключени
+ Приложението няма да показва известия. За да ги включите, докоснете.
+
+ Обновяване на приложението
+ Проверка за обновяване при стартиране
+ Периодична проверка за обновяване
+ Включително бета издания
+
+ Обновяване на хостове
+ Проверка за обновяване при стартиране
+ Периодична проверка за обновяване
+ Синхронизиране при обновяване
+ Синхронизиране само в мрежи без таксуване на трафика
+
diff --git a/app/src/main/res/values-bg/strings_prefs_vpn.xml b/app/src/main/res/values-bg/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1c7276
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN базиран блокер на реклами
+
+ Разрешаване при стартиране
+ Набюдаване на връзката
+ Периодично проверяване на състоянието на мрежата за рестартиране на VPN връзката при откачане.
+
+ Изключени приложения
+ Конфигурирайте кои приложения не трябва да използват VPN, така че няма да бъдат блокирани връзки.
+ Изключване на системни приложения
+
+ Нищо
+ All except browsers
+ All
+
+ Изключване на потребителски приложения
+
+
+ Изключени приложения
+ Избиране на всички
+ Премахване на всички
+ Икона на приложението
+
diff --git a/app/src/main/res/values-bg/strings_source_edit.xml b/app/src/main/res/values-bg/strings_source_edit.xml
new file mode 100644
index 0000000..a54c99e
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Редактиране на източник
+ Добавяне на източник
+
+ Етикет
+ Етикетът е задължителен
+ Вид
+ URL
+ Файл
+ Местоположение
+ https://
+ Местоположението е задължително
+ За да изберете изходен файл докоснете Файл
+ Местоположението е неприемливо
+ Формат на списъка
+ Забраняване
+ Разрешаване
+ Прилагане на пренасочените
+ Разрешаването на пренасочените адреси може да доведе до проблеми със сигурността. Използвайте тази настройка само при доверен източник, тъй като тя може да пренасочи чувствителен трафик към произволен сървър.
+
diff --git a/app/src/main/res/values-bg/strings_support.xml b/app/src/main/res/values-bg/strings_support.xml
new file mode 100644
index 0000000..4d8c36e
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Поддръжка
+ Станете спонсор
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bg/strings_update.xml b/app/src/main/res/values-bg/strings_update.xml
new file mode 100644
index 0000000..048e149
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_update.xml
@@ -0,0 +1,22 @@
+
+
+ Обновяване на AdAway
+
+ Налично е ново издание!
+
+
+ Ползвате последно издание
+ Налично е ново издание
+ Обновяване на AdAway
+ Обновяване
+ %1$s / %2$s
+ Готово
+ Последни промени
+ Дневник на промените
+ Подкрепете разработката
+ Даряване
+ Подпомагане
+
+
+ Изтегляне на последната версия на AdAway…
+
diff --git a/app/src/main/res/values-bg/strings_welcome.xml b/app/src/main/res/values-bg/strings_welcome.xml
new file mode 100644
index 0000000..601d502
--- /dev/null
+++ b/app/src/main/res/values-bg/strings_welcome.xml
@@ -0,0 +1,55 @@
+
+
+ Добре дошли
+ Първа стъпка на помощника
+ Втора стъпка на помощника
+ Последна стъпка на помощника
+
+
+ Добре дошли от AdAway!
+ AdAway предлага два метода за спиране на реклами.
+Изберете предпочитания от вас:
+
+ Логотип на суперпотребител
+ Чрез достъп до\nсуперпотребител
+ По-бърз
+ Пести батерия
+ Нужен е суперпотребител
+
+ Логотип на VPN
+ VPN базирано\nблокиране на реклами
+ По-бавно
+ Работи във фонов режим
+ Съвместимост
+
+ Изисква се Android с достъп до суперпотребител
+ Изпълниимият файл на su не е намерен или AdAway няма разрешение за достъп до правата на суперпотребителя.\n\n
+Това може да се случи, когато тройството ви няма достъп до суперпотребителя. Можете да намерите информация как да получите достъп до него на устройството си в wiki.lineageos.org или в други страници за Android.
+
+ Предимства
+ Недостатъци
+
+
+ Синхронизирането е извършено
+ Грешка при синхронизиране.
+
+ Синхронизиране
+ Синхронизирано!
+ AdAway изтегля от отдалечени източници рекламните мрежи, които да спира. По-късно ще можете да ги променяте в настройките.
+ Повторно синхронизиране
+ Грешка при синхронизиране: %1$s Повторен опит?
+ Може да показва известия за състоянието и да ви известява за налични обновявания (няколко пъти в годината). Включете ги, за да научаеате последните промени.
+
+
+ Поддръжка
+ Подкрепете ме!
+ AdAway е безплатно приложение с отворен код. Разработвам го в свободното си време. Ако ви хареса, не се колебайте да покажете вашата подкрепа:
+ Даряване в PayPal
+ Харесвате ли дефекти? Аз също.
+ Включване на телеметрия, за бъдат изпращани доклади за срив
+
+
+ Назад
+ Напред
+ Край
+
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
new file mode 100644
index 0000000..024fcf8
--- /dev/null
+++ b/app/src/main/res/values-bn/strings.xml
@@ -0,0 +1,22 @@
+
+
+
+ এক্সিট
+ বন্ধ
+ মুছে ফেলুন
+
+ আপডেট উপলব্ধ
+ ইন্টারনেট সংযোগ নেই
+ কোন ইন্টারনেট সংযোগ উপলব্ধ নেই
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-bn/strings_app.xml b/app/src/main/res/values-bn/strings_app.xml
new file mode 100644
index 0000000..c2ac018
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ অ্যাডঅ্যাওয়ে
+
diff --git a/app/src/main/res/values-bn/strings_errors.xml b/app/src/main/res/values-bn/strings_errors.xml
new file mode 100644
index 0000000..c0126e0
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_errors.xml
@@ -0,0 +1,5 @@
+
+
+
+ ইন্টারনেট সংযোগ নেই
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bn/strings_home.xml b/app/src/main/res/values-bn/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bn/strings_hosts.xml b/app/src/main/res/values-bn/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-bn/strings_lists.xml b/app/src/main/res/values-bn/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-bn/strings_log.xml b/app/src/main/res/values-bn/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-bn/strings_notification.xml b/app/src/main/res/values-bn/strings_notification.xml
new file mode 100644
index 0000000..1de8595
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_notification.xml
@@ -0,0 +1,4 @@
+
+
+ আপডেট উপলব্ধ
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bn/strings_prefs_backup_restore.xml b/app/src/main/res/values-bn/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-bn/strings_prefs_main.xml b/app/src/main/res/values-bn/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-bn/strings_prefs_root.xml b/app/src/main/res/values-bn/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-bn/strings_prefs_update.xml b/app/src/main/res/values-bn/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-bn/strings_prefs_vpn.xml b/app/src/main/res/values-bn/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-bn/strings_support.xml b/app/src/main/res/values-bn/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bn/strings_update.xml b/app/src/main/res/values-bn/strings_update.xml
new file mode 100644
index 0000000..eb3aaeb
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ আপডেট উপলব্ধ
+
diff --git a/app/src/main/res/values-bn/strings_welcome.xml b/app/src/main/res/values-bn/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-bn/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
new file mode 100644
index 0000000..aeb5857
--- /dev/null
+++ b/app/src/main/res/values-ca/strings.xml
@@ -0,0 +1,262 @@
+
+
+
+ Surt
+ Tanca
+ Si
+ No
+ Afegeix
+ Cancel·la
+ Desa
+ Ajuda
+
+
+ Us donem la benvinguda!
+ L\'AdAway és una aplicació de codi obert i gratuïta dissenyat per blocar anuncis. Obté adreces de xarxa publicitària per blocar-les al dispositiu.\nVoleu saber-ne més? Feu un cop d\'ull a l\'ajuda de sota!
+ Mostra més ajuda
+ Estat d\'actualització
+ Es baixen tots els fitxers d\'amfitrió d\'unes fonts definides, s\'uneixen amb les vostres llistes que personalitzeu i s\'instal·len com a un únic fitxer amfitrió al vostre sistema.
+ Activa el bloqueig d\'anuncis
+ Desactiva el bloqueig d\'anuncis
+ Servidor web
+ En execució
+ Aturat
+ Atura o inicia el servidor web local per respondre les peticions de les direccions blocades.
+ Activa el servidor web
+ Desactiva el servidor web
+ VPN
+ En execució
+ Aturat
+ Arrenca o para la VPN per a filtrar peticions
+ Activa la VPN
+ Desactiva la VPN
+
+
+ Edita l\'entrada
+ Aplica
+ Edita
+ Elimina
+
+
+ S\'està important….
+ S\'ha importat correctament la còpia de l\'emmagatzematge extern.
+ Ha fallat en importar la còpia. El format és correcte? Mireu l\'informe del logcat per a més informació.
+ S\'està exportant…
+ S\'ha exportat correctament l\'arxiu \'%s\' a l\'emmagatzematge extern.
+ Error al exportar la còpia de seguretat \'%s\'
+
+
+ El fitxer d\'amfitrions
+ El fitxer d\'amfitrions és un fitxer del sistema on s\'associen noms d\'amfitrió a les corresponents adreces IP. És un fitxer en text pla on la seva configuració és administrada per l\'AdAway. Aquí podeu veure les primeres línies:
+ S\'està carregant el contingut del fitxer d\'amfitrions…
+ Obre el fitxer d\'amfitrions
+
+
+ S\'estan comprovant les actualitzacions
+ Comprovant a %s si hi han actualitzacions
+ Recuperant recursos
+ Descarregant recurs %s
+ Llegint font %s
+ Analitzant font %s
+ Sincronització de les regles de la base de dades
+ Retornant al fitxer hosts per defecte
+ Fitxer hosts per defecte restaurat
+ Creació del fitxer estàndard de servidors
+ Actualització disponible
+ Amfitrions nous disponibles
+ No s\'han trobat actualitzacions de la font
+ No hi ha connexió a internet
+ No hi ha connexió a internet disponible
+ Fonts no disponibles
+ No s\'ha pogut contactar amb els servidors de fonts!
+ Accés a Root rebutjat
+ Heu de facilitar permisos d\'administrador a l\'aplicació
+ Quelcom ha anat malament
+ Veieu l\'informe del logcat per a més informació
+ Activat
+ S\'han activat els fitxers d\'amfitrions més recents
+ Desactivat
+ S\'han instal·lat els fitxers d\'amfitrions per defecte
+ Aplicar ultimes fonts
+ Creant un nou fitxer hosts
+ Copiant un nou fitxer hosts
+ Comprovant còpia del fitxer hosts
+ Fitxer hosts actualitzat correctament
+ Configuració de la VPN actualitzada correctament
+ Ha canviat la configuració. Heu d\'aplicar els canvis.
+ Aplica
+ Aplicant nova configuració…
+ Error al aplicar la nova configuració
+
+
+ No es troba l\'enllaç simbolic al fitxer hosts escollit
+ L\'enllaç simbòlic cap a /system/etc/hosts no existeix o no és correcte! L\'AdAway no funcionarà si no apunta al fitxer correcte.\n\nVoleu intentar crear un enllaç simbòlic?
+ Falta l\'enllaç simbòlic
+ No hi ha prou espai a la partició!\nProveu canviant el fitxer a les preferències a /data/data/hosts.
+ No hi ha prou espai
+ No s\'ha pogut llegir el fitxer baixat.
+ Error al fitxer privat
+ Ha fallat al muntar la partició en mode lectura/escriptura!
+ Ha fallat en muntar
+ Error al copiar l\'arxiu de hosts
+ No s\'ha pogut copiar el fitxer!
+ Ha fallat la còpia
+ S\'han aplicat les fonts
+ S\'ha aplicat correctament
+ S\'ha aplicat correctament.\nÉs necessari reiniciar Android per aplicar els canvis.\n\nVoleu reiniciar ara?\n(Per evitar cap pèrdua a la targeta SD, assegureu-vos que cap altra aplicació l\'està utilitzant en aquest moment!)
+ S\'ha creat l\'enllaç simbòlic correctament.\nÉs necessari reiniciar Android per aplicar els canvis.\n\nVoleu reiniciar ara?\n(Per evitar cap pèrdua a la targeta SD, assegureu-vos que cap altra aplicació l\'està utilitzant en aquest moment!)
+ S\'ha creat l\'enllaç simbòlic correctament
+ L\'Android no ha pogut crear l\'enllaç simbòlic.\nAixò falla normalment per una característica anomenada S-ON als telèfons HTC.\n\nUna solució és iniciar el telèfon en mode recuperació i crear l\'enllaç simbòlic allà amb \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nSi no funciona, cerqueu a Internet S-OFF i el model del vostre telèfon.
+ S\'ha produït un error en la creació de l\'enllaç simbòlic
+ Veieu l\'ajuda per a més informació.
+ S\'ha configurat un servidor intermediari APN al vostre Android!\nL\'AdAway no funcionarà correctament amb xarxes com ara 3G. Podeu desactivar aquest servidor intermediari d\'aquest APN (des del menú Configuració -> Connexions sense fils i xarxes -> Xarxes mòbils -> APN -> Nom del vostre APN) i suprimint el valor del camp Servidor intermediari.
+ S\'ha desat el servidor intermediari d\'APN
+ La connexió a Internet no funciona.
+ Sense connexió
+ S\'està baixant…
+ S\'està aplicant…
+ Aplicant llista negra i llista blanca
+ Processant i unint els fitxers hosts
+ Construïnt fitxer hosts
+ Aplicant el fitxer hosts
+ Error al aplicar el nou arxiu de hosts
+ No s\'ha pogut aplicar el fitxer al sistema!\nProveu canviant la ruta del fitxer a les preferències a /data/data/hosts.
+ Aplicació fallida
+ Verifiqueu que l\'aplicació disposa de permisos d\'administrador (Root).
+ Heu restaurat al fitxer per defecte.\nÉs necessari reiniciar Android per aplicar els canvis.\n\nVoleu reiniciar ara?\n(Per evitar cap pèrdua a la targeta SD, assegureu-vos que cap altra aplicació l\'està utilitzant en aquest moment!)
+ S\'ha revertit correctament
+ No s\'ha pogut revertir l\'arxiu de hosts
+ Procés de revertiment fallit degut a causes desconegudes
+ Ha fallat en restaurar!
+ No es pot contactar amb cap font dels fitxers d\'amfitrions. Comproveu la connexió a internet.
+ Error amb la baixada
+ Error al escriure el nou arxiu de hosts privat
+ No s\'ha pogut crear el fitxer privat.
+ Error en la creació del fitxer privat
+ Heu activat el mode systemless.\nÉs necessari reiniciar Android per aplicar els canvis.\n\nVoleu reiniciar ara?\n(Per evitar cap pèrdua a la targeta SD, assegureu-vos que cap altra aplicació l\'està utilitzant en aquest moment!)
+ S\'ha habilitat correctament
+ Heu desactivat el mode systemless.\nÉs necessari reiniciar Android per aplicar els canvis.\n\nVoleu reiniciar ara?\n(Per evitar cap pèrdua a la targeta SD, assegureu-vos que cap altra aplicació l\'està utilitzant en aquest moment!)
+ S\'ha inhabilitat correctament
+ Error al activar el blocatge d\'anuncis per VPN
+ Error al desactivar el blocatge d\'anuncis per VPN
+ Activant mòdul Magisk de hosts
+ Activar funció \"systemless hosts\" del Magisk manager. Des de la configuració del Magisk, activar l\'opció Systemless hostsi reiniciar el dispositiu.
+ Desactivant mòdul Magisk de hosts
+ Desactivar funció \"systemless hosts\" del Magisk manager. Des del llistat de mòduls del Magisk, desinstalar el modulSystemless hostsi reiniciar el dispositiu.
+
+
+ Introduïu l\'adreça URL cap el fitxer hosts:
+ Aquest no és un nom de servidor vàlid!
+ Nom de màquina incorrecte
+ Aquesta no és una IP vàlida!
+ Format IP incorrecte
+ No reiniciïs mai i no mostris més aquest missatge.
+ Carregant..
+
+
+ Refresca
+ Afegeix
+ Ajuda
+ Importar còpia de seguretat
+ Exportar còpia de seguretat
+
+
+ S-ON/S-OFF
+ PMF (FAQ)
+ Problemes
+
+
+ Adware
+ Aquí podeu trobar aplicacions Adware malignes que no es poden bloquejar amb AdAway. Aquestes aplicacions utilitzen, entre altres, notificacions Airpush que poden apareixer inclús quan l\'aplicació no està funcionant o poden inclús canviar el vostre to de trucada. La única defensa possible és desinstalar-les clicant en la llista de elements
+ S\'està escanejant…
+ No s\'ha trobat Adware!
+
+
+ Bloquejador d\'anuncis
+ No hi ha cap editor de text instal·lat
+ No s\'ha trobat cap editor de text per obrir el fitxer hosts. Podeu intal·lar Jota o d\'altres editors de text per gestionar-ho.\n\nVoleu instal·lar Jota?
+ No hi ha cap gestor de fitxers instal·lat
+ No s\'ha trobat cap gestor de fitxers per obrir fitxers. Podeu instal·lar l\'OI File Manager o d\'altres gestors de fitxers per gestionar-ho.\n\nVoleu instal·lar l\'OI File Manager?
+
+
+ Tcpdump
+ tcpdump és una eina per monitoritzar i desar les peticions DNS. Podeu iniciar-lo en segon pla, iniciar les aplicacions que mostrin anuncis i, més tard, analitzar les peticions DNS utilitzant el registre de tcpdump. Així podreu afegir els servidors d\'anuncis a la vostra llista.
+ Desactiva la supervisió
+ Activa la supervisió
+ Mostra els resultats
+ Ordena dominis
+ Esborra el registre
+ Afegeix una entrada a la llista negra
+ Afegeix una entrada a la llista blanca
+ Afegeix una entrada a la llista de redireccions
+
+ Edita el valor de preferència del text
+ Obre el menú
+ Tanca el menú
+
+
+
+ Home
+ Servidors de fitxers hosts
+ Les vostre llistes
+ Obriu el fitxer de hosts
+ Log DNS requests
+ Scan for adware
+ Preferències
+ Ajuda
+
+
+
+
+ Sol·licituds DNS
+ Les vostre llistes
+ Preferències
+
+
+ Instal·lat fa %1$s
+ Actualitzat per %1$s
+ Actualització necessària per %1$s
+ Darrera actualització fa %1$s
+ Estat d\'actualització desconegut
+ Desactivat
+ pocs minuts
+
+ %d minut
+ %d minuts
+
+
+ %d hora
+ %d hores
+
+
+ %d dia
+ %d dies
+
+
+ %d mes
+ %d mesos
+
+
+
+ L\'amfitrió s\'ha copiat al porta-retalls
+
+
+ començant
+ actiu
+ aturant
+ espera a tenir xarxa
+ reconnectant
+ error durant la reconnexió
+ pausat
+ aturat
+ VPN bloquejadora d\'anuncis %1$s
+ Pausa
+ Reprèn
+
+
+ Permisos del AdAway
+ Permetre la interacció amb l\'AdAway
+ Enviar ordres a l\'AdAway
+ Permet enviar ordres al AdAway com activar/desactivar el sistema de bloqueig d\'anuncis
+
+
diff --git a/app/src/main/res/values-ca/strings_app.xml b/app/src/main/res/values-ca/strings_app.xml
new file mode 100644
index 0000000..8529cd2
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Blocador d\'anuncis de codi obert
+ Logotip de l\'AdAway
+
diff --git a/app/src/main/res/values-ca/strings_errors.xml b/app/src/main/res/values-ca/strings_errors.xml
new file mode 100644
index 0000000..2c54460
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ No hi ha connexió a internet
+ No es pot establir una connexió a Internet. Comproveu la connectivitat del vostre dispositiu.
+ No s\'ha pogut baixar la font dels amfitrions
+ Cap de les fonts dels vostres amfitrions habilitats és accessible. Comproveu que esteu connectat correctament a Internet.
+
+ No s\'ha pogut crear el fitxer privat
+ No es pot crear un fitxer privat per crear una font d\'amfitrió nova. Comproveu l\'espai lliure disponible al vostre dispositiu.
+ No hi ha prou espai
+ No es pot copiar el fitxer hosts a la partició del sistema. Comproveu que el mòdul sense sistema Magisk està activat i reinicieu-lo.
+ No s\'ha pogut instal·lar el fitxer hosts nou
+ No es pot copiar el fitxer hosts a la partició /system. Comproveu que el mòdul sense sistema Magisk està activat i reinicieu-lo.
+ No s\'ha pogut revertir el fitxer hosts
+ No es pot restaurar la configuració per defecte del fitxer hosts.
+
+ Error al activar el blocatge d\'anuncis per VPN
+ Comproveu la configuració de la vostra VPN per autoritzar l\'inici de l\'aplicació VPN.
+ Error al desactivar el blocatge d\'anuncis per VPN
+ Comproveu la configuració de la vostra VPN per desactivar-la manualment.
+
diff --git a/app/src/main/res/values-ca/strings_home.xml b/app/src/main/res/values-ca/strings_home.xml
new file mode 100644
index 0000000..94e49c9
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Bloquejat
+ Permès
+ Redirigit
+
+
+
+ %d font actualitzada
+ %d fonts actualitzades
+
+
+ %d font obsoleta
+ %d fonts obsoletes
+
+ Cerca actualitzacions dels amfitrions
+ Actualitza els amfitrions
+
+
+ Mostra el registre de sol·licituds del DNS
+
+
+ Mostra ajuda\ni consells
+
+
+ Obre la pàgina del GitHub
+
+
+ Ajudeu al projecte
+
+
+ Projecte GitHub
+ Preferències
+
+
+ Obriu el calaix de navegació
+ Pausa/reprèn el bloqueig d\'anuncis
+ Actualitza els dominis bloquejats
+ Mostra els dominis sol·licitats
+
+
+ Veieu l\'ajuda per a més informació.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ca/strings_hosts.xml b/app/src/main/res/values-ca/strings_hosts.xml
new file mode 100644
index 0000000..d5e160c
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Servidors de fitxers hosts
+
+ Llista d\'usuaris
+ Amfitrions oficials de l\'AdAway
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ no disponible
+ %s amfitrions
+
+ Afegeix una font
+ Edita la font
+ URL: (un recurs https:// o fitxer://)
+ URL de la font de l\'amfitrió
+
diff --git a/app/src/main/res/values-ca/strings_lists.xml b/app/src/main/res/values-ca/strings_lists.xml
new file mode 100644
index 0000000..fde29d0
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Les vostre llistes
+ Afegeix un amfitrió
+
+ Bloquejat
+ Permès
+ Redirigit
+
+ Filtra els amfitrions
+ Cerca un nom d\'amfitrió…
+ Commuta les fonts
+
+ Afegeix l\'amfitrió a la llista negra
+ Afegeix l\'amfitrió a la llista blanca
+ Afegeix la redirecció de l\'amfitrió
+ Edita l\'amfitrió d\'una llista negra
+ Edita l\'amfitrió d\'una llista blanca
+ Edita la redirecció
+ Servidor:
+ URL de la font de l\'amfitrió
+ (Els caràcters comodí * i ? estan permesos)
+ IP (IPv4 o IPv6):
+
diff --git a/app/src/main/res/values-ca/strings_log.xml b/app/src/main/res/values-ca/strings_log.xml
new file mode 100644
index 0000000..e969fce
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Commuta la gravació del registre
+ Premeu grava per començar a registrar les sol·licituds, navegueu pel web o utilitzeu aplicacions i, a continuació, torneu enrere o llisqueu per actualitzar els registres.
+ \n\nLes sol·licituds bloquejades no es registraran. Desactiveu primer el bloqueig d\'anuncis si també voleu registrar-los.
+
+ Ordena alfabèticament
+ Ordena per nivell de domini
+
+ Redirigeix domini
+
diff --git a/app/src/main/res/values-ca/strings_notification.xml b/app/src/main/res/values-ca/strings_notification.xml
new file mode 100644
index 0000000..e5f62ec
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Actualitzacions
+ Noves notificacions d\'actualització
+ Actualització disponible
+ Fitxers d\'amfitrió més nous disponibles per baixar.
+ Actualització de l\'aplicació disponible
+ Hi ha disponible una versió nova d\'AdAway per baixar.
+
+ VPN
+ Notificacions d\'execució de VPN
+
diff --git a/app/src/main/res/values-ca/strings_prefs_backup_restore.xml b/app/src/main/res/values-ca/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..7abef2d
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Copia i restaura
+ Copia
+ Feu una còpia de seguretat a l\'emmagatzematge extern de les vostres regles de bloqueig
+ Restaura
+ Restaura les regles de bloqueig des del fitxer de còpia de seguretat
+
diff --git a/app/src/main/res/values-ca/strings_prefs_main.xml b/app/src/main/res/values-ca/strings_prefs_main.xml
new file mode 100644
index 0000000..6249411
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferències
+
+ General
+ Tema fosc
+
+ Clar
+ Fosc
+ Valor per defecte del sistema
+
+ Actualitzacions automàtiques
+
+ Bloqueig d\'anuncis
+ Bloquejador d\'anuncis basat en root
+ Bloquejador d\'anuncis basat en VPN
+ Activa el suport d\'IPv6
+ Copia/restaura les regles de bloqueig
+
+ Depuració
+ Envia informes d\'error
+ Informa a Sentry (sentry.io)
+ No s\'admet en aquesta compilació
+ Registre detallat
+ Cal reiniciar l\'aplicació per aplicar
+
diff --git a/app/src/main/res/values-ca/strings_prefs_root.xml b/app/src/main/res/values-ca/strings_prefs_root.xml
new file mode 100644
index 0000000..fb2630a
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Bloquejador d\'anuncis basat en root
+
+ Instal·lació hosts
+ Obriu el fitxer de hosts
+ Fitxer hosts objectiu
+ Llegiu l\'ajuda abans d\'utilitzar aquesta funció
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Objectiu personalitzt
+
+ Ubicació destí personalitzada
+ Amaga el diàleg de reinici després d\'aplicar
+
+ Redirecció
+ Defineix on redirigir els amfitrions bloquejats
+ Configura la redirecció IPv4
+ Configura la redirecció IPv6
+ Redirecció no vàlida
+
+ Servidor web local
+ El servidor web local escolta les adreces IP locals per respondre a les sol·licituds de nom d\'amfitrió bloquejades. Pot ser útil amb la congelació de l\'aplicació en connexió bloquejada.
+ Activa el servidor web
+ Prova el servidor web
+ Instal·la el certificat autofirmat
+ Instal·lació manual del certificat
+ A partir d\'Android 11 (R), l\'aplicació ja no pot instal·lar automàticament l\'autoritat de certificació (CA).\n\nAneu a la configuració de \"Seguretat\", \"Xifrat i credencials\" i després \"Instal·la un certificat\". A partir d\'aquí, trieu \"Certificat CA\" i seleccioneu el fitxer de certificat recent exportat.
+ Obriu la configuració de \"Seguretat\".
+ S\'està comprovant…
+ No s\'està executant
+ S\'està executant però el certificat no s\'ha instal·lat
+ S\'està executant i el certificat està instal·lat
+ Substituïu l\'espai publicitari en blanc per la icona de l\'aplicació
+
diff --git a/app/src/main/res/values-ca/strings_prefs_update.xml b/app/src/main/res/values-ca/strings_prefs_update.xml
new file mode 100644
index 0000000..403e85c
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Actualitzacions
+
+ Actualitzacions de l\'aplicació
+ Comprova si hi ha actualitzacions a l\'inici
+ Comprova periòdicament actualitzacions
+ Inclou versions beta
+
+ Actualitzacions dels amfitrions
+ Comprova si hi ha actualització a l\'inici
+ Comprova periòdicament actualitzacions
+ Sincronitza en l\'actualització
+ Sincronitza només a la xarxa sense mesura
+
diff --git a/app/src/main/res/values-ca/strings_prefs_vpn.xml b/app/src/main/res/values-ca/strings_prefs_vpn.xml
new file mode 100644
index 0000000..75445dc
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Bloquejador d\'anuncis basat en VPN
+
+ Activa a l\'inici
+ Analitza la connexió
+ Comprova periòdicament l\'estat de la xarxa per reiniciar la VPN en desconnectar-se.
+
+ Aplicacions excloses
+ Configureu quines aplicacions no haurien d\'utilitzar la VPN perquè no es bloquegin les connexions.
+ Exclou les aplicacions del sistema
+
+ None
+ All except browsers
+ All
+
+ Exclou les aplicacions d\'usuari
+
+
+ Aplicacions excloses
+ Seleccioneu-ho tot
+ Anul·la la selecció
+ Icona de l\'aplicació
+
diff --git a/app/src/main/res/values-ca/strings_source_edit.xml b/app/src/main/res/values-ca/strings_source_edit.xml
new file mode 100644
index 0000000..07ce5fc
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Edita la font
+ Afegeix una font
+
+ Etiqueta
+ Etiqueta necessària
+ Tipus
+ URL
+ Fitxer
+ Enllaç
+ https://
+ Enllaç necessari
+ Premeu Fitxer per seleccionar un fitxer com a origen
+ Enllaç no vàlid
+ Format de llista
+ Bloca
+ Permet
+ Aplica la redirecció
+ En permetre la redirecció del web pot causar problemes de seguretat . Utilitzeu aquesta opció només si prové d\'una font confiable, atès que podria redirigir informació confidencial cap a un servidor atacant.
+
diff --git a/app/src/main/res/values-ca/strings_support.xml b/app/src/main/res/values-ca/strings_support.xml
new file mode 100644
index 0000000..ed79a73
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Ajuda
+ Feu-vos patrocinador
+
diff --git a/app/src/main/res/values-ca/strings_update.xml b/app/src/main/res/values-ca/strings_update.xml
new file mode 100644
index 0000000..8f47bee
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Actualització d\'AdAway
+
+ Actualització disponible!
+
+
+ Actualitzat
+ Actualització disponible
+ S\'està actualitzant l\'AdAway
+ Actualitza ara
+ %1$s / %2$s
+ Últims canvis
+ Registre de canvis
+ Ajuda al desenvolupament
+ Fer un donatiu
+ Patrocinador
+
+
+ S\'està baixant la darrera versió d\'AdAway…
+
diff --git a/app/src/main/res/values-ca/strings_welcome.xml b/app/src/main/res/values-ca/strings_welcome.xml
new file mode 100644
index 0000000..5a4d0c2
--- /dev/null
+++ b/app/src/main/res/values-ca/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Us donem la benvinguda
+ Primer pas de l\'assistent
+ Segon pas de l\'assistent
+ Últim pas de l\'assistent
+
+
+ Sigueu benvinguts a l\'AdAway!
+ L\'AdAway ofereix dos mètodes de bloqueig d\'anuncis. Trieu la que us agradi:
+
+ Logo root
+ Bloqueig d\'anuncis\nbasat en root
+ Més ràpid
+ No consumeix molta bateria
+ Cal root
+
+ Logo VPN
+ Bloqueig d\'anuncis\nbasat en VPN
+ Més lent
+ S\'executa en segon pla
+ Compatibilitat
+
+ És necessari tenir l\'Android rootejat
+ No s\'ha pogut trobar el binari su o no heu permès el permís root per a l\'AdAway.\n\nAixò pot passar quan el dispositiu no té root. Podeu trobar informació sobre com activar el root al vostre dispositiu a wiki.lineageos.org o a altres llocs web d\'Android.
+
+ Pros
+ Contres
+
+
+ Sincronització completada
+ Error durant la sincronització
+
+ S\'està sincronitzant
+ S\'ha sincronitzat!
+ L\'AdAway baixa xarxes publicitàries per bloquejar-les de fonts en línia. Podeu personalitzar-los més endavant a la configuració.
+ Reintenta la sincronització
+ No s\'ha pogut sincronitzar: %1$s Voleu provar-ho de nou?
+
+
+ Ajuda
+ Ajudeu-me!
+ És una aplicació gratuïta i de codi obert. Ho desenvolupo en el meu temps lliure. Així que si us agrada, no dubteu a mostrar el vostre suport:
+ Feu un donatiu al PayPal
+ Us agraden els errors? A mi tampoc.
+ Activeu la telemetria per enviar-me informes d\'error
+
+
+ Enrere
+ Següent
+ Acaba
+
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
new file mode 100644
index 0000000..e812fe9
--- /dev/null
+++ b/app/src/main/res/values-cs/strings.xml
@@ -0,0 +1,270 @@
+
+
+
+ Ukončit
+ Zavřít
+ Ano
+ Ne
+ Přidat
+ Zrušit
+ Uložit
+ Nápověda
+
+
+ Vítejte!
+ AdAway je bezplatná open-source aplikace pro blokování reklam. AdAway stahuje síťové adresy reklam za účelem jejich blokování na vašem zařízení.\nChcete vědět více? Podívejte se na nápovědu níže!
+ Zobrazit další nápovědu
+ Aktualizovat status
+ Všechny soubory hostitelů z vybraných zdrojů budou staženy, sloučeny s vašimi vlastními seznamy a aplikovány do vašeho systému jako jeden soubor hostitelů.
+ Zapnout blokování reklam
+ Vypnout blokování reklam
+ Webový server
+ Spuštěn
+ Vypnut
+ Zapnout nebo vypnout webový server pro odpovídání na požadavky na jména zablokovaných hostitelů.
+ Povolit webový server
+ Zakázat webový server
+ VPN
+ Spuštěna
+ Vypnuta
+ Zapnout nebo vypnout VPN pro filtrování požadavků.
+ Povolit VPN
+ Zakázat VPN
+
+
+ Upravit položku
+ Aplikovat
+ Upravit
+ Smazat
+
+
+ Importování…
+ Záloha z vašeho externího úložiště úspěšně importována.
+ Importování zálohy se nezdařilo. Je ve správném formátu? Pro více detailů zkontrolujte systémový protokol událostí.
+ Exportování…
+ Záloha úspěšně exportována do souboru \"%s\" na vašem externím úložišti.
+ Exportování souboru zálohy \"%s\" se nezdařilo.
+
+
+ Soubor hostitelů
+ Soubor hostitelů je systémový soubor, který přiřazuje jména hostitelů IP adresám. Jedná se o textový soubor, který je spravován aplikací AdAway. Zde je jeho malá část:
+ Načítání obsahu souboru hostitelů…
+ Otevřít soubor hostitelů
+
+
+ Kontrola aktualizace
+ Kontrola aktualizací zdroje %s
+ Načítání zdrojů
+ Stahování zdroje %s
+ Čtení zdroje %s
+ Zpracovávání zdroje %s
+ Synchronizování databáze pravidel
+ Obnovování výchozího souboru hostitelů
+ Výchozí soubor hostitelů obnoven
+ Vytváření standardního souboru hostitelů
+ Aktualizace zdroje k dispozici
+ Jsou dostupné novější soubory hostitelů
+ Nebyla nalezena žádná aktualizace zdroje
+ Bez připojení k internetu
+ Bez dostupného připojení k internetu
+ Nedostupné zdroje
+ Nejsou dostupné žádné zdroje souborů hostitelů!
+ ROOT přístup odepřen
+ Povolte ROOT přístup v aplikaci pro správu ROOT přístupů
+ Něco se pokazilo
+ Pro více detailů zkontrolujte systémový protokol událostí
+ Povoleno
+ Nejnovější soubory hostitelů povoleny
+ Zakázáno
+ Výchozí soubor hostitelů aplikován
+ Aplikovat nejnovější zdroje
+ Vytváření nového souboru hostitelů
+ Kopírování nového souboru hostitelů
+ Kontrola kopie souboru hostitelů
+ Soubor hostitelů úspěšně aktualizován
+ Nastavení VPN úspěšně aktualizováno
+ Vaše nastavení bylo změněno. Musíte ho aplikovat.
+ Aplikovat
+ Aplikování nového nastavení…
+ Aplikování nového nastavení se nezdařilo.
+
+
+ Chybí symbolický odkaz na cílový soubor hostitelů
+ Symbolický odkaz z vašeho cíle na /system/etc/hosts neexistuje nebo je chybný! AdAway nebude fungovat, pokud neodkazuje na správný soubor.\n\nChcete se pokusit vytvořit symbolický odkaz?
+ Chybějící symbolický odkaz
+ Na oddílu není dostatek volného místa!\nZkuste v nastavení změnit cílový soubor hostitelů na /data/data/hosts.
+ Nedostatek místa
+ Stažený soubor nelze přečíst.
+ Selhání soukromého souboru
+ Připojení oddílu pro čtení/zápis selhalo!
+ Připojení oddílu selhalo!
+ Nepodařilo se zkopírovat soubor hostitelů
+ Kopírování souboru hostitelů selhalo!
+ Kopírování selhalo
+ Použité zdroje hostitelů
+ Aplikování úspěšné
+ Aplikování bylo úspěšné.\nAby se změny projevily, může být nutné restartovat vaše zařízení.\n\nChcete zařízení restartovat?\n(Abyste předešli ztrátě dat, ujistěte se, že žádná aplikace momentálně nepoužívá SD kartu!)
+ Symbolický odkaz byl úspěšně vytvořen.\nAby se změny projevily, může být nutné restartovat vaše zařízení.\n\nChcete zařízení restartovat?\n(Abyste předešli ztrátě dat, ujistěte se, že žádná aplikace momentálně nepoužívá SD kartu!)
+ Symbolický odkaz úspěšně vytvořen
+ Symbolický odkaz nemohl být vytvořen.\nTo se většinou stává na telefonech HTC kvůli \"vylepšení\" nazývanému S-ON.\n\nŘešením je restartovat telefon do režimu obnovy a vytvořit symbolický odkaz příkazem \"ln -s /data/data/hosts /system/etc/hosts\".\n\nPokud to nepomůže, pak zkuste na internetu vyhledat frázi S-OFF a název modelu vašeho telefonu.
+ Vytvoření symbolického odkazu selhalo
+ Pro více informací si prosím přečtěte nápovědu.
+ Na vašem zařízení je nastaveno APN proxy!\nAdAway nebude správně fungovat při připojení přes mobilní sítě, jako je 3G. Proxy můžete deaktivovat v nastavení zvoleného APN (Z nastavení systému: Nastavení SIM & sítě -> Nastavení SIM -> Názvy přístupových bodů) smazáním záznamu v poli proxy.
+ APN proxy nastaven!
+ Připojení k internetu nefunguje.
+ Žádné připojení
+ Stahování…
+ Aplikování…
+ Aplikování bílé a černé listiny
+ Zpracovávání a slučování souborů hostitelů
+ Vytváření souboru hostitelů
+ Aplikování souboru hostitelů
+ Nepodařilo se aplikovat nový soubor hostitelů
+ Při aplikaci souboru hostitelů došlo k chybě!\nZkuste v nastavení změnit cílový soubor hostitelů na /data/data/hosts.
+ Aplikování se nezdařilo
+ Ujistěte se, prosím, že jste v aplikaci pro správu ROOT přístupů udělili oprávnění pro ROOT přístup.
+ Obnovili jste výchozí soubor hostitelů.\nAby se změny projevily, může být nutné restartovat vaše zařízení.\n\nChcete zařízení restartovat?\n(Abyste předešli ztrátě dat, ujistěte se, že žádná aplikace momentálně nepoužívá SD kartu!)
+ Obnova úspěšná
+ Soubor hostitelů nelze obnovit
+ Obnova souboru hostitelů z neznámých příčin selhala!
+ Obnova souboru hostitelů selhala!
+ Žádný z povolených zdrojů souboru hostitelů není dostupný! Jste správně připojeni k internetu?
+ Stahování selhalo
+ Nepodařilo se zapsat nový soukromý soubor hostitelů
+ Soukromý soubor nelze vytvořit.
+ Vytváření soukromého souboru selhalo
+ Povolili jste mód systemless.\nAby se změny projevily, může být nutné restartovat vaše zařízení.\n\nChcete zařízení restartovat?\n(Abyste předešli ztrátě dat, ujistěte se, že žádná aplikace momentálně nepoužívá SD kartu!)
+ Úspěšně povoleno
+ Zakázali jste mód systemless.\nAby se změny projevily, může být nutné restartovat vaše zařízení.\n\nChcete zařízení restartovat?\n(Abyste předešli ztrátě dat, ujistěte se, že žádná aplikace momentálně nepoužívá SD kartu!)
+ Úspěšně zakázáno
+ Povolení blokování reklam pomocí VPN se nezdařilo.
+ Zakázání blokování reklam pomocí VPN se nezdařilo.
+ Povolování Magisk modulu hosts
+ Povolte funkci nesystémoví hostitelé v Magisk Manageru. V jeho nastavení povolte možnost Nesystémoví hostitelé a poté restartujte zařízení.
+ Zakazování Magisk modulu hosts
+ Zakažte funkci nesystémoví hostitelé v Magisk Manageru. V seznamu modulů odinstalujte modul Systemless Hosts a poté restartujte zařízení.
+
+
+ Zadejte URL k souboru hostitelů:
+ Toto není platné jméno hostitele!
+ Chybný formát jména hostitele
+ Toto není platná IP!
+ Chybný formát IP
+ Nikdy nerestartovat a příště již nezobrazovat tuto otázku!
+ Načítání…
+
+
+ Obnovit
+ Přidat
+ Nápověda
+ Importovat zálohu
+ Exportovat zálohu
+
+
+ S-ON/S-OFF
+ Časté otázky
+ Problémy
+
+
+ Adware
+ Zde můžete vyhledat nainstalovaný Adware, špatné aplikace, které nemohou být aplikací AdAway zablokovány. Tyto aplikace používají například oznámení Airpush, které se objevují i v případě, že aplikace není spuštěna, nebo dokonce změní vaše vyzvánění. Jediné protiopatření je odinstalování těchto aplikací klepnutím na položky seznamu!
+ Skenování…
+ Žádný Adware nebyly nalezen!
+
+
+ Blokování reklam
+ Není nainstalován žádný textový editor
+ Nepodařilo se najít žádný textový editor pro otevření souboru hostitelů. Můžete si nainstalovat Jota nebo jakýkoliv jiný textový editor.\n\nChcete nainstalovat Jota?
+ Není nainstalován žádný správce souborů
+ Nepodařilo se najít žádného správce souborů. Můžete si nainstalovat OI File Manager nebo jakéhokoliv jiného správce souborů.\n\nChcete nainstalovat OI File Manager?
+
+
+ Tcpdump
+ Tcpdump je nástroj pro monitorování DNS požadavků a jejich zaznamenávání do souboru. Můžete ho spustit na pozadí, spustit aplikace zobrazující reklamy a potom v záznamu analyzovat jejich DNS požadavky. Adresy možných serverů poskytujících reklamní obsah si pak můžete přidat na svou černou listinu.
+ Zakázat monitorování
+ Povolit monitorování
+ Zobrazit výsledky
+ Řazení domén
+ Vymazat záznam
+ Přidat položku na černou listinu
+ Přidat položku na bílou listinu
+ Přidat položku na listinu přesměrování
+
+ Upravit textovou hodnotu předvolby
+ Otevřít menu
+ Zavřít menu
+
+
+
+ Úvodní obrazovka
+ Zdroje hostitelů
+ Vaše seznamy
+ Otevřít soubor hostitelů
+ Zaznamenat DNS požadavky
+ Vyhledat Adware
+ Nastavení
+ Nápověda
+
+
+
+
+ DNS požadavky
+ Vaše seznamy
+ Nastavení
+
+
+ Aplikováno před %1$s
+ Aktualizováno před %1$s
+ Dostupná aktualizace před %1$s
+ Poslední aktualizace před %1$s
+ Neznámý stav aktualizace
+ Zakázáno
+ pár minutami
+
+ %d minutou
+ %d minutami
+ %d minutami
+ %d minutami
+
+
+ %d hodinou
+ %d hodinami
+ %d hodinami
+ %d hodinami
+
+
+ %d dnem
+ %d dny
+ %d dny
+ %d dny
+
+
+ %d měsícem
+ %d měsíci
+ %d měsíci
+ %d měsíci
+
+
+
+ Hostitel zkopírován do schránky
+
+
+ spouštění
+ spuštěno
+ vypínání
+ čekání na síť
+ obnovování připojení
+ obnovování připojení selhalo
+ pozastaveno
+ vypnuto
+ Blokování reklam pomocí VPN: %1$s
+ Pozastavit
+ Obnovit
+
+
+ Oprávnění AdAway
+ Dovoluje interakci s AdAway
+ Odesílání příkazů do AdAway
+ Dovoluje odesílání příkazů do AdAway jako například povolení nebo zakázání blokování reklam v celém systému
+
+
diff --git a/app/src/main/res/values-cs/strings_app.xml b/app/src/main/res/values-cs/strings_app.xml
new file mode 100644
index 0000000..c9cc656
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Open source blokovač reklam
+ Logo AdAway
+
diff --git a/app/src/main/res/values-cs/strings_errors.xml b/app/src/main/res/values-cs/strings_errors.xml
new file mode 100644
index 0000000..f068b30
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Bez připojení k internetu
+ Není možné navázat připojení k internetu. Zkontrolujte, prosím, internetové připojení vašeho zařízení.
+ Není možné stáhnout zdroj hostitelů
+ Žádný z vašich povolených zdrojů hostitelů není dostupný. Zkontrolujte, prosím, že je vaše připojení k internetu v pořádku.
+
+ Vytváření soukromého souboru selhalo
+ Není možné vytvořit soukromý soubor potřebný pro sestavení nového souboru hostitelů. Zkontrolujte, prosím, že je na vašem zařízení dostatek volného místa.
+ Nedostatek místa
+ Není možné zkopírovat soubor hostitelů na váš systémový oddíl. Zkontrolujte, prosím, zda je funkce nesystémoví hostitelé v Magisk Manageru povolena a poté restartujte zařízení.
+ Aplikování nového souboru hostitelů selhalo
+ Není možné zkopírovat soubor hostitelů na oddíl /system. Zkontrolujte, prosím, zda je v Magisk Manageru přidán modul pro podporu nesystémových hostitelů a poté restartujte zařízení.
+ Obnovení souboru hostitelů selhalo
+ Výchozí soubor hostitelů nelze obnovit.
+
+ Povolení blokování reklam pomocí VPN se nezdařilo.
+ Zkontrolujte, prosím, vaše nastavení VPN, aby aplikace byla autorizovaná ke spuštění VPN.
+ Zakázání blokování reklam pomocí VPN se nezdařilo.
+ Zkontrolujte, prosím, vaše nastavení VPN a deaktivujte jej ručně.
+
diff --git a/app/src/main/res/values-cs/strings_home.xml b/app/src/main/res/values-cs/strings_home.xml
new file mode 100644
index 0000000..ec95966
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Zablokované
+ Povolené
+ Přesměrované
+
+
+
+ %d aktuální zdroj
+ %d aktuální zdroje
+ %d aktuální zdroje
+ %d aktuálních zdrojů
+
+
+ %d zastaralý zdroj
+ %d zastaralé zdroje
+ %d zastaralé zdroje
+ %d zastaralých zdrojů
+
+ Zkontrolovat aktualizace hostitelů
+ Aktualizovat hostitele
+
+
+ Zobrazit záznam DNS požadavků
+
+
+ Zobrazit nápovědu\na tipy
+
+
+ Otevřít stránku GitHub
+
+
+ Podpořit projekt
+
+
+ GitHub projekt
+ Nastavení
+
+
+ Otevřít navigační panel
+ Pozastavit/pokračovat v blokování reklam
+ Aktualizovat zablokované domény
+ Zobrazit požadované domény
+
+
+ Pro více informací si prosím přečtěte nápovědu.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-cs/strings_hosts.xml b/app/src/main/res/values-cs/strings_hosts.xml
new file mode 100644
index 0000000..c13b926
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Zdroje hostitelů
+
+ Seznam uživatele
+ Oficiální AdAway hostitelé
+ StevenBlack Unified hostitelé
+ Pete Lowe blocklist hostitelé
+
+ není k dispozici
+ %s hostitelů
+
+ Přidat zdroj
+ Upravit zdroj
+ URL: (https:// nebo file://)
+ URL adresa hostitele
+
diff --git a/app/src/main/res/values-cs/strings_lists.xml b/app/src/main/res/values-cs/strings_lists.xml
new file mode 100644
index 0000000..eeb9f36
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Vaše seznamy
+ Přidat hostitele
+
+ Zablokované
+ Povolené
+ Přesměrované
+
+ Filtrovat hostitele
+ Najít hostitele…
+ Přepnout zdroje
+
+ Přidat hostitele na černou listinu
+ Přidat hostitele na bílou listinu
+ Přidat hostitele na listinu přesměrování
+ Upravit hostitele na černé listině
+ Upravit hostitele na bílé listině
+ Upravit hostitele na listině přesměrování
+ Jméno hostitele:
+ URL adresa hostitele
+ (Jsou povoleny zástupné znaky * a ?)
+ IP (IPv4 nebo IPv6):
+
diff --git a/app/src/main/res/values-cs/strings_log.xml b/app/src/main/res/values-cs/strings_log.xml
new file mode 100644
index 0000000..b5c73cf
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Přepnout zaznamenávání
+ Stisknutím tlačítka nahrávání spusťte zaznamenávání požadavků, procházejte web nebo používáte aplikace a poté se vraťte zpět nebo přejetím prstem dolů aktualizujte záznam.
+ \n\nZablokované požadavky nebudou zaznamenány. Pokud je chcete zaznamenat také, nejprve vypněte blokování reklam.
+
+ Řazení podle abecedy
+ Řazení podle nejvyšší úrovně domény
+
+ Doména pro přesměrování
+
diff --git a/app/src/main/res/values-cs/strings_notification.xml b/app/src/main/res/values-cs/strings_notification.xml
new file mode 100644
index 0000000..f5d7ef2
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Aktualizace
+ Upozornění na nové aktualizace
+ Je k dispozici aktualizace zdroje
+ Ke stažení jsou dostupné novější soubory hostitelů.
+ Je k dispozici aktualizace aplikace
+ Ke stažení je dostupná nová verze AdAway.
+
+ VPN
+ Upozornění na spuštěnou VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-cs/strings_prefs_backup_restore.xml b/app/src/main/res/values-cs/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..a70e80a
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Záloha a obnovení
+ Zálohovat
+ Zálohovat vaše pravidla pro blokování na externí úložiště
+ Obnovit
+ Obnovit vaše pravidla pro blokování ze souboru zálohy
+
diff --git a/app/src/main/res/values-cs/strings_prefs_main.xml b/app/src/main/res/values-cs/strings_prefs_main.xml
new file mode 100644
index 0000000..6c961df
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Nastavení
+
+ Obecné
+ Tmavé téma
+
+ Světlé
+ Tmavé
+ Podle systému
+
+ Automatické aktualizace
+
+ Blokování reklamy
+ Blokování reklamy pomocí přístupu ROOT
+ Blokování reklamy pomocí VPN
+ Povolit podporu IPv6
+ Zálohovat / obnovit pravidla pro blokování
+
+ Ladění
+ Odesílat zprávy o selhání
+ Nahlašovat na Sentry (sentry.io)
+ Na tomto sestavení není k dispozici
+ Záznam s více informacemi
+ Pro aplikování je potřeba restartovat aplikaci
+
diff --git a/app/src/main/res/values-cs/strings_prefs_root.xml b/app/src/main/res/values-cs/strings_prefs_root.xml
new file mode 100644
index 0000000..2b26d1f
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Blokování reklam pomocí přístupu ROOT
+
+ Instalace hostitelů
+ Otevřít soubor hostitelů
+ Cílový soubor hostitelů
+ Před používáním této funkce si přečtěte nápovědu
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Vlastní cíl
+
+ Umístění vlastního cíle
+ Skrýt dialogové okno restartu po aplikování
+
+ Přesměrování
+ Určit kam přesměrovat zablokované hostitele
+ Přesměrování IPv4
+ Přesměrování IPv6
+ Neplatné přesměrování
+
+ Lokální webový server
+ Lokální webový server naslouchá na lokálních IP adresách a odpovídá na požadavky na zablokovaná jména hostitelů. To může pomoci se zamrzáváním aplikací po zablokování spojení.
+ Povolit webový server
+ Otestovat webový server
+ Nainstalovat certifikát podepsaný sám sebou
+ Ruční instalace certifikátu
+ Počínaje Androidem 11 (R) již aplikace nemůže automaticky nainstalovat certifikační autoritu (CA).\n\nPřejděte do nastavení zabezpečení, \"Šifrování a identifikační údaje\" a poté \"Nainstalovat certifikát\". Odtud zvolte možnost \"Certifikát CA\" a vyberte nově exportovaný soubor certifikátu.
+ Otevřít nastavení zabezpečení
+ Kontrolování…
+ Neběží
+ Běží, ale není nainstalován certifikát
+ Běží a certifikát je nainstalován
+ Vyplnit prázdné místo reklamy ikonou aplikace
+
diff --git a/app/src/main/res/values-cs/strings_prefs_update.xml b/app/src/main/res/values-cs/strings_prefs_update.xml
new file mode 100644
index 0000000..19e5990
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Aktualizace
+ Oznámení jsou vypnuta
+ Oznámení aplikace se nezobrazí. Klepnutím je povolíte.
+
+ Aktualizace aplikace
+ Zkontrolovat aktualizace při spuštění
+ Pravidelně kontrolovat aktualizace
+ Zahrnout beta verze
+
+ Aktualizace hostitelů
+ Zkontrolovat aktualizace při spuštění
+ Pravidelně kontrolovat aktualizace
+ Při aktualizaci synchronizovat
+ Synchronizovat pouze na neměřených sítích
+
diff --git a/app/src/main/res/values-cs/strings_prefs_vpn.xml b/app/src/main/res/values-cs/strings_prefs_vpn.xml
new file mode 100644
index 0000000..f48c92d
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Blokování reklamy pomocí VPN
+
+ Povolit při spuštění
+ Monitorovat připojení
+ Pravidelně kontrolovat stav sítě za účelem restartování VPN při odpojení.
+
+ Vyloučené aplikace
+ Nakonfigurujte, které aplikace by neměly používat VPN, takže nebudou blokována žádná spojení.
+ Vyloučit systémové aplikace
+
+ Žádné
+ Všechny kromě prohlížečů
+ Všechny
+
+ Vyloučit uživatelské aplikace
+
+
+ Vyloučené aplikace
+ Vybrat vše
+ Zrušit výběr
+ Ikona aplikace
+
diff --git a/app/src/main/res/values-cs/strings_support.xml b/app/src/main/res/values-cs/strings_support.xml
new file mode 100644
index 0000000..34e2f42
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Podpořit
+ Stát se sponzorem
+
\ No newline at end of file
diff --git a/app/src/main/res/values-cs/strings_update.xml b/app/src/main/res/values-cs/strings_update.xml
new file mode 100644
index 0000000..3fb61af
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Aktualizace AdAway
+
+ Aktualizace k dispozici!
+
+
+ Máte nejnovější verzi
+ Aktualizace je k dispozici
+ Aktualizace AdAway
+ Aktualizovat nyní
+ %1$s / %2$s
+ Poslední změny
+ Seznam změn
+ Podpořit vývoj
+ Přispět
+ Sponzorovat
+
+
+ Stahování poslední verze AdAway…
+
diff --git a/app/src/main/res/values-cs/strings_welcome.xml b/app/src/main/res/values-cs/strings_welcome.xml
new file mode 100644
index 0000000..753fbaa
--- /dev/null
+++ b/app/src/main/res/values-cs/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Vítejte
+ Průvodce první krok
+ Průvodce druhý krok
+ Průvodce poslední krok
+
+
+ Vítejte v AdAway!
+ AdAway poskytuje dvě metody blokování reklam. Vyberte si tu, která Vám vyhovuje:
+
+ Logo ROOT přístupu
+ Blokování reklam\npomocí ROOT přístupu
+ Rychlejší
+ Šetrné k baterii
+ Vyžadován ROOT přístup
+
+ Logo VPN
+ Blokování reklam\npomocí VPN
+ Pomalejší
+ Běží na pozadí
+ Kompatibilita
+
+ Vyžaduje Android s ROOT přístupem
+ Spustitelný soubor su nebyl nalezen nebo jste AdAway neudělili oprávnění ROOT přístupu.\n\nToto se může stát, pokud Vaše zařízení nemá ROOT přístup. Informace jak získat ROOT přístup naleznete na wiki.lineageos.org nebo jiných stránkách o Androidu.
+
+ Výhody
+ Nevýhody
+
+
+ Synchronizace dokončena
+ Chyba během synchronizace
+
+ Synchronizování
+ Synchronizováno!
+ AdAway stahuje reklamní sítě k zablokování z online zdrojů. Později si je můžete v nastavení přizpůsobit.
+ Opakovat synchonizaci
+ Selhala synchronizace: %1$s Opakovat nyní?
+ Může zasílat oznámení k zobrazení stavu blokování reklam a ovládání, zznamovat nové aktualizace aplikace (několikrát ročně). Povolte je, pokud chcete zůstat informováni.
+
+
+ Podpořit
+ Podpořte mě!
+ AdAway je aplikace se svobodným zdrojovým kódem, kterou jsem vyvinul ve svém volném čase. Pokud se vám líbí, můžete mě podpořit:
+ Darovat přes PayPal
+ Máte rádi chyby? Ani já ne.
+ Povolit temeterii, aby mi posílala zprávy o selhání
+
+
+ Zpět
+ Další
+ Dokončit
+
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
new file mode 100644
index 0000000..7f0e2b5
--- /dev/null
+++ b/app/src/main/res/values-da/strings.xml
@@ -0,0 +1,190 @@
+
+
+
+ Afslut
+ Luk
+ Ja
+ Nej
+ Tilføj
+ Annuller
+ Gem
+ Hjælp
+
+
+ Velkommen!
+ AdAway er et gratis og open source software design til blokering af reklamer. Det henter netværksadresser af reklame for at blokere dem på din enhed.\nVil du vide mere? Se hjælp nedenfor!
+ Se mere hjælp
+ Opdater status
+ Alle hosts-filer fra de definerede kilder er hentet, flettet sammen med dine egne lister og installeret som en hosts-fil på dit system.
+ Aktiver ad-blocking
+ Deaktiver ad-blocking
+ Webserver
+ Kører
+ Stoppet
+ Aktiver webserver
+ Deaktiver webserver
+
+ Rediger opslag
+ Anvend
+ Rediger
+ Slet
+
+
+ Importerer…
+ Sikkerhedskopi importeret med succes fra dit eksterne lager.
+ Kunne ikke importere backup. Er dets format korrekt? Tjek logcat for flere detaljer.
+ Eksporterer…
+
+ Hosts filen
+ Hosts filen er en systemfil, der kortlægger værtsnavne til IP-adresser. Det er en almindelig tekstfil, hvilken konfiguration håndteres af AdAway. Her er de få første linjer:
+ Indlæser indholdet af hosts filen…
+ Åbn hosts filen
+
+ Opretter en standard hosts-fil
+ En nyere hosts-fil findes
+ Ingen Internetforbindelse
+ Ingen Internetforbindelse tilgængelig
+ Utilgængelige kilder
+ Ingen hostskilder kan nås!
+ Root adgang nægtet
+ Tillad rootadgang fra din root-app
+ Noget gik galt
+ Tjek logcat for flere detaljer
+ Aktiveret
+ Nyeste hosts-fil aktiveret
+ Deaktiveret
+ Standard hostsfil installeret
+ Anvend
+ Symlink fra dit mål til /system/etc/hosts findes ikke eller er sat forkert! AdAway virker ikke, hvis den ikke peger det rigtige sted hen.\n\nVil du prøve at lave et symlink?
+ Symlink mangler
+ Ikke nok plads på partitionen!\nPrøv at ændre hosts kildefilen i indstillingerne til /data/data/hosts.
+ Ikke nok plads
+ Den hentede fil kunne ikke læses.
+ Privat fil fejlede
+ Remontering af partitionen med læse/skrive-rettigheder fejlede!
+ Remontering fejlede
+ Kopiering af hosts filen fejlede
+ Kopiering fejlede
+ Anvendte værts kilder
+ Anvendt successfuldt
+ Anvend var succesfuldt.\nDer er muligvis nødvendigt at genstarte Android for ændringerne træder i kraft.\n\nVil du genstarte?\n(For at forhindre tab af data skal du sørge for, at ingen app bruger SD-kortet i øjeblikket!)
+ Symlink blev oprettet succesfuldt.\nDer er muligvis nødvendigt at genstarte Android for ændringerne træder i kraft.\n\nVil du genstarte?\n (For at forhindre tab af data skal du sørge for, at ingen app bruger SD-kortet i øjeblikket!)
+ Symlink oprettet successfuldt
+ Symlink kunne ikke oprettes af Android.\nDet mislykkes hovedsageligt på grund af en \"funktion\", der hedder S-ON på HTC-telefoner!\n\nDen løsning er at starte din telefon i gendannelsesmodus og oprette symlink der med \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nHvis dette ikke virker, søg på internettet for S-OFF og din telefon.
+ Oprettelse af symlink mislykkedes
+ Venligst læs Hjælp for mere information.
+ En APN-proxy er indstillet på din Android!\nAdAway fungerer ikke pålideligt, når du er på mobilnetværk som 3G. Du kan deaktivere den pågældende proxy ved at gå til din valgte APN (Fra indstillingsappen: Netværk og internet -> Mobilnetværk -> Avanceret -> Adgangspunktnavn) og fjerne værdien i proxy-feltet.
+ APN proxy indstillet!
+ Internetforbindelsen virker ikke.
+ Ingen forbindelse
+ Henter…
+ Anvender…
+ Anvender godkendte og ikke godkendte lister
+ Parser og fletter hosts-filer
+ Opbygger hosts-filen
+ Anvender hosts-filen
+ Hosts-filen kunne ikke påføres dit system!\nPrøv at ændre placeringen af hosts-filen i indstillingerne til \"/data/data/hosts\".
+ Anvendelse mislykkedes
+ Kontroller din root management-app for at sikre, at rootadgang er blevet tildelt.
+ Du vendte tilbage til standardværtsfilen.\nDu er muligvis nødt til at genstarte Android, for ændringerne træder i kraft.\n\nVil du genstarte?\n(For at forhindre tab af data skal du sørge for, at ingen app bruger SD-kortet i øjeblikket!)
+ Gendannelse successfuld
+ Gendannelse mislykkedes af ukendte årsager.
+ Gendannelse mislykkedes!
+ Ingen af dine aktiverede hosts-kilder kunne nås! Er du forbundet til internettet?
+ Download mislykkedes
+ Privat fil kan ikke oprettes.
+ Oprettelse af privat fil mislykkedes
+ Du har aktiveret systemløs tilstand.\nDet kan være nødvendigt at genstarte Android for at ændringerne skal træde i kraft.\n\nVil du genstarte?\n(For at forhindre tab af data skal du sørge for, at ingen apps bruger SD-kortet i øjeblikket!)
+ Aktivering succesfuldt
+ Du har deaktiveret systemløs tilstand.\nDet kan være nødvendigt at genstarte Android for at ændringerne skal træde i kraft.\n\nVil du genstarte?\n(For at forhindre tab af data skal du sørge for, at ingen apps bruger SD-kortet i øjeblikket!)
+ Deaktivering succesfuldt
+
+ Indsæt URL til hosts fil:
+ Dette er ikke et gyldigt værtsnavn
+ Inkorrekt formateret hostnavn
+ Dette er ikke en gyldig IP!
+ Forkert formateret IP
+ Genstart aldrig og vis ikke dette spørgsmål næste gang!
+ Indlæser…
+
+
+ Opdater
+ Tilføj
+ Hjælp
+ Importer sikkerhedskopieren
+ Eksporter sikkerhedskopieren
+
+
+ S-ON/S-OFF
+ OSS
+ Problemer
+
+
+ Adware
+ Her kan du finde installerede adware, dårlige applikationer, som ikke kan blokeres af AdAway. Disse apps bruger f.eks. Airpush-underretninger, der dukker op, selvom appen ikke kører eller endda ændrer din ringetone. Den eneste tilgængelige modforanstaltning er at afinstallere disse apps ved at klikke på listeposterne.
+ Scanning…
+ Ingen Adware blev fundet!
+
+
+ Reklameblokering
+ Intet tekstredigeringsprogram installeret
+ Ingen tekst editor blev fundet til at åbne host filen. Du kan installere Jota eller andre tekst editorer til at håndtere dette.\n\nVil du installere Jota?
+ Intet filhåndteringsprogram installeret
+ Intet filhåndteringsprogram blev fundet til at åbne filen. Du kan installere OI File Manager eller andre filhåndteringsprogrammer til at håndtere dette.\n\nVil du installere OI File Manager?
+
+
+ Tcpdump
+ Tcpdump er et værktøj til at overvåge DNS-anmodninger og gemme dem i en logfil. Du kan starte den i baggrunden, køre programmer, der viser reklamer, for bagefter at analysere DNS-anmodningerne ved hjælp af logfilen. Mulig reklameværter kan derefter blive tilføjet til din blackliste.
+ Deaktiver overvågning
+ Aktiver overvågning
+ Vis resultater
+ Sorter domæner
+ Ryd log
+ Tilføj adgang til sort liste
+ Tilføj adgang til hvide liste
+ Tilføj adgang til omdirigeringsliste
+
+ Rediger tekst præference værdi
+ Åben menu
+ Luk menu
+
+
+
+ Hjem
+ Hosts kilder
+ Dine lister
+ Åben hosts-filen
+ Log DNS-anmodninger
+ Søg efter adware
+ Indstillinger
+ Hjælp
+
+
+
+
+ DNS forespørgsler
+ Dine lister
+ Indstillinger
+
+ Aktuelt for %1$s
+ Brug for opdatering til %1$s
+ Sidste opdatering %1$s siden
+ Ukendt opdateringsstatus
+
+ %d minut
+ %d minutter
+
+
+ %d time
+ %d timer
+
+
+ %d dag
+ %d dage
+
+
+ %d måned
+ %d måneder
+
+
+
diff --git a/app/src/main/res/values-da/strings_app.xml b/app/src/main/res/values-da/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-da/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-da/strings_errors.xml b/app/src/main/res/values-da/strings_errors.xml
new file mode 100644
index 0000000..a830a10
--- /dev/null
+++ b/app/src/main/res/values-da/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ Ingen Internetforbindelse
+ Ikke nok plads
+
\ No newline at end of file
diff --git a/app/src/main/res/values-da/strings_home.xml b/app/src/main/res/values-da/strings_home.xml
new file mode 100644
index 0000000..fbe1fcb
--- /dev/null
+++ b/app/src/main/res/values-da/strings_home.xml
@@ -0,0 +1,9 @@
+
+
+
+ Indstillinger
+
+
+ Venligst læs Hjælp for mere information.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-da/strings_hosts.xml b/app/src/main/res/values-da/strings_hosts.xml
new file mode 100644
index 0000000..7abd256
--- /dev/null
+++ b/app/src/main/res/values-da/strings_hosts.xml
@@ -0,0 +1,11 @@
+
+
+ Hosts kilder
+
+ Ikke tilgængelig
+
+ Tilføj kilde
+ Rediger kilde
+ URL: (en https:// eller file:// ressource)
+ Værts kilde URL
+
diff --git a/app/src/main/res/values-da/strings_lists.xml b/app/src/main/res/values-da/strings_lists.xml
new file mode 100644
index 0000000..221b2bf
--- /dev/null
+++ b/app/src/main/res/values-da/strings_lists.xml
@@ -0,0 +1,15 @@
+
+
+ Dine lister
+
+ Tilføj host til sortliste
+ Tilføj host til hvidliste
+ Tilføj host omdirigering
+ Rediger sortlistet host
+ Rediger hvidlistet host
+ Rediger viderestilling
+ Værtsnavn:
+ Værts kilde URL
+ (Wildcard tegn * og ? er tilladt)
+ IP (IPv4 eller IPv6):
+
diff --git a/app/src/main/res/values-da/strings_log.xml b/app/src/main/res/values-da/strings_log.xml
new file mode 100644
index 0000000..43353ce
--- /dev/null
+++ b/app/src/main/res/values-da/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Sorter alfabetisk
+ Sorter topniveau domæne
+
+ Viderestil domæne
+
diff --git a/app/src/main/res/values-da/strings_notification.xml b/app/src/main/res/values-da/strings_notification.xml
new file mode 100644
index 0000000..32dbdf9
--- /dev/null
+++ b/app/src/main/res/values-da/strings_notification.xml
@@ -0,0 +1,5 @@
+
+
+
+ Opdateringer
+
\ No newline at end of file
diff --git a/app/src/main/res/values-da/strings_prefs_backup_restore.xml b/app/src/main/res/values-da/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-da/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-da/strings_prefs_main.xml b/app/src/main/res/values-da/strings_prefs_main.xml
new file mode 100644
index 0000000..b89b530
--- /dev/null
+++ b/app/src/main/res/values-da/strings_prefs_main.xml
@@ -0,0 +1,12 @@
+
+
+ Indstillinger
+ Aktiver mørkt tema
+ Aktivér IPv6
+
+ Debug
+ Aktivér nedbrudrapporter
+ Tillad, at applikationen sender fejl og nedbrudrapporter til Sentry (sentry.io).
+ Aktivér verbose logging
+ Du skal genstarte AdAway for at denne indstilling tages i brug
+
diff --git a/app/src/main/res/values-da/strings_prefs_root.xml b/app/src/main/res/values-da/strings_prefs_root.xml
new file mode 100644
index 0000000..f75911b
--- /dev/null
+++ b/app/src/main/res/values-da/strings_prefs_root.xml
@@ -0,0 +1,14 @@
+
+
+ Åben hosts-filen
+ Destinations-hostsfil
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Brugerdefineret destination
+
+
+ Omdirigering
+ Aktiver webserver
+
diff --git a/app/src/main/res/values-da/strings_prefs_update.xml b/app/src/main/res/values-da/strings_prefs_update.xml
new file mode 100644
index 0000000..3c71d30
--- /dev/null
+++ b/app/src/main/res/values-da/strings_prefs_update.xml
@@ -0,0 +1,6 @@
+
+
+ Opdateringer
+ Check for opdateringer dagligt
+ Check for opdateringer dagligt
+
diff --git a/app/src/main/res/values-da/strings_prefs_vpn.xml b/app/src/main/res/values-da/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-da/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-da/strings_support.xml b/app/src/main/res/values-da/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-da/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-da/strings_update.xml b/app/src/main/res/values-da/strings_update.xml
new file mode 100644
index 0000000..ffdd7a2
--- /dev/null
+++ b/app/src/main/res/values-da/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ Opdatering fundet
+
diff --git a/app/src/main/res/values-da/strings_welcome.xml b/app/src/main/res/values-da/strings_welcome.xml
new file mode 100644
index 0000000..6802b2b
--- /dev/null
+++ b/app/src/main/res/values-da/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ En rootet Android kræves
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000..fc65672
--- /dev/null
+++ b/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,262 @@
+
+
+
+ Beenden
+ Schließen
+ Ja
+ Nein
+ Hinzufügen
+ Abbrechen
+ Speichern
+ Hilfe
+
+
+ Willkommen!
+ AdAway ist ein freier Open-Source Werbeblocker. Wenn eine Netzwerkadresse eines Werbeanbieters aufgerufen wird, blockiert er dies.\nMöchten Sie mehr darüber erfahren? Rufen Sie dazu weiter unten \"Hilfe anzeigen\" auf!
+ Hilfe anzeigen
+ Aktualisierungsstatus
+ Alle Hosts-Dateien aus den hinterlegten Quellen werden heruntergeladen. Anschließend werden diese zu Ihrer eigenen Liste hinzugefügt und als eine Hosts-Datei im System gespeichert.
+ Werbeblocker aktivieren
+ Werbeblocker deaktivieren
+ Webserver
+ Läuft
+ Gestoppt
+ Lokalen Webserver starten oder stoppen, um Anfragen an blockierte Hostnamen zu beantworten.
+ Webserver aktivieren
+ Webserver deaktivieren
+ VPN
+ Läuft
+ Angehalten
+ VPN zum Filtern von Anfragen starten oder beenden.
+ VPN aktivieren
+ VPN deaktivieren
+
+
+ Eintrag bearbeiten
+ Anwenden
+ Bearbeiten
+ Löschen
+
+
+ Importiere…
+ Sicherung erfolgreich aus externem Speicher importiert.
+ Einlesen der Sicherung fehlgeschlagen. Passt das Format? Weitere Infos dazu im Logcat Protokoll.
+ Exportiere…
+ Sicherung wurde erfolgreich in die Datei \'%s\' auf externem Speicher erstellt.
+ Erstellen der Sicherungsdatei \'%s\' ist fehlgeschlagen.
+
+
+ Die Hosts-Datei
+ Die Hosts-Datei ist eine Datei aus dem Systembereich, bei der Hostnamen(Webadressen) zu IP-Adressen zugewiesen werden. Die Konfiguration der reinen Text Datei wird von AdAway übernommen. Nachfolgend ihre ersten Zeilen:
+ Inhalt der Hosts-Datei laden…
+ Hosts-Datei öffnen
+
+
+ Prüfen auf Aktualisierung
+ Quelle %s auf Aktualisierung prüfen
+ Quellen abrufen
+ Quelle %s wird heruntergeladen
+ Lese Quelle %s
+ Analysiere Quelle %s
+ Abgleichen des Regelwerks
+ Hosts-Datei wird auf Standard zurückgesetzt
+ Standard-Hosts-Datei wiederhergestellt
+ Standard-Hosts-Datei wird generiert
+ Aktualisierung verfügbar
+ Neuere Hosts-Dateien verfügbar
+ Keine Quellaktualisierung gefunden
+ Keine Internetverbindung
+ Keine Internetverbindung verfügbar
+ Nicht verfügbare Quellen
+ Keine Hosts-Quellen erreichbar!
+ Root-Zugriff verweigert
+ Aus der Root-App den Root-Zugriff zulassen.
+ Ein Fehler ist aufgetreten
+ Logcat für weitere Details sichten
+ Aktiviert
+ Die neuesten Hosts-Dateien sind aktiv
+ Deaktiviert
+ Standard-Hosts-Datei installiert
+ Neueste Quellen anwenden
+ Neue Hosts-Datei wird erstellt
+ Neue Hosts-Datei wird kopiert
+ Kopie der Hosts-Datei wird geprüft
+ Hosts-Datei erfolgreich aktualisiert
+ VPN-Konfiguration erfolgreich aktualisiert
+ Ihre Konfiguration hat sich geändert. Zum Anwenden \'übernehmen\' betätigen.
+ Übernehmen
+ Neue Konfiguration wird übernommen …
+ Anwendung der neuen Konfiguration ist fehlgeschlagen.
+
+
+ Die symbolische Verknüpfung (symlink) zur Hosts-Datei fehlt
+ Die symbolische Verknüpfung (Symlink) zwischen Ziel und /system/etc/hosts ist nicht vorhanden oder falsch! Ohne diese Verknüpfung wird AdAway nicht funktionieren.\n\nMöchten Sie versuchen eine symbolische Verknüpfung zu erstellen?
+ Symbolische Verknüpfung fehlt
+ Nicht genügend Speicherplatz auf der Partition frei!\nVersuchen Sie die zu benutzende Hosts-Datei auf /data/data/hosts zu ändern.
+ Nicht genügend Speicherplatz
+ Die heruntergeladene Datei konnte nicht gelesen werden.
+ Private Datei fehlgeschlagen
+ Das Einbinden der Partition mit Schreibrechten ist fehlgeschlagen!
+ Neueinbinden ist fehlgeschlagen
+ Kopieren der Hosts-Datei fehlgeschlagen
+ Kopieren der Hosts-Datei fehlgeschlagen!
+ Kopieren fehlgeschlagen
+ Hosts-Quellen wurden angewandt
+ Erfolgreich angewendet
+ Änderungen waren erfolgreich.\nDamit alle Änderungen wirksam werden, kann es nötig sein Android neu zu starten.\n\nMöchten Sie neu starten?\n(Um Datenverlust zu vermeiden, stellen Sie bitte sicher, dass keine Anwendung gerade die SD-Karte verwendet!)
+ Symbolische Verknüpfung wurde erfolgreich erstellt.\nAndroid muss eventuell neu gestartet werden, damit alle Änderungen wirksam werden.\n\nMöchten Sie neu starten?\n(Um Datenverluste zu vermeiden darf momentan keine Anwendung die SD-Karte verwenden!)
+ Symbolische Verknüpfung erfolgreich erstellt
+ Symbolische Verknüpfung konnte nicht von Android erstellt werden.\nDies liegt wahrscheinlich an einer \'Funktion\' namens S-ON auf HTC-Geräten!\n\nEine Lösung ist es, Ihr Gerät im Wiederherstellungsmodus zu starten und die Verknüpfung von dort mit »ln -s /data/data/hosts /system/etc/hosts« zu erstellen.\n\nWenn dies nicht funktioniert, suchen Sie bitte im Internet nach S-OFF und Ihrem Gerät.
+ Symbolische Verknüpfung konnte nicht erstellt werden
+ Bitte Hilfe für mehr Informationen lesen.
+ Auf Ihrem Android-Gerät ist ein Zugangspunktvermittlungsserver (APN-Proxy) aktiviert!\nAdAway wird in Mobilfunknetzen (2G, 3G, 4G, 5G) nicht zuverlässig funktionieren. Sie können diesen Vermittlungsserver (Proxy) deaktivieren, indem Sie in den Einstellungen wechseln: Netzwerk & Internet -> Mobilfunknetz -> Zugangspunkte (APNs)) und den Wert im Proxy-Feld entfernen.
+ APN-Proxy eingestellt!
+ Die Internetverbindung funktioniert nicht.
+ Keine Verbindung
+ Wird heruntergeladen…
+ Wird angewendet…
+ Negativ- und Positivliste werden angewendet
+ Hosts-Dateien werden verarbeitet und zusammengefügt
+ Hosts-Datei wird erstellt
+ Neue Hosts-Datei im System aktivieren
+ Anwendung der neuen Hosts-Datei fehlgeschlagen
+ Das Ändern der Hosts-Datei auf Ihrem System ist fehlgeschlagen!\nVersuchen Sie bitte die Hosts-Datei in den Einstellungen auf /data/data/hosts zu ändern.
+ Anwendung fehlgeschlagen
+ Bitte in der Root-Verwaltungssoftware überprüfen, ob diese App Root-Zugriffsrechte hat.
+ Die originale Hosts-Datei wurde wiederhergestellt.\nDamit alle Änderungen wirksam werden muss Android eventuell neu gestartet werden, .\nMöchten Sie neu starten?\n(Um Datenverluste zu vermeiden darf aktuell keine Anwendung die SD-Karte verwenden!)
+ Erfolgreich zurückgesetzt
+ Zurücksetzen der Hosts-Datei nicht möglich
+ Zurücksetzen aus unbekannten Gründen fehlgeschlagen.
+ Zurücksetzen fehlgeschlagen!
+ Keine der aktivierten Hosts-Quellen ist erreichbar! Bitte Internetverbindung prüfen!
+ Herunterladen fehlgeschlagen
+ Schreiben der neuen privaten Hosts-Datei fehlgeschlagen
+ Private Datei konnte nicht erstellt werden.
+ Erstellen der privaten Datei fehlgeschlagen
+ Sie haben den Systemlosen Modus deaktiviert.\nDamit alle Änderungen wirksam werden, muss das System eventuell neu gestartet werden.\n\nMöchten Sie neu starten?\n(Um Datenverlust zu vermeiden, vergewissern Sie sich, dass gerade keine Anwendung die SD-Karte verwendet!)
+ Aktivierung erfolgreich
+ Sie haben den Systemlosen Modus deaktiviert.\nDamit alle Änderungen wirksam werden, muss das System eventuell neu gestartet werden.\n\nMöchten Sie neu starten?\n(Um Datenverlust zu vermeiden, vergewissern Sie sich, dass gerade keine Anwendung die SD-Karte verwendet!)
+ Deaktivieren erfolgreich
+ Aktivieren der VPN-Werbeblockade fehlgeschlagen
+ Deaktivieren der VPN-Werbeblockade fehlgeschlagen
+ Aktivieren des Hosts-Moduls von Magisk
+ Systemunabhängige Hosts-Funktion im Magisk Manager aktivieren. Dort in den Einstellungen die Option Systemless hosts wählen und anschließend das Gerät neustarten.
+ Deaktivieren des Hosts-Moduls von Magisk
+ Systemunabhängige Hosts-Funktion im Magisk Manager deaktivieren. In den Optionen Systemless hosts deinstallieren und anschließend das Gerät neustarten.
+
+
+ Bitte Adresse zur Hosts-Datei eingeben:
+ Das ist kein gültiger Hostname!
+ Falsch formatierter Hostname
+ Das ist keine gültige IP!
+ Falsch formatierte IP
+ Nie neu starten und diese Frage nicht mehr stellen!
+ Wird geladen …
+
+
+ Neu laden
+ Hinzufügen
+ Hilfe
+ Sicherung importieren
+ Sicherung exportieren
+
+
+ S-ON/S-OFF
+ FAQ
+ Probleme
+
+
+ Adware
+ Hier sind schlechte Werbesoftware Anwendungen aufgelistet, die nicht von AdAway blockiert werden können. Diese Apps nutzen zum Beispiel Airpush-Benachrichtigungen die selbst dann erscheinen, wenn die App gar nicht läuft oder es wird sogar Ihr Klingelton umgestellt. Die einzige Gegenmaßnahme ist solche Apps zu deinstalieren, indem Sie auf die Listeneinträge klicken.
+ Durchsuchen …
+ Keine Adware gefunden!
+
+
+ Werbeblocker
+ Kein Text Editor installiert
+ Es konnte kein Text Editor gefunden werden um die Hosts-Datei zu öffnen. Sie können Jota oder eine andere Editor installieren um Textdateien zu öffnen.\n\nMöchten Sie Jota installieren?
+ Keine Dateiverwaltung installiert
+ Es konnte keine Dateiverwaltung gefunden werden um Dateien zu öffnen. Sie können um dies zu beheben »OI File Manager« oder einen andere Dateimanager installieren.\n\n Möchten Sie »OI File Manager« installieren?
+
+
+ TCPdump
+ Mit TCPDump können DNS-Anfragen aufgezeichnet und in einer Protokolldatei gespeichert werden. Dazu TCPDump im Hintergrund starten und anschließend die App mit Werbung ausführen. Danach die Protokolldatei in AdAway analysieren. Mögliche Werbe-Server können nun zu Ihrer Negativliste(blacklist) hinzugefügt werden.
+ Aufzeichnung deaktivieren
+ Aufzeichnung aktivieren
+ Ergebnisse anzeigen
+ Domänen sortieren
+ Protokoll leeren
+ Eintrag zur Negativliste hinzufügen
+ Eintrag zur Positivliste hinzufügen
+ Eintrag zur Umleitungsliste hinzufügen
+
+ Textvorgabe bearbeiten
+ Menü öffnen
+ Menü schließen
+
+
+
+ Home
+ Hosts-Quellen
+ Meine Listen
+ Hosts-Datei öffnen
+ DNS-Anfragen protokollieren
+ Adware-Scanner
+ Einstellungen
+ Hilfe
+
+
+
+
+ DNS-Anfragen
+ Meine Listen
+ Einstellungen
+
+
+ Vor %1$s installiert
+ Seit %1$s aktuell
+ Update seit %1$snotwendig
+ Letzte Aktualisierung vor %1$s
+ Status der Aktualisierung unbekannt
+ Deaktiviert
+ wenigen Minuten
+
+ %d Minute
+ %d Minuten
+
+
+ %d Stunde
+ %d Stunde(n)
+
+
+ %d Tag
+ %d Tag(en)
+
+
+ %d Monat
+ %d Monat(en)
+
+
+
+ Host in Zwischenablage kopiert
+
+
+ wird gestartet
+ aktiv
+ wird angehalten
+ auf Netzwerk warten
+ wird erneut verbunden
+ Fehler beim erneuten Verbinden
+ pausiert
+ angehalten
+ Ad-blocker-VPN %1$s
+ Pause
+ Weiter
+
+
+ AdAway Bewilligung
+ Mit AdAway den Kontakt bewilligen
+ Befehle an AdAway senden
+ Bewillige das Senden von Befehlen an AdAway, wie \"Einschalten\" oder \"Ausschalten\" des Werbeblockers
+
+
diff --git a/app/src/main/res/values-de/strings_app.xml b/app/src/main/res/values-de/strings_app.xml
new file mode 100644
index 0000000..4a34dee
--- /dev/null
+++ b/app/src/main/res/values-de/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Open Source Werbeblocker
+ AdAway Logo
+
diff --git a/app/src/main/res/values-de/strings_errors.xml b/app/src/main/res/values-de/strings_errors.xml
new file mode 100644
index 0000000..e33438a
--- /dev/null
+++ b/app/src/main/res/values-de/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Keine Internetverbindung
+ Es kann keine Verbindung zum Internet hergestellt werden. Prüfen Sie bitte die Verbindungsfähigkeit Ihres Geräts.
+ Download der Hosts-Quelle fehlgeschlagen
+ Keine der von Ihnen aktivierten Hosts-Quellen ist erreichbar. Prüfen Sie bitte, ob Ihre Internetverbindung funktioniert.
+
+ Erstellung der privaten Datei fehlgeschlagen
+ Es ist nicht möglich, eine private Datei zu erstellen, um eine neue Hosts-Quelle aufzubauen. Prüfen Sie bitte, ob auf Ihrem Gerät ausreichend Speicherplatz zur Verfügung steht.
+ Nicht genügend Speicherplatz
+ Es ist nicht möglich, die Hosts-Datei in Ihre Systempartition zu kopieren. Prüfen Sie bitte, ob das systemlose Magisk-Modul aktiviert ist, und starten Sie dann das Gerät neu.
+ Installation der neuen Hosts-Datei fehlgeschlagen
+ Kopieren der Hosts Datei zur /System Partition nicht möglich. Bitte überprüfe ob das Magisk Systemless Modul aktiv ist, dann Gerät neu starten
+ Zurücksetzen der Hosts-Datei fehlgeschlagen
+ Es ist nicht möglich, die Standardkonfiguration der Hosts-Datei wiederherzustellen.
+
+ Aktivierung der VPN-Werbeblockade fehlgeschlagen
+ Überprüfen Sie bitte Ihre VPN-Einstellungen, um der App den VPN-Start zu genehmigen.
+ Deaktivierung der VPN-Werbeblockade fehlgeschlagen
+ Überprüfen Sie bitte Ihre VPN-Einstellungen, um sie manuell zu deaktivieren.
+
diff --git a/app/src/main/res/values-de/strings_home.xml b/app/src/main/res/values-de/strings_home.xml
new file mode 100644
index 0000000..69c2912
--- /dev/null
+++ b/app/src/main/res/values-de/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Blockiert
+ Gestattet
+ Umgeleitet
+
+
+
+ %d aktuelle Quelle
+ %d aktuelle Quellen
+
+
+ %d veraltete Quelle
+ %d veraltete Quellen
+
+ Hosts-Aktualisierungen suchen
+ Hosts aktualisieren
+
+
+ DNS-Abfrage-Protokoll anzeigen
+
+
+ Hilfe\n und Tipps anzeigen
+
+
+ GitHub-Seite öffnen
+
+
+ Das Projekt unterstützen
+
+
+ GitHub Project
+ Einstellungen
+
+
+ App-Navigation öffnen
+ Werbeblockade anhalten/wiederaufnehmen
+ Blockierte Domänen aktualisieren
+ Abgefragte Domänen anzeigen
+
+
+ Bitte die Hilfe für mehr Informationen lesen.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings_hosts.xml b/app/src/main/res/values-de/strings_hosts.xml
new file mode 100644
index 0000000..2344634
--- /dev/null
+++ b/app/src/main/res/values-de/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts-Quellen
+
+ Benutzerliste
+ AdAway official hosts
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ nicht verfügbar
+ %s hosts
+
+ Quelle hinzufügen
+ Quelle bearbeiten
+ URL: (eine https:// oder file:// Quelle)
+ Die Quell-URL der Hosts
+
diff --git a/app/src/main/res/values-de/strings_lists.xml b/app/src/main/res/values-de/strings_lists.xml
new file mode 100644
index 0000000..df82d87
--- /dev/null
+++ b/app/src/main/res/values-de/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Meine Listen
+ Host hinzufügen
+
+ Blockiert
+ Gestattet
+ Umgeleitet
+
+ Host filtern
+ Suche Hostname…
+ Quellen wechseln
+
+ Host zur Negativliste hinzufügen
+ Host zur Positivliste hinzufügen
+ Host-Umleitung hinzufügen
+ Host in Negativliste bearbeiten
+ Host in Positivliste bearbeiten
+ Umleitung bearbeiten
+ Hostname:
+ Die Quell-URL der Hosts
+ (Die Zeichen * und ? sind als Platzhalter zulässig)
+ IP (IPv4 oder IPv6):
+
diff --git a/app/src/main/res/values-de/strings_log.xml b/app/src/main/res/values-de/strings_log.xml
new file mode 100644
index 0000000..6c37cc9
--- /dev/null
+++ b/app/src/main/res/values-de/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Protokoll-Aufzeichnung umschalten
+ Drücken Sie \"aufzeichnen\", um die Protokollierung von Anfragen zu starten, stöbern Sie im Netz oder verwenden Sie Apps, kehren Sie danach hierher zurück oder wischen Sie nach unten, damit die Protokolle erneuert werden.
+ \n\nBlockierte Anfragen werden nicht protokolliert. Deaktivieren Sie zunächst den Werbeblocker, wenn Sie diese auch protokollieren möchten.
+
+ Alphabetische Sortierung
+ Nach Top-Level-Domänen sortieren
+
+ Domäne umleiten
+
diff --git a/app/src/main/res/values-de/strings_notification.xml b/app/src/main/res/values-de/strings_notification.xml
new file mode 100644
index 0000000..c1f2a95
--- /dev/null
+++ b/app/src/main/res/values-de/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Aktualisierungen
+ Neue Aktualisierung verfügbar
+ Aktualisierung verfügbar
+ Neuere hosts-Datei vorhanden
+ App-Aktualisierung verfügbar
+ Neue Version von AdAway vorhanden
+
+ VPN
+ Nachricht von VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings_prefs_backup_restore.xml b/app/src/main/res/values-de/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4b9f71f
--- /dev/null
+++ b/app/src/main/res/values-de/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Sichern & Wiederherstellen
+ Sichern
+ Sichern Ihrer Listen auf einen externen Speicher
+ Wiederherstellen
+ Wiederherstellen Ihrer Listen aus der Sicherungsdatei
+
diff --git a/app/src/main/res/values-de/strings_prefs_main.xml b/app/src/main/res/values-de/strings_prefs_main.xml
new file mode 100644
index 0000000..078a1fd
--- /dev/null
+++ b/app/src/main/res/values-de/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Einstellungen
+
+ Allgemein
+ Dunkles Design aktivieren
+
+ Hell
+ Dunkel
+ Systemvorgabe
+
+ Automatische Updates
+
+ Werbung blockieren
+ Root-basierter Werbeblocker
+ VPN-basierter Werbeblocker
+ IPv6 aktivieren
+ Sichern / Wiederherstellen Ihrer Listen
+
+ Fehlerdiagnose
+ Absturzberichte aktivieren
+ Der Anwendung erlauben, Fehler und Absturzberichte an Sentry (sentry.io) zu senden.
+ Nicht unterstützt in dieser Version
+ Ausführliche Protokollierung aktivieren
+ Sie müssen AdAway neustarten, damit diese Einstellung genutzt werden kann.
+
diff --git a/app/src/main/res/values-de/strings_prefs_root.xml b/app/src/main/res/values-de/strings_prefs_root.xml
new file mode 100644
index 0000000..a13347a
--- /dev/null
+++ b/app/src/main/res/values-de/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Root-basierter Werbeblocker
+
+ Hosts Installation
+ Hosts-Datei öffnen
+ Zu benutzende Hosts-Datei
+ Bevor Sie diese Einstellung ändern, bitte die Hilfe zu dem Thema lesen.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Benutzerdefiniertes Ziel
+
+ Benutzerdefiniertes Ziel
+ Neustartdialog verstecken
+
+ Umleitung
+ Festlegen wohin blockierte Hosts umgeleitet werden sollen
+ Umleitungs-IPv4
+ Umleitungs-IPv6
+ Ungültige Umleitung
+
+ Lokaler Webserver
+ Der lokale Webserver überwacht lokale IP-Adressen um auf blockierte Hostnamen zu antworten. Dies kann helfen wenn Apps einfrieren bei blockierter Verbindung.
+ Webserver aktivieren
+ Webserver testen
+ Selbstsigniertes Zertifikat installieren
+ Zertifikat manuell installieren
+ Ab Android 11 (R), kann die Anwendung die Zertifizierungsstelle (CA) nicht mehr automatisch installieren.\n\nGehen Sie zu \"Sicherheit\"-Einstellungen, \"Verschlüsselung und Anmeldeinformationen\" und dann zu \"Zertifikat installieren\". Wählen Sie dort \"CA-Zertifikat\" und wählen Sie die neu exportierte Zertifikatsdatei aus.
+ \"Sicherheit\"-Einstellungen öffnen
+ Überprüfe…
+ Läuft nicht
+ Läuft aber Zertifikat nicht installiert
+ Läuft und Zertifikat installiert
+ Ersetzt die leere Werbefläche durch das Anwendungssymbol
+
diff --git a/app/src/main/res/values-de/strings_prefs_update.xml b/app/src/main/res/values-de/strings_prefs_update.xml
new file mode 100644
index 0000000..85724e2
--- /dev/null
+++ b/app/src/main/res/values-de/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Aktualisierungen
+ Benachrichtigungen sind ausgeschaltet
+ App-Benachrichtigungen werden unterdrückt. Drücke, um sie anzuzeigen.
+
+ App-Aktualisierungen
+ Beim Start nach Aktualisierungen suchen
+ Täglich nach Aktualisierungen suchen
+ Beta-Versionen einbeziehen
+
+ Hosts-Aktualisierungen
+ Beim Start nach Aktualisierungen suchen
+ Täglich nach Aktualisierungen suchen
+ Synchronisiere beim Aktualisieren
+ Synchronisiere nur im gebührenfreien Netzwerk
+
diff --git a/app/src/main/res/values-de/strings_prefs_vpn.xml b/app/src/main/res/values-de/strings_prefs_vpn.xml
new file mode 100644
index 0000000..ae6e1d8
--- /dev/null
+++ b/app/src/main/res/values-de/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN-basierter Werbeblocker
+
+ Beim Starten einschalten
+ Verbindung überwachen
+ Überprüfen Sie regelmäßig den Netzwerkstatus, um VPN beim Trennen der Verbindung neu zu starten.
+
+ Ausgenommene Anwendungen
+ Konfiguriere welche Anwendungen das VPN nicht verwenden sollen, damit keine Verbindungen blockiert werden.
+ System-Anwendungen ausschließen
+
+ Keine
+ Alle außer Web-Browser
+ Alle
+
+ Benutzer-Anwendungen ausschließen
+
+
+ Ausgenommene Anwendungen
+ Alle anwählen
+ Alle abwählen
+ App-Icon
+
diff --git a/app/src/main/res/values-de/strings_source_edit.xml b/app/src/main/res/values-de/strings_source_edit.xml
new file mode 100644
index 0000000..901e9ad
--- /dev/null
+++ b/app/src/main/res/values-de/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Quelle bearbeiten
+ Quelle hinzufügen
+
+ Beschriftung
+ Beschriftung erforderlich
+ Typ
+ URL
+ Datei
+ Speicherort
+ https://
+ Speicherort erforderlich
+ Drücke Datei, um Quelldatei auszuwählen
+ Ungültiger Speicherort
+ Format auflisten
+ Blockieren
+ Erlauben
+ Host-Weiterleitungen anwenden
+ Host-Weiterleitungen können ein Sicherheitsrisiko sein. Benutze diese Einstellungen nur, wenn du der Quelle vertraust, denn die Quelldatei kann den sensiblen Netzwerkverkehr auf jeden beliebigen Server umleiten.
+
diff --git a/app/src/main/res/values-de/strings_support.xml b/app/src/main/res/values-de/strings_support.xml
new file mode 100644
index 0000000..5c3bbe1
--- /dev/null
+++ b/app/src/main/res/values-de/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Support
+ Werden Sie Förderer
+
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings_update.xml b/app/src/main/res/values-de/strings_update.xml
new file mode 100644
index 0000000..624fac3
--- /dev/null
+++ b/app/src/main/res/values-de/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway aktualisieren
+
+ Aktualisierung verfügbar!
+
+
+ Sie sind auf dem neusten Stand
+ Aktualisierung verfügbar
+ Aktualisierung AdAway
+ Jetzt Aktualisieren
+ %1$s / %2$s
+ Letzte Änderungen
+ Änderungen
+ Weiterentwicklung fördern
+ Spenden
+ Sponsor
+
+
+ Herunterladen der neuesten AdAway Version…
+
diff --git a/app/src/main/res/values-de/strings_welcome.xml b/app/src/main/res/values-de/strings_welcome.xml
new file mode 100644
index 0000000..6aef315
--- /dev/null
+++ b/app/src/main/res/values-de/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Willkommen
+ Assistent erste Schritte
+ Assistent zweiter Schritt
+ Assistent letzter Schritt
+
+
+ Willkommen bei AdAway!
+ AdAway bietet zwei Methoden zum Blockieren von Werbung. Wählen Sie die Methode, die Ihnen gefällt:
+
+ Root logo
+ Root-basierter\nWerbeblocker
+ Schneller
+ Akku schonend
+ Benötigt Root
+
+ VPN logo
+ VPN-basierter\nWerbeblocker
+ Langsamer
+ Läuft im Hintergrund
+ Kompatibilität
+
+ Das System muss gerootet sein
+ Entweder konnte die su-Binärdatei nicht gefunden werden, oder Sie haben AdAway keine Root-Berechtigung erteilt.\n\nDies kann passieren, wenn Ihr Gerät nicht gerootet ist. Informationen darüber, wie Sie Ihr Gerät rooten können, finden Sie auf wiki.lineageos.org oder anderen Android-Webseiten.
+
+ Pro
+ Kontra
+
+
+ Synchronisation erledigt
+ Fehler beim Synchronisieren
+
+ Synchronisiere
+ Synchronisiert!
+ AdAway lädt Werbenetzwerke zum Blockieren aus Online-Quellen herunter. Sie können sie später in den Einstellungen anpassen.
+ Wiederhole Synchronisierung
+ Fehler beim Synchronisieren: %1$s. Jetzt erneut versuchen?
+ Es kann Benachrichtigungen anzeigen, die Informationen sowohl über den Status und das Blockieren von Werbung enthalten als auch über anstehende App-Aktualisierungen (einige pro Jahr). Schalte sie ein, wenn du auf dem Laufenden bleiben möchtest.
+
+
+ Support
+ Unterstützt mich!
+ AdAway ist eine quelloffene Software, die ich in meiner Freizeit entwickle. Wenn sie dir gefällt, dann freue ich mich über deine Unterstützung:
+ Spende über PayPal
+ Mögen Sie Fehler? Ich auch nicht
+ Telemetrie aktivieren, um Absturzberichte zu senden.
+
+
+ Zurück
+ Weiter
+ Fertig
+
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
new file mode 100644
index 0000000..bfd169f
--- /dev/null
+++ b/app/src/main/res/values-el/strings.xml
@@ -0,0 +1,284 @@
+
+
+
+ Έξοδος
+ Κλείσιμο
+ Ναι
+ Όχι
+ Προσθήκη
+ Άκυρο
+ Αποθήκευση
+ Βοήθεια
+
+
+ Καλώς ήρθατε!
+ Το AdAway είναι μια δωρεάν και ανοιχτού κώδικα εφαργμογή σχεδιασμένη να μπλοκάρει τις διαφημίσεις. Παίρνει τις διαφημιστικές διευθύνσεις των δικτύων και τις μπλοκάρει στην συσκευή σας. \nΘέλετε να μάθετε περισσότερα; Δείτε την βοήθεια παρακάτω!
+ Εμφάνιση περισσότερης βοήθειας
+ Κατάσταση ενημέρωσης
+ Όλα τα αρχεία hosts από τις πηγές που ορίστηκαν λήφθηκαν, συγχωνεύθηκαν με τις δικές σας λίστες και εγκαταστάθηκαν ως ένα αρχείο hosts στο σύστημά σας.
+ Ενεργοποίηση του αποκλεισμού διαφημίσεων
+ Απενεργοποίηση του αποκλεισμού διαφημίσεων
+ Διακομιστής διαδικτύου
+ Εκτελείται
+ Διακόπηκε
+ Ξεκινήστε ή διακόψτε webserver στο localhost για να απαντήσετε σε αιτήματα σε αποκλεισμένα hostnames.
+ Ενεργοποίηση του διακομιστή ιστοσελίδων
+ Απενεργοποήση διακομιστή διαδικτύου
+ VPN
+ Εκτελείται
+ Διακόπηκε
+ Ξεκινήστε ή διακόψτε το VPN για να φιλτράρετε αιτήματα.
+ Ενεργοποίηση VPN
+ Απενεργοποίηση VPN
+
+
+ Επεξεργασία καταχώρησης
+ Εφαρμογή
+ Επεξεργασία
+ Διαγραφή
+
+
+ Εισαγωγή…
+ Η δημιουργία αντιγράφων ασφαλείας έγινε με επιτυχία από το εξωτερικό αποθηκευτικό χώρο.
+ Αποτυχία εισαγωγής αντιγράφων ασφαλείας. Είναι σωστή η μορφή του; Ελέγξτε το αρχείο logcat για περισσότερες λεπτομέρειες.
+ Εξαγωγή…
+ Το αντίγραφο ασφαλείας εξήχθη με επιτυχία στο αρχείο \'%s\' στον εξωτερικό χώρο αποθήκευσης σας.
+ Αποτυχία εξαγωγής αρχείου αντιγράφου ασφαλείας \'%s\'.
+
+
+ Το αρχείο hosts
+ Το αρχείο hosts είναι ένα αρχείο συστήματος το οποίο αντιστοιχίζει ονόματα διακομιστών σε διευθύνσεις IP. Είναι ένα αρχείο απλού κειμένου το οποίο ρυθμίζει το AdAway. Εδώ παρατίθενται οι πρώτες του γραμμές:
+ Γίνεται φόρτωση του περιεχομένου του αρχείου hosts…
+ Άνοιγμα του αρχείου hosts
+
+
+ Έλεγχος για ενημέρωση
+ Ελεγχος %s πηγής-ών για ενημέρωση
+ Ανάκτηση πηγών
+ Λήψη πηγής %s
+ Ανάγνωση πηγής-ών %s
+ Παράθεση απο %s
+ Συγχρονισμός κανόνων βάσης δεδομένων
+ Επαναφορά στο προεπιλεγμένο hosts file
+ Τα προεπιλεγμένα hosts file αποκαταστάθηκαν
+ Δημιουργία στάνταρ αρχείου hosts
+ Διαθέσιμη ενημέρωση πηγής
+ Υπάρχουν διαθέσιμα πιο πρόσφατα αρχεία hosts
+ Δεν βρέθηκε ενημέρωση πηγής
+ Δεν υπάρχει σύνδεση στο ίντερνετ
+ Δεν υπάρχει διαθέσιμη σύνδεση στο ίντερνετ
+ Μη διαθέσιμες πηγές
+ Δεν υπάρχουν διαθέσιμες πηγές hosts!
+ Η πρόσβαση Root απορρίφθηκε
+ Επιτρέψετε την πρόσβαση Root από την Root εφαρμογή σας
+ Κάτι πήγε λάθος
+ Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες.
+ Ενεργοποιημένο
+ Ενεργοποιήθηκαν τα πιο πρόσφατα αρχεία hosts
+ Απενεργοποιημένο
+ Τα προεπιλεγμένα αρχεία hosts εγκαταστάθηκαν
+ Εφαρμογή των πιο πρόσφατων πηγών
+ Δημιουργία νέου hosts file
+ Αντιγραφή νέου hosts file
+ Έλεγχος αντιγράφου hosts file
+ To host file ενημερώθηκε με επιτυχία
+ Η διαμόρφωση VPN ενημερώθηκε με επιτυχία
+ Η διαμόρφωσή σας άλλαξε. Πρέπει να την εφαρμόσετε.
+ Εφαρμογή
+ Εφαρμογή νέας διαμόρφωσης…
+ Αποτυχία εφαρμογής νέας διαμόρφωσης.
+
+
+ Το symlink με στόχο το hosts file λείπει
+ Ο σύνδεσμος από τον προορισμό στο /system/etc/hosts δεν υπάρχει ή είναι λανθασμένος! Το AdAway δεν θα λειτουργήσει αν δεν δείχνει στο σωστό αρχείο.
+
+Θέλετε να προσπαθήσετε να δημιουργήσετε έναν σύνδεσμο;
+ Η συντόμευση λείπει
+ Δεν υπάρχει αρκετός χώρος στο διαμέρισμα αποθηκευτικού χώρου!
+Προσπαθήστε να αλλάξετε το αρχείο προορισμού hosts στις ρυθμίσεις σε /data/data/hosts.
+ Δεν υπάρχει διαθέσιμος χώρος
+ Δεν μπορεί να διαβαστεί το κατεβασμένο αρχείο.
+ Απέτυχε το προσωπικό αρχείο
+ Η επανατοποθέτηση του διαμερίσματος με δικαιώματα εγγραφής/ανάγνωσης απέτυχε!
+ Η επανατοποθέτηση απέτυχε
+ Αποτυχία αντιγραφής hosts file
+ Η αντιγραφή του αρχείου hosts απέτυχε!
+ Η αντιγραφή απέτυχε
+ Εφαρμοσμένα hosts sources
+ Επιτυχής εφαρμογή
+ Η εφαρμογή ήταν επιτυχής.
+Ίσως είναι απαραίτητο να επανεκκινήσετε το Android για να εφαρμοστούν οι αλλαγές.
+Θέλετε να γίνει επανεκκίνηση;
+(Για να αποφύγετε απώλεια δεδομένων, επαληθεύστε ότι καμία εφαρμογή δεν χρησιμοποιεί την κάρτα SD αυτή την στιγμή!)
+ Ο σύνδεσμος δημιουργήθηκε με επιτυχία.
+Ίσως είναι απαραίτητο να επανεκκινήσετε το Android για να εφαρμοστούν οι αλλαγές.
+Θέλετε να κάνετε επανεκκίνηση;
+(Για να αποφύγετε απώλεια δεδομένων, επαληθεύστε ότι καμία εφαρμογή δεν χρησιμοποιεί την κάρτα SD αυτή την στιγμή!)
+ Επιτυχής δημιουργία συντόμευσης
+ Δεν ήταν δυνατό να δημιουργηθεί ο σύνδεσμος από το Android.
+Η αποτυχία οφείλεται συνήθως σε ένα \'χαρακτηριστικό\' που ονομάζεται S-ON στις συσκευές HTC!
+
+Μια λύση είναι να επανεκκινήσετε την συσκευή σας σε κατάσταση ανάκτησης και να δημιουργήσετε τον σύνδεσμο εκεί με την εντολή \'ln -s /data/data/hosts /system/etc/hosts\'
+
+Αν αυτό δεν επιτύχει, αναζητήστε στο Internet για S-OFF και το μοντέλο της συσκευής σας.
+ Η δημιουργία συντόμευσης απέτυχε
+ Παρακαλούμε ανατρέξτε στην Βοήθεια για περισσότερες πληροφορίες
+ Ένας διαμεσολαβητής APN είναι ορίσμενος στο Android σας!\nΤο AdAway δεν λειτουργεί αξιόπιστα σε δίκυτα κινητής τηλεφωνίας όπως 3G. Μπορείτε να απενεργοποιήσετε τον διαμεσολαβητή πηγαίνοντας στο επιλεγμένο APN (Απο τα Settings app: Network & Internet -> Mobile network -> Advanced -> Access Point Names) και να αφαιρέσετε την τιμή στο πεδίο proxy.
+ Υπάρχει ορισμένος διαμεσολαβητής APN!
+ Η σύνδεση στο ίντερνετ δεν λειτουργεί
+ Αδυναμία συνδεσης
+ Λήψη…
+ Εφαρμογή…
+ Εφαρμογή Λευκής και Μαύρης λίστας
+ Ανάλυση και συγχώνευση αρχείων hosts
+ Δημιουργία αρχείου hosts
+ Εφαρμογή αρχείου hosts
+ Αποτυχία εφαρμογής νέου hosts file.
+ Η εφαρμογή του αρχείου hosts στο σύστημά σας απέτυχε!
+Προσπαθήστε να αλλάξετε το αρχείο προορισμού hosts στις ρυθμίσεις σε /data/data/hosts.
+ Εφαρμογή απέτυχε
+ Ελέγξτε την εφαρμογή διαχείρισης Root για να διασφαλίσετε ότι έχει γίνει η πρόσβαση σε Root.
+ Επαναφέρατε το αρχικό αρχείο hosts.
+Ίσως είναι απαραίτητο να επανεκκινήσετε το Android για να εφαρμοστούν οι αλλαγές.
+Θέλετε να κάνετε επανεκκίνηση;
+(Για να αποφύγετε απώλεια δεδομένων, επαληθεύστε ότι καμία εφαρμογή δεν χρησιμοποιεί την κάρτα SD αυτή την στιγμή!)
+ Επιτυχής επαναφορά
+ Δεν είναι δυνατή η επαναφορά του hosts file
+ Η επαναφορά απέτυχε λόγω μη γνωστής αιτίας
+ Η επαναφορά απέτυχε!
+ Καμία από τις ενεργοποιημένες πηγές hosts σας δεν είναι διαθέσιμη! Είστε συνδεδεμένοι στο Internet;
+ Το κατέβασμα απέτυχε
+ Αποτυχία εγγραφής νέου ιδιωτικού hosts file
+ Το προσωπικό αρχείο δεν μπορεί να δημιουργηθεί.
+ Απέτυχε η δημιουργία προσωπικού αρχείου
+ Έχετε ενεργοποιήσει την λειτουργία systemless. \nΜπορεί να χρειαστεί επανεκκίνηση της συσκευής για να δουλέψει. \n\n(Για να αποφύγετε απώλεια δεδομένων, επαληθεύστε ότι καμία εφαρμογή δεν χρησιμοποιεί την κάρτα SD αυτή την στιγμή!)
+ Ενεργοποίηση επιτυχής
+ Έχετε απενεργοποιήσει την λειτουργία systemless. \nΜπορεί να χρειαστεί επανεκκίνηση της συσκευής για να δουλέψει. \n\n(Για να αποφύγετε απώλεια δεδομένων, επαληθεύστε ότι καμία εφαρμογή δεν χρησιμοποιεί την κάρτα SD αυτή την στιγμή!)
+ Απενεργοποίηση επιτυχής
+ Αποτυχία ενεργοποίησης αποκλεισμού διαφημίσεων VPN.
+ Αποτυχία απενεργοποίησης αποκλεισμού διαφημίσεων VPN.
+ Ενεργοποίηση hosts Magisk module
+ Ενεργοποίηση δυνατότητας systemless hosts από το Magisk manager. Από τις ρυθμίσεις του, ενεργοποιήστε την επιλογή Systemless hosts και στη συνέχεια επανεκκινήστε τη συσκευή σας.
+ Απενεργοποίηση hosts Magisk module
+ Απενεργοποίηση δυνατότητας systemless hosts από το Magisk manager. Από την λίστα στοιχείων, απεγκαταστήστε to Systemless hosts στοιχείο και στη συνέχεια επανεκκινήστε τη συσκευή σας.
+
+
+ Εισάγετε διεύθυνση URL για το αρχείο hosts:
+ Μη έγκυρο όνομα διακομιστή!
+ Κακή μορφή ονόματος διακομιστή
+ Αυτή η διεύθυνση IP δεν είναι έγκυρη!
+ Κακή μορφή διεύθυνσης IP
+ Να μην γίνετε ποτέ επανεκκίνηση και να μην εμφανιστεί αυτή η ερώτηση την επόμενη φορά!
+ Φόρτωση…
+
+
+ Ανανέωση
+ Προσθήκη
+ Βοήθεια
+ Εισαγωγή αντιγράφου ασφαλείας
+ Εξαγωγή αντιγράφου ασφαλείας
+
+
+ S-ON/S-OFF
+ Συχνές Ερωτήσεις
+ Προβλήματα
+
+
+ Κακόβουλο λογισμικό διαφημίσεων
+ Εδώ μπορείτε να βρείτε τα εγκατεστημένα κακόβουλα λογισμικά διαφημίσεων, εφαρμογές τις οποίες το AdAway δεν μπορεί να αποκλείσει. Αυτές οι εφαρμογές χρησιμοποιούν, για παράδειγμα, ειδοποιήσεις Airpush οι οποίες εμφανίζονται ακόμα και όταν οι κακόβουλες εφαρμογές δεν εκτελούνται, ενώ μπορούν ακόμα να αλλάξουν και τον ήχο κλήσης σας. Η μόνη διαθέσιμη μέθοδος αντιμετώπισής του είναι να τις απεγκαταστήσετε, κάνοντας κλικ στα περιεχόμενα της λίστας.
+ Σάρωση…
+ Δεν βρέθηκαν Adware!
+
+
+ Φραγή διαφημίσεων
+ Δεν υπάρχει εγκατεστημένος κειμενογράφος
+ Δεν ήταν δυνατή η εύρεση επεξεργαστή κειμένου για το άνοιγμα του αρχείου hosts. Μπορείτε να εγκαταστήσετε το Jota ή άλλους επεξεργαστές κειμένου για τον χειρισμό αυτού.
+
+Θέλετε να εγκαταστήσετε το Jota;
+ Δεν υπάρχει εγκατεστημένο πρόγραμμα διαχείρισης αρχείων
+ Δεν βρέθηκε διαχειριστής αρχείων για το άνοιγμα αρχείων. Μπορείτε να εγκαταστήσετε τον OI File Manager ή άλλους διαχειριστές αρχείων για τον χειρισμό αυτών.
+
+Θέλετε να εγκαταστήσετε τον OI File Manager;
+
+
+ Tcpdump
+ Το tcpdump είναι ένα εργαλείο για την παρακολούθηση αιτήσεων DNS και την αποθήκευσή τους σε αρχείο καταγραφών. Μπορείτε να το εκκινήσετε στο παρασκήνιο, να εκτελέσετε εφαρμογές που εμφανίζουν διαφημίσεις, και έπειτα να αναλύσετε τις αιτήσεις DNS χρησιμοποιώντας το αρχείο αυτό. Ο πιθανός διακομιστής διαφημίσεων μπορεί μετά να προστεθεί στη μαύρη λίστα σας.
+ Απενεργοποίηση παρακολούθησης
+ Ενεργοποίηση παρακολούθησης
+ Εμφάνιση αποτελεσμάτων
+ Ταξινόμηση τομέω
+ Εκκαθάριση αρχείου καταγραφής
+ Προσθήκη καταχώρησης στη μαύρη λίστα
+ Προσθήκη καταχώρησης στη λευκή λίστα
+ Προσθήκη καταχώρησης στη λίστα ανακατεύθυνσης
+
+ Επεξεργασία της τιμής προτιμήσεων κειμένου
+ Άνοιγμα μενού
+ Κλείσιμο μενού
+
+
+
+ Αρχική
+ Πηγές Hosts
+ Οι λίστες σας
+ Άνοιγμα του αρχείου hosts
+ Εγγραφή αιτημάτων DNS
+ Σάρωση για adware
+ Προτιμήσεις
+ Βοήθεια
+
+
+
+
+ Αιτήματα DNS
+ Οι λίστες σας
+ Προτιμήσεις
+
+
+ Εγκαταστάθηκε %1$s πριν
+ Ενήμερο εδώ και %1$s
+ Απαιτείται ενημέρωηση εδώ και %1$s
+ Τελευταία ενημέρωση πρίν από %1$s
+ Άγνωστη κατάσταση ενημέρωσης
+ Απενεργοποιημένο
+ λίγα λεπτά
+
+ %d λεπτό
+ %d λεπτά
+
+
+ %d ώρα
+ %d ώρες
+
+
+ %d ημέρα
+ %d ημέρες
+
+
+ %d μήνα
+ %d μήνες
+
+
+
+ Hosts αντιγράφηκε στο πρόχειρο
+
+
+ ξεκινάει
+ ενεργό
+ σταματάει
+ περιμένετε για δίκτυο
+ επανασύνδεση
+ σφάλμα επανασύνδεσης
+ σε παύση
+ σταμάτησε
+ Ad-blocker VPN %1$s
+ Παύση
+ Συνέχεια
+
+
+ Δικαιώματα AdAway
+ Επιτρέπει την αλληλεπίδραση με το AdAway
+ Αποστολή εντολών στο AdAway
+ Να επιτρέπεται η αποστολή εντολών στο AdAway όπως η ενεργοποίηση ή η απενεργοποίηση του αποκλεισμού διαφημίσεων σε όλο το σύστημα
+
+
diff --git a/app/src/main/res/values-el/strings_app.xml b/app/src/main/res/values-el/strings_app.xml
new file mode 100644
index 0000000..5c3da3e
--- /dev/null
+++ b/app/src/main/res/values-el/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Ανοιχτού Κώδικα Πρόγραμμα αποκλεισμού διαφημίσεων
+ AdAway logo
+
diff --git a/app/src/main/res/values-el/strings_errors.xml b/app/src/main/res/values-el/strings_errors.xml
new file mode 100644
index 0000000..c4cdc07
--- /dev/null
+++ b/app/src/main/res/values-el/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Δεν υπάρχει σύνδεση στο ίντερνετ
+ Δεν είναι δυνατή η σύνδεση στο Διαδίκτυο. Ελέγξτε τη συνδεσιμότητα της συσκευής σας.
+ Αποτυχία λήψης πηγής hosts
+ Καμία από τις ενεργοποιημένες πηγές hosts σας δεν είναι προσβάσιμη. Ελέγξτε ότι είστε σωστά συνδεδεμένοι στο Διαδίκτυο.
+
+ Αποτυχία δημιουργίας ιδιωτικού αρχείου
+ Δεν είναι δυνατή η δημιουργία ενός ιδιωτικού αρχείου για τη δημιουργία μιας νέας πηγής hosts. Ελέγξτε τον διαθέσιμο χώρο στη συσκευή σας.
+ Δεν υπάρχει διαθέσιμος χώρος
+ Δεν είναι δυνατή η αντιγραφή του αρχείου hosts στο partition του συστήματός σας. Ελέγξτε ότι το Magisk systemless module είναι ενεργοποιημένο και στη συνέχεια κάντε επανεκκίνηση.
+ Αποτυχία εγκατάστασης νέου αρχείου hosts
+ Δεν είναι δυνατή η αντιγραφή του αρχείου hosts στο διαμέρισμα /system. Ελέγξτε ότι το Magisk systemless module είναι ενεργοποιημένο και, στη συνέχεια, κάντε επανεκκίνηση.
+ Αποτυχία επαναφοράς αρχείου hosts
+ Δεν είναι δυνατή η επαναφορά της προεπιλεγμένης διαμόρφωσης αρχείου hosts.
+
+ Αποτυχία ενεργοποίησης αποκλεισμού διαφημίσεων VPN.
+ Ελέγξτε τις ρυθμίσεις VPN για να εξουσιοδοτήσετε την εφαρμογή VPN να ξεκινήσει.
+ Αποτυχία απενεργοποίησης αποκλεισμού διαφημίσεων VPN.
+ Ελέγξτε τις ρυθμίσεις VPN για να το απενεργοποιήσετε χειροκίνητα.
+
diff --git a/app/src/main/res/values-el/strings_home.xml b/app/src/main/res/values-el/strings_home.xml
new file mode 100644
index 0000000..cd65142
--- /dev/null
+++ b/app/src/main/res/values-el/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Αποκλείστηκε
+ Επιτράπηκε
+ Ανακατευθύνθηκε
+
+
+
+ %d up-to-date source
+ %d ενημερωμένες πηγές
+
+
+ %d outdated source
+ %d ξεπερασμένες πηγές
+
+ Έλεγχος για ενημερώσεις αρχείου hosts
+ Ενημέρωση του αρχείου hosts
+
+
+ Εμφάνιση αρχείου καταγραφής αιτήσεων DNS
+
+
+ Εμφάνιση βοήθειας\nκαι συμβουλών
+
+
+ Ανοίξτε τη σελίδα GitHub
+
+
+ Υποστήριξη το project
+
+
+ GitHub project
+ Προτιμήσεις
+
+
+ Ανοίξτε το συρτάρι πλοήγησης
+ Παύση/συνέχιση αποκλεισμού διαφημίσεων
+ Ενημέρωση αποκλεισμένων domains
+ Εμφάνιση ζητημένων domains
+
+
+ Παρακαλούμε ανατρέξτε στην Βοήθεια για περισσότερες πληροφορίες
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-el/strings_hosts.xml b/app/src/main/res/values-el/strings_hosts.xml
new file mode 100644
index 0000000..1867407
--- /dev/null
+++ b/app/src/main/res/values-el/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Πηγές Hosts
+
+ Λίστα χρηστών
+ Επίσημοι πάροχοι AdAway
+ Ενοποιημένοι πάροχοι StevenBlack
+ Πάροχοι λίστας κλειδώματος Pete Lowe
+
+ δεν είναι διαθέσιμο
+ %s πάροχοι
+
+ Προσθήκη πηγής
+ Επεξεργασία πηγής
+ URL: (a https:// or file:// resource)
+ Το πηγαίο URL του αρχείου hosts
+
diff --git a/app/src/main/res/values-el/strings_lists.xml b/app/src/main/res/values-el/strings_lists.xml
new file mode 100644
index 0000000..0cb0437
--- /dev/null
+++ b/app/src/main/res/values-el/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Οι λίστες σας
+ Προσθήκη host
+
+ Αποκλείστηκε
+ Επιτράπηκε
+ Ανακατευθύνθηκε
+
+ Φίλτρο hosts
+ Αναζήτηση hostname…
+ Τoogle πηγών
+
+ Πρόσθεση host στη μαύρη λίστα
+ Πρόσθεση host σε λευκή λίστα
+ Πρόσθεση host σε ανακατεύθυνση
+ Επεξεργασία μαύρης λίστας host
+ Επεξεργασία λευκής λίστας host
+ Επεξεργασία ανακατευθύνσεων
+ Όνομα:
+ Το πηγαίο URL του αρχείου hosts
+ (Επιτρέπονται οι χαρακτήρες μπαλαντέρ * και ?)
+ IP (IPv4 ή IPv6):
+
diff --git a/app/src/main/res/values-el/strings_log.xml b/app/src/main/res/values-el/strings_log.xml
new file mode 100644
index 0000000..ec16d97
--- /dev/null
+++ b/app/src/main/res/values-el/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Εναλλαγή καταγραφής αρχείου εγγραφής
+ Πατήστε εγγραφή για να ξεκινήσετε την καταγραφή αιτημάτων, να περιηγηθείτε στον Ιστό ή να χρησιμοποιήσετε εφαρμογές και, στη συνέχεια, επιστρέψτε ή σύρετε για να ανανεώσετε τα αρχεία καταγραφής.
+ \n\nΤα αποκλεισμένα αιτήματα δεν θα καταγράφονται. Απενεργοποιήστε πρώτα τον αποκλεισμό διαφημίσεων εάν θέλετε να τα καταγράψετε επίσης.
+
+ Ταξινόμηση αλφαβητικά
+ Ταξινόμηση κατά τομέα ανώτατου επιπέδου
+
+ Τομέας ανακατεύθυνσης
+
diff --git a/app/src/main/res/values-el/strings_notification.xml b/app/src/main/res/values-el/strings_notification.xml
new file mode 100644
index 0000000..5508232
--- /dev/null
+++ b/app/src/main/res/values-el/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Ενημερώσεις
+ Νέες ειδοποιήσεις ενημέρωσης
+ Διαθέσιμη ενημέρωση πηγής
+ Νεότερα hosts files διαθέσιμα για λήψη.
+ Ενημέρωση εφαρμογής διαθέσιμη
+ Μια νέα έκδοση του AdAway είναι διαθέσιμη για λήψη.
+
+ VPN
+ Το VPN εκτελεί ειδοποιήσεις
+
\ No newline at end of file
diff --git a/app/src/main/res/values-el/strings_prefs_backup_restore.xml b/app/src/main/res/values-el/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..864403c
--- /dev/null
+++ b/app/src/main/res/values-el/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Αντίγραφο ασφαλείας & επαναφορά
+ Αντίγραφο ασφαλείας
+ Αντίγραφο ασφαλείας σε εξωτερικό χώρο αποθήκευσης τους κανόνες αποκλεισμού σας
+ Επαναφορά
+ Επαναφέρετε τους κανόνες αποκλεισμού από το εφεδρικό αρχείο
+
diff --git a/app/src/main/res/values-el/strings_prefs_main.xml b/app/src/main/res/values-el/strings_prefs_main.xml
new file mode 100644
index 0000000..3103063
--- /dev/null
+++ b/app/src/main/res/values-el/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Επιλογές
+
+ Γενικά
+ Σκοτεινό θέμα
+
+ Φωτεινό
+ Σκοτεινό
+ Προεπιλογή συστήματος
+
+ Αυτόματες ενημερώσεις
+
+ Αποκλεισμός διαφημίσεων
+ Αποκλεισμός διαφημίσεων βάσει Root
+ Αποκλεισμός διαφημίσεων βάσει VPN
+ Ενεργοποίηση υποστήριξης IPv6
+ Κανόνες αποκλεισμού Αντιγράφων ασφαλείας / επαναφοράς
+
+ Αποσφαλμάτωση
+ Αποστολή αναφορών σφαλμάτων
+ Αναφορά στο Sentry (sentry.io)
+ Δεν υποστηρίζεται σε αυτήν την έκδοση
+ Αναλυτική καταγραφή
+ Απαιτείται επανεκκίνηση εφαρμογής για εφαρμογή
+
diff --git a/app/src/main/res/values-el/strings_prefs_root.xml b/app/src/main/res/values-el/strings_prefs_root.xml
new file mode 100644
index 0000000..521a2b1
--- /dev/null
+++ b/app/src/main/res/values-el/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Αποκλεισμός διαφημίσεων βάσει Root
+
+ Hosts εγκατάσταση
+ Άνοιγμα του αρχείου hosts
+ Αρχείο hosts προορισμού
+ Πριν μεταβάλετε αυτή την ρύθμιση, διαβάστε την Βοήθεια σχετικά με αυτή την λειτουργικότητα.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Παραμετροποιημένος προορισμός
+
+ Παραμετροποιημένος προορισμός
+ Απόκρυψη διαλόγου επανεκκίνησης
+
+ Ανακατεύθυνση
+ Ορίστε πού θα ανακατευθύνετε αποκλεισμένα hosts
+ Ανακατεύθυνση IPv4
+ Ανακατεύθυνση IPv6
+ Μη έγκυρη ανακατεύθυνση
+
+ Τοπικός διακομιστής ιστοσελίδων
+ Ο τοπικός διακομιστής ιστού ακούει τοπικές διευθύνσεις IP για να απαντήσει σε αποκλεισμένες αιτήσεις hostsname. Μπορεί να βοηθήσει στην κατάψυξη εφαρμογών σε αποκλεισμένη σύνδεση.
+ Ενεργοποίηση του διακομιστή ιστοσελίδων
+ Δοκιμή σέρβερ
+ Εγκατάσταση αυτο-υπογραφόμενου πιστοποιητικού
+ Χειροκίνητη εγκατάσταση πιστοποιητικού
+ Ξεκινώντας από το Android 11 (R), η εφαρμογή δεν μπορεί πλέον να εγκαταστήσει αυτόματα την αρχή έκδοσης πιστοποιητικών (CA).\n\nΜεταβείτε στις ρυθμίσεις \"Ασφάλεια\", \"Κρυπτογράφηση & διαπιστευτήρια\" και στη συνέχεια, \"Εγκαταστήστε ένα πιστοποιητικό\". Από εκεί, επιλέξτε \"Πιστοποιητικό CA\" και επιλέξτε το αρχείο πιστοποιητικού που εξήχθη πρόσφατα.
+ Ανοίξτε τις ρυθμίσεις \"Ασφάλεια\"
+ Ελεγχος…
+ Δεν εκτελείται
+ Εκτελείται αλλα το πιστοποιητικό δεν έχει εγκατασταθεί
+ Εκτελείται και το πιστοποιητικό έχει εγκατασταθεί
+ Αντικατάσταση κενού χώρου διαφημίσεων απο το εικονίδιο της εφαρμογής
+
diff --git a/app/src/main/res/values-el/strings_prefs_update.xml b/app/src/main/res/values-el/strings_prefs_update.xml
new file mode 100644
index 0000000..daf3fa5
--- /dev/null
+++ b/app/src/main/res/values-el/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Ενημερώσεις
+ Οι ειδοποιήσεις είναι απενεργοποιημένες
+ Οι ειδοποιήσεις εφαρμογών δεν θα εμφανίζονται. Πατήστε για να τις ενεργοποιήσετε.
+
+ Ενημερώσεις εφαρμογής
+ Έλεγχος για ενημέρωση κατά την εκκίνηση
+ Ημερήσιος έλεγχος για ενημερώσεις
+ Συμπεριλάβετε εκδόσεις beta
+
+ Ενημερώσεις Hosts
+ Έλεγχος για ενημέρωση κατά την εκκίνηση
+ Ημερήσιος έλεγχος για ενημερώσεις
+ Συγχρονισμός κατά την ενημέρωση
+ Συγχρονισμός μόνο σε δίκτυο χωρίς μέτρηση
+
diff --git a/app/src/main/res/values-el/strings_prefs_vpn.xml b/app/src/main/res/values-el/strings_prefs_vpn.xml
new file mode 100644
index 0000000..e221243
--- /dev/null
+++ b/app/src/main/res/values-el/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Αποκλεισμός διαφημίσεων βάσει VPN
+
+ Ενεργοποίηση κατά την εκκίνηση
+ Παρακολούθηση σύνδεσης
+ Ελέγχετε περιοδικά την κατάσταση δικτύου για επανεκκίνηση του VPN κατά την αποσύνδεση.
+
+ Εξαιρούμενες εφαρμογές
+ Διαμορφώστε ποιες εφαρμογές δεν πρέπει να χρησιμοποιούν το VPN, ώστε να μην αποκλείονται συνδέσεις.
+ Εξαίρεση εφαρμογών συστήματος
+
+ None
+ All except browsers
+ All
+
+ Εξαίρεση εφαρμογών χρήστη
+
+
+ Εξαιρούμενες εφαρμογές
+ Επιλογή όλων
+ Αποεπιλογή όλων
+ Εικονίδιο εφαρμογής
+
diff --git a/app/src/main/res/values-el/strings_source_edit.xml b/app/src/main/res/values-el/strings_source_edit.xml
new file mode 100644
index 0000000..9dd5efd
--- /dev/null
+++ b/app/src/main/res/values-el/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Επεξεργασία πηγής
+ Προσθήκη πηγής
+
+ Ετικέτα
+ Απαιτείται ετικέτα
+ Τύπος
+ URL
+ Αρχείο
+ Τοποθεσία
+ https://
+ Απαιτείται τοποθεσία
+ Πατήστε Αρχείο για να επιλέξετε πηγαίο αρχείο
+ Μη έγκυρη τοποθεσία
+ Μορφή λίστας
+ Αποκλεισμός
+ Να επιτρέπεται
+ Εφαρμογή ανακατευθυνόμενων hosts
+ Η αποδοχή ανακατευθυνόμενων hosts μπορεί να προκαλέσει προβλήματα ασφαλείας. Χρησιμοποιήστε αυτές τις ρυθμίσεις μόνο σε μια αξιόπιστη πηγή, καθώς θα μπορούσε να ανακατευθύνει κάποια ευαίσθητη κίνηση σε όποιον διακομιστή θέλει.
+
diff --git a/app/src/main/res/values-el/strings_support.xml b/app/src/main/res/values-el/strings_support.xml
new file mode 100644
index 0000000..2d68f3c
--- /dev/null
+++ b/app/src/main/res/values-el/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Υποστήριξη
+ Γίνε χορηγός
+
\ No newline at end of file
diff --git a/app/src/main/res/values-el/strings_update.xml b/app/src/main/res/values-el/strings_update.xml
new file mode 100644
index 0000000..02c8a0e
--- /dev/null
+++ b/app/src/main/res/values-el/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Ενημέρωση AdAway
+
+ Διαθέσιμη ενημέρωση!
+
+
+ Είστε ενημερωμένοι
+ Υπάρχει διαθέσιμη ενημέρωση
+ Το AdAway ενημερώνεται
+ Ενημέρωση τώρα
+ %1$s / %2$s
+ Τελευταίες αλλαγές
+ Καταγραφή αλλαγών
+ Υποστήριξη ανάπτυξης
+ Δωρίστε
+ Sponsor
+
+
+ Λήψη της τελευταίας έκδοσης AdAway…
+
diff --git a/app/src/main/res/values-el/strings_welcome.xml b/app/src/main/res/values-el/strings_welcome.xml
new file mode 100644
index 0000000..4b72b3c
--- /dev/null
+++ b/app/src/main/res/values-el/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Καλώς ήρθατε
+ Wizard πρώτο βήμα
+ Wizard δεύτερο βήμα
+ Wizard τελευταίο βήμα
+
+
+ Καλώς ήλθατε στο AdAway!
+ Το AdAway παρέχει δύο μεθόδους αποκλεισμού διαφημίσεων. Διαλέξτε αυτή που σας αρέσει:
+
+ Λογότυπο Root
+ Root based\nad blocking
+ Γρηγορότερo
+ Φιλικό προς την μπαταρία
+ Απαιτείται Root
+
+ Λογότυπο VPN
+ VPN based\nad blocking
+ Πιο αργό
+ Εκτελείτε στο παρασκήνιο
+ Συμβατότητα
+
+ Απαιτείται Android με Root
+ Είτε το su binary δεν βρέθηκε είτε δεν επιτράψατε την άδεια root στο AdAway.\n\nΑυτό μπορεί να συμβεί όταν η συσκευή σας δεν είναι rooted. Μπορείτε να βρείτε πληροφορίες σχετικά με το πως how να rootάρετε τη συσκευή σας στο wiki.lineageos.org ή σε άλλα Android websites.
+
+ Πλεονεκτήματα
+ Μειονεκτήματα
+
+
+ Ο συγχρονισμός ολοκληρώθηκε
+ Σφάλμα κατά τον συγχρονισμό
+
+ Συγχρονισμός
+ Συγχρονίστηκε!
+ Το AdAway κατεβάζει δίκτυα διαφημίσεων για αποκλεισμό από διαδικτυακές πηγές. Μπορείτε να τα προσαρμόσετε αργότερα στις ρυθμίσεις.
+ Επανάληψη συγχρονισμού
+ Αποτυχία συγχρονισμού: %1$s Επανάληψη τώρα;
+ Μπορεί να στείλει ειδοποιήσεις για προβολή της κατάστασης και έλεγχο του μπλοκαρίσματος διαφημίσεων και να σας ειδοποιήσει εάν υπάρξει διαθέσιμη ενημέρωση εφαρμογής (λίγες ανά έτος). Ενεργοποιήστε το εάν θέλετε να παραμείνετε ενημερωμένοι.
+
+
+ Υποστήριξη
+ Υποστήριξε με!
+ Το AdAway είναι μια δωρεάν και ανοιχτού κώδικα εφαρμογή την οποία αναπτύσσω στον ελεύθερο χρόνο μου. Εάν την απολαμβάνετε, μη διστάσετε να δείξετε την υποστήριξή σας:
+ Δωρεά στο PayPal
+ Σας αρέσουν τα bugs; Ούτε εμένα.
+ Ενεργοποιήστε την τηλεμετρία για να μου στέλνετε αναφορές σφαλμάτων
+
+
+ Πίσω
+ Επόμενο
+ Τέλος
+
diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml
new file mode 100644
index 0000000..3e34fb7
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings.xml
@@ -0,0 +1,258 @@
+
+
+
+ Exit
+ Close
+ Yes
+ No
+ Add
+ Cancel
+ Save
+ Help
+
+
+ Welcome!
+ AdAway is a free and open-source software design to block advertising. It fetches advertising network addresses to block them on your device.\nWant to know more? Check the help below!
+ Show more help
+ Update status
+ All hosts files from the defined sources are downloaded, merged with your own lists and installed as one hosts file on your system.
+ Enable ad-blocking
+ Disable ad-blocking
+ Web server
+ Running
+ Stopped
+ Start or stop webserver on localhost to answer requests to blocked hostnames.
+ Enable web server
+ Disable web server
+ VPN
+ Running
+ Stopped
+ Start or stop VPN to filter requests.
+ Enable VPN
+ Disable VPN
+
+
+ Edit Entry
+ Apply
+ Edit
+ Delete
+
+
+ Importing…
+ Backup successfully imported from your external storage.
+ Failed to import backup. Is its format correct? Check logcat for more details.
+ Exporting…
+ Backup successfully exported to file \'%s\' on your external storage.
+ Failed to export backup file \'%s\'.
+
+
+ The hosts file
+ The hosts file is a system file that maps hostnames to IP addresses. It is a plain text file which configuration is handled by AdAway. Here are its few first lines:
+ Loading the hosts file content…
+ Open the hosts file
+
+
+ Checking for update
+ Checking %s source for update
+ Retrieving sources
+ Downloading source %s
+ Reading source %s
+ Parsing %s source
+ Syncing rule database
+ Reverting to default hosts file
+ Default hosts file restored
+ Creating standard hosts file
+ Source update available
+ Newer hosts files available
+ No source update found
+ No Internet connection
+ No Internet connection available
+ Unavailable sources
+ No hosts sources are reachable!
+ Root access denied
+ Allow root access from your root app
+ Something went wrong
+ Check the logcat for more details
+ Enabled
+ Newest hosts files enabled
+ Disabled
+ Default hosts file installed
+ Apply latest sources
+ Creating a new hosts file
+ Copying a new hosts file
+ Checking hosts file copy
+ Hosts file successfully updated
+ VPN configuration successfully updated
+ Your configuration changed. You need to apply it.
+ Apply
+ Applying new configuration…
+ Failed to apply new configuration.
+
+
+ The symlink to the hosts file target is missing
+ Symlink from your target to /system/etc/hosts is not existing or incorrect! AdAway will not work if it is not pointing to the right file.\n\nDo you want to try creating a symlink?
+ Symlink missing
+ Not enough space on the partition!\nTry changing the target hosts file in preferences to /data/data/hosts.
+ Not enough space
+ Downloaded file could not be read.
+ Private file fail
+ Remounting the partition as read/write failed!
+ Remount failed
+ Failed to copy hosts file
+ Copying of hosts file failed!
+ Copy failed
+ Applied hosts sources
+ Applying successful
+ Applying was successful.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Symlink was created successful.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Symlink creation successful
+ Symlink could not be created by Android.\nThis fails mostly due to a \'feature\' called S-ON on HTC phones!\n\nA solution is to boot your phone into recovery mode and create the symlink there with \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nIf this does not work search the Internet for S-OFF and your phone.
+ Symlink creation failed
+ Please read Help for more information.
+ An APN proxy is set on your Android!\nAdAway will not work reliably when on Mobile Networks like 3G. You can deactivate that proxy by going to your selected APN (From the Settings app: Network & Internet -> Mobile network -> Advanced -> Access Point Names) and remove the value in the proxy field.
+ APN proxy set!
+ The connection to the Internet is not working.
+ No Connection
+ Downloading…
+ Applying…
+ Applying Blacklist and Whitelist
+ Parsing and merging hosts files
+ Building hosts file
+ Applying hosts file
+ Failed to apply new hosts file.
+ Applying the hosts file to your system failed!\nTry changing the target hosts file in preferences to /data/data/hosts.
+ Applying failed
+ Please check your root management app to ensure root access has been granted.
+ You reverted to the default hosts file.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Reverting successful
+ Unable to revert hosts file
+ Reverting failed due to unknown reasons.
+ Reverting failed!
+ None of your enabled hosts sources are reachable! Are you properly connected to the Internet?
+ Download failed
+ Failed to write new private hosts file
+ Private file can not be created.
+ Private file creation failed
+ You enabled systemless mode.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Enabling successful
+ You disabled systemless mode.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Disabling successful
+ Failed to enable VPN ad blocking.
+ Failed to disable VPN ad blocking.
+ Enabling hosts Magisk module
+ Enable systemless hosts feature from Magisk manager. From its settings, enable the Systemless hosts option then reboot your device.
+ Disabling hosts Magisk module
+ Disable systemless hosts feature from Magisk manager. From the module list, uninstall the Systemless hosts module then reboot your device.
+
+
+ Input URL to hosts file:
+ This is not a valid hostname!
+ Improperly formatted hostname
+ This is not a valid IP!
+ Improperly formatted IP
+ Never reboot and don\'t show this question next time!
+ Loading…
+
+
+ Refresh
+ Add
+ Help
+ Import backup
+ Export backup
+
+
+ S-ON/S-OFF
+ FAQ
+ Problems
+
+
+ Adware
+ Here you can find installed adware, bad applications which can\'t be blocked by AdAway. These apps use for example Airpush notifications that pop up even when the app is not running or even change your ringtone. The only available countermeasure is to uninstall those apps by clicking on the list items.
+ Scanning…
+ No Adware were found!
+
+
+ Ad blocker
+ No text editor installed
+ No text editor could be found to open the hosts file. You can install Jota or other text editors to handle this.\n\nDo you want to install Jota?
+ No file manager installed
+ No file manager could be found to open files. You can install OI File Manager or other file managers to handle this.\n\nDo you want to install OI File Manager?
+
+
+ Tcpdump
+ Tcpdump is a tool to monitor DNS requests and save them in a log file. You can start it in the background, run applications that display ads, and afterwards analyze the DNS requests using the log file. Possible ad server can then be added to your blacklist.
+ Disable monitoring
+ Enable monitoring
+ Show results
+ Sort domains
+ Clear log
+ Add entry to black list
+ Add entry to white list
+ Add entry to redirect list
+
+ Edit text preference value
+ Open menu
+ Close menu
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
+
+
+ DNS requests
+ Your lists
+ Preferences
+
+
+ Installed %1$s ago
+ Up-to-date for %1$s
+ Need update for %1$s
+ Last update %1$s ago
+ Unknown update status
+ few minutes
+
+ %d minute
+ %d minutes
+
+
+ %d hour
+ %d hours
+
+
+ %d day
+ %d days
+
+
+ %d month
+ %d months
+
+
+
+ starting
+ active
+ stopping
+ wait for network
+ reconnecting
+ reconnecting error
+ paused
+ stopped
+ Ad-blocker VPN %1$s
+ Pause
+ Resume
+
+
+ AdAway permissions
+ Allow to interact with AdAway
+ Send commands to AdAway
+ Allow to send commands to AdAway like enabling or disabling the system-wide ad-blocking
+
+
diff --git a/app/src/main/res/values-en-rUS/strings_app.xml b/app/src/main/res/values-en-rUS/strings_app.xml
new file mode 100644
index 0000000..af6a933
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Open Source ad blocker
+ AdAway logo
+
diff --git a/app/src/main/res/values-en-rUS/strings_errors.xml b/app/src/main/res/values-en-rUS/strings_errors.xml
new file mode 100644
index 0000000..da703ab
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ No Internet connection
+ Unable to establish a connection to the Internet. Please check your device connectivity.
+ Failed to download hosts source
+ None of your enabled hosts sources are reachable. Please check you are properly connected to the Internet.
+
+ Failed to create private file
+ Unable to create a private file to build a new hosts source. Please check the free space available on your device.
+ Not enough space
+ Unable to copy hosts file to your system partition. Please check Magisk systemless module is enabled then reboot.
+ Failed to install new hosts file
+ Unable to copy hosts file to /system partition. Please check Magisk systemless module is enabled then reboot.
+ Failed to revert hosts file
+ Unable to restore default hosts file configuration.
+
+ Failed to enable VPN ad blocking.
+ Please check your VPN settings to authorize the application VPN to start.
+ Failed to disable VPN ad blocking.
+ Please check your VPN settings to disable it manually.
+
diff --git a/app/src/main/res/values-en-rUS/strings_home.xml b/app/src/main/res/values-en-rUS/strings_home.xml
new file mode 100644
index 0000000..d4feb49
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Blocked
+ Allowed
+ Redirected
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+ Check for hosts updates
+ Update hosts
+
+
+ Show DNS request log
+
+
+ Show help\nand tips
+
+
+ Open GitHub page
+
+
+ Support the project
+
+
+ GitHub project
+ Preferences
+
+
+ Open navigation drawer
+ Pause/resume ad blocking
+ Update blocked domains
+ Show requested domains
+
+
+ Please read Help for more information.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-en-rUS/strings_hosts.xml b/app/src/main/res/values-en-rUS/strings_hosts.xml
new file mode 100644
index 0000000..9708f7a
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts sources
+
+ User list
+ AdAway official hosts
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ not available
+ %s hosts
+
+ Add source
+ Edit source
+ URL: (a https:// or file:// resource)
+ The hosts source URL
+
diff --git a/app/src/main/res/values-en-rUS/strings_lists.xml b/app/src/main/res/values-en-rUS/strings_lists.xml
new file mode 100644
index 0000000..112a0d0
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_lists.xml
@@ -0,0 +1,23 @@
+
+
+ Your lists
+
+ Blocked
+ Allowed
+ Redirected
+
+ Filter hosts
+ Search hostname…
+ Toggle sources
+
+ Add host to blacklist
+ Add host to whitelist
+ Add host redirect
+ Edit blacklisted host
+ Edit whitelisted host
+ Edit redirect
+ Hostname:
+ The hosts source URL
+ (Wildcard characters * and ? are allowed)
+ IP (IPv4 or IPv6):
+
diff --git a/app/src/main/res/values-en-rUS/strings_log.xml b/app/src/main/res/values-en-rUS/strings_log.xml
new file mode 100644
index 0000000..88ceda5
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Alphabetical sort
+ Top level domain sort
+
+ Redirect domain
+
diff --git a/app/src/main/res/values-en-rUS/strings_notification.xml b/app/src/main/res/values-en-rUS/strings_notification.xml
new file mode 100644
index 0000000..46c6770
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Updates
+ New update notifications
+ Source update available
+ Newer hosts files available for download.
+ App update available
+ A new version of AdAway is available for download.
+
+ VPN
+ VPN running notifications
+
\ No newline at end of file
diff --git a/app/src/main/res/values-en-rUS/strings_prefs_backup_restore.xml b/app/src/main/res/values-en-rUS/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..910b88b
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Backup & restore
+ Backup
+ Backup to external storage your block rules
+ Restore
+ Restore your block rules from backup file
+
diff --git a/app/src/main/res/values-en-rUS/strings_prefs_main.xml b/app/src/main/res/values-en-rUS/strings_prefs_main.xml
new file mode 100644
index 0000000..ac8940e
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferences
+
+ General
+ Dark theme
+
+ Light
+ Dark
+ System default
+
+ Automatic updates
+
+ Ad blocking
+ Root based ad blocker
+ VPN based ad blocker
+ Enable IPv6 support
+ Backup / restore block rules
+
+ Debug
+ Send crash reports
+ Report to Sentry (sentry.io)
+ Not supported on this build
+ Verbose logging
+ App restart is needed to apply
+
diff --git a/app/src/main/res/values-en-rUS/strings_prefs_root.xml b/app/src/main/res/values-en-rUS/strings_prefs_root.xml
new file mode 100644
index 0000000..0f3ceaa
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Root based ad blocker
+
+ Hosts install
+ Open hosts file
+ Target hosts file
+ Read Help before using this feature
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+ Custom target location
+ Hide reboot dialog after apply
+
+ Redirection
+ Define where to redirect blocked hosts
+ Configure IPv4 redirection
+ Configure IPv6 redirection
+ Invalid redirection
+
+ Local web server
+ The local web server listens on local IP addresses to answer to blocked hostname requests. It may help with app freezing on blocked connection.
+ Enable web server
+ Test web server
+ Install self-signed certificate
+ Certificate manual install
+ Starting from Android 11 (R), application can no more automatically install certificate authority (CA).\n\nGo to \"Security\" settings, \"Encryption & credentials\" then \"Install a certificate\". From there, choose \"CA certificate\" and select the newly exported certificate file.
+ Open "Security" settings
+ Checking…
+ Not running
+ Running but certificate not installed
+ Running and certificate installed
+ Replace blank ad space by app icon
+
diff --git a/app/src/main/res/values-en-rUS/strings_prefs_update.xml b/app/src/main/res/values-en-rUS/strings_prefs_update.xml
new file mode 100644
index 0000000..d58435a
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Updates
+
+ Application updates
+ Check for update at startup
+ Periodically check for update
+ Include beta releases
+
+ Hosts updates
+ Check for update at startup
+ Periodically check for update
+ Sync on update
+ Sync on unmetered network only
+
diff --git a/app/src/main/res/values-en-rUS/strings_prefs_vpn.xml b/app/src/main/res/values-en-rUS/strings_prefs_vpn.xml
new file mode 100644
index 0000000..43102a4
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN based ad blocker
+
+ Enable at startup
+ Monitor connection
+ Periodically check the network state to restart VPN on disconnection.
+
+ Excluded applications
+ Configure which applications should not use the VPN so no connections will be blocked.
+ Exclude system applications
+
+ None
+ All except browsers
+ All
+
+ Exclude user applications
+
+
+ Excluded applications
+ Select all
+ Deselect all
+ Application icon
+
diff --git a/app/src/main/res/values-en-rUS/strings_support.xml b/app/src/main/res/values-en-rUS/strings_support.xml
new file mode 100644
index 0000000..308ebf9
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Support
+ Become a sponsor
+
\ No newline at end of file
diff --git a/app/src/main/res/values-en-rUS/strings_update.xml b/app/src/main/res/values-en-rUS/strings_update.xml
new file mode 100644
index 0000000..6cefde8
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_update.xml
@@ -0,0 +1,18 @@
+
+
+ AdAway update
+
+ Update available!
+
+
+ You are up-to-date
+ Update available
+ Updating AdAway
+ Update now
+ %1$s / %2$s
+ Last changes
+ Changelog
+
+
+ Downloading latest AdAway version…
+
diff --git a/app/src/main/res/values-en-rUS/strings_welcome.xml b/app/src/main/res/values-en-rUS/strings_welcome.xml
new file mode 100644
index 0000000..42ba60a
--- /dev/null
+++ b/app/src/main/res/values-en-rUS/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Welcome
+ Wizard first step
+ Wizard second step
+ Wizard last step
+
+
+ Welcome to AdAway!
+ AdAway provides two ad blocking methods. Pick the one you like:
+
+ Root logo
+ Root based\nad blocking
+ Faster
+ Battery friendly
+ Root required
+
+ VPN logo
+ VPN based\nad blocking
+ Slower
+ Run in background
+ Compatibility
+
+ Rooted Android required
+ Either the su binary could not be found or you did not allow root permission for AdAway.\n\nThis can happen when your device is not rooted. You can find information about how to root your device on wiki.lineageos.org or other Android websites.
+
+ Pro
+ Con
+
+
+ Sync done
+ Error during sync
+
+ Syncing
+ Synced!
+ AdAway downloads ad networks to block from online sources. You can customize them later in the settings.
+ Retry sync
+ Failed to sync: %1$s Retry now?
+
+
+ Support
+ Support me!
+ AdAway is a free and open-source app that I develop on my free time. If you enjoy it, feel free to show your support:
+ Donate on PayPal
+ Do you like bugs? Me neither.
+ Enable telemetry to send me crash reports
+
+
+ Back
+ Next
+ Finish
+
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
new file mode 100644
index 0000000..b4c7ab4
--- /dev/null
+++ b/app/src/main/res/values-eo/strings.xml
@@ -0,0 +1,17 @@
+
+
+
+ Eliro
+ Oftaj demandoj
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-eo/strings_app.xml b/app/src/main/res/values-eo/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-eo/strings_errors.xml b/app/src/main/res/values-eo/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eo/strings_home.xml b/app/src/main/res/values-eo/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eo/strings_hosts.xml b/app/src/main/res/values-eo/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-eo/strings_lists.xml b/app/src/main/res/values-eo/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-eo/strings_log.xml b/app/src/main/res/values-eo/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-eo/strings_notification.xml b/app/src/main/res/values-eo/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eo/strings_prefs_backup_restore.xml b/app/src/main/res/values-eo/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-eo/strings_prefs_main.xml b/app/src/main/res/values-eo/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-eo/strings_prefs_root.xml b/app/src/main/res/values-eo/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-eo/strings_prefs_update.xml b/app/src/main/res/values-eo/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-eo/strings_prefs_vpn.xml b/app/src/main/res/values-eo/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-eo/strings_support.xml b/app/src/main/res/values-eo/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eo/strings_update.xml b/app/src/main/res/values-eo/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-eo/strings_welcome.xml b/app/src/main/res/values-eo/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-eo/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml
new file mode 100644
index 0000000..95d8cc2
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings.xml
@@ -0,0 +1,266 @@
+
+
+
+ Salir
+ Cerrar
+ Sí
+ No
+ Agregar
+ Cancelar
+ Guardar
+ Ayuda
+
+
+ Te damos la bienvenida
+ AdAway es un software gratuito y de código abierto diseñado para bloquear los anuncios. Para ello, recupera las direcciones de red de los anuncios y los bloquea en el dispositivo.\nPara obtener más información, consulta la ayuda más abajo.
+ Mostrar más ayuda
+ Actualizar estado
+ Se descargarán todos los archivos hosts de las fuentes definidas, se combinarán con las listas propias y se instalarán como un solo archivo hosts en el sistema.
+ Habilitar bloqueo de anuncios
+ Inhabilitar bloqueo de anuncios
+ Servidor web
+ En funcionamiento
+ Detenido
+ Iniciar o detener un servidor web en el host local para responder las solicitudes a los nombres de host bloqueados.
+ Habilitar servidor web
+ Inhabilitar servidor web
+ VPN
+ En ejecución
+ Detenido
+ Iniciar o detener la VPN para filtrar las solicitudes.
+ Habilitar la VPN
+ Inhabilitar la VPN
+
+
+ Editar entrada
+ Aplicar
+ Editar
+ Borrar
+
+
+ Importando…
+ Se importó correctamente la copia de seguridad del almacenamiento externo.
+ No se pudo importar la copia de seguridad. Asegúrate de que el formato sea correcto. Revisa el registro de logcat para obtener más detalles.
+ Exportando…
+ Copia de seguridad exportada con éxito a un archivo \'%s\' en su almacenamiento externo.
+ No se ha podido exportar el archivo de copia de seguridad \'%s\'.
+
+
+ El archivo hosts
+ El archivo hosts es un archivo del sistema que permite asignar los nombres de hosts a las direcciones IP. Es un archivo de texto sin formato cuya configuración administra AdAway. Estas son sus primeras líneas:
+ Cargando el contenido del archivo hosts…
+ Abrir el archivo hosts
+
+
+ Buscando actualizaciones
+ Buscando actualizaciones en la fuente %s
+ Recuperando fuentes
+ Descargando datos de la fuente %s
+ Fuente de lectura %s
+ Analizando fuente %s
+ Sincronizando la base de datos de reglas
+ Revirtiendo el archivo hosts a la versión predeterminada
+ Se restableció el archivo hosts predeterminado
+ Creando archivo hosts estándar
+ Hay una actualización de la fuente
+ Nuevos archivos hosts disponibles
+ No se encontraron actualizaciones de la fuente
+ No hay conexión a Internet
+ La conexión a Internet no está disponible
+ Fuentes no disponibles
+ No se puede acceder a las fuentes de hosts
+ Se denegó el acceso de administrador
+ Permite el acceso de administrador desde la app de root
+ Hubo un problema
+ Revisa el registro logcat para obtener información detallada
+ Habilitado
+ Los archivos hosts más recientes están habilitados
+ Inhabilitado
+ El archivo hosts predeterminado está instalado
+ Aplicar fuentes más recientes
+ Creando un nuevo archivo hosts
+ Copiando un nuevo archivo hosts
+ Verificando la copia del archivo hosts
+ Se actualizó correctamente el archivo hosts
+ Se actualizó correctamente la configuración de la VPN
+ La configuración cambió, por lo que debes aplicarla.
+ Aplicar
+ Aplicando la configuración nueva…
+ No se pudo aplicar la configuración nueva.
+
+
+ Falta el vínculo simbólico al archivo hosts del objetivo
+ El vínculo simbólico del objetivo a /system/etc/hosts no existe o es incorrecto. AdAway no funcionará si este vínculo no apunta al archivo correcto.\n\n¿Quieres intentar crear un vínculo simbólico?
+ Falta el vínculo simbólico
+ No queda espacio suficiente en la partición.\nIntenta cambiar el archivo hosts objetivo en la configuración a /data/data/hosts.
+ No queda espacio suficiente
+ No se pudo leer el archivo descargado.
+ Error de archivo privado
+ No se pudo reactivar la partición con permisos de lectura y escritura.
+ Error de reactivación
+ No se pudo copiar el archivo hosts
+ No se pudo copiar el archivo hosts.
+ Error de copia
+ Se aplicaron las fuentes de hosts
+ Aplicación correcta
+ Se aplicó el archivo hosts correctamente.\nEs posible que debas reiniciar Android para que los cambios se apliquen.\n\n¿Quieres reiniciar el dispositivo?\nNota: Para evitar la pérdida de datos, asegúrate de que ninguna app esté usando la tarjeta SD en este momento.
+ Se creó el vínculo simbólico correctamente.\nEs posible que debas reiniciar Android para que los cambios se apliquen.\n\n¿Quieres reiniciar el dispositivo?\nNota: Para evitar la pérdida de datos, asegúrate de que ninguna app esté usando la tarjeta SD en este momento.
+ Creación correcta del vínculo simbólico
+ Android no pudo crear el vínculo simbólico.\nEs probable que se deba a una función llamada S-ON de los teléfonos HTC.\n\nPara solucionar este problema, puedes iniciar el teléfono en modo de recuperación y crear el vínculo simbólico desde allí con el comando “ln -s /data/data/hosts /system/etc/hosts”.\n\nSi esta solución no funciona, busca en Internet cómo inhabilitar S-ON en el teléfono.
+ No se pudo crear el vínculo simbólico
+ Para obtener más información, consulta la ayuda.
+ El dispositivo Android tiene configurado un proxy de APN.\nAdAway no funcionará de manera confiable en redes móviles como 3G. Puedes desactivar el proxy desde el APN seleccionado. Para ello, ve a la app de Configuración > Internet y red > Red móvil > Avanzada > Nombres de puntos de acceso y quita el valor del campo Proxy.
+ Se detectó un proxy de APN
+ La conexión a Internet no funciona.
+ No hay conexión
+ Descargando…
+ Aplicando…
+ Aplicando listas negra y blanca
+ Analizando y uniendo archivos hosts
+ Compilando archivo hosts
+ Aplicando archivo hosts
+ No se pudo aplicar el nuevo archivo hosts.
+ No se pudo aplicar el archivo hosts en el sistema.\nIntenta cambiar el archivo hosts de destino en la configuración a /data/data/hosts.
+ Error de aplicación
+ Compruebe su aplicación de administración de root para asegurarse de que se haya concedido el acceso root.
+ Restableciste el archivo hosts predeterminado.\nEs posible que debas reiniciar Android para que los cambios se apliquen.\n\n¿Quieres reiniciar el dispositivo?\nNota: Para evitar la pérdida de datos, asegúrate de que ninguna app esté usando la tarjeta SD en este momento.
+ Reversión correcta
+ No se pudo revertir el archivo hosts
+ No se pudo revertir el archivo hosts por razones desconocidas.
+ Error de reversión
+ No se puede acceder a ninguna de las fuentes de hosts habilitadas. Comprueba la conexión a Internet.
+ Error de descarga
+ No se pudo escribir el nuevo archivo hosts privado
+ No se pudo crear el archivo privado.
+ Error de creación de archivo privado
+ Habilitaste el modo sin modificaciones a la partición del sistema.\nEs posible que debas reiniciar Android para que los cambios se apliquen.\n\n¿Quieres reiniciar el dispositivo?\nNota: Para evitar la pérdida de datos, asegúrate de que ninguna app esté usando la tarjeta SD en este momento.
+ Habilitación correcta
+ Inhabilitaste el modo sin modificaciones a la partición del sistema.\nEs posible que debas reiniciar Android para que los cambios se apliquen.\n\n¿Quieres reiniciar el dispositivo?\nNota: Para evitar la pérdida de datos, asegúrate de que ninguna app esté usando la tarjeta SD en este momento.
+ Inhabilitación correcta
+ No se pudo habilitar el bloqueo de anuncios mediante VPN.
+ No se pudo inhabilitar el bloqueo de anuncios mediante VPN.
+ Habilitar el módulo Magisk de hosts
+ Habilita la función de hosts sin modificar el sistema del administrador de Magisk. Para ello, ve a su configuración, habilita la opción Systemless hosts (Hosts sin modificar el sistema) y, luego, reinicia el dispositivo.
+ Deshabilitar el módulo Magisk de hosts
+ Deshabilita la función de hosts sin sistema del administrador Magisk. En la lista de módulos, desinstale el módulo Hosts sin sistema y reinicie su dispositivo.
+
+
+ Ingresa la URL del archivo hosts:
+ El nombre de host no es válido.
+ El nombre de host tiene un formato incorrecto
+ La dirección IP no es válida
+ La dirección IP tiene un formato incorrecto
+ No reiniciar ni volver a preguntar
+ Cargando…
+
+
+ Actualizar
+ Añadir
+ Ayuda
+ Importar copia de seguridad
+ Exportar copia de seguridad
+
+
+ S-ON/S-OFF
+ Preguntas frecuentes
+ Problemas
+
+
+ Adware
+ En esta sección, encontrarás el adware y las aplicaciones maliciosas que AdAway no puede bloquear. Por ejemplo, algunas de estas apps pueden usar notificaciones push que aparecen cuando la app no está en ejecución o incluso cambiar el tono de llamada. La única forma de solucionar estos problemas es desinstalar esas apps. Para ello, selecciónalas en esta lista.
+ Analizando…
+ No se encontró adware.
+
+
+ Bloqueador de anuncios
+ No tienes instalado ningún editor de texto
+ No se encontró ningún editor de texto para abrir el archivo hosts. Puedes instalar Jota u otro editor de texto para encargarte de esto.\n\n¿Quieres instalar Jota?
+ No tienes instalado ningún administrador de archivos
+ No se encontró ningún administrador que pueda abrir los archivos. Puedes instalar OI File Manager u otro administrador de archivos para hacerlo.\n\n¿Quieres instalar OI File Manager?
+
+
+ Tcpdump
+ Tcpdump es una herramienta que permite supervisar las solicitudes DNS y guardarlas en un archivo de registro. Puedes iniciarlo en segundo plano, ejecutar aplicaciones que muestren anuncios y, luego, analizar las solicitudes DNS con el archivo de registro. Posteriormente, puedes agregar a la lista negra el posible servidor de anuncios.
+ Inhabilitar supervisión
+ Habilitar supervisión
+ Mostrar resultados
+ Ordenar dominios
+ Limpiar registro
+ Agregar entrada a la lista negra
+ Agregar entrada a la lista blanca
+ Agregar entrada a la lista de redirección
+
+ Editar valor de texto de la preferencia
+ Abrir menú
+ Cerrar menú
+
+
+
+ Home
+ Fuentes de hosts
+ Tus listas
+ Abrir archivo hosts
+ Log DNS requests
+ Scan for adware
+ Preferencias
+ Ayuda
+
+
+
+
+ Solicitudes DNS
+ Tus listas
+ Preferencias
+
+
+ Se instaló hace %1$s
+ Actualizado desde %1$s
+ Necesita actualización desde %1$s
+ Última actualización hace %1$s
+ Estado de actualización desconocido
+ Inhabilitado
+ pocos minutos
+
+ %d minuto
+ %d minutos
+ %d minutos
+
+
+ %d hora
+ %d horas
+ %d horas
+
+
+ %d día
+ %d días
+ %d días
+
+
+ %d mes
+ %d meses
+ %d meses
+
+
+
+ Host copiado al portapapeles
+
+
+ iniciando
+ activo
+ deteniendo
+ en espera de la red
+ reconectando
+ error de reconexión
+ en pausa
+ detenido
+ Bloqueador de anuncios por VPN %1$s
+ Pausar
+ Presiona para continuar
+
+
+ AdAway permisos
+ Permite interactuar con AdAway
+ Habilitar e inhabilitar el bloqueo de anuncios del sistema
+ Permite enviar comandos a AdAway como habilitar o deshabilitar el bloqueo de anuncios en todo el sistema
+
+
diff --git a/app/src/main/res/values-es-rMX/strings_app.xml b/app/src/main/res/values-es-rMX/strings_app.xml
new file mode 100644
index 0000000..b107a83
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Bloqueador de anuncios de código libre
+ Logo de AdAway
+
diff --git a/app/src/main/res/values-es-rMX/strings_errors.xml b/app/src/main/res/values-es-rMX/strings_errors.xml
new file mode 100644
index 0000000..f8e3aca
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ No hay conexión a Internet
+ No se pudo conectar a Internet. Comprueba la conectividad del dispositivo.
+ No se pudo descargar la fuente del archivo hosts
+ No se pudo conectar a ninguna de las fuentes de hosts habilitadas. Comprueba que tienes conexión a Internet.
+
+ No se pudo crear el archivo privado
+ No se pudo crear un archivo privado para generar una nueva fuente de hosts. Revisa que el dispositivo tenga espacio libre disponible.
+ No queda espacio suficiente
+ No se pudo copiar el archivo hosts a la partición del sistema. Verifica que esté habilitado el módulo de Magisk sin modificar el sistema y reinicia el dispositivo.
+ No se pudo instalar el nuevo archivo hosts
+ No se pudo copiar el archivo hosts a la partición /system. Verifica que esté habilitado el módulo de Magisk sin modificar el sistema y reinicia el dispositivo.
+ No se pudo revertir el archivo hosts
+ No se pudo restablecer la configuración predeterminada del archivo hosts
+
+ No se pudo habilitar el bloqueo de anuncios mediante VPN.
+ Verifica la configuración de la VPN y autoriza que se inicie la aplicación correspondiente.
+ No se pudo inhabilitar el bloqueo de anuncios mediante VPN.
+ Verifica la configuración de la VPN e inhabilítala de forma manual.
+
diff --git a/app/src/main/res/values-es-rMX/strings_home.xml b/app/src/main/res/values-es-rMX/strings_home.xml
new file mode 100644
index 0000000..09b5ad1
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_home.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ Bloquead
+ Permitido
+ Redireccionado
+
+
+
+ %d up-to-date source
+ %d fuentes actualizadas
+
+
+ %d outdated source
+ %d fuentes desactualizadas
+
+
+
+ Mostrar ayuda
+
+
+ Abrir página de GitHub
+
+
+ Apoyar el proyecto
+
+
+ Preferencias
+
+
+ Abrir panel de navegación
+ Pausar o reanudar el bloqueo de anuncios
+ Actualizar los dominios bloqueados
+ Mostrar los dominios solicitados
+
+
+ Para obtener más información, consulta la ayuda.
+
+
diff --git a/app/src/main/res/values-es-rMX/strings_hosts.xml b/app/src/main/res/values-es-rMX/strings_hosts.xml
new file mode 100644
index 0000000..8419a3e
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_hosts.xml
@@ -0,0 +1,16 @@
+
+
+ Fuentes de los hosts
+
+ Lista del usuario
+ Hosts oficiales de AdAway
+ Host unidos de StevenBlack
+ Lista hosts bloqueados de Pete Lowe
+
+ no disponible
+
+ Añadir fuente
+ Editar fuente
+ URL (recurso https:// o file://):
+ La URL fuente del archivo hosts
+
diff --git a/app/src/main/res/values-es-rMX/strings_lists.xml b/app/src/main/res/values-es-rMX/strings_lists.xml
new file mode 100644
index 0000000..b46c2f5
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_lists.xml
@@ -0,0 +1,23 @@
+
+
+ Tus listas
+
+ Bloqueado
+ Permitido
+ Redireccionado
+
+ Filtrar hosts
+ Buscar nombre de host…
+ Activar fuentes
+
+ Agregar host a la lista negra
+ Agregar host a la lista blanca
+ Agregar redireccionamiento de host
+ Editar host de la lista negra
+ Editar host de la lista blanca
+ Editar redireccionamiento
+ Nombre de host:
+ La URL fuente del archivo hosts
+ (Se admiten comodines * y ?)
+ IP (IPv4 o IPv6):
+
diff --git a/app/src/main/res/values-es-rMX/strings_log.xml b/app/src/main/res/values-es-rMX/strings_log.xml
new file mode 100644
index 0000000..2693e35
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Orden alfabético
+ Orden por dominio de nivel superior
+
+ Redirigir dominio
+
diff --git a/app/src/main/res/values-es-rMX/strings_notification.xml b/app/src/main/res/values-es-rMX/strings_notification.xml
new file mode 100644
index 0000000..86ed4d5
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Actualizaciones
+ Notificaciones de actualizaciones nuevas
+ Actualización disponible
+ Hay archivos hosts más nuevos disponibles para descargar.
+ Hay una actualización de la app
+ Hay una nueva versión de AdAway disponible para descargar.
+
+ VPN
+ Notificaciones de ejecución de la VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es-rMX/strings_prefs_backup_restore.xml b/app/src/main/res/values-es-rMX/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..7f06adb
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Copias de seguridad y restablecimiento
+ Crear copias de seguridad
+ Crear una copia de seguridad de las reglas de bloqueo en el almacenamiento externo
+ Restablecer
+ Restablecer las reglas de bloqueo desde un archivo de copia de seguridad
+
diff --git a/app/src/main/res/values-es-rMX/strings_prefs_main.xml b/app/src/main/res/values-es-rMX/strings_prefs_main.xml
new file mode 100644
index 0000000..0e7006a
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferencias
+
+ Generales
+ Tema oscuro
+
+ Claro
+ Oscur
+ Predeterminado del sistema
+
+ Actualizaciones automaticas
+
+ Bloqueo de anuncios
+ Bloqueador de anuncios basado en acceso raíz
+ Bloqueador de anuncios basado en VPN
+ Habilitar compatibilidad con IPv6
+ Crear copias de seguridad y restablecer reglas de bloqueo
+
+ Depuración
+ Enviar informes de fallas
+ Enviar informes a Sentry (sentry.io)
+ No se admite en esta versión
+ Registro detallado
+ Debes reiniciar la app para aplicar esta opción
+
diff --git a/app/src/main/res/values-es-rMX/strings_prefs_root.xml b/app/src/main/res/values-es-rMX/strings_prefs_root.xml
new file mode 100644
index 0000000..cdd2d77
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_prefs_root.xml
@@ -0,0 +1,35 @@
+
+
+ Bloqueador de anuncios basado en acceso raíz
+
+ Instalación de hosts
+ Abrir archivo hosts
+ Archivo hosts de destino
+ Lee la ayuda antes de usar esta función
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Destino personalizado
+
+ Ubicación del destino personalizado
+ Ocultar el cuadro de diálogo de reinicio después de aplicar
+
+ Redirección
+ Define adónde se redireccionarán los hosts bloqueados
+ Redireccionamiento IPv4
+ Redireccionamiento IPv6
+
+ Servidor web local
+ El servidor web local escucha en las direcciones IP locales para responder las solicitudes a los hosts bloqueados. Esto puede evitar que las apps dejen de funcionar cuando se bloquean las conexiones.
+ Habilitar servidor web
+ Probar servidor web
+ Instalar certificado autofirmado
+ Instalacion manual de Certificado
+ Abrir ajustes de \"Seguridad\"
+ Comprobando…
+ Inactivo
+ Activo (certificado no instalado)
+ Activo (certificado instalado)
+ Reemplazar espacio en blanco de los anuncios por ícono de la app
+
diff --git a/app/src/main/res/values-es-rMX/strings_prefs_update.xml b/app/src/main/res/values-es-rMX/strings_prefs_update.xml
new file mode 100644
index 0000000..0bb1969
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Actualizaciones
+
+ Actualizaciones de la aplicación
+ Comprobar actualizaciones al iniciar
+ Buscar actualizaciones periódicamente
+ Incluir actualizaciones beta
+
+ Actualizaciones del archivo de hosts
+ Comprobar actualizaciones al iniciar
+ Buscar actualizaciones periódicamente
+ Sincronizar durante la actualización
+ Sincronizar solo en redes sin medición de uso
+
diff --git a/app/src/main/res/values-es-rMX/strings_prefs_vpn.xml b/app/src/main/res/values-es-rMX/strings_prefs_vpn.xml
new file mode 100644
index 0000000..30e3e18
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_prefs_vpn.xml
@@ -0,0 +1,22 @@
+
+
+ Bloqueador de anuncios basado en VPN
+
+ Habilitar en el inicio
+
+ Aplicaciones excluidas
+ Configura las aplicaciones que no deben usar la VPN (es decir, cuyas conexiones no se bloquearán).
+ Excluir aplicaciones del sistema
+
+ Ninguna
+ Todas, excepto navegadores
+ Todas
+
+ Excluir aplicaciones del usuario
+
+
+ Aplicaciones excluidas
+ Seleccionar todas
+ Anular selección de todas
+ Ícono de la aplicación
+
diff --git a/app/src/main/res/values-es-rMX/strings_support.xml b/app/src/main/res/values-es-rMX/strings_support.xml
new file mode 100644
index 0000000..62be33d
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Apoyo
+ Conviértete en patrocinador
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es-rMX/strings_update.xml b/app/src/main/res/values-es-rMX/strings_update.xml
new file mode 100644
index 0000000..ef4ce96
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_update.xml
@@ -0,0 +1,17 @@
+
+
+ Actualizacion de AdAway
+
+ Actualización disponible
+
+
+ Estás al día
+ Actualización disponible
+ Actualizando AdAway
+ Actualizar ahora
+ Ultimos cambios:
+ Lista de cambios:
+
+
+ Descargando la ultima version de AdAway
+
diff --git a/app/src/main/res/values-es-rMX/strings_welcome.xml b/app/src/main/res/values-es-rMX/strings_welcome.xml
new file mode 100644
index 0000000..eb0f61b
--- /dev/null
+++ b/app/src/main/res/values-es-rMX/strings_welcome.xml
@@ -0,0 +1,48 @@
+
+
+ Te damos la bienvenida
+
+ Te damos la bienvenida a AdAway
+ AdAway tiene dos métodos de bloqueo de anuncios. Elige el que prefieras:
+
+ Logotipo de acceso raíz
+ Bloqueo de anuncios\nbasado en acceso raíz
+ Es más rápido
+ Usa menos batería
+ Se necesita un dispositivo con acceso raíz
+
+ Logotipo de VPN
+ Bloqueo de anuncios\nbasado en VPN
+ Es más lento
+ Se ejecuta en segundo plano
+ Compatibilidad
+
+ Se necesita un dispositivo con acceso raíz
+ No se pudo encontrar el objeto binario su o no otorgaste permisos de superusuario a AdAway.\n\nEsto puede deberse a que no tienes acceso raíz al dispositivo. Para obtener más información sobre cómo obtener acceso raíz, consulta wiki.lineageos.org (en inglés) u otros sitios web sobre Android.
+
+ Ventaja
+ Desventaja
+
+
+ Se realizó la sincronización
+ Error de sincronización
+
+ Sincronizando
+ Sincronizado
+ AdAway usa fuentes en línea para descargar las redes de anuncios y bloquearlas. Puedes personalizar estas fuentes más adelante en la configuración.
+ Reintentar sincronización
+ No se pudo sincronizar : %1$s ¿Quieres volver a intentarlo?
+
+
+ Apoyo
+ ¡Apóyame!
+ Esta es una app gratuita y de código libre. La desarrollo en mi tiempo libre. Si la disfrutas, puedes demostrar tu apoyo:
+ Dona en PayPal
+ A nadie le gustan los errores.
+ Habilita la telemetría para enviarme informes de fallas
+
+
+ Atrás
+ Siguiente
+ Terminar
+
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
new file mode 100644
index 0000000..ac6a68d
--- /dev/null
+++ b/app/src/main/res/values-es/strings.xml
@@ -0,0 +1,266 @@
+
+
+
+ Salir
+ Cerrar
+ Sí
+ No
+ Añadir
+ Cancelar
+ Guardar
+ Ayuda
+
+
+ ¡Bienvenido!
+ AdAway es software libre y código abierto para bloquear anuncios. Descarga las direcciones de red publicitarias para bloquearlas en tu dispositivo.\n¿Quieres saber más? ¡Revisa la ayuda más abajo!
+ Mostrar más ayuda
+ Estado de la actualización
+ Todos los archivos hosts de las fuentes específicadas se descargan, se fusionan contsus propias listas y se instalan como un único archivo hosts en tu sistema.
+ Activar el bloqueo de anuncios
+ Desactivar el bloqueo de anuncios
+ Servidor web
+ Funcionando
+ Detenido
+ Inicia o detiene el servidor web en localhost para responder a las peticiones de nombres de host bloqueados.
+ Activar el servidor web
+ Desactivar el servidor web
+ VPN
+ Funcionando
+ Detenido
+ Iniciar o detener VPN para filtrar peticiones.
+ Activar la VPN
+ Desactivar la VPN
+
+
+ Modificar la entrada
+ Aplicar
+ Editar
+ Borrar
+
+
+ Importando…
+ Copia de seguridad importada correctamente desde el almacenamiento externo.
+ No se ha podido importar la copia de seguridad. ¿Es correcto su formato? Comprueba logcat para más detalles.
+ Exportando…
+ Copia de seguridad exportada correctamente al archivo \'%s\' en tu almacenamiento externo.
+ Error al exportar el archivo de la copia de seguridad \'%s\'.
+
+
+ El archivo hosts
+ El archivo hosts es un archivo del sistema que asigna los nombres de los hosts a las direcciones IP. Es un archivo de texto plano cuya configuración es manejada por AdAway. Estas son sus primeras líneas:
+ Cargando el contenido del archivo hosts…
+ Abrir el archivo hosts
+
+
+ Comprobando actualización
+ Comprobando la fuente %s para la actualización
+ Recuperando las fuentes
+ Descargando la fuente %s
+ Leyendo la fuente %s
+ Analizando la fuente %s
+ Sincronizando la base de datos de las reglas
+ Volviendo al archivo hosts predeterminado
+ Archivo de hosts predeterminado restaurado
+ Creando un archivo hosts estándar
+ Actualización disponible
+ Nuevos archivos hosts disponibles
+ No se encontró ninguna actualización de la fuente
+ No hay conexión a Internet
+ No hay ninguna conexión a Internet disponible
+ Fuentes no disponibles
+ ¡No hay fuentes de archivos hosts accesibles!
+ Acceso root denegado
+ Permitir el acceso root desde tu aplicación root
+ Algo salió mal
+ Comprueba el logcat para más detalles
+ Habilitado
+ Nuevos archivos hosts habilitados
+ Deshabilitado
+ Archivo hosts predeterminado instalado
+ Aplicar las últimas fuentes
+ Crear un nuevo archivo hosts
+ Copiando un nuevo archivo hosts
+ Comprobando la copia del archivo hosts
+ Archivo hosts actualizado correctamente
+ La configuración de la VPN se actualizó correctamente
+ Tu configuración ha cambiado. Necesitas aplicarla.
+ Aplicar
+ Aplicando la nueva configuración…
+ Error al aplicar la nueva configuración.
+
+
+ Falta el enlace simbólico al archivo hosts
+ El enlace simbólico a /system/etc/hosts no existe o es incorrecto. AdAway no funcionará si no apunta al archivo correcto.\n¿Quieres intentar crear un enlace simbólico?
+ Falta enlace simbólico
+ ¡No hay suficiente espacio en la partición!\nIntenta cambiar la ruta del archivo hosts a /data/data/hosts en las preferencias.
+ No hay suficiente espacio
+ No se pudo leer el archivo descargado.
+ El archivo privado falló
+ ¡Error al volver a montar la partición en modo lectura/escritura!
+ Error al volver a montar
+ Error al copiar el achivo hosts.
+ ¡La copia del archivo host ha fallado!
+ Ha fallado la copia
+ Fuentes de hosts aplicados
+ Aplicado correctamente
+ Se ha aplicado correctamente.\nPuede ser necesario reiniciar Android para que los cambios surtan efecto.\n\n¿Quieres reiniciar?\n(¡Para evitar una posible pérdida de datos, asegúrate que ninguna aplicación esté usando la memoria SD en este momento!)
+ El enlace simbólico fue creado correctamente.\nPuede ser necesario reiniciar Android para que los cambios surtan efecto.\n\n¿Quieres reiniciar?\n(¡Para evitar una posible pérdida de datos, asegúrate que ninguna aplicación esté usando la memoria SD en este momento!)
+ El enlace simbólico se creó correctamente
+ El enlace simbólico no pudo ser creado por Android.\nEste fallo principalmente se debe a una \'característica\' llamada S-ON en los teléfonos HTC!\n\nUna solución es arrancar el teléfono en modo de recuperación y crear el enlace simbólico allí con \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nSi esto no funciona busca en Internet S-OFF y tu modelo de teléfono.
+ No se pudo crear el enlace simbólico
+ Por favor lee la Ayuda para más información.
+ ¡Un proxy APN está configurado en tu Android!\nAdAway no funcionará de manera fiable cuando se encuentre en redes móviles como 3G. Puedes deshabilitar ese proxy al ir a su APN seleccionado (en la aplicación Configuración: Red e Internet -> Red móvil -> Avanzado -> Nombres de puntos de acceso) y borra el valor existente en el campo proxy.
+ ¡Proxy APN configurado!
+ La conexión a Internet no funciona.
+ Sin conexión
+ Descargando…
+ Aplicando…
+ Aplicando las listas negra y blanca
+ Analizando y fusionando los archivos hosts
+ Construyendo el archivo hosts
+ Aplicando el archivo hosts
+ Error al aplicar el nuevo archivo hosts.
+ ¡No se pudo aplicar el archivo hosts en tu sistema!\nIntenta cambiar la ruta del archivo hosts a /data/data/hosts en las preferencias.
+ Error al aplicar
+ Verifica tu aplicación de root para asegurarte de que se haya otorgado acceso root
+ Has vuelto al archivo de hosts predeterminado.\nPuede ser necesario reiniciar Android para que los cambios tengan efecto.\n\n¿Quieres reiniciar?\n(¡Para evitar una posible pérdida de datos, asegúrese que ninguna aplicación esté usando la memoria SD en este momento!)
+ Los cambios se revirtieron correctamente
+ No se pudo revertir el archivo hosts
+ No pudieron revertirse los cambios por razones desconocidas.
+ ¡Error al revertir!
+ ¡Ninguna de tus fuentes de archivos hosts habilitadas son accesibles! ¿Estás conectado adecuadamente a Internet?
+ Descarga fallida
+ Error al escribir el nuevo archivo hosts privado
+ No se pudo crear el archivo privado.
+ Error al crear el archivo privado
+ Has habilitado el modo sin sistema.\nPuede ser necesario reiniciar Android para que los cambios surtan efecto.\n\n¿Quieres reiniciar?\n(Para evitar una posible pérdida de datos, asegúrese que ninguna aplicación esté usando la memoria SD en este momento)
+ Habilitado correctamente
+ Has deshabilitado el modo sin sistema.\nPuede ser necesario reiniciar Android para que los cambios surtan efecto.\n\n¿Quieres reiniciar?\n(Para evitar una posible pérdida de datos, asegúrese que ninguna aplicación esté usando la memoria SD en este momento)
+ Deshabilitado correctamente
+ Error al habilitar el bloqueo de anuncios VPN.
+ Error al deshabilitar el bloqueo de anuncios VPN.
+ Habilitar el módulo Magisk de hosts
+ Habilita la función de hosts sin sistema del administrador Magisk. Desde la configuración, habilita la opción Hosts sin sistema y luego reinicia tu dispositivo.
+ Deshabilitar el módulo Magisk de hosts
+ Deshabilita la función de hosts sin sistema del administrador Magisk. En la lista de módulos, desinstala el módulo Hosts sin sistema y reinicia tu dispositivo.
+
+
+ Ingresar URL del archivo hosts:
+ ¡Este no es un nombre de host válido!
+ El nombre del host tiene un formato erróneo.
+ ¡Esta no es una IP válida!
+ Formato de IP incorrecto
+ ¡Nunca reiniciar y no mostrar esta pregunta la próxima vez!
+ Cargando…
+
+
+ Actualizar
+ Añadir
+ Ayuda
+ Importar la copia de seguridad
+ Exportar la copia de seguridad
+
+
+ S-ON/S-OFF
+ Preguntas frecuentes
+ Problemas
+
+
+ Adware
+ Aquí puedes encontrar adware instalado, aplicaciones malas que no pueden ser bloqueadas por AdAway. Estas aplicaciones utilizan, por ejemplo, notificaciones Airpush que aparecen incluso cuando la aplicación no se está ejecutando o incluso cambian el tono de llamada. La única contramedida disponible es desinstalar esas aplicaciones haciendo clic en los elementos de la lista.
+ Escaneando…
+ ¡No se ha encontrado Adware!
+
+
+ Bloqueador de anuncios
+ No hay ningún editor de texto instalado
+ No se pudo encontrar un editor de texto para abrir el archivo hosts. Puedes instalar Jota u otros editores de texto para solucionar esto.\n\n¿Quieres instalar Jota?
+ No hay ningún administrador de archivos instalado
+ No pudo encontrarse ningún administrador de archivos para abrir los archivos. Puedes instalar OI File Manager u otros administradores de archivos para solucionar esto.\n\n¿Quieres instalar OI File Manager?
+
+
+ Tcpdump
+ Tcpdump es una herramienta para monitorizar peticiones DNS y guardarlas en un archivo de registro. Puedes iniciarla en segundo plano, ejecutar aplicaciones que muestran anuncios, y luego analizar las peticiones DNS de ellas usando el archivo de registro. Los posibles servidores de anuncios utilizados podrán entonces ser añadidos a tu lista negra.
+ Deshabilitar monitorización
+ Habilitar monitorización
+ Mostrar resultados
+ Dominios cortos
+ Borrar registro
+ Añadir una entrada a la lista negra
+ Añadir una entrada a la lista blanca
+ Añadir una entrada a la lista de redirección
+
+ Editar valor de preferencia de texto
+ Abrir menú
+ Cerrar menú
+
+
+
+ Inicio
+ Fuentes de archivos hosts
+ Tus listas
+ Abrir el archivo hosts
+ Registro de peticiones DNS
+ Escanea en busca de adware
+ Preferencias
+ Ayuda
+
+
+
+
+ Peticiones DNS
+ Tus listas
+ Preferencias
+
+
+ Instalado hace %1$s
+ Actualizado para %1$s
+ Necesita actualización para %1$s
+ Última actualización hace %1$s
+ Estado de la actualización desconocido
+ Deshabilitado
+ pocos minutos
+
+ %d minuto
+ %d minutos
+ %d minutos
+
+
+ %d hora
+ %d horas
+ %d horas
+
+
+ %d día
+ %d días
+ %d días
+
+
+ %d mes
+ %d meses
+ %d meses
+
+
+
+ Host copiado al portapapeles
+
+
+ iniciando
+ activo
+ deteniendo
+ esperando a la red
+ reconectando
+ error al reconectar
+ pausado
+ detenido
+ Bloqueador de anuncios por VPN %1$s
+ Pausar
+ Reanudar
+
+
+ Permisos de AdAway
+ Permitir interactuar con AdAway
+ Enviar comandos a AdAway
+ Permite enviar comandos a AdAway como habilitar o deshabilitar el bloqueo de anuncios en todo el sistema
+
+
diff --git a/app/src/main/res/values-es/strings_app.xml b/app/src/main/res/values-es/strings_app.xml
new file mode 100644
index 0000000..d72ec0e
--- /dev/null
+++ b/app/src/main/res/values-es/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Bloqueador de anuncios de código abierto
+ Logo de AdAway
+
diff --git a/app/src/main/res/values-es/strings_errors.xml b/app/src/main/res/values-es/strings_errors.xml
new file mode 100644
index 0000000..ba0edac
--- /dev/null
+++ b/app/src/main/res/values-es/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Sin conexión a Internet
+ No se puede establecer una conexión a Internet. Verifica la conectividad de tu dispositivo.
+ Error al descargar la fuente del hosts
+ No se puede acceder a ninguna de las fuentes de los hosts habilitadas. Comprueba que está correctamente conectado a Internet.
+
+ Error al crear el archivo privado
+ No se puede crear un archivo privado para crear una nueva fuente de hosts. Comprueba el espacio libre disponible en tu dispositivo.
+ No hay suficiente espacio
+ No se pudo copiar el archivo hosts a la partición del sistema. Comprueba que el módulo Magisk systemless esté habilitado y luego reinícialo.
+ No se pudo instalar el nuevo archivo hosts
+ No se pudo copiar el archivo hosts en la partición /system. Por favor, comprueba que el módulo sin sistema Magisk está habilitado y luego reinícialo.
+ Error al revertir el archivo hosts
+ No se pudo restaurar la configuración predeterminada del archivo hosts.
+
+ Error al habilitar el bloqueo de anuncios VPN.
+ Verifica la configuración de tu VPN para autorizar el inicio de la aplicación VPN.
+ Error al deshabilitar el bloqueo de anuncios VPN.
+ Comprueba la configuración de tu VPN para desactivarla manualmente.
+
diff --git a/app/src/main/res/values-es/strings_home.xml b/app/src/main/res/values-es/strings_home.xml
new file mode 100644
index 0000000..23765ab
--- /dev/null
+++ b/app/src/main/res/values-es/strings_home.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ Bloqueado
+ Permitido
+ Redirigido a
+
+
+
+ %d fuente actualizada
+ %d fuentes actualizadas
+ %d fuentes actualizadas
+
+
+ %d fuente desactualizada
+ %d fuentes desactualizadas
+ %d fuentes desactualizadas
+
+ Buscar las actualizaciones de los hosts
+ Actualizar los hosts
+
+
+ Mostrar el registro de las peticiones DNS
+
+
+ Mostrar la ayuda\ny los consejos
+
+
+ Abrir la página de GitHub
+
+
+ Apoyar el proyecto
+
+
+ Proyecto en GitHub
+ Preferencias
+
+
+ Abrir el cajón de navegación
+ Pausar/reanudar el bloqueo de anuncios
+ Actualizar los dominios bloqueados
+ Mostrar los dominios solicitados
+
+
+ Por favor para más información, consulta la Ayuda.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings_hosts.xml b/app/src/main/res/values-es/strings_hosts.xml
new file mode 100644
index 0000000..43e681b
--- /dev/null
+++ b/app/src/main/res/values-es/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Fuentes de los archivos hosts
+
+ Lista del usuario
+ Hosts oficial de AdAway
+ Hosts unificados de StevenBlack
+ Lista de bloqueo de Pete Lowe
+
+ no disponible
+ %s hosts
+
+ Añadir una fuente
+ Editar una fuente
+ URL: (un recurso https:// o archivo file://)
+ La dirección URL del origen de los hosts
+
diff --git a/app/src/main/res/values-es/strings_lists.xml b/app/src/main/res/values-es/strings_lists.xml
new file mode 100644
index 0000000..2faac41
--- /dev/null
+++ b/app/src/main/res/values-es/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Tus listas
+ Añadir un host
+
+ Bloqueado
+ Permitido
+ Redirigido a
+
+ Filtrar los hosts
+ Buscar el nombre del host…
+ Alternar las fuentes
+
+ Añadir un host a la lista negra
+ Añadir un host a la lista blanca
+ Añadir una redirección al host
+ Editar el host de la lista negra
+ Editar el host de la lista blanca
+ Editar la redirección
+ Nombre del host:
+ La dirección url de origen de los hosts
+ (se permiten los caracteres comodín * y ?)
+ IP (IPv4 ó IPv6):
+
diff --git a/app/src/main/res/values-es/strings_log.xml b/app/src/main/res/values-es/strings_log.xml
new file mode 100644
index 0000000..664f6ee
--- /dev/null
+++ b/app/src/main/res/values-es/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Activar la grabación del registro
+ Presiona en grabar para iniciar el registro de las solicitudes, navegar por la Web o usar las aplicaciones, luego regresa o desliza el dedo para actualizar los registros.
+ \n\nLas solicitudes bloqueadas no se registrarán. Desactiva el bloqueo de anuncios primero si también deseas registrarlas.
+
+ Orden alfabético
+ Clasificación de los dominios de nivel superior
+
+ Redirigir un dominio
+
diff --git a/app/src/main/res/values-es/strings_notification.xml b/app/src/main/res/values-es/strings_notification.xml
new file mode 100644
index 0000000..bddfb3d
--- /dev/null
+++ b/app/src/main/res/values-es/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Actualizaciones
+ Nuevas notificaciones de actualización
+ Actualización de la fuente disponible
+ Nuevos archivos hosts disponibles para descargar.
+ Actualización de la aplicación disponible
+ Una nueva versión de AdAway está disponible para ser descargada.
+
+ VPN
+ Notificaciones de la VPN funcionando
+
diff --git a/app/src/main/res/values-es/strings_prefs_backup_restore.xml b/app/src/main/res/values-es/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..2c487e1
--- /dev/null
+++ b/app/src/main/res/values-es/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Respaldar y restaurar
+ Respaldar
+ Respalda tus reglas de bloqueo en el almacenamiento externo
+ Restaurar
+ Restaura tus reglas de bloqueo desde un archivo de respaldo
+
diff --git a/app/src/main/res/values-es/strings_prefs_main.xml b/app/src/main/res/values-es/strings_prefs_main.xml
new file mode 100644
index 0000000..6fee688
--- /dev/null
+++ b/app/src/main/res/values-es/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferencias
+
+ General
+ Tema oscuro
+
+ Claro
+ Oscuro
+ Predeterminado del sistema
+
+ Actualizaciones automáticas
+
+ Bloqueo de anuncios
+ Bloqueador de anuncios basado en root
+ Bloqueador de anuncios basado en VPN
+ Habilitar el soporte para IPv6
+ Copia de seguridad / restauración de las reglas de bloqueo
+
+ Depurar
+ Enviar los informes de los fallos
+ Informar a Sentry (sentry.io)
+ No es compatible con esta compilación
+ Registro detallado
+ Es necesario reiniciar la aplicación para aplicar los cambios
+
diff --git a/app/src/main/res/values-es/strings_prefs_root.xml b/app/src/main/res/values-es/strings_prefs_root.xml
new file mode 100644
index 0000000..394ad04
--- /dev/null
+++ b/app/src/main/res/values-es/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Bloqueador de anuncios basado en root
+
+ Instalación de hosts
+ Abrir el archivo hosts
+ Ruta del archivo hosts
+ Antes de cambiar esta configuración, lea la Ayuda sobre esta funcionalidad.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Ruta personalizada
+
+ Ruta personalizada
+ Ocultar cuadro de diálogo de reinicio
+
+ Redirección
+ Definir dónde redirigir los hosts bloqueados
+ Configurar redirección IPv4
+ Configurar redirección IPv6
+ Redirección no válida
+
+ Servidor web local
+ El servidor web local escucha las direcciones IP locales para responder a las peticiones de nombres de host bloqueadas. Puede ayudar con la congelación de aplicaciones en conexiones bloqueadas.
+ Habilitar servidor web
+ Probar servidor web
+ Instalar certificado autofirmado
+ Instalación manual del certificado
+ A partir de Android 11 (R), la aplicación ya no puede instalar automáticamente la autoridad de certificación (CA).\n\nVe a la configuración de \"Seguridad\", \"Cifrado y credenciales\" y luego a \"Instalar un certificado\". Desde allí, elige \"Certificado de CA\" y seleccione el archivo del certificado recién exportado.
+ Abrir configuración de \"Seguridad\"
+ Comprobando…
+ No se está ejecutando
+ En ejecución pero el certificado no está instalado
+ En ejecución y certificado instalado
+ Reemplazar espacio en blanco del anuncio por el icono de la aplicación
+
diff --git a/app/src/main/res/values-es/strings_prefs_update.xml b/app/src/main/res/values-es/strings_prefs_update.xml
new file mode 100644
index 0000000..f64db39
--- /dev/null
+++ b/app/src/main/res/values-es/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Actualizaciones
+ Las notificaciones están deshabilitadas
+ Las notificaciones de la aplicación no se mostrarán. Toca para habilitarlas.
+
+ Actualizaciones de la aplicación
+ Buscar actualizaciones al inicio
+ Buscar actualizaciones diariamente
+ Incluir las versiones beta
+
+ Actualizaciones de los hosts
+ Buscar actualizaciones al inicio
+ Buscar actualizaciones diariamente
+ Sincronizar durante la actualización
+ Sincronizar sólo en redes sin limitaciones
+
diff --git a/app/src/main/res/values-es/strings_prefs_vpn.xml b/app/src/main/res/values-es/strings_prefs_vpn.xml
new file mode 100644
index 0000000..5cdd196
--- /dev/null
+++ b/app/src/main/res/values-es/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Bloqueador de anuncios basado en VPN
+
+ Habilitar al inicio
+ Monitor de conexión
+ Comprobar periódicamente el estado de la red para reiniciar la VPN en caso de desconexión.
+
+ Aplicaciones excluidas
+ Configura qué aplicaciones no deben usar la VPN para que no se bloquee ninguna conexión.
+ Excluir aplicaciones del sistema
+
+ Ninguno
+ Todas excepto los navegadores
+ Todo
+
+ Excluir aplicaciones del usuario
+
+
+ Aplicaciones excluidas
+ Seleccionar todo
+ Deseleccionar todo
+ Icono de la aplicación
+
diff --git a/app/src/main/res/values-es/strings_source_edit.xml b/app/src/main/res/values-es/strings_source_edit.xml
new file mode 100644
index 0000000..1bb9751
--- /dev/null
+++ b/app/src/main/res/values-es/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Editar una fuente
+ Añadir una fuente
+
+ Etiqueta
+ La etiqueta es obligatoria
+ Tipo
+ Dirección url
+ Archivo
+ Ubicación
+ https://
+ La ubicación es necesaria
+ Presiona en Archivo para seleccionar el archivo de origen
+ Ubicación no válida
+ Formato de la lista
+ Bloquear
+ Permitir
+ Aplicar la redirección a los hosts
+ Permitir la redirección de los hosts puede causar problemas de seguridad. Utiliza esta configuración sólo en una fuente de confianza, ya que podría redirigir el tráfico sensible a cualquier servidor que desee.
+
diff --git a/app/src/main/res/values-es/strings_support.xml b/app/src/main/res/values-es/strings_support.xml
new file mode 100644
index 0000000..62be33d
--- /dev/null
+++ b/app/src/main/res/values-es/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Apoyo
+ Conviértete en patrocinador
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings_update.xml b/app/src/main/res/values-es/strings_update.xml
new file mode 100644
index 0000000..c89c041
--- /dev/null
+++ b/app/src/main/res/values-es/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Actualización de AdAway
+
+ ¡Actualización disponible!
+
+
+ Estás al día
+ Actualización disponible
+ Actualizando AdAway
+ Actualizar ahora
+ %1$s / %2$s
+ Últimos cambios
+ Registro de cambios
+ Apoyar el desarrollo
+ Donar
+ Patrocinador
+
+
+ Descargando la última versión de AdAway…
+
diff --git a/app/src/main/res/values-es/strings_welcome.xml b/app/src/main/res/values-es/strings_welcome.xml
new file mode 100644
index 0000000..35f5657
--- /dev/null
+++ b/app/src/main/res/values-es/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Bienvenido
+ Primer paso del asistente
+ Segundo paso del asistente
+ Último paso del asistente
+
+
+ ¡Bienvenido a AdAway!
+ AdAway proporciona dos métodos de bloqueo de anuncios. Escoge el que te gusta:
+
+ Logo root
+ Basado en root\nbloqueo de anuncios
+ Más rápido
+ Amigable para la batería
+ Root necesario
+
+ Logo VPN
+ Basado en VPN\nbloqueo de anuncios
+ Más lento
+ Ejecutar en segundo plano
+ Compatibilidad
+
+ Se requiere un Android rooteado
+ O bien no se pudo encontrar el binario o no permitió el permiso de root para AdAway.\n\nEsto puede suceder cuando tu dispositivo no está rooteado. Puedes encontrar información acerca de cómo hacer funcionar tu dispositivo en wiki.lineageos.org u otros sitios web de Android.
+
+ Pro
+ Con
+
+
+ Sincronización realizada
+ Error durante la sincronización
+
+ Sincronización
+ ¡Sincronizado!
+ AdAway descarga redes publicitarias para bloquear las fuentes en línea. Puedes personalizarlas más tarde en la configuración.
+ Reintentar la sincronización
+ Error al sincronizar: %1$s ¿Reintentar ahora?
+ Puedes enviar notificaciones para mostrar el estado y el control del bloqueo de anuncios, y para notificar sobre las actualizaciones disponibles de la aplicación (unas pocas al año). Habilítalas si quieres estar actualizado.
+
+
+ Apoyo
+ ¡Apóyame!
+ AdAway es una aplicación libre y de código abierto. Lo desarrollo en mi tiempo libre. Entonces, si lo disfrutas, no dudes en mostrar tu apoyo:
+ Donar en PayPal
+ ¿Te gustan los errores? A mí tampoco.
+ Habilitar la telemetría para enviarme los informes de fallos
+
+
+ Atrás
+ Siguiente
+ Finalizar
+
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
new file mode 100644
index 0000000..9b71133
--- /dev/null
+++ b/app/src/main/res/values-et/strings.xml
@@ -0,0 +1,166 @@
+
+
+
+ Välju
+ Sulge
+ Jah
+ Ei
+ Lisa
+ Tühista
+ Salvesta
+ Abi
+
+
+ Tere tulemast!
+ AdAway on vaba ja avatud lähtekoodiga tarkvara reklaamide blokeerimiseks. See hangib reklaamide võrguaadressid, et need sinu seadmes blokeerida.\nSoovid rohkem teada? Vaata abimaterjali allpool!
+ Kuva rohkem abi
+ Uuenduse olek
+ Kõik hosts-failid laetakse määratud allikatest, ühendatakse sinu loenditega ning paigaldatakse süsteemi ühe failina.
+ Luba reklaamiblokeering
+ Keela reklaamiblokeering
+ Veebiserver
+ Käimas
+ Peatatud
+ Luba veebiserver
+ Keela veebiserver
+ VPN
+ Käimas
+ Peatatud
+ Luba VPN
+ Keela VPN
+
+
+ Muuda üksust
+ Rakenda
+ Muuda
+ Kustuta
+
+
+ Importimine…
+ Eksportimine…
+
+ Hosts-fail
+ Ava hosts-fail
+
+ Uuendus saadaval
+ Uuemad hosts-failid saadaval
+ Ühendus puudub
+ Internetiühendus ei ole saadaval
+ Allikad pole saadaval
+ Juurkasutaja ligipääs keelatud
+ Võimalda juurkasutajale ligipääs oma juurkasutaja rakendusest
+ Midagi läks valesti
+ Rohkema teabe saamiseks vaata logcati
+ Lubatud
+ Uusimad hosts-failid kasutusel
+ Keelatud
+ Vaikimisi hosts-fail paigaldatud
+ Rakenda
+ Sümlink puudub
+ Pole piisavalt ruumi
+ Privaatse faili ebaõnnestumine
+ Taashaakimine ebaõnnestus
+ Hosts-faili kopeerimine ebaõnnestus!
+ Kopeerimine nurjus
+ Hosts-allikad rakendatud
+ Rakendamine edukas
+ Sümlingi loomine edukas
+ Sümlingi loomine nurjus
+ Palun loe abi rohkema teabe saamiseks.
+ APN-proksi määratud!
+ Ühendus puudub
+ Allalaadimine…
+ Rakendamine…
+ Musta ja valge loendi rakendamine
+ Hosts-failide töötlemine ja ühendamine
+ Hosts-faili koostamine
+ Hosts-faili rakendamine
+ Rakendamine nurjus
+ Palun kontrolli oma juurkasutaja haldusrakendust, et veenduda juurkasutaja ligipääsu andmises.
+ Taastamine edukas
+ Taastamine ebaõnnestus!
+ Allalaadimine nurjus
+ Lubamine edukas
+ Keelamine edukas
+
+ Sisesta URL hosts-faili:
+ See ei ole kehtiv aadress!
+ See ei ole kehtiv IP!
+ Sobimatult vormistatud IP
+ Laadimine…
+
+
+ Värskenda
+ Lisa
+ Abi
+ Impordi varundus
+ Ekspordi varundus
+
+
+ S-ON/S-OFF
+ KKK
+ Probleemid
+
+
+ Reklaamvara
+ Skanneerimine…
+ Reklaamvara ei leitud!
+
+
+ Reklaamide blokeerija
+ Tekstitöötlejaid pole paigaldatud
+ Ühtegi failihaldurit pole installitud
+
+ Tcpdump
+ Keela monitoorimine
+ Luba monitoorimine
+ Kuva tulemused
+ Sorteeri domeene
+ Tühjenda logi
+ Lisa üksus musta loendisse
+ Lisa üksus valgesse loendisse
+ Lisa üksus suunamisloendisse
+
+ Ava menüü
+ Sulge menüü
+
+
+
+ Kodu
+ Hosts-allikad
+ Sinu loendid
+ Ava hosts-fail
+ Logi DNS-taotlusi
+ Skanni reklaamvara
+ Eelistused
+ Abi
+
+
+
+
+ DNS-taotlused
+ Sinu loendid
+ Eelistused
+
+ %1$s on kaasaegne
+ %1$s vajab uuendust
+ Viimane uuendus %1$s tagasi
+ Uuenduste olek teadmata
+
+ %d minut
+ %d minutit
+
+
+ %d tund
+ %d tundi
+
+
+ %d päev
+ %d päeva
+
+
+ %d kuu
+ %d kuud
+
+
+
diff --git a/app/src/main/res/values-et/strings_app.xml b/app/src/main/res/values-et/strings_app.xml
new file mode 100644
index 0000000..7f00b07
--- /dev/null
+++ b/app/src/main/res/values-et/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Avatud lähtekoodiga reklaamiblokeerija
+ AdAway logo
+
diff --git a/app/src/main/res/values-et/strings_errors.xml b/app/src/main/res/values-et/strings_errors.xml
new file mode 100644
index 0000000..619fa3c
--- /dev/null
+++ b/app/src/main/res/values-et/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ Ühendus puudub
+ Pole piisavalt ruumi
+
\ No newline at end of file
diff --git a/app/src/main/res/values-et/strings_home.xml b/app/src/main/res/values-et/strings_home.xml
new file mode 100644
index 0000000..12534cc
--- /dev/null
+++ b/app/src/main/res/values-et/strings_home.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ Blokeeritud
+ Lubatud
+ Ümbersuunatud
+
+
+
+ %d kaasaegne allikas
+ %d kaasaegset allikat
+
+
+ %d aegunud allikas
+ %d aegunud allikat
+
+
+
+ Kuva abi
+
+
+ Ava GitHubi leht
+
+
+ Toeta projekti
+
+
+ Eelistused
+
+ Peata/jätka reklaamiblokeerimist
+
+ Palun loe abi rohkema teabe saamiseks.
+
+
diff --git a/app/src/main/res/values-et/strings_hosts.xml b/app/src/main/res/values-et/strings_hosts.xml
new file mode 100644
index 0000000..075d76d
--- /dev/null
+++ b/app/src/main/res/values-et/strings_hosts.xml
@@ -0,0 +1,11 @@
+
+
+ Hosts-allikad
+
+ pole saadaval
+
+ Lisa allikas
+ Muuda allikat
+ URL: (https:// või file:// ressurss)
+ Hosts-allika URL
+
diff --git a/app/src/main/res/values-et/strings_lists.xml b/app/src/main/res/values-et/strings_lists.xml
new file mode 100644
index 0000000..f3c93dd
--- /dev/null
+++ b/app/src/main/res/values-et/strings_lists.xml
@@ -0,0 +1,19 @@
+
+
+ Sinu loendid
+
+ Blokeeritud
+ Lubatud
+ Ümbersuunatud
+
+ Lisa host musta loendisse
+ Lisa host valgesse loendisse
+ Lisa hosti suunamine
+ Muuda musta loendi hosti
+ Muuda valge loendi hosti
+ Muuda suunamist
+ Hostinimi:
+ Hosts-allika URL
+ (Lubatud on jokkermärgid * ja ?)
+ IP (IPv4 või IPv6):
+
diff --git a/app/src/main/res/values-et/strings_log.xml b/app/src/main/res/values-et/strings_log.xml
new file mode 100644
index 0000000..9c2320b
--- /dev/null
+++ b/app/src/main/res/values-et/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Tähestikuline järjekord
+ TLD järjekord
+
+ Suuna domeen
+
diff --git a/app/src/main/res/values-et/strings_notification.xml b/app/src/main/res/values-et/strings_notification.xml
new file mode 100644
index 0000000..da7a0c2
--- /dev/null
+++ b/app/src/main/res/values-et/strings_notification.xml
@@ -0,0 +1,8 @@
+
+
+
+ Uuendused
+ Uuendus saadaval
+
+ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-et/strings_prefs_backup_restore.xml b/app/src/main/res/values-et/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-et/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-et/strings_prefs_main.xml b/app/src/main/res/values-et/strings_prefs_main.xml
new file mode 100644
index 0000000..ffef65d
--- /dev/null
+++ b/app/src/main/res/values-et/strings_prefs_main.xml
@@ -0,0 +1,11 @@
+
+
+ Eelistused
+ Luba tume teema
+ Luba IPv6
+
+ Silumine
+ Luba krahhiaruanded
+ Luba rakendusel saata vigu ja krahhiaruandeid Sentryle (sentry.io)
+ Logimise jõustumiseks on vajalik AdAway taaskäivitamine.
+
diff --git a/app/src/main/res/values-et/strings_prefs_root.xml b/app/src/main/res/values-et/strings_prefs_root.xml
new file mode 100644
index 0000000..e65fd18
--- /dev/null
+++ b/app/src/main/res/values-et/strings_prefs_root.xml
@@ -0,0 +1,21 @@
+
+
+ Ava hosts-fail
+ Hosts-faili asukoht
+ Enne muutmist loe abist selle funktsiooni kohta.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Muu asukoht
+
+ Muu asukoht
+ Taaskäivitamise dialoog peidetud
+
+ Suunamine
+ Suunamise IPv4
+ Suunamise IPv6
+
+ Kohalik veebiserver
+ Luba veebiserver
+
diff --git a/app/src/main/res/values-et/strings_prefs_update.xml b/app/src/main/res/values-et/strings_prefs_update.xml
new file mode 100644
index 0000000..1be2389
--- /dev/null
+++ b/app/src/main/res/values-et/strings_prefs_update.xml
@@ -0,0 +1,6 @@
+
+
+ Uuendused
+ Uuenduste kontroll iga päev
+ Uuenduste kontroll iga päev
+
diff --git a/app/src/main/res/values-et/strings_prefs_vpn.xml b/app/src/main/res/values-et/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-et/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-et/strings_support.xml b/app/src/main/res/values-et/strings_support.xml
new file mode 100644
index 0000000..41f6a1a
--- /dev/null
+++ b/app/src/main/res/values-et/strings_support.xml
@@ -0,0 +1,4 @@
+
+
+ Tugi
+
\ No newline at end of file
diff --git a/app/src/main/res/values-et/strings_update.xml b/app/src/main/res/values-et/strings_update.xml
new file mode 100644
index 0000000..558612d
--- /dev/null
+++ b/app/src/main/res/values-et/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ Uuendus saadaval
+
diff --git a/app/src/main/res/values-et/strings_welcome.xml b/app/src/main/res/values-et/strings_welcome.xml
new file mode 100644
index 0000000..9b3b997
--- /dev/null
+++ b/app/src/main/res/values-et/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Tere tulemast
+ Viisardi esimene samm
+ Viisardi teine samm
+ Viisardi viimane samm
+
+
+ Tere tulemast AdAwaysse!
+ AdAway pakub kahte reklaamiblokeerimise viisi. Vali endale meeldiv:
+
+ Juurkasutaja logo
+ Juurkasutaja-põhine\nreklaamiblokeerimine
+ Kiirem
+ Akusõbralik
+ Juurkasutaja nõutud
+
+ VPNi logo
+ VPNi-põhine\nreklaamiblokeerimine
+ Aeglasem
+ Töötab taustal
+ Ühilduvus
+
+ Vajalik juurkasutaja toega Android
+ Täitmisfaili \"su\" ei leitud või sa ei lubanud AdAwayle juurkasutaja õigusi.\n\nSee võib juhtuda, kui su seade ei oma juurkasutaja õigusi. Oma seadme juurkasutaja õiguste avamise kohta saad rohkem lugeda wiki.lineageos.org või teistelt Androidi veebilehtedelt.
+
+ Eelis
+ Puudus
+
+
+ Sünkroonimine lõpetatud
+ Sünkroonimisel esines tõrge
+
+ Sünkroonimine
+ Sünkroonitud!
+ AdAway laadib võrguallikatest reklaamivõrgustike nimed, et neid blokeerida. Neid saab hiljem seadetes kohandada.
+ Proovi uuesti sünkroonida
+ Sünkroonimine ebaõnnestus: %1$s Proovid uuesti?
+
+
+ Tugi
+ Toeta mind!
+ See on tasuta ja avatud lähtekoodiga rakendus. Ma arendan seda oma vabast ajast. Seega, kui see sulle meeldib võid vabalt oma toetust näidata:
+ Anneta PayPalis
+ Kas sulle meeldivad vead? Mulle ka mitte.
+ Luba krahhiaruannete saatmiseks telemeetria
+
+
+ Tagasi
+ Edasi
+ Lõpeta
+
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
new file mode 100644
index 0000000..10c8eab
--- /dev/null
+++ b/app/src/main/res/values-eu/strings.xml
@@ -0,0 +1,236 @@
+
+
+
+ Irten
+ Itxi
+ Bai
+ Ez
+ Gehitu
+ Ezeztatu
+ Gorde
+ Laguntza
+
+
+ Ongi etorri!
+ AdAway iragarkiak blokeatzeko diseinatuta dagoen librea eta kode irekikoa den softwarea da. Iragarkien sareko helbideak lortzen ditu zure gailuan blokeatzeko.\nGehiago jakin nahi duzu? Begiratu beheko laguntza.
+ Erakutsi laguntza gehiago
+ Eguneratu egoera
+ Zehaztutako iturburuetako hostalari agiri guztiak jeitsi eta batu dira zeure zerrendarekin eta hostalari agiri bat bezala ezarri dira zure sisteman.
+ Gaitu iragarki-blokeatzailea
+ Ezgaitu iragarki-blokeatzailea
+ Web zerbitzaria
+ Exekutatzen
+ Geldituta
+ Hasi edo gelditu web zerbitzua localhost-en, blokeatutako ostalari-izenen eskaerei erantzuteko.
+ Gaitu web zerbitzaria
+ Desgaitu web zerbitzaria
+ VPN
+ Abian
+ Geldirik
+ Hasi edo gelditu VPN-a eskaerak filtratzen.
+ VPN-a gaitu
+ VPN-a desgaitu
+
+
+ Editatu Sarrera
+ Aplikatu
+ Editatu
+ Ezabatu
+
+
+ Inportatzen…
+ Kanpoko biltegitik segurtasun-kopia ondo inportatuta.
+ Ezin izan da segurtasun-kopia inportatu. Zuzena al da formatua? Egiaztatu logcat-a xehetasunak ikusteko.
+ Esportatzen…
+
+ Hostalari fitxategia
+ Hosts fitxategia IP helbideei host izenak ematen dizkien sistemaren fitxategi bat da. Formaturik gabeko testu-fitxategia da, AdAwayk konfiguratzen du. Hauek dira bere lehenengo lerroak:
+ Hostalari fitxategiaren edukia kargatzen…
+ Ireki hostalari fitxategia
+
+
+ Eguneraketak egiaztatzen
+ Iturriak berreskuratzen
+ %s iturria deskargatzen
+ Lehenetsitako host fitxategira itzultzen
+ Lehenetsitako host fitxategia zaharberritua
+ Hostalari agiri estandarra sortzen
+ eguneratze-jakinarazpen berriak
+ Hostalari agiri berrienak eskuragarri
+ Ez da iturriaren eguneraketarik aurkitu
+ Ez dago Internet elkarketarik
+ Ez dago Internet elkarketa eskuragarririk
+ Ez dago iturburu eskuragarririk
+ Ez dago hostalari ituruburu erdietsigarririk!
+ Root atzipena ukatua
+ Onartu root atzipena root aplikaziotik
+ Arazo bat izan da
+ Begiratu logcat xehetasun gehiagorako
+ Gaituta
+ Hostalari agiri berrienak gaituta
+ Ezgaituta
+ Hostalari fitxategi lehenetsia instalatuta
+ Azken iturriak aplikatu
+ Hosts fitxategi berri bat sortzen
+ Hosts fitxategi berri bat kopiatzen
+ Hosts fitxategiaren kopia egiaztatzen
+ Hosts fitxategia eguneratuta
+ VPN konfigurazioa eguneratuta
+ Zure konfigurazioa aldatuta. Aplikatzea behar da.
+ Aplikatu
+ Konfigurazio berria aplikatzen…
+ Errorea konfigurazio berria aplikatzen.
+
+
+ Hosts fitxategiaren helmugarako symlink-a falta da
+ Zure xedetiko Symlotura /system/etc/hosts-ra ez dago edo okerra da! AdAway-k ez du lan egingo ez bada agiri zuzenera zuzentzen.\n\nNahi duzu symlotura bat sortzen saiatzea?
+ Symlotura ez dago
+ Ez dago nahikoa toki partizioan!\nSaiatu xede hostalari agiria aldatzen hobespenetan: /data/data/hosts.
+ Ez dago nahikoa toki
+ Jeitsitako agiria ezin da irakurri.
+ Agiri pribatu hutsegitea
+ Hutsegitea partizioa idaz/irakurtzekoa bezala ber-muntatzerakoan.
+ Ber-muntatze hutsegitea
+ Errorea hosts fitxategia kopiatzen
+ Hostalari agiri kopiatze hutsegitea!
+ Kopiatze hutsegitea
+ Hostalari iturriak aplikatu dira
+ Ongi ezarri dira
+ Symlotura ongi sortu da
+ Symlotura sortze hutsegitea
+ Mesedez irakurri Laguntza argibide gehiagorako.
+ APN proxya ezarrita!
+ Interneteko elkarketa ez dabil.
+ Ez dago Elkarketarik
+ Jeisten…
+ Ezartzen…
+ Zerrenda-beltza eta Zerrenda-zuria ezartzen
+ Hostalari agiriak aztertzen eta batzen
+ Hostalari agiria eraikitzen
+ Hostalari agiria ezartzen
+ Errorea hosts fitxategi berria aplikatzen.
+ Hutsegitea hostalari agiria zure sisteman ezartzerakoan!\nSaiatu xede hostalari agiria aldatzen hobespenetan: /data/data/hosts.
+ Ezartze hutsegitea
+ Egiaztatu zure root kudeaketa aplikazioa root sarbidea eman dela ziurtatzeko.
+ Ongi leheneratu da
+ Ezin da hosts fitxategia irauli
+ Leheneratze hutsegitea zergaiti ezezagunengaitik.
+ Leheneratze hutsegitea!
+ Zure gaitutako hostalari iturburu bat ere ez da erdiesgarria! Zihur zaude Intenetera egoki elkartuta zaudela?
+ Jeisketa hutsegitea
+ Errorea hosts fitxategi pribatu berria idazten
+ Agiri pribatua ezin da sortu.
+ Agiri pribatu sortze hutsegitea
+ Ongi gaitu da
+ Ongi ezgaitu da
+ Errorea VPN ad blocking gaitzen.
+ Errorea VPN ad blocking desgaitzen.
+ Hosts Magisk modulua gaitzen.
+ Hosts Magisk modulua desgaitzen.
+
+ Sartu hostalari agirirako URL-a:
+ Hau ez da baliozko hostalari-izen bat!
+ Hostalari-izena ezegoki heuskarrituta
+ Hau ez da baliozko IP bat!
+ IP-a ezegoki heuskarrituta
+ Inoiz eguneratu eta ez erakutsi galdera hau hurrengoan!
+ Gertatzen…
+
+
+ Berritu
+ Gehitu
+ Laguntza
+ Segurtasun-kopia inportatu
+ Segurtasun-kopia esportatu
+
+
+ S-ON/S-OFF
+ SEG
+ Arazoak
+
+
+ Adware
+ Eskaneatzen…
+ Ez da Adwarerik topatu!
+
+
+ Iragarki blokeatzailea
+ Ez dago idazki editatzailerik ezarrita
+ Ez da idazki editatzailerik aurkitu hostalari agiriak irekitzeko. Jota edo beste idazki editatzaile bat ezarri dezakezu hau kudeatzeko.\n\nNahi duzu Jota ezartzea?
+ Ez dago agiri kudeatzailerik ezarrita
+ Ez da agiri kudeatzailerik aurkitu hostalari agiriak irekitzeko. OI File Manager edo beste agiri kudeatzaile bat ezarri dezakezu hau kudeatzeko.\n\nNahi duzu OI File Manager ezartzea?
+
+
+ Tcpdump
+ Tcpdump DNS eskabideak monitorizatzeko eta hauek ohar agiri baten gordetzeko tresna bat da. Barrenean hasi dezakezu, iragarkiak erakusten dituzten aplikazioak ekin, eta ondoren DNS eskabideak aztertu ohar agiria erabiliz. Orduan ahalezko iragarki zerbitzaria zerrenda-beltzera gehitu daiteke.
+ Ezgaitu kontrola
+ Gaitu kontrola
+ Erakutsi emaitzak
+ Ordenatu domeinuak
+ Garbitu egunkaria
+ Gehitu sarrera zerrenda-beltzara
+ Gehitu sarrera zerrenda-zurira
+ Gehitu sarrera birbidalketa zerrendara
+
+ Testuaren lehentasun-balioa editatu
+ Ireki menua
+ Itxi menua
+
+
+
+ Hasiera
+ Hostalari iturburuak
+ Zure zerrendak
+ Ireki hostalari agiria
+ Erregistratu DNS eskaerak
+ Bilatu adware
+ Hobespenak
+ Laguntza
+
+
+
+
+ DNS eskaerak
+ Zure zerrendak
+ Hobespenak
+
+
+ Orain dela %1$sinstalatuta
+ %1$sarte eguneratuta
+ %1$srako eguneraketa behar du
+ Azken eguneraketa duela %1$s
+ Eguneratze egoera ezezaguna
+
+ minutu %d
+ %d minutu
+
+
+ ordu %d
+ %d ordu
+
+
+ egun %d
+ %d egun
+
+
+ hilabete %d
+ %d hilabete
+
+
+
+ abiarazten
+ aktibo
+ gelditzen
+ sareari itxaron
+ birkonektatzen
+ birkonekzio errorea
+ etenda
+ geldituta
+ Ad-blocker VPN %1$s
+ Eten
+ Ukitu berrekiteko
+
+
+ Gaitu eta desgaitu sitemako ad-blocking-a
+
+
diff --git a/app/src/main/res/values-eu/strings_app.xml b/app/src/main/res/values-eu/strings_app.xml
new file mode 100644
index 0000000..48ae0e1
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Kode libreko iragarki-blokeatzailea
+ AdAway-ren logoa
+
diff --git a/app/src/main/res/values-eu/strings_errors.xml b/app/src/main/res/values-eu/strings_errors.xml
new file mode 100644
index 0000000..b5aaa5a
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Ez dago Internet elkarketarik
+ Ezin izan da internetera konektatu. Egiaztatu zure gailuaren konexioa.
+ Huts egin du ostalari-iturburuak deskargatzeak
+ Gaitutako ostalari-iturburu bat ere ez dago eskuragarri! Egiaztatu intenetera konektatuta zaudela.
+
+ Ezin izan da fitxategi pribatua sortu
+ Ezin izan da ostalari-iturburu berria idazteko fitxategi pribatua sortu. Egiaztatu gailuak nahikoa toki duela.
+ Ez dago nahikoa toki
+ Ezin izan da ostalari-fitxategia sistemaren partiziora kopiatu. Egiaztatu Magisk-en \'systemless\' modulua gaituta dagoela eta berrabiarazi gailua.
+ Huts egin du ostalari-fitxategi berria instalatzeak
+ Ezin izan da ostalari-fitxategia /system partiziora kopiatu. Egiaztatu Magisk-en \'systemless\' modulua gaituta dagoela eta berrabiarazi gailua.
+ Huts egin du ostalari-fitxategia leheneratzeak
+ Ezin izan dira lehenetsitako ostalari-fitxategiko ezarpenak leheneratu.
+
+ Errorea VPN ad blocking gaitzen.
+ Egiaztatu zure VPN ezarpenak aplikazioaren VPNa baimentzeko, abiarazi dadin.
+ Errorea VPN ad blocking desgaitzen.
+ Egiaztatu zure VPNaren ezarpenak eskuz ezgaitzeko.
+
diff --git a/app/src/main/res/values-eu/strings_home.xml b/app/src/main/res/values-eu/strings_home.xml
new file mode 100644
index 0000000..0102714
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ blokeatuta
+ baimenduta
+ birhelbideratzea
+
+
+
+ %d up-to-date source
+ %d iturri egunean
+
+
+ %d outdated source
+ %diturri zaharkitu
+
+ Egiaztatu ostalarien eguneraketak
+ Eguneratu ostalariak
+
+
+ Erakutsi DNS eskariak
+
+
+ Erakutsi Laguntza\neta aholkuak
+
+
+ Ireki GitHub-en orria
+
+
+ Lagundu proiektua
+
+
+ GitHub proiektua
+ Hobespenak
+
+
+ Ireki nabigazio-tiradera
+ Eten/Jarraitu irakargien blokeoa
+ Eguneratu blokeatutako domeinuak
+ Erakutsi eskatutako domeinuak
+
+
+ Irakurri Laguntza argibide gehiagorako.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eu/strings_hosts.xml b/app/src/main/res/values-eu/strings_hosts.xml
new file mode 100644
index 0000000..79833fe
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Ostalari-iturburuak
+
+ Erabiltzailearen zerrenda
+ AdAway-ren ostalari ofizialak
+ StevenBlack-en ostalari bateratuak
+ Pete Lowe-ren ostalarien blokeo-zerrenda
+
+ ez dago eskuragarri
+ %s ostalari
+
+ Gehitu iturria
+ Editatu iturria
+ URL: (https:// edo file:// baliabidea)
+ Ostalari-iturburuaren URLa
+
diff --git a/app/src/main/res/values-eu/strings_lists.xml b/app/src/main/res/values-eu/strings_lists.xml
new file mode 100644
index 0000000..68df7ae
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Zure zerrendak
+ Gehitu ostalaria
+
+ blokeatuta
+ baimenduta
+ birbideratze
+
+ Iragazi ostalariak
+ ostalari-izena bilatu…
+ Txandakatu iturriak
+
+ Gehitu ostalaria zerrenda-beltzara
+ Gehitu ostalaria zerrenda-zurira
+ Gehitu birbideratze ostalaria
+ Editatu zerrenda-beltzeko ostalaria
+ Editatu zerrenda-zuriko ostalaria
+ Editatu birbideratzea
+ Ostalari-izena:
+ Ostalari-iturburuaren URLa
+ (* eta ? bezalako komodin karaktereak onartzen dira)
+ IP-a (IPv4 edo IPv6):
+
diff --git a/app/src/main/res/values-eu/strings_log.xml b/app/src/main/res/values-eu/strings_log.xml
new file mode 100644
index 0000000..acea860
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Ordenatu alfabetikoki
+ Ordenatu gai-mailako domeinukoki
+
+ Birbideratu domeinua
+
diff --git a/app/src/main/res/values-eu/strings_notification.xml b/app/src/main/res/values-eu/strings_notification.xml
new file mode 100644
index 0000000..26e3400
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_notification.xml
@@ -0,0 +1,9 @@
+
+
+
+ Eguneraketak
+ eguneratze-jakinarazpen berriak
+ eguneratze-jakinarazpen berriak
+
+ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eu/strings_prefs_backup_restore.xml b/app/src/main/res/values-eu/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..13b6233
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Babes-kopia eta berreskuratzea
+ Babes-kopia
+ Egin blokeo-arauen babes-kopia kanpo biltegiratzean
+ Berreskuratu
+ Berreskuratu zure blokeo-arauak babes-kopia fitxategitik
+
diff --git a/app/src/main/res/values-eu/strings_prefs_main.xml b/app/src/main/res/values-eu/strings_prefs_main.xml
new file mode 100644
index 0000000..de0d9ef
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_prefs_main.xml
@@ -0,0 +1,6 @@
+
+
+ Hobespenak
+
+ Garbiketa
+
diff --git a/app/src/main/res/values-eu/strings_prefs_root.xml b/app/src/main/res/values-eu/strings_prefs_root.xml
new file mode 100644
index 0000000..b4951ea
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_prefs_root.xml
@@ -0,0 +1,21 @@
+
+
+ Ireki hostalari agiria
+ Xede hostalari agiria
+ Ezarpen hau aldatu aurretik, irakurri bere eginkizunari buruz Laguntza.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Norbere xedea
+
+ Norbere xedea
+ Ezkutatu berrabiarazte elkarrizketa
+
+ Berzuzenketa
+ IPv4 birbideratzea
+ IPv6 birbideratzea
+
+ Tokiko Web-zerbitzaria
+ Gaitu web-zerbitzaria
+
diff --git a/app/src/main/res/values-eu/strings_prefs_update.xml b/app/src/main/res/values-eu/strings_prefs_update.xml
new file mode 100644
index 0000000..0cee9e8
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Eguneraketak
+ Jakinarazpenak ezgaituta daude
+ Ez dira aplikazioaren jakinarazpenak erakutsiko. Sakatu gaitzeko.
+
+ Aplikazioaren eguneraketak
+ Egiaztatu eguneraketak abiatzean
+ Egiaztatu eguneraketak egunero
+ Barne hartu beta bertsioak
+
+ Ostalarien eguneraketak
+ Egiaztatu eguneraketak abiatzean
+ Egiaztatu eguneraketak egunero
+ Sinkronizatu eguneratzean
+ Sinkronizatu nehurtu gabeko sareetan soilik
+
diff --git a/app/src/main/res/values-eu/strings_prefs_vpn.xml b/app/src/main/res/values-eu/strings_prefs_vpn.xml
new file mode 100644
index 0000000..95172ed
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPNan oinarritutako iragarkien blokeoa
+
+ Gaitu sistemaren abioan
+ Egin konexioaren segimendua
+ Egiaztatu noizean behin sarearen egoera VPNa deskonektatzen denean berrabiarazteko.
+
+ Alde batera utzitako aplikazioak
+ Ezarri zein aplikaziok ez lukeen VPNa erabili beharko konexioa ez blokeatzeko.
+ Alde batera utzitako sistemaren aplikazioak
+
+ Bat ere ez
+ Guztia nabigatzaileak izan ezik
+ Guztia
+
+ Utzi alde batera erabiltzailearen aplikazioak
+
+
+ Alde batera utzitako aplikazioak
+ Hautatu guztia
+ Utzi guztia hautatzeari
+ Aplikazioaren ikonoa
+
diff --git a/app/src/main/res/values-eu/strings_source_edit.xml b/app/src/main/res/values-eu/strings_source_edit.xml
new file mode 100644
index 0000000..6d9c413
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Editatu iturria
+ Gehitu iturria
+
+ Etiketa
+ Etiketa beharrezkoa da
+ Mota
+ URLa
+ Fitxategia
+ Kokalekua
+ https://
+ Kokalekua beharrezkoa da
+ Sakatu Fitxategia iturburuaren fitxategia hautatzeko
+ Kokalekua ez da baliozkoa
+ Zerrendaren formatua
+ Blokeatu
+ Baimendu
+ Aplikatu birbideratutako ostalariak
+ Ostalarien birbideratzea baimentzeak segurtasun arazoak sor ditzake. Fidagarritzat dituzun iturburuekin soilik erabili ezarpen hau, trafiko sentsitiboa nahi duen zerbitzarira bidal lezakelako.
+
diff --git a/app/src/main/res/values-eu/strings_support.xml b/app/src/main/res/values-eu/strings_support.xml
new file mode 100644
index 0000000..5d32053
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Lagundu
+ Babestu aplikazioa
+
diff --git a/app/src/main/res/values-eu/strings_update.xml b/app/src/main/res/values-eu/strings_update.xml
new file mode 100644
index 0000000..00325f7
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway eguneratzea
+
+ Eguneraketa eskuragarri!
+
+
+ Egunean zaude
+ Eguneraketa eskuragarri
+ AdAway eguneratzen
+ Eguneratu orain
+ %1$s / %2$s
+ Azken aldaketak
+ Aldaketa-oharra
+ Babestu garapena
+ Dirulaguntza
+ Babesa
+
+
+ AdAway-ren azken bertsioa deskargatzen…
+
diff --git a/app/src/main/res/values-eu/strings_welcome.xml b/app/src/main/res/values-eu/strings_welcome.xml
new file mode 100644
index 0000000..4b30b9d
--- /dev/null
+++ b/app/src/main/res/values-eu/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Ongi etorri
+ Laguntzailearen lehen pausua
+ Laguntzailearen bigarren pausua
+ Laguntzailearen azken pausua
+
+
+ Ongi etorri AdAway-ra!
+ AdAwayk iragarkiak blokeatzeko bi metodo eskaintzen ditu. Aukeratu gustuko duzuna:
+
+ Erro logoa
+ Erroan oinarritutako blokeoa.
+ Azkarragoa
+ Bateriarekiko lagungarria
+ Erroa beharrezkoa da
+
+ VPN logoa
+ VPNan oinarritutako blokeoa
+ Motelagoa
+ Atzeko planoan exekutatu
+ Bateragarritasuna
+
+ Beharrezkoa Android errotua
+ Ezin izan da su binarioa aurkitu edo ez duzu root baimendu AdAway-rako.\n\nGailuaren fitxategi sistemako erroa atzitu ezin denean gerta daiteke. wiki.lineageos.org edo Android-i buruzko beste webgune batzuetan aurki dezakezu gailuaren fitxategi sistemako erroa nola atzitu.
+
+ Alde
+ Kontra
+
+
+ Sinkroinazioa eginda
+ Errorea sinkronizatze-prozesuan
+
+ Sinkronizatzen
+ Sinkronizatuta!
+ AdAway-k blokeatzeko iragarki-sareak deskargatzen ditu. Ezarpenetan moldatu ditzazkezu beranduago.
+ Saiatu berriro sinkronizatzen
+ Huts egin du %1$s sinkronizatzeak. Berriro saiatu?
+ Jakinarazpenak bidal ditzakezu iragarkien eta kontrolaren blokeo-egoera erakusteko, bai eta eskuragarri dagoen aplikazioaren eguneratzearen berri emateko ere (gutxi batzuk urtean). Gaitu egunean egon nahi baduzu.
+
+
+ Lagundu
+ Lagundu nazazu!
+ AdAway doako aplikazioa da, kode irekikoa, eta aisialdian garatzen dudana. Gogoko baduzu, erakutsi zure babesa:
+ Lagundu PayPal-en bidez
+ Zorriak gogoko al dituzu? Nik ere ez.
+ Gaitu telemetria erroreen erregistroak bidaltzeko
+
+
+ Atzera
+ Hurrengoa
+ Amaitu
+
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
new file mode 100644
index 0000000..fb0d377
--- /dev/null
+++ b/app/src/main/res/values-fa/strings.xml
@@ -0,0 +1,139 @@
+
+
+
+ خروج
+ بستن
+ بله
+ خیر
+ اضافه کردن
+ لغو
+ ذخیره
+ راهنما
+
+
+ خوش آمدید!
+ AdAway یک نرم افزار مجانی و اوپن سورس است که به منظور بلاک کردن تبلیغات طراحی شده است.این برنامه آدرس های شبکه تبلیغات را واکشی میکند تا آنها را بر روی دستگاه شما بلاک کند./میخواهید بیشتر بدانید؟راهنمای زیر را بخوانید!
+ راهنمایی بیشتر
+ وضعیت به روزرسانی
+ تمامی فایلهای hosts جدید از منابع تعریف شده دریافت شدند و با لیستی که از قبل موجود بوده است در یک قالب یک فایل hosts واحد یکی شدند.
+ فعالسازی توقف تبلیغات
+ غیر فعال کردن برنامه ضد تبلیغات
+ وب سرور
+ در حال اجرا
+ متوقف شده
+ فعالسازی وب سرور
+ غیرفعالسازی وب سرور
+
+ ویرایش ورودی
+ اعمال تغییرات
+ ویرایش
+ حذف کردن
+
+
+ بارگیری…
+ فایل پشتیبانی با موفقیت از کارت حافظه شما بارگذاری شد.
+ بارگذاری فایل پشتبانی با شکست مواجه شد. فرمت فایل درست است؟ فایل ثبت رویدادها رو چک کنید.
+ در حال خروجی گرفتن…
+
+ فایل هاست ها
+ فایل هاست ها یک فایل سیستمی است که نام هاست ها را به آی پی آدرس ها مرتبط میکند.این یک فایل متنی ساده است که توسط AdAway تنظیم شده است.در اینجا چند خط ابتدایی آن را داریم:
+ بارگذاری محتوای فایل هاست…
+ بازکردن هاست فایل
+
+ ایجاد فایل hosts استاندارد
+ به روز رسانی موجود میباشد
+ فایلهای hosts جدیدتری موجود میباشد
+ اتصال اینترنت برقرار نیست
+ اتصال اینترنت موجود نیست
+ منابع موجود نیستند
+ منابع hosts ها در درسترس نیستند!
+ دسترسی روت رد شد
+ از طریق برنامه روت خود به این برنامه دسترسی روت دهید
+ مشکلی پیش آمد
+ فایل ثبت رویدادها رو چک کنید
+ فعال
+ فایل های hosts جدید فعال شد
+ غیر فعال
+ هاست فایلهای پیشفرض نصب شدند
+ اعمال تغییرات
+ پیوند نمادین از هدف شما به /system/etc/hosts وجود ندارد و یا درست نمیباشد! اگر مسیر فایل به درستی تنظیم نشده باشد برنامه AdAway به درستی کار نخواهد کرد.\n\nآیا مایلید که یک پیوند نمادین ایجاد نمایید؟
+ پیوند نمادین موجود نیست
+ فضای کافی در پارتیشن موجود نیست!\nسعی نمایید مسیر فایل hosts را در تنظیمات به /data/data/hosts تغییر دهید.
+ فضای کافی موجود نیست
+ فایل دانلود شده قابل خواندن نیست.
+ فایل خصوصی ایراد دارد
+ بارگیری پارتیشن برای خواندن/نوشتن ناموفق بود!
+ بارگیری ناموفق
+ کپی کردن فایل hosts ناموفق!
+ کپی ناموفق
+ اعمال موفقیت آمیز
+ ایجاد موفق پیوند نمادین
+ ایجاد ناموفق پیوند نمادین
+ لطفا برای اطلاعات بیشتر به راهنما مراجعه نمایید.
+ تنظیم پروکسی APN!
+ اتصال اینترنت بر قرار نیست
+ اتصال برقرار نیست
+ در حال دریافت…
+ در حال اعمال…
+ اعمال لیست سیاه و لیست سفید
+ تجزیه و ادغام فایل های hosts
+ ساختن فایل hosts
+ اعمال فایل hosts
+ اعمال ناموفق فایل hosts بر روی سیستم!\n\nمسیر فایل hosts را در تنظیمات /data/data/hosts تغییر دهید.
+ اعمال ناموفق تغییرات
+ لطفا برنامه مدیریت روت خود رو بررسی کنیدتا از دسترسی داشتن این برنامه به روت مطمئن شید.
+ بازنشانی موفق آمیز
+ بازنشانی نا موفق به دلایل ناشناخته.
+ بازنشانی ناموفق
+ هیچ یک از منابع hosts های انتخابی شما در دسترس نیستند! آیا از اتصال دستگاه خود به اینترنت مطمئن هستید؟
+ خطا در دریافت
+ فایل های خصوصی نمیتواند ایجاد گردد.
+ ایجاد ناموفق فایل خصوصی
+ فعال کردن با موفقیت انجام شد
+ غیر فعال کردن با موفقیت انجام شد
+
+ تارنما به فایل hosts وارد نمایید
+ این یک hostname مجاز نیست
+ hostname با فرمت نادرست
+ این یک آی پی مجاز نیست!
+ آی پی با فرمت نادرست
+ در حال بارگیری…
+
+
+ تازه کردن
+ اضافه کردن
+ راهنما
+ بارگذاری فایل پشتیبان
+ خروجی گرفتن فایل پشتیبانی
+
+
+ S-روشن/S-خاموش
+ پرسش و پاسخ
+ مشکلات
+
+
+ Adware
+
+ مسدودگر تبلیغات
+ هیچ ویرایشگر متنی نصب نیست
+ هیچ برنامه ویرایشگر متنی برای باز کردن این فایل یافت نشد. شما میتوانید از برنامه Jota یا دیگر برنامه های ویرایشگر متن برای حل این مشکل استفاده نمایید.\n\nآیا مایل به نصب برنامه Jota هستید؟
+ هیچ برنامه مدیریت فایلی نصب نیست
+ هیچ برنامه مدیریت فایلی برای باز کردن این فایل یافت نشد. شما میتوانید از برنامه OI File Manager یا برنامه های مشابه برای حل این مشکل استفاده نمایید.\n\nآیا مایل به نصب برنامه OI File Manager هستید؟
+
+ Tcpdump یک ابزاری برای نظارت بر روی درخواست های دی ان اس بوده و آنها در فایل گزارشات ذخیره مینماید. شما میتوانید آن را در پس زمینه اجرا نمایید، برنامه ای که تبلیغات را نشان میدهد را اجرا نموده و بعدا در فایل گزارشات درخواست های دی ان اس را بررسی و آنالیز نمایید. سرور تبلیغات مشکوک را میتوانید در لیست سیاه اضافه نمایید.
+ نمایش نتایج
+ پاک کردن رویدادها
+
+
+ Home
+ منابع Hosts
+ Your lists
+ باز کردن فایل hosts
+ Log DNS requests
+ Scan for adware
+ تنظیمات
+ راهنما
+
+ تنظیمات
+
+
diff --git a/app/src/main/res/values-fa/strings_app.xml b/app/src/main/res/values-fa/strings_app.xml
new file mode 100644
index 0000000..710ffc4
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ مسدود کننده تبلیغات AdAway
+ مسدود کننده تبلیغات منبع باز
+ نماد برنامه AdAway
+
diff --git a/app/src/main/res/values-fa/strings_errors.xml b/app/src/main/res/values-fa/strings_errors.xml
new file mode 100644
index 0000000..b4040d0
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ اتصال اینترنت برقرار نیست
+ امکان برقراری اتصال به اینترنت وجود ندارد لطفا اتصال گوشی خود را بررسی کنید
+ منبع hosts دانلود نشد
+ هیچ یک از منابع hosts فعال شما در دسترس نیست لطفا بررسی کنید که به درستی به اینترنت متصل هستید
+
+ فایل خصوصی ساخته نشد
+ امکان ساخت یک فایل خصوصی برای ساخت یک منبع hosts جدید وجود ندارد لطفا فضای خالی موجود در گوشی خود را بررسی کنید
+ فضای کافی موجود نیست
+ امکان کپی فایل hosts به پارتیشن سیستم شما وجود ندارد لطفا بررسی کنید که ماژول بدون سیستم Magisk فعال است و سپس گوشی خود را خاموش و روشن کنید
+ فایل hosts جدید نصب نشد
+ کپی فایل hosts در پارتیشن سیستم / امکان پذیر نیست لطفا بررسی کنید که ماژول بدون سیستم Magisk فعال است و سپس گوشی خود را خاموش و روشن کنید
+ فایل hosts بازگردانده نشد
+ نمی توان پیکربندی فایل hosts پیشفرض را بازیابی کرد
+
+ مسدود کننده تبلیغات VPN فعال نشد
+ لطفا تنظیمات VPN خود را بررسی کنید تا برنامه VPN شروع به کار کند
+ مسدود کننده تبلیغات VPN غیرفعال نشد
+ لطفا تنظیمات VPN خود را بررسی کنید تا آن را به صورت دستی غیرفعال کنید
+
diff --git a/app/src/main/res/values-fa/strings_home.xml b/app/src/main/res/values-fa/strings_home.xml
new file mode 100644
index 0000000..fb64ef3
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ مسدود شده
+ اجازه داده شده
+ منتقل شده
+
+
+
+ %d up-to-date source
+ %d منابع به روز
+
+
+ %d outdated source
+ %d منابع قدیمی
+
+ بررسی به روز رسانی hosts
+ به روز رسانی hosts
+
+
+ نمایش گزارش درخواست DNS
+
+
+ نمایش راهنما و نکات
+
+
+ باز کردن صفحه گیت هاب
+
+
+ حمایت از پروژه
+
+
+ پروژه گیت هاب
+ تنظیمات
+
+
+ کشوی ناوبری را باز کنید
+ توقف / ادامه مسدودسازی تبلیغات
+ به روز رسانی دامنه های مسدود شده
+ نمایش دامنه های درخواستی
+
+
+ لطفا برای اطلاعات بیشتر به راهنما مراجعه نمایید.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fa/strings_hosts.xml b/app/src/main/res/values-fa/strings_hosts.xml
new file mode 100644
index 0000000..2433bc1
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ منابع Hosts
+
+ فهرست کاربر
+ hosts رسمی AdAway
+ hosts یکپارچه StevenBlack
+ hosts لیست مسدود کردن Pete Lowe
+
+ موجود نیست:
+ %s hosts
+
+ افزودن منبع
+ ویرایش منبع
+ لینک : (a https:// or file:// resource)
+ لینک منبع hosts
+
diff --git a/app/src/main/res/values-fa/strings_lists.xml b/app/src/main/res/values-fa/strings_lists.xml
new file mode 100644
index 0000000..826ec07
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ لیست های شما
+ افزودن host
+
+ مسدود شده
+ اجازه داده شده
+ منتقل شده
+
+ فیلتر hosts
+ جستجوی نام host …
+ تغییر وضعیت منابع
+
+ افزودن host به لیست سیاه
+ افزودن host به لیست سفید
+ افزودن تغییر مسیر host
+ ویرایش host موجود در لیست سیاه
+ ویرایش host موجود در لیست سفید
+ ویرایش و تغییر مسیر
+ نام Host :
+ لینک منبع hosts
+ (کاراکترهای جامع * و ؟ مجاز هستند)
+ IP (IPv4 یا IPv6) :
+
diff --git a/app/src/main/res/values-fa/strings_log.xml b/app/src/main/res/values-fa/strings_log.xml
new file mode 100644
index 0000000..2597eea
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ تغییر وضعیت ثبت گزارش
+ برای شروع گزارش درخواست ها درباره مرور وب یا استفاده از برنامه ها دکمه ثبت را فشار دهید سپس به عقب برگردید یا برای تازه سازی صفحه گزارش ها انگشت خود را به پایین بکشید
+ درخواست های مسدود شده گزارش نمی شوند اگر میخواهید آن ها را نیز وارد کنید ابتدا مسدود کردن تبلیغات را غیرفعال کنید.
+
+ مرتبسازی بر اساس حروف الفبا
+ مرتب سازی دامنه سطح بالا
+
+ تغییر مسیر دامنه
+
diff --git a/app/src/main/res/values-fa/strings_notification.xml b/app/src/main/res/values-fa/strings_notification.xml
new file mode 100644
index 0000000..e8e081b
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ به روز رسانی ها
+ اطلاعیه های به روز رسانی جدید
+ به روز رسانی منبع موجود است
+ فایل های hosts جدید برای دانلود در دسترس هستند
+ به روز رسانی برنامه موجود است
+ نسخه جدید AdAway برای دانلود در دسترس است
+
+ VPN
+ اعلان در حال اجرای VPN
+
diff --git a/app/src/main/res/values-fa/strings_prefs_backup_restore.xml b/app/src/main/res/values-fa/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..e2e9fea
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ پشتیبان گیری و بازگردانی
+ پشتیبان گیری
+ از قوانین مسدود سازی در حافظه خارجی یک نسخه پشتیبان گیری شده تهیه کنید
+ بازگردانی
+ قوانین مسدود سازی را از طریق فایل پشتیبان گیری شده بازیابی کنید
+
diff --git a/app/src/main/res/values-fa/strings_prefs_main.xml b/app/src/main/res/values-fa/strings_prefs_main.xml
new file mode 100644
index 0000000..05040a3
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ تنظیمات
+
+ عمومی
+ پس زمینه سیاه
+
+ سفید
+ سیاه
+ پیش فرض سیستم
+
+ به روز رسانی های خودکار
+
+ مسدود کردن تبلیغات
+ مسدود کننده تبلیغات مبتنی بر روت
+ مسدود کننده تبلیغات مبتنی بر VPN
+ فعال کردن پشتیبانی از IPv6
+ پشتیبان گیری / بازیابی از قوانین مسدود کردن
+
+ عیب یابی
+ ارسال گزارش خرابی
+ گزارش به نگهبان (sentry.io)
+ در این نسخه پشتیبانی نمی شود
+ ثبت نام کامل
+ برای انجام به خاموش و روشن کردن گوشی نیاز است
+
diff --git a/app/src/main/res/values-fa/strings_prefs_root.xml b/app/src/main/res/values-fa/strings_prefs_root.xml
new file mode 100644
index 0000000..401d152
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ مسدود کننده تبلیغات مبتنی بر روت
+
+ نصب Hosts
+ باز کردن فایل hosts
+ هدف فایل hosts
+ قبل از استفاده از این ویژگی راهنما را بخوانید
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ هدف سفارشی
+
+ مکان هدف سفارشی
+ مخفی کردن گفتگوی خاموش و روشن کردن گوشی بعد از انجام
+
+ تغییر مسیر
+ تعیین کنید که hosts مسدود شده به کجا منتقل شود
+ پیکربندی تغییر مسیر IPv4
+ پیکربندی تغییر مسیر IPv6
+ تغییر مسیر نامعتبر است
+
+ وب سرور محلی
+ وب سرور محلی به آدرس های IP محلی گوش می دهد تا به درخواست های نام host مسدود شده پاسخ دهد و ممکن است به مسدود شدن برنامه در اتصال مسدود شده کمک کند
+ فعال کردن وب سرور
+ آزمایش وب سرور
+ نصب گواهی امضا شده شما
+ نصب دستی گواهی
+ از اندروید 11 (R) به بعد برنامه دیگر نمی تواند به طور خودکار مرجع گواهی (CA) را نصب کند برای برطرف شدن این مشکل به تنظیمات گوشی / \"امنیت\" / \"رمزگذاری و اعتبار\" و سپس \"نصب گواهی\" بروید از آنجا \" گواهی CA\" را انتخاب کنید و فایل گواهی صادر شده جدید را انتخاب کنید
+ باز کردن تنظیمات امنیت
+ در حال بررسی ...
+ در حال اجرا نیست
+ در حال اجرا است اما گواهی نصب نشده
+ در حال اجرا است و گواهی نصب شده
+ فضای خالی تبلیغات را با نماد برنامه جایگزین کنید
+
diff --git a/app/src/main/res/values-fa/strings_prefs_update.xml b/app/src/main/res/values-fa/strings_prefs_update.xml
new file mode 100644
index 0000000..1b06ff9
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ به روز رسانی ها
+ اعلان ها غیرفعال هستند
+ اعلان های برنامه نمایش داده نمیشوند برای فعال کردن آن ها فشار دهید
+
+ به روز رسانی های برنامه
+ بررسی به روز رسانی در استارت آپ
+ به صورت دوره ای به روز رسانی را بررسی کنید
+ شامل نسخه های بتا
+
+ به روز رسانی های Hosts
+ بررسی به روز رسانی در استارت آپ
+ به صورت دوره ای به روز رسانی را بررسی کنید
+ همگام سازی در به روز رسانی
+ فقط در شبکه بدون اندازه گیری همگام سازی شود
+
diff --git a/app/src/main/res/values-fa/strings_prefs_vpn.xml b/app/src/main/res/values-fa/strings_prefs_vpn.xml
new file mode 100644
index 0000000..bf23f35
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ مسدود کننده تبلیغات مبتنی بر VPN
+
+ فعال کردن در هنگام استارت آپ
+ نظارت بر اتصال
+ به طور دوره ای وضعیت شبکه را بررسی کنید تا VPN در صورت قطع اتصال دوباره متصل شود
+
+ برنامه های کاربردی استثنا شده
+ پیکربندی کنید که کدام برنامه ها نباید از VPN استفاده کنند تا هیچ اتصالی مسدود نشود
+ استثنا کردن برنامه های سیستمی
+
+ هیچ کدام
+ همه به جز مرورگر ها
+ همه
+
+ استثنا کردن برنامه های کاربر
+
+
+ برنامه های کاربردی استثنا شده
+ انتخاب همه
+ لغو انتخاب همه
+ نماد برنامه
+
diff --git a/app/src/main/res/values-fa/strings_source_edit.xml b/app/src/main/res/values-fa/strings_source_edit.xml
new file mode 100644
index 0000000..becf539
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ ویرایش منبع
+ افزودن منبع
+
+ برچسب
+ برچسب لازم است
+ بنویسید
+ لینک
+ فایل
+ مکان
+ https://
+ مکان لازم است
+ برای انتخاب فایل منبع فایل را فشار دهید
+ مکان نامعتبر است
+ قالب فهرست
+ مسدود کردن
+ اجازه
+ انجام انتقال hosts
+ اجازه دادن به hosts منتقل شده ممکن است باعث ایجاد مشکلات امنیتی شود از این تنظیمات فقط در یک منبع قابل اعتماد استفاده کنید زیرا می تواند برخی از ترافیک حساس را به هر سروری که می خواهد هدایت کند
+
diff --git a/app/src/main/res/values-fa/strings_support.xml b/app/src/main/res/values-fa/strings_support.xml
new file mode 100644
index 0000000..c9066eb
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ حمایت
+ یک حامی مالی شوید
+
diff --git a/app/src/main/res/values-fa/strings_update.xml b/app/src/main/res/values-fa/strings_update.xml
new file mode 100644
index 0000000..40f45de
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_update.xml
@@ -0,0 +1,22 @@
+
+
+ به روز رسانی AdAway
+
+ به روز رسانی موجود است
+
+
+ شما به روز هستید
+ به روز رسانی موجود است
+ در حال به روز رسانی AdAway
+ اکنون به روز رسانی کنید
+ %1$s / %2$s
+ کامل
+ آخرین تغییرات
+ گزارش تغییرات
+ پشتیبانی از توسعه
+ حمایت مالی
+ حامی مالی
+
+
+ در حال دانلود آخرین نسخه AdAway …
+
diff --git a/app/src/main/res/values-fa/strings_welcome.xml b/app/src/main/res/values-fa/strings_welcome.xml
new file mode 100644
index 0000000..1ded78e
--- /dev/null
+++ b/app/src/main/res/values-fa/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ خوش آمدید
+ اولین قدم جادوگر
+ گام دوم جادوگر
+ آخرین مرحله جادوگر
+
+
+ به برنامه AdAway مسدود کننده تبلیغات خوش آمدید
+ برنامه AdAway به دو روش ویژگی مسدود کردن تبلیغات را ارائه می دهد لطفا یکی از روش ها را انتخاب کنید :
+
+ نماد روت
+ مسدود کردن تبلیغات با استفاده از روت
+ سریع تر
+ سازگار با باتری
+ نیاز به روت دارد
+
+ نماد vpn
+ مسدود کردن تبلیغات مبتنی بر VPN
+ کند تر
+ اجرا در پس زمینه
+ سازگاری
+
+ به گوشی اندروید روت شده نیاز دارد
+ دسترسی روت به AdAway داده نشده یا باینری پیدا نشد این اتفاق ممکن است زمانی اتفاق بیفتد که دستگاه شما روت نشده باشد شما می توانید اطلاعات مورد نظر در مورد روش روت کردن گوشی خود را در سایت wiki.lineageos.org یا سایر سایت های اندروید پیدا کنید
+
+ حرفه ای
+ همراه هم
+
+
+ همگام سازی انجام شد
+ خطا در هنگام همگام سازی
+
+ در حال همگام سازی
+ همگام سازی شد
+ AdAway شبکه های تبلیغاتی را دانلود کرده و آن ها را مسدود خواهد کرد شما می توانید آن ها را در تنظیمات برنامه سفارشی کنید
+ دوباره همگام سازی کنید
+ همگام سازی انجام نشد : %1$s آیا دوباره امتحان میکنید؟
+ این گزینه اعلان هایی را برای نمایش وضعیت مسدود کردن تبلیغات و مدیریت و اطلاع رسانی در مورد به روز رسانی برنامه (تا چندین سال) ارسال کند اگر میخواهید به روز بمانید آنها را فعال کنید
+
+
+ حمایت
+ حمایت از من
+ AdAway یک برنامه رایگان و منبع باز است که در اوقات فراغت خود توسعه می دهم اگر از آن لذت می برید با کمک مالی از طریق پی پال از توسعه برنامه حمایت کنید
+ کمک مالی در پی پال
+ آیا شما اشکالات را دوست دارید؟ من هم نه
+ فعال کردن ارسال گزارش های خرابی تله متری
+
+
+ بازگشت
+ بعدی
+ پایان
+
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
new file mode 100644
index 0000000..0761ee4
--- /dev/null
+++ b/app/src/main/res/values-fi/strings.xml
@@ -0,0 +1,182 @@
+
+
+
+ Sulje
+ Sulje
+ Kyllä
+ Ei
+ Lisää
+ Peruuta
+ Tallenna
+ Ohjeet
+
+
+ Tervetuloa!
+ Näytä enemmän ohjeita
+ Päivityksen tila
+ Kaikki hosts-tiedostot määritellyistä lähteistä ovat ladattu, yhdistyi luetteloihin ja asenettu yhdeksi hosts-tiedostoksi.
+ Web-palvelin
+ Käynnissä
+ Pysäytetty
+ Ota web-palvelin käyttöön
+ Ota web-palvelin pois käytöstä
+ VPN
+ Käynnissä
+ Pysäytetty
+ Aktivoi VPN
+
+ Muokka merkintää
+ Hyväksy
+ Muokkaa
+ Poista
+
+
+ Tuodaan…
+ Varmuuskopion tuominen epäonnistui. Onko formaatti oikea? Tarkista logcat saadaksesi lisätietoja.
+ Viedään…
+
+ Hosts-tiedosto
+ Avaa hosts-tiedosto
+
+
+ Tarkistetaan päivityksiä
+ Noudetaan lähteitä
+ Ladataan lähdettä %s
+ Luetaan lähdettä %s
+ Käsitellään lähdettä %s
+ Luodaan vakio-hosts-tiedostoa
+ Päivitys saatavilla
+ Uudempia hosts-tiedostoja on saatavilla
+ Ei verkkoyhteyttä
+ Verkkoyhtyettä ei ole saatavilla
+ Lähteet eivät ole käytettävissä
+ Hosts-lähteet eivät ole tavoitettavissa!
+
+ Jokin meni pieleen
+ Käytössä
+ Uusimmat hosts-tiedostot ovat käytössä
+ Pois käytöstä
+ Hyväksy
+ Symbolista linkkiä kohteeseen /system/etc/hosts ei ole olemassa tai se on virheellinen! AdAway ei toimi, jos se ei osoita oikeaan tiedostoon.\n\nHaluatko yrittää luoda symbolisen linkin?
+ Symbolinen linkki puuttuu
+ Ei tarpeeksi tilaa osiossa!\nYritä muuttaa asetuksissa hosts-tiedoston kohde /data/data/hosts -vaihtoehdoksi.
+ Ei tarpeeksi tilaa
+ Ladattua tiedostoa ei voitu lukea.
+ Yksityinen tiedosto hylätty
+ Osion kokoaminen luku/kirjoitus-tilaksi epäonnistui!
+ Uudelleenkokoaminen epäonnistui
+ Hosts-tiedoston kopiointi epäonnistui!
+ Kopiointi epäonnistui
+ Soveltaminen onnistui
+ Symbolisen linkin luominen onnistui
+ Symbolisen linkin luominen epäonnistui
+ Lue ohjeet, jos haluat lisätietoja.
+ APN-välityspalvelin on asetettu!
+ Yhteys internettiin ei toimi.
+ Ei yhteyttä
+ Ladataan…
+ Hyväksytään…
+ Mustan listan ja valkoisen listan soveltaminen
+ Hosts-tiedostojen jäsentäminen ja yhdistäminen
+ Luodaan hosts-tiedostoa
+ Hyväksytään hosts-tiedosto
+ Hosts-tiedoston soveltaminen epäonnistui!\nYritä muuttaa hosts-tiedoston kohde /data/data/hosts -vaihtoehdoksi.
+ Soveltaminen epäonnistui
+ Palauttaminen onnistui
+ Palauttaminen epäonnistui tuntemattomasta syystä.
+ Palauttaminen epäonnistui!
+ Mikään käytössä olevista hosts-lähteistä ei ole tavoitettavissa! Onko sinulla verkkoyhteys?
+ Lataus epäonnistui
+ Yksityistä tiedostoa ei voi luoda.
+ Yksityisen tiedoston luominen epäonnistui
+ Käyttöönotto onnistui
+ Kytketty pois päältä
+
+ Kirjoita hosts-tiedoston URL-osoite:
+ Tämä ei ole kelvollinen host-nimi!
+ Väärin muotoiltu host-nimi
+ Tämä ei ole kelvollinen IP-osoite!
+ Väärin muotoiltu iP
+ Ladataan…
+
+
+ Päivitä
+ Lisää
+ Ohjeet
+ Tuo varmuuskopio
+ Vie varmuuskopio
+
+
+ S-ON/S-OFF
+ FAQ
+ Ongelmat
+
+
+ Mainosohjelma
+ Tarkistetaan…
+ Adaware-sovellusta ei löydy!
+
+
+ Mainosten esto
+ Ei tekstieditoria asennettuna
+ Ei voitu avata hosts-tiedostoa, koska tekstieditoria ei löytynyt. Voit asentaa Jota tai toisen tekstieditorin.\n\nHaluatko asentaa Jota-sovelluksen?
+ Tiedostohallintasovellusta ei ole asennettu
+ Ei voitu avata tiedostoja, koska tiedostonhallintasovellusta ei löytynyt. Voit asentaa OI File Manager:n tai muun tiedostohallintasovelluksen.\n\nHaluatko asentaa OI File Manager:n?
+
+
+ Tcpdump
+ Tcpdump on työkalu, jolla voit seurata DNS-pyyntöjä ja tallentaa ne lokitiedostoon. Voit käynnistää sen taustalla, käyttää sovelluksia, jotka näyttävät mainoksia ja sen jälkeen analysoida DNS-pyyntöjä käyttäen lokitiedostoa. Mahdolliset mainospalvelimet voidaan sitten lisätä mustalle listalle.
+ Salli tarkkailu
+ Näytä tulokset
+ Tyhjennä loki
+ Avaa valikko
+ Sulje valikko
+
+
+
+ Koti
+ Hosts-lähteet
+ Luettelosi
+ Avaa hosts-tiedosto
+ Log DNS requests
+ Scan for adware
+ Asetukset
+ Ohjeet
+
+
+
+
+ DNS-pyynnöt
+ Luettelosi
+ Asetukset
+
+ muutama minuutti
+
+ %d minuutti
+ %d minuuttia
+
+
+ %d tunti
+ %d tuntia
+
+
+ %d päivä
+ %d päivää
+
+
+ %d kuukausi
+ %d kuukautta
+
+
+
+ käynnistetään
+ aktiivinen
+ pysäytetään
+ odotetaan verkkoa
+ uudelleen yhdistetään
+ tauotettu
+ pysäytetty
+ Tauko
+ Paina jatkaakseen
+
+
diff --git a/app/src/main/res/values-fi/strings_app.xml b/app/src/main/res/values-fi/strings_app.xml
new file mode 100644
index 0000000..1910e53
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Avoimen lähdekoodin mainosesto
+ AdAway-logo
+
diff --git a/app/src/main/res/values-fi/strings_errors.xml b/app/src/main/res/values-fi/strings_errors.xml
new file mode 100644
index 0000000..59fabfb
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_errors.xml
@@ -0,0 +1,9 @@
+
+
+
+ Ei verkkoyhteyttä
+ Isäntätiedoston lähteen lataaminen epäonnistui
+ Ei tarpeeksi tilaa
+ Uuden hosts-tiedoston asentaminen epäonnistui
+ Host-tiedoston palauttaminen epäonnistui
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fi/strings_home.xml b/app/src/main/res/values-fi/strings_home.xml
new file mode 100644
index 0000000..3f8db40
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Estetty
+ Sallittu
+ Ohjattu
+
+
+
+ %d up-to-date source
+ %d lähdettä ajan tasalla
+
+
+ %d outdated source
+ %d vanhentunutta lähdettä
+
+ Tarkista hosts-päivitykset
+ Päivitä hosts-tiedot
+
+
+ Näytä DNS-pyyntöhistoria
+
+
+ Näytä ohje\nja vinkit
+
+
+ Avaa GitHub-sivu
+
+
+ Tue projektia
+
+
+ GitHub-projekti
+ Asetukset
+
+
+ Avaa siirtymisvalikko
+ Keskeytä/palauta mainosesto
+ Päivitä estetyt verkkotunnukset
+ Näytä pyydetyt verkkotunnukset
+
+
+ Lue lisätietoja ohjeista.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fi/strings_hosts.xml b/app/src/main/res/values-fi/strings_hosts.xml
new file mode 100644
index 0000000..140b1fd
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts-lähteet
+
+ Käyttäjälista
+ AdAwayn virallinen hosts-lähde
+ StevenBlackin yhtenäinen hosts-lähde
+ Pete Lowen estolista hosts-lähde
+
+ ei saatavilla
+ %shostia
+
+ Lisää lähde
+ Muokkaa lähdettä
+ Osoite: (https:// tai file:// -resurssi)
+ Isännän lähde URL
+
diff --git a/app/src/main/res/values-fi/strings_lists.xml b/app/src/main/res/values-fi/strings_lists.xml
new file mode 100644
index 0000000..fc30bfd
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_lists.xml
@@ -0,0 +1,10 @@
+
+
+ Luettelosi
+
+ Torjuttu
+ Hyväksytty
+ host-nimi:
+ Isännän lähde URL
+ IP (IPv4 tai IPv6):
+
diff --git a/app/src/main/res/values-fi/strings_log.xml b/app/src/main/res/values-fi/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-fi/strings_notification.xml b/app/src/main/res/values-fi/strings_notification.xml
new file mode 100644
index 0000000..3d31d31
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Päivitykset
+ Uusi päivitys ilmoitukset
+ Päivitys saatavilla
+ Uudet hosts-tiedostot ovat ladattavissa
+ Sovelluspäivitys saatavilla
+ Uusi AdAway versio ladattavissa
+
+ VPN
+ VPN käynnissä ilmoitukset
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fi/strings_prefs_backup_restore.xml b/app/src/main/res/values-fi/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..ccdd4a6
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_prefs_backup_restore.xml
@@ -0,0 +1,6 @@
+
+
+ Varmuuskopioi & palauta
+ Varmuuskopioi
+ Palauta
+
diff --git a/app/src/main/res/values-fi/strings_prefs_main.xml b/app/src/main/res/values-fi/strings_prefs_main.xml
new file mode 100644
index 0000000..1fb6270
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_prefs_main.xml
@@ -0,0 +1,20 @@
+
+
+ Asetukset
+
+ Yleiset
+ Tummateema
+
+ Vaalea
+ Tumma
+ Järjestelmän oletus
+
+ Automaattiset päivitykset
+
+ Mainostentorjunta
+ VPN pohjainen mainostenesto
+
+ Virheenkorjaus
+ Lähetä virheraportteja
+ Ei ole tuettu tässä julkaisussa
+
diff --git a/app/src/main/res/values-fi/strings_prefs_root.xml b/app/src/main/res/values-fi/strings_prefs_root.xml
new file mode 100644
index 0000000..9564b6f
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_prefs_root.xml
@@ -0,0 +1,21 @@
+
+
+ Avaa hosts-tiedosto
+ Hosts-tiedoston kohde
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Mukautettu kohde
+
+ Mukautetun kohteen sijainti
+
+ Uudelleenohjaus
+
+ Paikallinen web-palvelin
+ Ota web-palvelin käyttöön
+ Testaa web-palvelinta
+ Avaa \"Turvallisuus\'\" -asetukset
+ Tarkistetaan…
+ Ei käynnissä
+
diff --git a/app/src/main/res/values-fi/strings_prefs_update.xml b/app/src/main/res/values-fi/strings_prefs_update.xml
new file mode 100644
index 0000000..84dce96
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Päivityksiä
+
+ Ohjelmapäivitykset
+ Tarkista päivityksiä käynnistäessä
+ Säännöllisesti tarkista päivityksiä
+ Sisällytä beta-julkaisut
+
+ Hosts-päivityksiä
+ Tarkista päivityksiä käynnistäessä
+ Säännöllisesti tarkista päivityksiä
+ Synkronoi päivittäessä
+ Synkronoi ainoastaan rajattomalla yhteydellä
+
diff --git a/app/src/main/res/values-fi/strings_prefs_vpn.xml b/app/src/main/res/values-fi/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d99beee
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN pohjainen mainostenesto
+
+ Aktivoi käynnistyksessä
+ Valvo yhteyttä
+ Tarkista säännöllisesti verkon tilaa uudelleen käynnistääkseen VPN yhteyden katkettua.
+
+ Pois jätetyt sovellukset
+ Valitse mitkä sovellukset eivät saa käyttää VPNää jotta mitään yhteyksiä ei estetä.
+ Jätä pois järjestelmäsovelluksia
+
+ Ei mikään
+ All except browsers
+ Kaikki
+
+ Jätä pois käyttäjän sovelluksiä
+
+
+ Pois jätetyt sovellukset
+ Valitse kaikki
+ Poista valinta kaikista
+ Sovelluksen kuvake
+
diff --git a/app/src/main/res/values-fi/strings_support.xml b/app/src/main/res/values-fi/strings_support.xml
new file mode 100644
index 0000000..6e6a469
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Tue
+ Ryhdy sponsoriksi
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fi/strings_update.xml b/app/src/main/res/values-fi/strings_update.xml
new file mode 100644
index 0000000..dbb6fa6
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway-päivitys
+
+ Päivitys saatavilla!
+
+
+ Olet ajan tasalla
+ Päivitys saatavilla
+ Päivitetään AdAwaytä
+ Päivitä nyt
+ %1$s / %2$s
+ Viimeisimmät muutokset
+ Muutokset
+ Tue kehitystä
+ Lahjoita
+ Sponsoroi
+
+
+ Ladataan uusinta versiota AdAwaystä…
+
diff --git a/app/src/main/res/values-fi/strings_welcome.xml b/app/src/main/res/values-fi/strings_welcome.xml
new file mode 100644
index 0000000..efac78f
--- /dev/null
+++ b/app/src/main/res/values-fi/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Tervetuloa
+ Määrityksen ensimmäinen vaihe
+ Määrityksen toinen vaihe
+ Määrityksen viimeinen vaihe
+
+
+ Tervetuloa käyttämään AdAwaytä!
+ AdAway tarjoaa kaksi mainosten estotapaa. Valitse haluamasi:
+
+ Root-logo
+ Root-pohjainen\nmainosesto
+ Nopeampi
+ Akkuystävällinen
+ Vaatii root-oikeudet
+
+ VPN-logo
+ VPN-pohjainen\nmainosesto
+ Hitaampi
+ Suoritetaan taustalla
+ Yhteensopiva
+
+ Vaatii rootatun Androidin
+ Joko su-binääriä ei löytynyt tai et myöntänyt AdAwaylle root-oikeuksia.\n\nTämä voi tapahtua jos laitetta ei ole rootattu. Löydät tietoja laitteen roottauksesta osoitteessa wiki.lineageos.org tai muilta Android-sivustoilta.
+
+ Hyöty
+ Haitta
+
+
+ Synkronointi on suoritettu
+ Virhe synkronoitaessa
+
+ Synkronoidaan
+ Synkronoitu!
+ AdAway lataa estettäviä mainosverkostoja verkkolähteistä. Voit mukauttaa niitä myöhemmin asetuksista.
+ Yritä synkronointia uudelleen
+ Synkronointi epäonnistui: %1$s Yritetäänkö uudelleen?
+ Sovellus voi näyttää ilmoituksia mainoseston tilasta, hallinnasta ja uusista sovellusversioista (muutama vuodessa). Ota ne käyttöön, jos haluat pysyä ajan tasalla.
+
+
+ Tue
+ Tue minua!
+ AdAway on ilmainen avoimen lähdekoodin sovellus, jota kehitän vapaa-ajallani. Jos pidät siitä, voit halutessasi ilmaista tukesi:
+ Lahjoita PayPalilla
+ Pidätkö vioista? En minäkään.
+ Lähetä minulle virheraportteja ottamalla telemetria käyttöön
+
+
+ Edellinen
+ Seuraava
+ Valmis
+
diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml
new file mode 100644
index 0000000..5bc16a5
--- /dev/null
+++ b/app/src/main/res/values-fil/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+ Lumabas
+ Isara
+ Oo
+ Hindi
+ Dagdagan
+ I-cancel
+ Tulong
+
+
+ Palitan ang entry
+ Palitan
+ Ibura
+
+
+ Nag-iimport…
+ Nag-eexport…
+ Gumagawa ng standard na hosts file
+ May bagong update
+ Walang koneksyong Internet
+ Walang connection
+ Dinadownload…
+ gumagawa ng hosts file
+ Dagdagan
+ Tulong
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Tulong
+
+
diff --git a/app/src/main/res/values-fil/strings_app.xml b/app/src/main/res/values-fil/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-fil/strings_errors.xml b/app/src/main/res/values-fil/strings_errors.xml
new file mode 100644
index 0000000..e22f302
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_errors.xml
@@ -0,0 +1,5 @@
+
+
+
+ Walang koneksyong Internet
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fil/strings_home.xml b/app/src/main/res/values-fil/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fil/strings_hosts.xml b/app/src/main/res/values-fil/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-fil/strings_lists.xml b/app/src/main/res/values-fil/strings_lists.xml
new file mode 100644
index 0000000..c3a387e
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_lists.xml
@@ -0,0 +1,5 @@
+
+
+ Your lists
+ IP (IPv4 or IPv6):
+
diff --git a/app/src/main/res/values-fil/strings_log.xml b/app/src/main/res/values-fil/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-fil/strings_notification.xml b/app/src/main/res/values-fil/strings_notification.xml
new file mode 100644
index 0000000..7552073
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_notification.xml
@@ -0,0 +1,4 @@
+
+
+ May bagong update
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fil/strings_prefs_backup_restore.xml b/app/src/main/res/values-fil/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-fil/strings_prefs_main.xml b/app/src/main/res/values-fil/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-fil/strings_prefs_root.xml b/app/src/main/res/values-fil/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-fil/strings_prefs_update.xml b/app/src/main/res/values-fil/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-fil/strings_prefs_vpn.xml b/app/src/main/res/values-fil/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-fil/strings_support.xml b/app/src/main/res/values-fil/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fil/strings_update.xml b/app/src/main/res/values-fil/strings_update.xml
new file mode 100644
index 0000000..05f2a67
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ May bagong update
+
diff --git a/app/src/main/res/values-fil/strings_welcome.xml b/app/src/main/res/values-fil/strings_welcome.xml
new file mode 100644
index 0000000..41a4523
--- /dev/null
+++ b/app/src/main/res/values-fil/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ Kailangan ng Android na may root
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..87adc6d
--- /dev/null
+++ b/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,266 @@
+
+
+
+ Quitter
+ Fermer
+ Oui
+ Non
+ Ajouter
+ Annuler
+ Enregistrer
+ Aide
+
+
+ Bienvenue !
+ AdAway est un programme gratuit et à code source ouvert conçu pour bloquer les publicités. Il obtient les adresses des réseaux publicitaires afin de les bloquer sur votre appareil.\nVoulez-vous en apprendre davantage ? Consultez l’aide ci-dessous.
+ Afficher plus d’aide
+ Mettre à jour l’état
+ Tous les fichiers hosts des sources définies sont téléchargés, fusionnés avec vos propres listes, puis installés en un seul fichier hosts sur votre système.
+ Activer le blocage des publicités
+ Désactiver le blocage des publicités
+ Serveur Web
+ En fonction
+ Arrêté
+ Démarrer ou arrêter le serveur Web sur « localhost » pour répondre aux requêtes vers des noms d’hôtes bloqués.
+ Activer le serveur Web
+ Désactiver le serveur Web
+ RPV
+ En fonction
+ Arrêté
+ Démarrer ou arrêter le RPV pour filtrer les requêtes.
+ Activer le RPV
+ Désactiver le RPV
+
+
+ Modifier l’entrée
+ Appliquer
+ Modifier
+ Supprimer
+
+
+ Importation…
+ La sauvegarde a été importée avec succès de votre mémoire externe.
+ Échec d’importation de la sauvegarde. Le format est-il correct ? Consultez logcat pour plus de précisions.
+ Exportation…
+ La sauvegarde a été exportée avec succès vers le fichier « %s » de votre mémoire externe.
+ Échec d’exportation du fichier de sauvegarde « %s ».
+
+
+ Le fichier hosts
+ Le fichier hosts est un fichier système qui fait correspondre les noms d’hôtes à des adresses IP. C’est un simple fichier texte dont la configuration est gérée par AdAway. Voici ses premières lignes :
+ Chargement du contenu du fichier hosts…
+ Ouvrir le fichier hosts
+
+
+ Vérification de la présence de mises à jour
+ Vérification de la présence de mises à jour sur la source %s
+ Récupération des sources
+ Téléchargement de la source %s
+ Lecture de la source %s
+ Analyse de la source %s
+ Synchronisation de la base de données des règles
+ Rétablissement du fichier hosts par défaut
+ Le fichier hosts par défaut a été restauré
+ Création d’un fichier hosts standard
+ Une mise à jour des sources est proposée
+ De nouveaux fichiers hosts sont proposés
+ Aucune mise à jour des sources n’a été trouvée
+ Aucune connexion à Internet
+ Aucune connexion à Internet n’est accessible
+ Les sources ne sont pas accessibles
+ Aucune source de fichier hosts n’est accessible
+ L’accès racine a été refusé
+ Autorisez l’accès racine à partir de votre appli de débridage
+ Une erreur s’est produite
+ Vérifiez « logcat » pour plus de précisions.
+ Activé
+ Les fichiers hosts les plus récents sont activés
+ Désactivé
+ Le fichier hosts par défaut a été installé
+ Appliquer les sources les plus récentes
+ Création d’un nouveau fichier hosts
+ Copie d’un nouveau fichier hosts
+ Vérification de la copie du fichier hosts
+ Le fichier hosts a été mis à jour avec succès
+ La configuration du RPV a été mise à jour avec succès
+ Votre configuration a changé. Vous devez l’appliquer.
+ Appliquer
+ Application de la nouvelle configuration…
+ Échec d’application de la nouvelle configuration.
+
+
+ Le lien symbolique vers la cible du fichier hosts manque
+ Le lien symbolique de votre cible vers /system/etc/hosts est absent ou incorrect. AdAway ne fonctionnera pas sans un lien vers le bon fichier.\n\nVoulez-vous essayer de créer un lien symbolique ?
+ Le lien symbolique manque
+ Il manque d’espace sur la partition.\nEssayez de changer le fichier hosts cible dans les préférences par /data/data/hosts.
+ Il manque d’espace
+ Impossible de lire le fichier téléchargé.
+ Échec de fichier privé
+ Échec de remontage de la partition en lecture/écriture
+ Échec de remontage
+ Échec de copie du fichier hosts
+ La copie du fichier hosts a échoué
+ Échec de copie
+ Les sources de fichiers hosts ont été mises en place
+ La mise à en place a réussi
+ La mise en place est réussie.\nIl faudra peut-être redémarrer Android pour que les modifications prennent effet.\n\nVoulez-vous redémarrer ?\n(Pour éviter toute perte de données, assurez-vous qu’aucune appli n’utilise la carte SD actuellement.)
+ Le lien symbolique a été créé avec succès.\nIl faudra peut-être redémarrer Android pour que les modifications prennent effet.\n\nVoulez-vous redémarrer ? (Pour éviter toute perte de données, assurez-vous qu’aucune appli n’utilise la carte SD actuellement.)
+ Le lien symbolique a été créé avec succès
+ Le lien symbolique n’a pas pu être créé par Android.\nL’échec provient probablement d’une « fonction » appelée S-ON sur les téléphones HTC.\n\nUne solution possible est de démarrer votre téléphone en mode récupération et d’y créer un lien symbolique avec « ln-s /data/data/hosts/system/etc/hosts ».\n\nSi cela ne fonctionne pas, rechercher S-OFF et votre téléphone sur Internet.
+ Échec de création du lien symbolique
+ Pour plus de précisions, veuillez consulter l’aide.
+ Un mandataire APN est configuré sur votre Android.\nAdAway ne fonctionnera pas de manière fiable sur les réseaux mobiles tels que le 3G. Vous pouvez désactiver ce mandataire en allant à l’APN choisi (dans l’appli Paramètres : Réseau et Internet -> Réseau cellulaire -> Avancés -> Nom des points d’accès) et en supprimant la valeur dans le champ « Serveur mandataire »
+ Le mandataire APN est configuré
+ La connexion à Internet ne fonctionne pas.
+ Aucune connexion
+ Téléchargement…
+ Mise en place…
+ Mise en place des liste de rejet et d’autorisation
+ Analyse et fusion des fichiers hosts
+ Création du fichier hosts
+ Mise en place du fichier hosts
+ Échec d’application du nouveau fichier hosts.
+ Le fichier hosts n’a pas pu être mis en place dans votre système.\nEssayez de changer le fichier hosts cible dans les préférences par /data/data/hosts.
+ Échec de mise en place
+ Veuillez vérifier votre appli de débridage pour vous assurer que l’accès racine a été autorisé.
+ Vous avez rétabli le fichier hosts par défaut.\nUn redémarrage Android sera peut-être nécessaire pour que les changements prennent effet.\n\nVoulez-vous redémarrer ?\n(Afin d’éviter toute perte de données, assurez-vous qu’aucune appli n’utilise la carte SD actuellement.)
+ A été rétabli avec succès
+ Impossible de rétablir le fichier hosts
+ Échec de rétablissement pour des raisons inconnues.
+ Échec de rétablissement
+ Aucune de vos sources de fichiers hosts activées n’est accessible. Êtes-vous correctement connecté à internet ?
+ Échec de téléchargement
+ Échec d’écriture du nouveau fichier hosts privé
+ Le fichier privé ne peut pas être créé.
+ Échec de création du fichier privé
+ Vous avez activé le mode sans système.\nIl faudra peut-être redémarrer Android pour que les changements prennent effet.\n\nVoulez-vous redémarrer ?\n(Pour prévenir toute perte de données, assurez-vous qu’aucune autre appli n’utilise la carte SD en ce moment.)
+ L’activation a réussi
+ Vous avez désactivé le mode sans système.\nIl faudra peut-être redémarrer Android pour que les changements prennent effet.\n\nVoulez-vous redémarrer l’appareil ?\n(Pour prévenir toute perte de données, assurez-vous qu’aucune autre appli n’utilise la carte SD en ce moment.)
+ La désactivation a réussi
+ Échec d’activation du blocage des publicités par RPV.
+ Échec de désactivation du blocage des publicités par RPV.
+ Activation du module hosts de Magisk
+ Activer la fonction Fichier hosts sans système du gestionnaire Magisk. Dans ses paramètres, activez l’option Fichier hosts sans système, puis redémarrez votre appareil.
+ Désactivation du module hosts de Magisk
+ Désactiver la fonction Fichier hosts sans système du gestionnaire Magisk. Dans la liste des modules, désinstallez le module Systemless hosts, puis redémarrez votre appareil.
+
+
+ Ajouter une URL au fichier hosts :
+ Ce n’est pas un nom d’hôte valide
+ Nom d’hôte mal formaté
+ Ce n’est pas une IP valide
+ IP mal formatéee
+ Ne jamais redémarrer et ne plus afficher cette question.
+ Chargement…
+
+
+ Actualiser
+ Ajouter
+ Aide
+ Importer une sauvegarde
+ Exporter une sauvegarde
+
+
+ S-ON/S-OFF
+ FAQ
+ Problèmes
+
+
+ Logiciels publicitaires
+ Vous trouverez ici les logiciels publicitaires installés, des applications néfastes qui ne peuvent pas être bloquées par AdAway. Ces applis utilisent par exemple des notifications Airpush qui surgissent même si l’appli n’est pas en cours de fonctionnement. Elles peuvent même changer votre sonnerie. La seule contre-mesure à votre disposition est de désinstaller ces applis en cliquant sur les éléments de la liste.
+ Analyse…
+ Aucun logiciel publicitaire n’a été trouvé
+
+
+ Bloqueur de publicités
+ Aucun éditeur de texte n’est installé
+ Aucun éditeur de texte n’a été trouvé pour ouvrir le fichier hosts. Vous pouvez installer Jota ou d’autres éditeurs de texte pour ce faire.\n\nVoulez-vous installer Jota ?
+ Aucun gestionnaire de fichiers n’est installé
+ Aucun gestionnaire de fichier n’a trouvé pour ouvrir les fichiers. Vous pouvez installer OI File Manager ou d’autres gestionnaires de fichiers pour ce faire.\n\nVoulez-vous installer OI File Manager ?
+
+
+ Tcpdump
+ Tcpdump est un outil pour surveiller les requêtes DNS et les enregistrer dans un fichier journal. Vous pouvez le démarrer en arrière-plan, lancer des applications qui affichent des publicités et analyser ensuite les requêtes DNS d’après le fichier journal. Le serveur publicitaire candidat peut ensuite être ajouté à votre liste de rejet.
+ Désactiver la surveillance
+ Activer la surveillance
+ Afficher les résultats
+ Trier les domaines
+ Effacer le journal
+ Ajouter une entrée à la liste de rejet
+ Ajouter une entrée à la liste d’autorisation
+ Ajouter une entrée à la liste des redirections
+
+ Modifier la valeur de préférence du texte
+ Ouvrir le menu
+ Fermer le menu
+
+
+
+ Accueil
+ Sources de fichiers hosts
+ Vos listes
+ Ouvrir le fichier « hosts »
+ Journaliser les requêtes DNS
+ Chercher des logiciels publicitaires
+ Préférences
+ Aide
+
+
+
+
+ Requêtes DNS
+ Vos listes
+ Préférences
+
+
+ Installée il y a %1$s
+ À jour depuis %1$s
+ Mise à jour proposée depuis %1$s
+ Dernière mise à jour il y a %1$s
+ L’état de mise à jour est inconnu
+ Désactivée
+ quelques minutes
+
+ %d minute
+ %d minutes
+ %d minutes
+
+
+ %d heure
+ %d heures
+ %d heures
+
+
+ %d jour
+ %d jours
+ %d jours
+
+
+ %d mois
+ %d mois
+ %d mois
+
+
+
+ L’hôte a été copié dans le presse-papiers
+
+
+ démarrage
+ activé
+ arrêt
+ en attente du réseau
+ reconnexion
+ erreur de reconnexion
+ en pause
+ arrêté
+ RPV bloqueur de publicités %1$s
+ Pause
+ Reprendre
+
+
+ Autorisations d’AdAway
+ Permettre d’interagir avec AdAway
+ Envoyer des commandes à AdAway
+ Permettre d’envoyer des commandes à AdAway telles qu’activer ou désactiver le blocage des publicités pour le système entier
+
+
diff --git a/app/src/main/res/values-fr/strings_app.xml b/app/src/main/res/values-fr/strings_app.xml
new file mode 100644
index 0000000..2036e4e
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Bloqueur de publicités à code source ouvert
+ Logo AdAway
+
diff --git a/app/src/main/res/values-fr/strings_errors.xml b/app/src/main/res/values-fr/strings_errors.xml
new file mode 100644
index 0000000..576e7f5
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Aucune connexion à Internet
+ Impossible d’établir une connexion vers Internet. Veuillez vérifier la connectivité de votre appareil.
+ Échec de téléchargement de la source du fichier hosts
+ Aucune de vos sources de fichiers hosts activées n’est accessible. Veuillez vous assurer d’être correctement connecté à Internet ?
+
+ Échec de création du fichier privé
+ Impossible de créer un fichier privé pour construire une nouvelle source d’hosts. Veuillez vérifier l’espace libre sur votre appareil.
+ Il manque d’espace
+ Impossible de copier le fichier hosts vers votre partition système. Veuillez vous assurer que le module « Systemless Hosts » de Magisk est activé, puis redémarrez.
+ Échec d’installation du nouveau fichier hosts.
+ Impossible de copier le fichier hosts vers la partition /system. Veuillez vous assurer que le module « Systemless Hosts » de Magisk est activé, puis redémarrez.
+ Échec de rétablissement du fichier hosts
+ Impossible de restaurer la configuration du fichier hosts par défaut.
+
+ Échec d’activation du blocage des publicités par RPV.
+ Veuillez vérifier les paramètres de votre RPV pour autoriser le démarrage du RPV de l’application.
+ Échec de désactivation du blocage des publicités par RPV.
+ Veuillez vérifier les paramètres de votre RPV pour le désactiver manuellement.
+
diff --git a/app/src/main/res/values-fr/strings_home.xml b/app/src/main/res/values-fr/strings_home.xml
new file mode 100644
index 0000000..1cf5a9f
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_home.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ Bloqués
+ Autorisés
+ Redirigés
+
+
+
+ %d source à jour
+ %d sources à jour
+ %d sources à jour
+
+
+ %d source périmée
+ %d sources périmées
+ %d sources périmées
+
+ Vérifier la présence de mises à jour des fichiers hosts
+ Mettre à jour le fichier hosts
+
+
+ Afficher le journal de requêtes DNS
+
+
+ Afficher l’aide\net les conseils
+
+
+ Ouvrir la page GitHub
+
+
+ Soutenir le projet
+
+
+ Projet GitHub
+ Préférences
+
+
+ Ouvrir le tiroir de navigation
+ Mettre en pause/Reprendre le blocage des publicités
+ Mettre à jour les domaines bloqués
+ Afficher les domaines interrogés
+
+
+ Veuillez consulter l’aide pour plus de précisions.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings_hosts.xml b/app/src/main/res/values-fr/strings_hosts.xml
new file mode 100644
index 0000000..f25acd6
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Sources de fichiers hosts
+
+ Liste de l’utilisateur
+ Fichier hosts officiel d’AdAway
+ Fichier hosts unifié de StevenBlack
+ Fichier hosts unifié de Pete Lowe
+
+ non disponibles
+ Fichier(s) hosts de %s
+
+ Ajouter une source
+ Modifier une source
+ URL : (une ressource https:// ou file://)
+ L’URL de la source du fichier hosts
+
diff --git a/app/src/main/res/values-fr/strings_lists.xml b/app/src/main/res/values-fr/strings_lists.xml
new file mode 100644
index 0000000..c1f312c
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Vos listes
+ Ajouter un hôte
+
+ Bloqués
+ Autorisés
+ Redirigés
+
+ Filtrer les hôtes
+ Chercher un nom d’hôte…
+ Activer/désactiver les sources
+
+ Ajouter un hôte à la liste noire
+ Ajouter un hôte à la liste blanche
+ Ajouter une redirection d’hôte
+ Modifier l’hôte mis en liste noire
+ Modifier l’hôte mis en liste blanche
+ Modifier la redirection
+ Nom de l’hôte :
+ L’URL de la source du fichier hosts
+ (Les métacaractères * et ? sont permis)
+ IP (IPv4 ou IPv6) :
+
diff --git a/app/src/main/res/values-fr/strings_log.xml b/app/src/main/res/values-fr/strings_log.xml
new file mode 100644
index 0000000..54ed2f1
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Activer ou désactiver l’enregistrement du journal
+ Appuyez sur le bouton d’enregistrement pour lancer la journalisation des requêtes. Naviguez sur Internet ou utilisez des applis, puis revenez dans cet écran et balayez-le vers le bas pour actualiser les journaux.
+ \n\nLes requêtes bloquées ne seront pas journalisées. Désactivez d’abord le blocage des publicités si vous voulez aussi les journaliser.
+
+ Tri alphabétique
+ Tri par domaines de premier niveau
+
+ Rediriger un domaine
+
diff --git a/app/src/main/res/values-fr/strings_notification.xml b/app/src/main/res/values-fr/strings_notification.xml
new file mode 100644
index 0000000..f4c0674
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Mises à jour
+ Notification de nouvelles mises à jour
+ Une mise à jour des sources est proposée
+ Des fichiers hosts plus récents peuvent être téléchargés.
+ Une mise à jour de l’appli est proposée
+ Une nouvelle version d’AdAway est proposée en téléchargement.
+
+ RPV
+ Notifications de l’exécution du RPV
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings_prefs_backup_restore.xml b/app/src/main/res/values-fr/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..87aafcc
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Sauvegarde et restauration
+ Sauvegarde
+ Sauvegardez vos règles de blocage sur une mémoire externe
+ Restaurer
+ Restaurez vos règles de blocage d’un fichier de sauvegarde
+
diff --git a/app/src/main/res/values-fr/strings_prefs_main.xml b/app/src/main/res/values-fr/strings_prefs_main.xml
new file mode 100644
index 0000000..48e89fe
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Préférences
+
+ Général
+ Thème sombre
+
+ Clair
+ Sombre
+ Valeur par défaut du système
+
+ Mises à jour automatiques
+
+ Blocage des publicités
+ Bloqueur de publicités pour appareil débridé
+ Bloqueur de publicités fondé sur un RPV
+ Activer la prise en charge d’IPv6
+ Sauvegarder/restaurer les règles de blocage
+
+ Débogage
+ Envoyer des relevés de plantage
+ Signaler à Sentry (sentry.io)
+ N’est pas pris en charge dans cette version
+ Journalisation détaillée
+ Les changements prendront effet après redémarrage de l’appli
+
diff --git a/app/src/main/res/values-fr/strings_prefs_root.xml b/app/src/main/res/values-fr/strings_prefs_root.xml
new file mode 100644
index 0000000..8a02397
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Bloqueur de publicités pour appareil débridé
+
+ Installation de fichier hosts
+ Ouvrir le fichier hosts
+ Fichier hosts cible
+ Consultez l’aide avant d’utiliser cette fonction
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Cible personnalisée
+
+ Emplacement de la cible personnalisée
+ Cacher le message de redémarrage après application
+
+ Redirection
+ Définir où rediriger les hôtes bloqués
+ Redirection IPv4
+ Redirection IPv6
+ La redirection est invalide
+
+ Serveur Web local
+ Le serveur Web local écoute les adresses IP locales pour répondre aux requêtes vers des noms d’hôtes bloqués. Cela pourrait empêcher le gel de certaines applications lors de connexions bloquées.
+ Activer le serveur Web
+ Tester le serveur Web
+ Installer un certificat autosigné
+ Installation manuelle d’un certificat
+ À partir d’Android 11 Ⓡ, une application ne peut plus installer manuellement une autorité de certification (CA).\n\nAccédez aux paramètres Sécurité > Chiffrement et authentifiants, puis Installer un certificat. Choisissez ensuite Certificat CA et sélectionnez le fichier du certificat nouvellement exporté.
+ Ouvrir les paramètres « Sécurité »
+ Vérification…
+ N’est pas en fonction
+ En fonction, mais le certificat n’est pas installé
+ En fonction et le certificat est installé
+ Remplacer l’espace vide des publicités par l’icône de l’appli
+
diff --git a/app/src/main/res/values-fr/strings_prefs_update.xml b/app/src/main/res/values-fr/strings_prefs_update.xml
new file mode 100644
index 0000000..85b6be1
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Mises à jour
+ Les notifications sont désactivées
+ Les notifications de l’appli ne seront pas affichées. Touchez pour les activer.
+
+ Mises à jour de l’application
+ Vérifier la présence d’une mise à jour au démarrage
+ Vérifier régulièrement la présence de mises à jour
+ Inclure les versions bêta
+
+ Mises à jour des hôtes
+ Vérifier la présence d’une mise à jour au démarrage
+ Vérifier régulièrement la présence de mises à jour
+ Synchroniser lors d’une mise à jour
+ Ne synchroniser que sur les réseaux sans limite de données
+
diff --git a/app/src/main/res/values-fr/strings_prefs_vpn.xml b/app/src/main/res/values-fr/strings_prefs_vpn.xml
new file mode 100644
index 0000000..a633c6e
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Bloqueur de publicités fondé sur un RPV
+
+ Activer au démarrage
+ Surveiller la connexion
+ Vérifier régulièrement l’état du réseau pour relancer le RPV après une déconnexion.
+
+ Applications exclues
+ Configurer les applis qui ne devraient pas utiliser le RPV, afin qu’aucune connexion ne soit bloquée.
+ Exclure les applications système
+
+ Aucune
+ Toutes, sauf les navigateurs
+ Toutes
+
+ Exclure des applications utilisateur
+
+
+ Applications exclues
+ Les sélectionner toutes
+ Les dessélectionner toutes
+ Icône de l’application
+
diff --git a/app/src/main/res/values-fr/strings_source_edit.xml b/app/src/main/res/values-fr/strings_source_edit.xml
new file mode 100644
index 0000000..8aa1f0a
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Modifier une source
+ Ajouter une source
+
+ Étiquette
+ Une étiquette est nécessaire
+ Type
+ URL
+ Fichier
+ Emplacement
+ https://
+ Un emplacement est nécessaire
+ Touchez Fichier pour sélectionner le fichier source
+ L’emplacement est invalide
+ Format des listes
+ Bloquer
+ Autoriser
+ Appliquer les hôtes redirigés
+ Autoriser les hôtes redirigés peut entraîner des problèmes de sécurité. N’utilisez ces paramètres que sur une source de confiance, car du trafic sensible pourrait être redirigé à votre insu vers n’importe quel serveur.
+
diff --git a/app/src/main/res/values-fr/strings_support.xml b/app/src/main/res/values-fr/strings_support.xml
new file mode 100644
index 0000000..e8f5220
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Soutien
+ Devenir commanditaire
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings_update.xml b/app/src/main/res/values-fr/strings_update.xml
new file mode 100644
index 0000000..554c948
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_update.xml
@@ -0,0 +1,22 @@
+
+
+ Mise à jour d’AdAway
+
+ Une mise à jour est proposée
+
+
+ AdAway est à jour
+ Une mise à jour est proposée
+ Mise à jour d’AdAway
+ Mettre à jour maintenant
+ %1$s / %2$s
+ Terminée
+ Derniers changements
+ Journal des changements
+ Soutenir le développement
+ Faire un don
+ Commanditer
+
+
+ Téléchargement de la version d’AdAway la plus récente…
+
diff --git a/app/src/main/res/values-fr/strings_welcome.xml b/app/src/main/res/values-fr/strings_welcome.xml
new file mode 100644
index 0000000..fca5dc7
--- /dev/null
+++ b/app/src/main/res/values-fr/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Bienvenue
+ Première étape de l’assistant
+ Deuxième étape de l’assistant
+ Dernière étape de l’assistant
+
+
+ Bienvenue dans AdAway !
+ AdAway offre deux modes de blocage des publicités. Sélectionnez celui qui vous convient :
+
+ Logo de la racine
+ Bloqueur de publicités\nfondé sur la racine
+ Plus rapide
+ Demande en énergie moins élevée
+ Exige un appareil débridé
+
+ Logo du RPV
+ Bloqueur de publicités\nfondé sur un RPV
+ Plus lent
+ Exécution en arrière-plan
+ Compatibilité
+
+ Un Android débridé est exigé
+ Soit le fichier binaire su est introuvable, soit vous n’avez pas donné l’accès racine à AdAway.\n\nCela peut arriver quand votre appareil n’est pas débridé. Vous trouverez des renseignements sur comment débrider votre appareil sur wiki.lineageos.org ou sur d’autres sites Web dédiés à Android.
+
+ Avantages
+ Inconvénients
+
+
+ La synchronisation est terminée
+ Erreur de synchronisation
+
+ Synchronisation
+ La synchronisation est terminée
+ AdAway télécharge de sources en ligne la liste de réseaux publicitaires à bloquer. Vous pouvez les personnaliser ultérieurement dans les paramètres.
+ Essayer de resynchroniser
+ Échec de synchronisation : %1$s Réessayer maintenant ?
+ Peut envoyer des notifications pour afficher l’état et le contrôle du blocage des publicités et vous signaler la présence de mise à jour de l’appli (quelques fois par an). Activez-les si vous voulez rester à jour.
+
+
+ Dons
+ Soutenez-moi !
+ AdAway est une appli gratuite et à code source ouvert que je développe à temps perdu. Si vous l’aimez, n’hésitez pas à témoigner votre soutien :
+ Faire un don par PayPal
+ Aimez-vous les bogues ? Moi non plus.
+ Activer la télémétrie pour envoyer des relevés de plantage
+
+
+ Retour
+ Suivant
+ Terminer
+
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
new file mode 100644
index 0000000..5d3c2f8
--- /dev/null
+++ b/app/src/main/res/values-gl/strings.xml
@@ -0,0 +1,81 @@
+
+
+
+ Saír
+ Pechar
+ Si
+ Non
+ Engadir
+ Desbotar
+ Gardar
+ Axuda
+
+
+ Benvido!
+ Amosar máis axuda
+ Estado da actualización
+ Habilitar bloqueo de publicidade
+ Deshabilitar bloqueo de publicidade
+ Servidor web
+ En execución
+ Detido
+ Habilitar servidor web
+ Deshabilitar servidor web
+ VPN
+ En execución
+ Detido
+ Habilitar VPN
+ Deshabilitar VPN
+
+ Aplicar
+ Editar
+ Eliminar
+
+
+ Estase a importar…
+ Copia de seguridade importada correctamente dende o teu almacenamento externo.
+ Estase a exportar…
+
+ O arquivo hosts
+ Cargando contido do arquivo hosts…
+ Abrir o arquivo hosts
+
+ Descargando fonte %s
+ Reverter ó arquivo hosts por defecto
+ Arquivo hosts predeterminado restablecido
+ Creando arquivo hosts estándar
+ Actualización da fonte dispoñíbel
+ Arquivos hosts recentes dispoñíbeis
+ Sen conexión a Internet
+ Non hai conexión a Internet dispoñíbel
+ Fontes non dispoñíbeis.
+ Non hay fontes de hosts accesíbeis
+ Acceso root denegado
+ Habilitado
+ Deshabilitado
+ Arquivo hosts actualizado correctamente
+ Aplicar
+ Erro ao aplicar a nova configuración.
+
+ Non hai espazo dabondo
+ O arquivo descargado non se puido ler.
+ Por favor ler Axuda para máis información.
+ Estase a descarregar…
+ Estase a aplicar…
+ Erro ao habilitar o bloqueo de publicidade VPN.
+ Erro ao deshabilitar o bloqueo de publicidade VPN.
+ Engadir
+ Axuda
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Axuda
+
+ Túas listas
+
diff --git a/app/src/main/res/values-gl/strings_app.xml b/app/src/main/res/values-gl/strings_app.xml
new file mode 100644
index 0000000..59a5cf7
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_app.xml
@@ -0,0 +1,5 @@
+
+
+ AdAway
+ Bloqueador de publicidade de Código Aberto
+
diff --git a/app/src/main/res/values-gl/strings_errors.xml b/app/src/main/res/values-gl/strings_errors.xml
new file mode 100644
index 0000000..1769c79
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_errors.xml
@@ -0,0 +1,16 @@
+
+
+
+ Non hai conexión a Internet
+
+ Erro ao crear arquivo privado
+ Non hai espazo dabondo
+ Erro ao instalar novo arquivo hosts
+ Foi incapaz de copiar o arquivo hosts á partición do sistema. Verifica que o módulo systemless de Magisk esté habilitado para reiniciar.
+ Erro ao revertir o arquivo hosts
+ Non se é capaz de restaurar-la configuración predeterminada do arquivo hosts.
+
+ Erro ao habilitar o bloqueo de publicidade VPN.
+ Erro ao deshabilitar o bloqueo de publicidade VPN.
+ Por favor comproba os axustes da túa VPN para deshabilitala manualmente.
+
\ No newline at end of file
diff --git a/app/src/main/res/values-gl/strings_home.xml b/app/src/main/res/values-gl/strings_home.xml
new file mode 100644
index 0000000..0262e09
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_home.xml
@@ -0,0 +1,33 @@
+
+
+
+
+ Bloqueado
+ Permitido
+ Redirixido
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+
+ Amosar axuda
+
+
+ Abrir páxina de GitHub
+
+ Preferences
+
+ Actualizar dominios bloqueados
+ Amosar dominios solicitados
+
+
+ Por favor ler Axuda para máis información.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-gl/strings_hosts.xml b/app/src/main/res/values-gl/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-gl/strings_lists.xml b/app/src/main/res/values-gl/strings_lists.xml
new file mode 100644
index 0000000..ac2c73b
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_lists.xml
@@ -0,0 +1,14 @@
+
+
+ Túas listas
+
+ Bloqueado
+ Permitido
+ Redirixido
+
+ Filtrar hosts
+
+ Engadir host á lista negra
+ Engadir host á lista branca
+ Engadir host de redirección
+
diff --git a/app/src/main/res/values-gl/strings_log.xml b/app/src/main/res/values-gl/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-gl/strings_notification.xml b/app/src/main/res/values-gl/strings_notification.xml
new file mode 100644
index 0000000..de91780
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_notification.xml
@@ -0,0 +1,11 @@
+
+
+
+ Actualizacións
+ Actualización da fonte dispoñibel
+ Novos arquivos hosts dispoñíbeis para descargar.
+ Actualización da app dispoñibel
+ Unha nova versión de AdAway está dispoñíbel para descargar
+
+ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-gl/strings_prefs_backup_restore.xml b/app/src/main/res/values-gl/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-gl/strings_prefs_main.xml b/app/src/main/res/values-gl/strings_prefs_main.xml
new file mode 100644
index 0000000..a855b2e
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_prefs_main.xml
@@ -0,0 +1,5 @@
+
+
+ Preferences
+ Bloqueador de publicidade baseado en VPN
+
diff --git a/app/src/main/res/values-gl/strings_prefs_root.xml b/app/src/main/res/values-gl/strings_prefs_root.xml
new file mode 100644
index 0000000..2f4b74b
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_prefs_root.xml
@@ -0,0 +1,11 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+ Activar servidor web
+
diff --git a/app/src/main/res/values-gl/strings_prefs_update.xml b/app/src/main/res/values-gl/strings_prefs_update.xml
new file mode 100644
index 0000000..364509a
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_prefs_update.xml
@@ -0,0 +1,4 @@
+
+
+ Unha nova versión de AdAway está dispoñibel para descargar
+
diff --git a/app/src/main/res/values-gl/strings_prefs_vpn.xml b/app/src/main/res/values-gl/strings_prefs_vpn.xml
new file mode 100644
index 0000000..1420979
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_prefs_vpn.xml
@@ -0,0 +1,17 @@
+
+
+ Bloqueador de publicidade baseado en VPN
+
+ Habilitar no arranque
+
+ Aplicacións excluídas
+ Configure cales aplicacións non deberían utilizar a VPN para que non se bloqueen súas conexións.
+ Excluír aplicacións do sistema
+ Excluír aplicacións do usuario
+
+
+ Aplicacións excluídas
+ Selecciona todas
+ Quitar selección a todas
+ Icona da aplicación
+
diff --git a/app/src/main/res/values-gl/strings_support.xml b/app/src/main/res/values-gl/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-gl/strings_update.xml b/app/src/main/res/values-gl/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-gl/strings_welcome.xml b/app/src/main/res/values-gl/strings_welcome.xml
new file mode 100644
index 0000000..02e289f
--- /dev/null
+++ b/app/src/main/res/values-gl/strings_welcome.xml
@@ -0,0 +1,23 @@
+
+
+ Benvido
+ Primeiro paso do asistente
+ Segundo paso do asistente
+ Derradeiro paso do asistente
+
+
+ Benvido a AdAway!
+ AdAway proporciona dous métodos de bloqueo. Escolle un:
+
+ Precisa root
+
+ Executar en segundo plano
+ Compatibilidade
+
+ Precisa ter Android rooteado
+ Podería ser que non se atopara o arquivo su binary ou que AdAway non teña autorización dos permisos root.\n\nIsto sucede cando o teu dispositivo non está rooteado. Podes atopar información sobre como rootear o teu dispositivo en wiki.lineageos.org ou noutros sitios web Android.
+
+ Doar en PayPal
+ Gústanche os bugs? A min tampouco.
+ Seguinte
+
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
new file mode 100644
index 0000000..8bd1807
--- /dev/null
+++ b/app/src/main/res/values-hi/strings.xml
@@ -0,0 +1,15 @@
+
+
+ सवाल
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-hi/strings_app.xml b/app/src/main/res/values-hi/strings_app.xml
new file mode 100644
index 0000000..34e2f06
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ एड अवे
+
diff --git a/app/src/main/res/values-hi/strings_errors.xml b/app/src/main/res/values-hi/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings_home.xml b/app/src/main/res/values-hi/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings_hosts.xml b/app/src/main/res/values-hi/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-hi/strings_lists.xml b/app/src/main/res/values-hi/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-hi/strings_log.xml b/app/src/main/res/values-hi/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-hi/strings_notification.xml b/app/src/main/res/values-hi/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings_prefs_backup_restore.xml b/app/src/main/res/values-hi/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-hi/strings_prefs_main.xml b/app/src/main/res/values-hi/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-hi/strings_prefs_root.xml b/app/src/main/res/values-hi/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-hi/strings_prefs_update.xml b/app/src/main/res/values-hi/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-hi/strings_prefs_vpn.xml b/app/src/main/res/values-hi/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-hi/strings_support.xml b/app/src/main/res/values-hi/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings_update.xml b/app/src/main/res/values-hi/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-hi/strings_welcome.xml b/app/src/main/res/values-hi/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-hi/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
new file mode 100644
index 0000000..e73eec9
--- /dev/null
+++ b/app/src/main/res/values-hr/strings.xml
@@ -0,0 +1,266 @@
+
+
+
+ Zatvori
+ Zatvori
+ Da
+ Ne
+ Dodaj
+ Odustani
+ Spremi
+ Pomoć
+
+
+ Dobrodošli!
+ AdAway je slobodan softver otvorenog kôda dizajniran za blokiranje oglašavanja. Preuzima popis adresa oglasa i podešava vaš uređaj kako bi ih mogao blokirati.\nŽelite li saznati više? Pogledajte pomoć ispod!
+ Prikaži više pomoći
+ Stanje ažuriranja
+ Sve datoteke poslužitelja su preuzete s određenih izvora, spojene s vašim popisima i instalirane kao jedna datoteka na vašem sustavu.
+ Omogući blokiranje oglasa
+ Onemogući blokiranje oglasa
+ Web poslužitelj
+ Pokrenuto
+ Zaustavljeno
+ Pokreni ili zaustavi web poslužitelj na lokalnom poslužitelju kako bi odgovarao na zahtjeve za blokiranje naziva poslužitelja.
+ Omogući web poslužitelja
+ Onemogući web poslužitelja
+ VPN
+ Pokrenuto
+ Zaustavljeno
+ Pokreni ili zaustavi VPN filtriranje zahtjeva.
+ Omogući VPN
+ Onemogući VPN
+
+
+ Uredi upis
+ Primijeni
+ Uredi
+ Obriši
+
+
+ Uvažanje…
+ Sigurnosna kopija je uspješno uvezena iz vašeg uređaja vanjske pohrane.
+ Neuspjeli uvoz sigurnosne kopije. Je li format ispravan? Provjerite logcat za više pojedinosti.
+ Izvažanje…
+ Sigurnosna kopija uspješno je izvezena u datoteku \'%s\' na vašem uređaju vanjske pohrane.
+ Neuspjeli izvoz %s datoteke sigurnosne kopije.
+
+
+ Datoteka poslužitelja
+ Datoteka poslužitelja je datoteka sustava koja mapira nazive poslužitelja prema IP adresama. To je obična tekstna datoteka čijim se podešavanjem rukuje putem AdAwaya. Ovdje je prvih nekoliko redaka:
+ Učitavanje sadržaja datoteke poslužitelja…
+ Otvori datoteku poslužitelja
+
+
+ Provjeravanje ažuriranja
+ Provjeravanje ažuriranja na izvoru poslužitelja %s
+ Preuzimanje izvora poslužitelja
+ Preuzimanje izvora poslužitelja %s
+ Učitavanje izvora poslužitelja%s
+ Obrada %s izvora poslužitelja
+ Usklađivanje baze podataka pravila
+ Preuzimanje u zadanu datoteku poslužitelja
+ Zadana datoteka poslužitelja je obnovljena
+ Stvaranje standardne datoteke poslužitelja
+ Dostupno je ažuriranje izvora poslužitelja
+ Dostupne su novije datoteke poslužitelja
+ Nema pronađenih ažuriranja izvora poslužitelja
+ Internet nedostupan
+ Nema dostupnog pristupa internetu
+ Nedostupni izvori poslužitelja
+ Nema dostupnih izvora poslužitelja!
+ Korijenski (Root) pristup odbijen
+ Dopustite korijenski (root) pristup iz vaše root aplikacije
+ Nešto je pošlo po krivu
+ Provjeri logcat zapis za više pojedinosti
+ Omogućeno
+ Najnovija datoteka poslužitelja je omogućena
+ Onemogućeno
+ Zadana datoteka poslužitelja je instalirana
+ Primijeni najnovije izvore poslužitelja
+ Stvaranje nove datoteke poslužitelja
+ Kopiranje nove datoteke poslužitelja
+ Provjeravanje kopiranja datoteke poslužitelja
+ Datoteka poslužitelja je uspješno ažurirana
+ VPN podešavanja uspješno ažurirana
+ Vaša podešavanja su promijenjena. Potrebno ih je primijeniti.
+ Primijeni
+ Primjenjivanje novih podešavanja…
+ Nuspjelo primjenjivanje novih podešavanja.
+
+
+ Simbolička poveznica na odredište datoteke poslužitelja nedostaje
+ Simbolička poveznica s vašeg odredišta /system/etc/hosts ne postoji ili je neispravna! AdAway neće raditi ako nije usmjeren na ispravnu datoteku.\n\nŽelite li pokušati stvoriti simboličku poveznicu?
+ Simbolička poveznica nedostaje
+ Nema dovoljno prostora na particiji!\nPokušajte promijeniti odredišnu datoteku poslužitelja u postavkama u /data/data/hosts.
+ Nedovoljno prostora
+ Preuzeta datoteka se ne može pročitati.
+ Neuspjela privatna datoteka
+ Ponovno montiranje particije uslijed neuspjelog čitanja/pisanja!
+ Neuspjelo ponovno montiranje
+ Neuspjelo kopiranje datoteke poslužitelja
+ Neuspjelo kopiranje datoteke poslužitelja!
+ Neuspjelo kopiranje
+ Primijenjeni izvori poslužitelja
+ Uspješno primijenjivanje
+ Primjena je bila uspješna.\nPonekada je potrebno ponovo pokrenuti Android za primijenjivanje promjena.\n\n Želite li ponovno pokrenuti Android?\n (Kako biste izbjegli gubitak podataka pobrinite se da nijedna aplikacija trenutno ne koristi memorijsku karticu!)
+ Simbolička poveznica je uspješno stvorena.\nPonekada je potrebno ponovo pokrenuti Android za primijenjivanje promjena.\n\n Želite li ponovo pokrenuti Android?\n (Kako biste izbjegli gubitak podataka pobrinite se da nijedna aplikacija trenutno ne koristi memorijsku karticu!)
+ Simbolička poveznica je uspješno stvorena
+ Simbolička poveznica se ne može stvoriti na Androidu.\nOvo uobičajeno ne uspijeva zbog \'značajke\' zvane S-ON na HTC telefonima!\n\nRješenje je u ponovnom pokretanju vašeg telefona u način oporavka i stvaranju simboličke poveznice sa naredbom \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nAko ovo ne radi potražite na internetu za S-OFF za vaš telefon.
+ Stvaranje simboličke poveznice je neuspješno
+ Pročitajte pomoć za više informacija.
+ APN proxy je postavljen na vašem Androidu!\nAdAway neće pouzdano raditi na mobilnim 3G mrežama. Taj proxy možete deaktivirati odlaskom na vaš odabrani APN (Iz aplikacije Postavke: Sim kartice -> Sim postavke -> Pristupne točke -> Uredi pristupnu točku) i obrišite podatak u proxy polju.
+ APN proxy je postavljen!
+ Povezivanje s internetom ne radi.
+ Internet nedostupan
+ Preuzimanje…
+ Primijenjivanje…
+ Primijenjivanje blokiranih i neblokiranih popisa
+ Obrada i spajanje datoteka poslužitelja
+ Izgradnja datoteke poslužitelja
+ Primijenjivanje datoteke poslužitelja
+ Neuspjela primjena nove datoteke poslužitelja.
+ Primijenjivanje datoteke poslužitelja na vašem sustavu nije uspjelo!\n Pokušajte promijeniti odredišnu datoteku poslužitelja u postavkama u /data/data/hosts.
+ Primijenjivanje neuspjelo
+ Provjerite vašu aplikaciju root upravljanja kako bi osigurali da je vaš korijenski (root) pristup dopušten.
+ Ponovno koristite izvornu datoteku poslužitelja.\nPonekada je potrebno ponovo pokrenuti Android za primijenjivanje promjena.\n\n Želite li ponovo pokrenuti Android?\n (Kako biste izbjegli gubitak podataka pobrinite se da nijedna aplikacija trenutno ne koristi memorijsku karticu!)
+ Uspješno vraćanje na izvorno
+ Neuspjelo vraćanje izvorne datoteke poslužitelja
+ Neuspješno vraćanje na izvorno uslijed nepoznatih razloga.
+ Neuspješno vraćanje na izvorno!
+ Niti jedan od vaših omogućenih izvora poslužitelja nije dostupan! Jeste li ispravno povezani s internetom?
+ Neuspjelo preuzimanje
+ Neuspjelo zapisivanje nove privatne datoteke poslužitelja
+ Privatna datoteka se ne može stvoriti.
+ Neuspjelo stvaranje privatne datoteke
+ Omogućili ste bezsustavski način rada.\nPonekada je potrebno ponovno pokrenuti Android za primijenjivanje promjena.\n\nŽelite li ponovno pokrenuti Android?\n(Kako biste izbjegli gubitak podataka pobrinite se da nijedna aplikacija trenutno ne koristi memorijsku karticu!)
+ Uspješno omogućeno
+ Onemogućili ste bezsustavski način rada.\nPonekada je potrebno ponovno pokrenuti Android za primijenjivanje promjena.\n\nŽelite li ponovno pokrenuti Android?\n(Kako biste izbjegli gubitak podataka pobrinite se da nijedna aplikacija trenutno ne koristi memorijsku karticu!)
+ Uspješno onemogućeno
+ Neuspjelo omogućavanje VPN blokiranja oglasa.
+ Neuspjelo onemogućavanje VPN blokiranja oglasa.
+ Omogućavanje Magisk modula poslužitelja
+ Omogućite bezsustavsku (systemless) hosts značajku iz Magisk upravitelja. Iz njegovih postavki, omogućite Systemless hosts mogućnost zatim ponovno pokrenite svoj uređaj.
+ Onemogućavanje Magisk modula poslužitelja
+ Onemogućite bezsustavsku (systemless) hosts značajku iz Magisk upravitelja. Iz popisa modula, deinstalirajte Systemless hosts modul zatim ponovno pokrenite svoj uređaj.
+
+
+ URL unosa za datoteku poslužitelja:
+ Ovo nije valjan naziv poslužitelja!
+ Nepravilno oblikovan naziv poslužitelja
+ Ovo nije valjana IP adresa!
+ Nepravilno oblikovana IP adresa
+ Nikada ne pokreći ponovno i ne prikazuj ovo pitanje!
+ Učitavanje…
+
+
+ Osvježi
+ Dodaj
+ Pomoć
+ Uvezi sigurnosnu kopiju
+ Izvezi sigurnosnu kopiju
+
+
+ S-ON/S-OFF
+ Česta pitanja
+ Problemi
+
+
+ Zlonamjerne aplikacije
+ Ovdje možete potražiti zlonamjerne aplikacije, loše aplikacije koje AdAway ne može blokirati. Te aplikacije koriste, na primjer, Airpush obavijesti koje se pojavljuju čak i ako aplikacija nije pokrenuta, a mogu čak promijeniti i melodiju vašeg zvona. Jedina moguća mjera koju možete poduzeti protiv takvih aplikacija je uklanjanje klikom na stavke popisa.
+ Pretraživanje…
+ Nema pronađenih zlonamjernih aplikacija!
+
+
+ Blokator oglasa
+ Nema instaliranog uređivača teksta
+ Nema instaliranog uređivača teksta za otvaranje datoteke poslužitelja. Možete instalirati Jotu ili sličnog uređivača teksta.\n\n Želite li instalirati Jotu?
+ Nema instaliranog upravitelja datoteka
+ Nemoguće je pronaći upravitelja datoteka. Možete instalirati OI File Managera ili drugog upravitelja datoteka.\n\n Želite li instalirati OI File Manager?
+
+
+ Tcpdump
+ TCPdump je alat za nadzor DNS zahtjeva i spremanje istih u datoteku zapisa. Možete ga pokrenuti u pozadini, zatim pokretati aplikacije koje prikazuju oglase, a nakon toga analizirati DNS zahtjeve koristeći datoteku zapisa. Zatim mogući poslužitelj oglasa može biti dodan na popis blokiranih.
+ Onemogći nadgledanje
+ Omogući nadgledanje
+ Prikaži rezultate
+ Razvrstaj domene
+ Obriši zapis
+ Dodaj unos u popis nedopuštenih
+ Dodaj unos u popis dopuštenih
+ Dodaj unos u popis preusmjernih
+
+ Uredi tekstnu vrijednost postavke
+ Otvori izbornik
+ Zatvori izbornik
+
+
+
+ Naslovnica
+ Izvori poslužitelja
+ Vaši popisi
+ Otvori datoteku poslužitelja
+ Zapisuj DNS zahtjeve
+ Pretraži zlonamjerne aplikacije
+ Postavke
+ Pomoć
+
+
+
+
+ DNS zahtjevi
+ Vaši popisi
+ Postavke
+
+
+ Instalirano prije %1$s
+ Najnovija ažuriranja za %1$s
+ Potrebno je ažuriranje za %1$s
+ Posljednje ažuriranje prije %1$s
+ Nepoznato stanje ažuriranja
+ Onemogućeno
+ nekoliko minuta
+
+ %d minuta
+ %d minute
+ %d minuta
+
+
+ %d sat
+ %d sata
+ %d sati
+
+
+ %d dan
+ %d dana
+ %d dana
+
+
+ %d mjesec
+ %d mjeseca
+ %d mjeseca
+
+
+
+ Poslužitelj je kopiran u međuspremnik
+
+
+ pokretanje
+ aktivan
+ zaustavljanje
+ čekanje mreže
+ ponovno povezivanje
+ greška ponovnog povezivanja
+ pauziran
+ zaustavljen
+ VPN blokator oglasa %1$s
+ Pauziraj
+ Nastavi
+
+
+ AdAway dozvole
+ Dopusti interakciju sa AdAwayom
+ Pošalji naredbu u AdAway
+ Dopusti slanje naredbe AdAwayu poput omogućavanja ili onemogućavanja blokiranja oglasa širom sustava
+
+
diff --git a/app/src/main/res/values-hr/strings_app.xml b/app/src/main/res/values-hr/strings_app.xml
new file mode 100644
index 0000000..9acb094
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Blokator oglasa otvorenog kôda
+ AdAway sličica
+
diff --git a/app/src/main/res/values-hr/strings_errors.xml b/app/src/main/res/values-hr/strings_errors.xml
new file mode 100644
index 0000000..8ca3cfe
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Internet nedostupan
+ Nemoguće uspostavljanje povezivanja s internetom. Provjerite svoju mrežnu povezivost uređaja.
+ Neuspjelo preuzimanje izvora poslužitelja
+ Niti jedan od vaših omogućenih izvora poslužitelja nije dostupan! Provjerite jeste li ispravno povezani na internet?
+
+ Neuspjelo stvaranje privatne datoteke
+ Neuspjelo stvaranje privatne datoteke za izgradnju novog izvora poslužitelja. Provjerite slobodan prostor na vašem uređaju.
+ Nedovoljno prostora
+ Neuspjelo kopiranje datoteke poslužitelja na vašu particiju sustava. Provjerite je li Magisk systemless modul omogućen a zatim ponovno pokrenite uređaj.
+ Neuspjela instalacija nove datoteke poslužitelja.
+ Neuspjelo kopiranje datoteka poslužitelja na /system particiju. Provjerite da li je Magisk systemless mogul uključen te zatim ponovno pokrenite uređaj.
+ Neuspjelo vraćanje datoteke poslužitelja
+ Neuspjelo vraćanje izvorne datoteke podešavanja poslužitelja.
+
+ Neuspjelo omogućavanje VPN blokiranja oglasa.
+ Provjerite svoje VPN postavke za dopuštenje aplikaciji VPN pokretanje.
+ Neuspjelo onemogućavanje VPN blokiranja oglasa.
+ Provjerite svoje VPN postavke kako bi ih ručno onemogućili.
+
diff --git a/app/src/main/res/values-hr/strings_home.xml b/app/src/main/res/values-hr/strings_home.xml
new file mode 100644
index 0000000..ada31d4
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_home.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ Blokirani
+ Dopušteni
+ Preusmjereni
+
+
+
+ %d ažurirani izvor
+ %d ažurirana izvora
+ %d ažuriranih izvora
+
+
+ %d zastarjeli izvor
+ %d zastarjela izvora
+ %d zastarjelih izvora
+
+ Provjeri ažuriranja
+ Nadopuni poslužitelje
+
+
+ Prikaži zapis DNS zahtjeva
+
+
+ Prikaži pomoć\ni savjete
+
+
+ Otvori GitHub stranicu
+
+
+ Podržite projekt
+
+
+ Github projekat
+ Postavke
+
+
+ Otvori navigacijsku ladicu
+ Pauziraj/Nastavi blokiranje oglasa
+ Ažuriraj blokirane domene
+ Prikaži zahtijevane domene
+
+
+ Pročitajte pomoć za više informacija.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hr/strings_hosts.xml b/app/src/main/res/values-hr/strings_hosts.xml
new file mode 100644
index 0000000..9a4c960
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Izvori poslužitelja
+
+ Korisnikov popis
+ AdAway službeni poslužitelji
+ StevenBlack objedinjeni poslužitelji
+ Pete Lowe blokirani poslužitelji
+
+ nedostupno
+ %sposlužitelj(a)
+
+ Dodaj izvor
+ Uredi izvor
+ URL: (https:// ili file:// izvor)
+ URL izvora poslužitelja
+
diff --git a/app/src/main/res/values-hr/strings_lists.xml b/app/src/main/res/values-hr/strings_lists.xml
new file mode 100644
index 0000000..7eb2726
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Vaši popisi
+ Dodaj poslužitelja
+
+ Blokirano
+ Dopušteno
+ Preusmjereni
+
+ Filtriranje poslužitelja
+ Pretraga naziva poslužitelja…
+ Ukl/Isk izvore
+
+ Dodaj poslužitelj na popis blokiranih
+ Dodaj poslužitelj u popis neblokiranih
+ Dodaj poslužitelj na popis preusmjernih
+ Uredi popis blokiranih poslužitelja
+ Uredi popis neblokiranih poslužitelja
+ Uredi preusmjeravanje
+ Naziv poslužitelja:
+ URL izvora poslužitelja
+ (Zamjenski znakovi * i ? su dopušteni!)
+ IP (IPv4 ili IPv6):
+
diff --git a/app/src/main/res/values-hr/strings_log.xml b/app/src/main/res/values-hr/strings_log.xml
new file mode 100644
index 0000000..6a3a24b
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Uklj/Isklj bilježenje zapisa
+ Pritisnite tipku snimanja za pokretanje bilježenja zahtjeva, pregledavajte web ili koristite aplikacije, zatim se vratite natag ili povucite po zaslonu za osvježavanje.
+ \n\nBlokirani zahtjevi neće se bilježiti. Prvo onemogućite blokiranje oglasa ako želite i njih bilježiti.
+
+ Abecedno razvrstavanje
+ Ravrstavanje najviše razine
+
+ Preusmjeri domenu
+
diff --git a/app/src/main/res/values-hr/strings_notification.xml b/app/src/main/res/values-hr/strings_notification.xml
new file mode 100644
index 0000000..229a9f8
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Ažuriranja
+ Nova obavijest ažuriranja
+ Dostupno je ažuriranje izvora
+ Nove datoteke poslužitelja su dostupne za preuzimanje.
+ Dostupno je ažuriranje aplikacije
+ Nova inačica AdAwaya je dostupna za preuzimanje.
+
+ VPN
+ Obavijest o pokrenutom VPN-u
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hr/strings_prefs_backup_restore.xml b/app/src/main/res/values-hr/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4d896cb
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Sigurnosno kopiranje i obnova
+ Sigurnosno kopiraj
+ Sigurnosno kopirajte svoja pravila blokiranja na vanjsku pohranu
+ Obnovi
+ Obnovite svoja pravila blokiranja iz datoteke sigurnosne kopije
+
diff --git a/app/src/main/res/values-hr/strings_prefs_main.xml b/app/src/main/res/values-hr/strings_prefs_main.xml
new file mode 100644
index 0000000..6df4a85
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Postavke
+
+ Općenito
+ Tamna tema
+
+ Svjetla
+ Tamna
+ Zadano sustavom
+
+ Automatska ažuriranja
+
+ Blokiranje oglasa
+ Korijenski (root) temeljen blokator oglasa
+ VPN temeljen blokator oglasa
+ Omogući IPv6 podršku
+ Sigurnosno kopiraj / Obnovi pravila blokiranja
+
+ Otklanjanje grešaka
+ Pošalji izvještaj rušenja
+ Pošalji na Sentry (sentry.io).
+ Nije podržano na ovoj izgradnji
+ Opširnije zapisivanje
+ Ponovno pokretanje aplikacije je potrebno za primjenjivanje.
+
diff --git a/app/src/main/res/values-hr/strings_prefs_root.xml b/app/src/main/res/values-hr/strings_prefs_root.xml
new file mode 100644
index 0000000..3c8754d
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Korijenski (root) temeljen blokator oglasa
+
+ Instalacija poslužitelja
+ Otvori datoteku poslužitelja
+ Odredišna datoteka poslužitelja
+ Prije korištenja ove značajke pročitajte Pomoć
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Prilagođeno odredište
+
+ Prilagođena lokacija odredišta
+ Sakrij dijalog ponovnog pokretanja nakon primjenjivanja
+
+ Preusmjeravanje
+ Odredite gdje će se preusmjeravati blokirani poslužitelji
+ IPv4 preusmjeravanja
+ IPv6 preusmjeravanja
+ Nevaljano preusmjeravanje
+
+ Lokalni web poslužitelj
+ Lokalni web poslužitelj osluškuje lokalne IP adrese u svrhu odgovora na blokirane nazive poslužitelja. Može pomoći pri smrzavanju aplikacija kod blokiranih povezivanja.
+ Omogući web poslužitelj
+ Testiraj web poslužitelj
+ Instaliraj samopotpisanu vjerodajnicu
+ Ručna instalacija vjerodajnice
+ Počevši od Androida 11 (R), aplikacije više ne mogu automatski instalirati izdavatelja vjerodajnice (CA).\n\nIdite u \"Sigurnost\" postavke, \"Šifriranje i vjerodajnice\" zatim \" Instaliraj vjerodajnicu\". Tada, odaberite \"CA vjerodajnica\" i odaberite novo izvezvenu datoteku vjerodajnice.
+ Otvori \"Sigurnost\" postavke
+ Provjeravanje…
+ Nije pokrenuto
+ Pokrenuto ali vjerodajnica nije instalirana
+ Pokrenuto i vjerodajnica je instalirana
+ Zamijeni prazan prostor s ikonom aplikacije
+
diff --git a/app/src/main/res/values-hr/strings_prefs_update.xml b/app/src/main/res/values-hr/strings_prefs_update.xml
new file mode 100644
index 0000000..17b21a0
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Ažuriranja
+
+ Ažuriranja aplikacije
+ Provjeri ažuriranja pri pokretanju
+ Povremeno provjeri ažuriranja
+ Uključi beta izdanja
+
+ Ažurianja poslužitelja
+ Provjeri ažuriranja pri pokretanju
+ Povremeno provjeri ažuriranja
+ Uskladi pri ažuriranju
+ Uskladi samo na mrežama s neograničenim podacima
+
diff --git a/app/src/main/res/values-hr/strings_prefs_vpn.xml b/app/src/main/res/values-hr/strings_prefs_vpn.xml
new file mode 100644
index 0000000..bde0556
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN temeljen blokator oglasa
+
+ Omogući pri pokretanju
+ Nadgledaj povezivanje
+ Povremeno provjeri stanje mreže za ponovno pokretanje VPN-a pri prekidanju povezivanja.
+
+ Izuzete aplikacije
+ Postavite koja aplikacija neće koristiti VPN tako da se povezivanja ne blokiraju
+ Izuzmi aplikacije sustava
+
+ Nijedna
+ Sve osim web preglednika
+ Sve
+
+ Izuzmi korisnikove aplikacije
+
+
+ Izuzete aplikacije
+ Odaberi sve
+ Ukloni odabir svih
+ Ikona aplikacije
+
diff --git a/app/src/main/res/values-hr/strings_support.xml b/app/src/main/res/values-hr/strings_support.xml
new file mode 100644
index 0000000..4833fbf
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Podrška
+ Postanite sponzor
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hr/strings_update.xml b/app/src/main/res/values-hr/strings_update.xml
new file mode 100644
index 0000000..7ef602e
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway ažuriranje
+
+ Dostupno ažuriranje!
+
+
+ Ažurirano
+ Dostupno ažuriranje
+ Ažuriranje AdAwaya
+ Ažuriraj odmah
+ %1$s / %2$s
+ Zadnje promjene
+ Popis promjena
+ Podržite razvoj
+ Donirajte
+ Sponzor
+
+
+ Preuzimanje posljednje AdAway inačice…
+
diff --git a/app/src/main/res/values-hr/strings_welcome.xml b/app/src/main/res/values-hr/strings_welcome.xml
new file mode 100644
index 0000000..26e3e37
--- /dev/null
+++ b/app/src/main/res/values-hr/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Dobrodošli
+ Prvi korak instalacije
+ Drugi korak instalacije
+ Posljednji korak instalacije
+
+
+ Dobrodošli u AdAway!
+ AdAway omogućuje dva načina blokiranja oglasa. Odaberite poželjni način:
+
+ Root logotip
+ Root temeljeno\nblokiranje oglasa
+ Brže
+ Baterijski prihvatljivije
+ Root je potreban
+
+ VPN logotip
+ VPN temeljeno\nblokiranje oglasa
+ Sporije
+ Pokreni u pozadini
+ Kompatibilnost
+
+ Potreban je rootani Android
+ Nemoguće je pronaći su izvršnu datoteku ili AdAway nema root dozvole.\n\nOvo se može dogoditi kada vaš uređaj nije rootan. \n Možete pronaći informacije o rootanju vašeg uređaja na wiki.lineageos.org ili na drugim Android web stranicama.
+
+ Prednosti
+ Mane
+
+
+ Usklađivanje završeno
+ Greška tijekom usklađivanja
+
+ Usklađivanje
+ Usklađeno!
+ AdAway preuzima mrežna oglašavanja kako bi ih blokirao iz mrežnih izvora. Možete ih prilagoditi kasnije u postavkama.
+ Ponovno pokušaj uskladiti
+ Neuspjelo usklađivanje: %1$s Ponovno pokušaj odmah?
+
+
+ Podrška
+ Podrži me!
+ Ovo je besplatna aplikacija otvorenog kôda. Razvijam ju u slobodno vrijeme. Stoga ako uživate u njoj, slobodno iskažite svoju podršku:
+ Donirajte na PayPalu
+ Volite li greške? Ni ja isto.
+ Omogući telemetriju kako bi mi poslali izvještaj rušenja
+
+
+ Natrag
+ Sljedeće
+ Završi
+
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
new file mode 100644
index 0000000..e01df69
--- /dev/null
+++ b/app/src/main/res/values-hu/strings.xml
@@ -0,0 +1,264 @@
+
+
+
+ Kilépés
+ Bezárás
+ Igen
+ Nem
+ Hozzáadás
+ Mégse
+ Mentés
+ Súgó
+
+
+ Üdv!
+ Az AdAway egy ingyenes és nyílt forráskódú szoftver, amely blokkolja a hirdetéseket. A hirdetési hálózatok címeit letiltja, hogy blokkolja őket a készüléken.\nSzeretnél többet tudni? Nézd meg az alábbi súgót!
+ További információ megjelenítése
+ Státusz frissítése
+ A kijelölt hosts fájlok letöltése, összefűzése a saját listákkal, majd aktiválás a rendszeren közös hosts fájlként.
+ Hirdetésblokkolás engedélyezése
+ Hirdetésblokkolás letiltása
+ Webszerver
+ Fut
+ Megállítva
+ Webszerver indítása vagy leállítása a localhost-on, amely válaszol a letiltott hostoknak küldött lekérésekre.
+ Webszerver engedélyezése
+ Webszerver letiltása
+ VPN
+ Fut
+ Megállítva
+ Indítsa el vagy állítsa le a VPN-t a kérelmek szűréséhez
+ VPN Bekapcsolása
+ VPN Kikapcsolása
+
+
+ Bejegyzés szerkesztése
+ Alkalmaz
+ Szerkesztés
+ Törlés
+
+
+ Importálás…
+ A biztonsági mentés importja a külső tárolóból sikeres.
+ A biztonsági másolat importálás nem sikerült. Megfelelő a formátuma? További részletekért ellenőrizd a logcat-et.
+ Exportálás…
+ A bizt.mentés sikeresen exportálva \'%s\' néven a külső tárhelyre.
+ Sikertelen a bizt.mentés exportja \'%s\' fájlba.
+
+
+ A hosts fájl
+ A hosts fájl egy olyan rendszerfájl, amely a hosztneveket IP címekhez társítja. Ez egy egyszerű szöveges fájl, melyet az AdAway kezeli. Íme a néhány első sora:
+ Hosts fájl tartalmának betöltése…
+ Hosts fájl megnyitása
+
+
+ Frissítés ellenőrzése…
+ %s forrás frissítésének ellenőrzése
+ Források lekérése
+ Források letöltése %s
+ Források olvasása %s
+ %s forrás elemzése
+ Szabály-adatbázis szinkronizálása
+ Alapértelmezett host fájl visszaállítása
+ Alapértelmezett host fájl visszaállítva
+ Alapértelmezett hosts fájl létrehozása
+ Frissítés érhető el
+ Újabb hosts fájlok érhetők el
+ Nem található forrásfrissítés
+ Nincs internetkapcsolat
+ Nincs elérhető internetkapcsolat
+ Elérhetetlen források
+ Nincs elérhető hosts-fájl forrás!
+ Root hozzáférés megtagadva
+ Engedélyezd a root hozzáférést a root alkalmazásból
+ Valami nem stimmel
+ Ellenőrizd a logcatet további részletekért
+ Engedélyezett
+ A legújabb hosts fájlok vannak engedélyezve
+ Letiltva
+ Az alapértelmezett hosts fájl van telepítve
+ Legújabb források alkalmazása
+ Új hosts fájl készítése
+ Hosts fájl másolása
+ Hosts fájl másolásának ellenőrzése
+ Hosts fájl sikeresen frissítve
+ VPN konfiguráció sikeresen frissítve
+ A konfiguráció megváltozott. Alkalmaznod kell.
+ Alkalmaz
+ Új konfiguráció alkalmazása…
+ Nem sikerült alkalmazni az új konfigurációt.
+
+
+ Hiányzik a hosts fájl symlink
+ A /system/etc/hosts fájlra mutató szimbolikus link nem létezik vagy hibás! Az AdAway nem fog működni, amíg ez nem mutat a megfelelő fájlra.
+
+Szeretnéd megpróbálni létrehozni a szimbolikus linket?
+ Hiányzó symlink
+ Nincs elég hely a partíción!\nPróbáld meg módosítani a cél hosts fájlt /data/data/hosts -ra a beállításokban !
+ Nincs elég hely
+ A letöltött fájlt nem lehet beolvasni.
+ Privát fájl hiba
+ Nem sikerült a partíciót írhatóként újracsatolni!
+ Sikertelen újracsatolás
+ A hosts fájl másolása nem sikerült
+ Nem sikerült a hosts fájl másolása!
+ Sikertelen másolás
+ A hosts források beállítása sikerült
+ Sikeresen alkalmazva
+ Sikeresen alkalmazva.\nElőfordulhat, hogy a módosítások érvényesítéséhez újra kell indítani az Androidot.\n\nSzeretnéd most újraindítani?\n(Az adatvesztés elkerülése érdekében győződj meg róla, hogy egyetlen alkalmazás sem használja az SD kártyát!)
+ A symlink sikeresen létrehozva.\nElőfordulhat, hogy a módosítások érvényesítéséhez újra kell indítani az Androidot.\n\nSzeretnéd most újraindítani?\n(Az adatvesztés elkerülése érdekében győződj meg róla, hogy egyetlen alkalmazás sem használja az SD kártyát!)
+ A symlink létrehozása sikeres
+ Nem tudta létrehozni a symlink-et az Android.\nEz elsősorban a HTC telefonok S-ON \"funkciójának\" köszönhető.\n\nA megoldás az, hogy telefonját recovery módba kapcsolja és létrehozza ott a symlink-et \'ln -s /data/data/hosts /system/etc/hosts\' paranccsal.\n\nHa ez sem működik keressen rá az interneten, arra a szövegre, hogy \"S-OFF + a telefonja\".
+ Szimbolikus link létrehozása sikertelen
+ Kérlek olvassa el a Súgót további információkért!
+ Egy APN proxy van beállítva az készülékén!\nAz AdAway nem fog megbízhatóan működni az olyan mobilhálózatokon, mint pl. a 3G. Ezt a proxy-t deaktiválhatod, ha a kiválasztott APN-hez lépsz (A Beállításokban: Hálózat & Internet -> Mobil hálózat -> Haladó -> Hozzáférési pontok nevei) ás távolítsd el az értéket a proxy mezőből.
+ APN proxy beállítva!
+ Az internetkapcsolat nem működik.
+ Nincs kapcsolat
+ Letöltés…
+ Alkalmazás…
+ Fekete- és fehérlista alkalmazása
+ Hosts fájlok feldolgozása és összefésülése
+ Hosts fájl felépítése
+ Hosts fájl alkalmazása
+ Az új hosts fájl alkalmazása nem sikerült
+ Nem sikerült a hosts fájl alkalmazása rendszeren!\nPróbálja meg /data/data/hosts-ra módosítani a cél hosts fájlt a beállításokban.
+ Az alkalmazás nem sikerült
+ Ellenőrizze a root kezelő alkalmazásban a root hozzáférés megadását.
+ Visszaállította az alapértelmezett hosts fájlt.\nElőfordulhat, hogy a módosítások érvényesítéséhez újra kell indítani az Androidot.\n\nSzeretné most újraindítani?\n(Az adatvesztés elkerülése érdekében győződjön meg róla, hogy egyetlen alkalmazás sem használja az SD kártyát!)
+ Sikeres visszaállítás
+ A hosts fájl visszaállítása nem sikerült
+ A visszaállítás ismeretlen ok miatt nem sikerült.
+ Sikertelen visszaállítás!
+ Egyik engedélyezett hosts fájl sem érhető el! Megfelelő az internetkapcsolat?
+ Sikertelen letöltés
+ A privát hosts fájl írása nem sikerült
+ Privát fájl nem hozható létre.
+ Privát fájl létrehozása sikertelen.
+ Engedélyezte a systemless módot.\nElőfordulhat, hogy a módosítások érvényesítéséhez újra kell indítani az Androidot.\n\nSzeretné most újraindítani?\n(Az adatvesztés elkerülése érdekében győződj meg róla, hogy egyetlen alkalmazás sem használja az SD kártyát!)
+ Engedélyezés sikeres
+ Kikapcsolta a systemless módot.\nElőfordulhat, hogy a módosítások érvényesítéséhez újra kell indítani az Androidot.\n\nSzeretné most újraindítani?\n(Az adatvesztés elkerülése érdekében győződj meg róla, hogy egyetlen alkalmazás sem használja az SD kártyát!)
+ Sikerült a letiltás
+ Nem sikerült a VPN reklámblokkolás engedélyezése.
+ Nem sikerült letiltani a VPN reklámblokkolást.
+ Magisk hosts modul engedélyezése
+ Systemless hosts funkció bekapcsolása a Magisk managerben. A beállításokban kapcsolja be a Systemless hosts lehetőséget, majd indítsa újra a készüléket.
+ Magisk hosts modul letiltása
+ Systemless hosts funkció kikapcsolása a Magisk managerben. A modul listából távolítssa el a Systemless hosts modult majd indítsa újra az eszközt.
+
+
+ Adja meg a host fájl URL címét:
+ Ez nem egy érvényes hosztnév!
+ Helytelenül formázott hosztnév
+ Ez nem érvényes IP!
+ Helytelenül formázott IP cím
+ Soha ne indítsa újra és ne jelenítse meg ezt a kérdést legközelebb!
+ Betöltés…
+
+
+ Frissítés
+ Hozzáadás
+ Súgó
+ Bizt.mentés import
+ Bizt.mentés export
+
+
+ S-ON/S-OFF
+ GYIK
+ Problémák
+
+
+ Adware
+ Itt megtalálhatja a telepített adware-eket, a rossz alkalmazásokat, amelyeket az AdAway nem blokkolhat. Ezek az alkalmazások például Airpush értesítéseket használnak, amelyek akkor is megjelennek, ha az alkalmazás nem fut, vagy akár csengőhangot is megváltoztathatnak. Az egyetlen használható megoldás az, hogy ezeket az alkalmazásokat a listaelemekre kattintva eltávolítja.
+ Keresés…
+ Nem található adware!
+
+
+ Hirdetésblokkoló
+ Nincs telepítve szövegszerkesztő
+ Nem találni olyan szövegszerkesztőt, amely megnyitná a hosts fájlt. A fájl kezeléséhez feltelepítheti a Jota-t vagy más szövegszerkesztőt. Szeretné telepíteni a Jota-t?
+ Nincs telepítve fájlkezelő
+ Nincs olyan fájlkezelő telepítve, amely megnyithatná a fájlt. A fájl kezeléséhez telepítheti az OI File Manager-t, vagy bármilyen más fájlkezelőt. Szeretné telepíteni az OI File Manager-t?
+
+
+ Tcpdump
+ A tcpdump olyan eszköz, amely monitorozza és elmenti egy naplófájlba a DNS kéréseket. Futtassa a háttérben, majd a reklámokat megjelenítő alkalmazások elindítását követően után elemezze a DNS kérések a napló alapján. A lehetséges reklámkiszolgáló-szerverek ezután hozzáadhatóak a feketelistához.
+ Monitorozás tiltása
+ Monitorozás engedélyezése
+ Eredmények megjelenítése
+ Domainek rendezése
+ Napló törlése
+ Elem hozzáadása feketelistához
+ Elem hozzáadása fehérlistához
+ Elem hozzáadása az átirányítási listához
+
+ Szöveges beállítási érték szerkesztése
+ Menü megnyitása
+ Menü bezárása
+
+
+
+ Kezdőlap
+ Hosts források
+ Saját listák
+ Hosts fájl megnyitása
+ A DNS kérések naplózása
+ Adware keresése
+ Beállítások
+ Súgó
+
+
+
+
+ DNS kérések
+ Saját listák
+ Beállítások
+
+
+ Telepítve %1$sezelőtt
+ Friss (frissítve %1$s ezelőtt)
+ %1$sfrissítése szükséges
+ Utolsó frissítés %1$s ezelőtt
+ Ismeretlen frissítési státusz
+ Letiltva
+ néhány perce
+
+ %d perc
+ %d perc
+
+
+ %d óra
+ %d óra
+
+
+ %d nap
+ %d nap
+
+
+ %d hónap
+ %d hónap
+
+
+
+ Host a vágólapra másolva
+
+
+ elindítás
+ aktív
+ megállítás
+ várakozás a hálózatra
+ újracsatlakozás
+ újracsatlakozási hiba
+ szüneteltetve
+ megállítva
+ Hirdetésblokkoló VPN %1$s
+ Szüneteltetés
+ Folytat
+
+
+ AdAway engedélyek
+ Engedélyezd az AdAway-interakciót
+ Parancsok küldése az AdAway-nek
+ Parancsküldés engedélyezése az AdAway számára, pl. a rendszerszintű hirdetésblokkolás engedélyezése vagy letiltása
+
+
diff --git a/app/src/main/res/values-hu/strings_app.xml b/app/src/main/res/values-hu/strings_app.xml
new file mode 100644
index 0000000..532361a
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Nyílt forráskódú hirdetésblokkoló
+ AdAway logo
+
diff --git a/app/src/main/res/values-hu/strings_errors.xml b/app/src/main/res/values-hu/strings_errors.xml
new file mode 100644
index 0000000..cad3159
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Nincs internetkapcsolat
+ Nem sikerült kapcsolatot létesíteni az internettel. Ellenőrizze az eszköz csatlakozását.
+ Nem sikerült letölteni a host forrást
+ Egyik engedélyezett hosts forrás sem érhető el. Ellenőrizze, megfelelően csatlakozik-e az internethez.
+
+ Nem sikerült létrehozni a privát fájlt
+ Nem lehet privát fájlt létrehozni új hosts forrás létrehozásához. Ellenőrizze a készüléken a szabad tárhelyet.
+ Nincs elég hely
+ Nem lehet a hosts fájlt a rendszerpartícióra másolni. Ellenőrizze, hogy a Magisk systemless modul engedélyezve van-e, majd indítsa újra.
+ Nem sikerült az új hosts fájl telepítése
+ A hosts fájl nem másolható a /system partícióra. Ellenőrizd, hogy a Magisk systemless modul engedélyezve van-e, majd indítsd újra.
+ A hosts fájl visszaállítása nem sikerült
+ Nem sikerült visszaállítani az alapért. hosts fájl konfigurációt.
+
+ Nem sikerült engedélyezni a VPN reklámblokkolást.
+ Jelöld be a VPN beállításoknál, hogy engedélyezze az app VPN indítását.
+ Nem sikerült letiltani a VPN reklámblokkolást.
+ Ellenőrizd a VPN beállításokat a manuális letiltáshoz.
+
diff --git a/app/src/main/res/values-hu/strings_home.xml b/app/src/main/res/values-hu/strings_home.xml
new file mode 100644
index 0000000..db39e71
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Blokkolt
+ Megengedve
+ Átirányítva
+
+
+
+ %d up-to-date source
+ %d naprakész forrás
+
+
+ %d outdated source
+ %d elavult forrás
+
+ Hosts frissítések ellenőrzése
+ Hosztok frissítése
+
+
+ Mutassa a DNS kérések naplót
+
+
+ Mutassa a súgó\nand tippeket
+
+
+ GitHub oldal megnyitása
+
+
+ Projekt támogatása
+
+
+ GitHub projekt
+ Beállítások
+
+
+ Navigációs fiók megnyitása
+ Reklámblokkolás szünet/folytat
+ Blokkolt domainek frissítése
+ A kért domainek megjelenítése
+
+
+ Kérlek olvassa el a Súgót további információkért!
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hu/strings_hosts.xml b/app/src/main/res/values-hu/strings_hosts.xml
new file mode 100644
index 0000000..220ee21
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts források
+
+ Felhasználói lista
+ AdAway official hosts
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ nem érhető el
+ %shoszt
+
+ Forrás hozzáadása
+ Forrás szerkesztése
+ URL: (https:// vagy file:// erőforrás)
+ Hosts fájl forrása (URL)
+
diff --git a/app/src/main/res/values-hu/strings_lists.xml b/app/src/main/res/values-hu/strings_lists.xml
new file mode 100644
index 0000000..d37b614
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Saját listák
+ Host hozzáadása
+
+ Blokkolt
+ Megengedett
+ Átirányítva
+
+ Hosztok szűrése
+ Hosztnevek keresése
+ Források váltása
+
+ Hoszt hozzáadása a feketelistához
+ Hoszt hozzáadása a fehérlistához
+ Hoszt átirányítás hozzáadása
+ Feketelistás hostok szerkesztése
+ Fehérlista szerkesztése
+ Átirányítás szerkesztése
+ Hosztnév:
+ Hosts fájl forrása (URL)
+ (Helyettesítő karakterek * és ? használata is engedélyezett!)
+ IP (IPv4 vagy IPv6):
+
diff --git a/app/src/main/res/values-hu/strings_log.xml b/app/src/main/res/values-hu/strings_log.xml
new file mode 100644
index 0000000..05210af
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Rendezés ABC sorrendben
+ Rendezés TLD szerint
+
+ Domain átirányítása
+
diff --git a/app/src/main/res/values-hu/strings_notification.xml b/app/src/main/res/values-hu/strings_notification.xml
new file mode 100644
index 0000000..d71c3cd
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Frissítések
+ Új frissítés értesítések
+ Frissítés érhető el
+ Újabb hosts fájl elérhető.
+ Alkalmazás frissítés elérhető
+ Az AdAway új verziója letölthető.
+
+ VPN
+ VPN futása értesítések
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hu/strings_prefs_backup_restore.xml b/app/src/main/res/values-hu/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..ea88a90
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Mentés & visszaállítás
+ Biztonsági mentés
+ Blokkszabályok biztonsági mentése külső tárhelyre
+ Visszaállítás
+ Blokkszabályok visszaállítása a biztonsági mentés fájlból
+
diff --git a/app/src/main/res/values-hu/strings_prefs_main.xml b/app/src/main/res/values-hu/strings_prefs_main.xml
new file mode 100644
index 0000000..d675ddc
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Beállítások
+
+ Általános
+ Sötét téma
+
+ Világos
+ Sötét
+ Rendszer alapértelmezett
+
+ Automatikus frissítések
+
+ Hirdetésblokkolás
+ Root alapú hirdetésblokkolás
+ VPN alapú hirdetésblokkolás
+ IPv6 engedélyezése
+ Blokkszabályok mentése / visszaállítása
+
+ Hibakeresés
+ Összeomlási jelentések BE
+ Az alkalmazás hibaüzenet- és összeomlási jelentést küld a Sentry-nek (sentry.io).
+ Nem támogatott ezen a verzión
+ Részletes naplózás bekapcsolása
+ Újra kell indítani az AdAway-t a beállítás életbe léptetéséhez.
+
diff --git a/app/src/main/res/values-hu/strings_prefs_root.xml b/app/src/main/res/values-hu/strings_prefs_root.xml
new file mode 100644
index 0000000..8b29bbd
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Root alapú hirdetésblokkolás
+
+ Hosts telepítése
+ Hosts fájl megnyitása
+ Cél hosts fájl
+ Ezen beállítás módosítása előtt olvassa el a Súgó vonatkozó fejezetét!
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Egyéni cél
+
+ Egyéni cél
+ Újraindítási ablak elrejtése
+
+ Átirányítás
+ Adja meg hova irányítsa a letiltott hosztokat
+ IPv4 átirányítás
+ IPv6 átirányítás
+ Érvénytelen átirányítás
+
+ Helyi webszerver
+ A helyi webszerver meghallgatja a helyi IP-címeket, hogy válaszoljon a blokkolt gazdagép-kérelmekre. Segítheti az alkalmazás lefagyasztását blokkolt kapcsolat esetén.
+ Webszerver engedélyezése
+ Webszerver tesztelése
+ Önaláírt tanusítvány telepítése
+ Tanusítvány manuális telepítése
+ Az Android 11 (R) verziótól kezdve az alkalmazás már nem tudja automatikusan telepíteni a tanusítványt (CA).\n\nLépjen a \"biztonsági\" beállítások menübe, majd \"Titkosítás és hitelesítő adatok\", azután a \"Tanusítvány telepítése\" opcióba. Ott válassza a \"CA tanusítványt\" és jelölje ki az újonnan exportált fájlt.
+ \"Biztonsági\" beállítások megnyitása
+ Ellenőrzés…
+ Nem fut
+ Fut, de a tanusítvány nincs telepítve
+ Fut és a tanusítvány telepítve van
+ Üres hirdetési felület cseréje az alkalmazás ikonra
+
diff --git a/app/src/main/res/values-hu/strings_prefs_update.xml b/app/src/main/res/values-hu/strings_prefs_update.xml
new file mode 100644
index 0000000..1df7dab
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Frissítések
+
+ Alkalmazás frissítések
+ Indításkor a frissítések ellenőrizése
+ Frissítések keresése naponta
+ Tartalmazza a béta verziókat
+
+ Hosts frissítések
+ Indításkor a frissítések ellenőrizése
+ Frissítések keresése naponta
+ Szinkronizálás frissítéskor
+ Szinkronizálás csak nem mért hálózaton
+
diff --git a/app/src/main/res/values-hu/strings_prefs_vpn.xml b/app/src/main/res/values-hu/strings_prefs_vpn.xml
new file mode 100644
index 0000000..410b0d3
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN alapú hirdetésblokkolás
+
+ Engedélyezés indításkor
+ Kapcsolat figyelő
+ Rendszeresen ellenőrzi a hálózat állapotát a VPN újraindításához a szétkapcsoláskor.
+
+ Kizárt alkalmazások
+ Állítsa be, mely alkalmazások ne használják a VPN-t. Így egyetlen kapcsolat sem lesz blokkolva.
+ Rendszeralkalmazások kizárása
+
+ None
+ All except browsers
+ All
+
+ Felhasználói alkalmazások kizárása
+
+
+ Kizárt alkalmazások
+ Összes kijelölése
+ Összes kijelölésének törlése
+ Application icon
+
diff --git a/app/src/main/res/values-hu/strings_support.xml b/app/src/main/res/values-hu/strings_support.xml
new file mode 100644
index 0000000..be3c01f
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Támogatás
+ Legyél szponzor
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hu/strings_update.xml b/app/src/main/res/values-hu/strings_update.xml
new file mode 100644
index 0000000..7d0c1cc
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway frissítés
+
+ Frissítés elérhető!
+
+
+ Naprakész vagy
+ Frissítés érhető el
+ AdAway frissítése
+ Frissítés most
+ %1$s / %2$s
+ Utolsó változtatások
+ Változásnapló
+ Fejlesztés támogatása
+ Adományozás
+ Támogató
+
+
+ Legutóbbi AdAway verzió letöltése…
+
diff --git a/app/src/main/res/values-hu/strings_welcome.xml b/app/src/main/res/values-hu/strings_welcome.xml
new file mode 100644
index 0000000..43be991
--- /dev/null
+++ b/app/src/main/res/values-hu/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Üdv
+ A varázsló első lépése
+ A varázsló második lépése
+ A varázsló utolsó lépése
+
+
+ Üdv az AdAway alkalmazásban!
+ Az AdAway két hirdetésblokkoló módot kínál. Válassza ki azt, amelyik tetszik:
+
+ Root logo
+ Root alapú\nhirdetésblokkolás
+ Gyorsabb
+ Akkumulátor-barát
+ Root szükséges
+
+ VPN logo
+ VPN alapú\nhirdetésblokkolás
+ Lassabb
+ Fut a háttérben
+ Kompatibilitás
+
+ Rootolt Android szükséges
+ Vagy nem található a su bináris, vagy nem engedélyezte a root hozzáférést az AdAway számára.\n\nEz akkor fordulhat elő, ha az eszköt nem rendelkezik root jogosultságokkal. A készülék rootolásáról további információkat a wiki.lineageos.org vagy más Android weboldalon talál.
+
+ Előny
+ Hátrány
+
+
+ Szinkronizálás kész
+ Hiba történt a szinkronizálás közben
+
+ Szinkronizálás
+ Szinkronizálva!
+ Az AdAway letölti a hirdetési hálózatokat, hogy blokkolja az online forrásokat. A beállításokban később testreszabhatja őket.
+ Szinkronizálás újrapróbálása
+ Nem sikerült a szinkronizálás: %1$s Újrapróbálkozás?
+
+
+ Támogatás
+ Támogass engem!
+ Ez egy ingyenes és nyílt forráskódú alkalmazás. A szabadidőmben fejlesztem, ezért ha tetszik a projekt, és megteheted, támogass:
+ Támogatás PayPal-on keresztül
+ Szereted a bugokat? Én se.
+ Telemetria engedélyezése összeomlási jelentések küldéséhez
+
+
+ Vissza
+ Következő
+ Befejezés
+
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
new file mode 100644
index 0000000..b1300e4
--- /dev/null
+++ b/app/src/main/res/values-in/strings.xml
@@ -0,0 +1,258 @@
+
+
+
+ Keluar
+ Tutup
+ Ya
+ Tidak
+ Tambah
+ Batal
+ Simpan
+ Bantuan
+
+
+ Selamat Datang!
+ AdAway adalah perangkat lunak gratis dengan desain kode terbuka untuk memblokir iklan. AdAway menangkap alamat-alamat jaringan iklan untuk memblokirnya di perangkatmu.\nIngin tahu lebih? Lihat bantuan di bawah!
+ Tampilkan semua bantuan
+ Keterangan pembaharuan
+ Semua file hosts dari sumber yang ditentukan sudah didownload dan digabungkan dengan daftar anda dan dipasang menjadi satu file host dalam sistem anda.
+ Hidupkan pemblokir iklan
+ Matikan pemblokir iklan
+ Layanan perambah
+ Berjalan
+ Berhenti
+ Mulai atau hentikan web server pada localhost untuk menjawab permintaan untuk memblok hostnames
+ Hidupkan layanan perambah
+ Matikan layanan perambah
+ VPN
+ Berjalan
+ Berhenti
+ Mulai atau hentikan VPN untuk menyaring permintaan
+ Hidupkan VPN
+ Matikan VPN
+
+
+ Ubah Masukan
+ Terapkan
+ Sunting
+ Hapus
+
+
+ Mengimpor …
+ Cadangan sukses diimpor dari penyimpanan eksternal anda
+ Cadangan gagal diimpor. Apakah formatnya benar? Lihat logcat untuk detail lebih.
+ Mengekspor …
+ File backup \'%s\' berhasil di export ke penyimpanan eksternal
+ Gagal untuk mengeksport file backup \'%s\'.
+
+
+ Daftar hosts
+ File host adalah File sistem yang memetakan antara nama host dengan alamat IP. Itu adalah file teks biasa yang konfigurasinya ditangani oleh Adaway. Berikut beberapa baris pertamanya:
+ Membaca isi file host…
+ Buka file host
+
+
+ Memeriksa pembaruan
+ Cek pembaruan sumber %s
+ menerima sumber
+ Mengunduh sumber %s
+ membaca sumber %s
+ Mengurai %s sumber
+ Mensinkronasi peraturan database
+ Mengembalikan ke file hosts standar
+ file hosts kembali ke standar
+ Membuat host file standar
+ Sumber pembaruan tersedia
+ Berkas hosts terbaru tersedia
+ Tidak ada pembaruan
+ Tidak ada koneksi internet
+ Tidak ada koneksi internet yang tersedia
+ Sumber tidak tersedia
+ Tidak ada sumber host yang terjangkau!
+ Akses root ditolak
+ Ijinkan akses root dari aplikasi root anda
+ Terjadi kesalahan
+ Periksa logcat untuk lebih jelasnya
+ Dinyalakan
+ Berkas hosts terbaru dinyalakan
+ Dimatikan
+ File host bawaan dipasang
+ Terapkan sumber terbaru
+ Membuat file host baru
+ Menyalin file host baru
+ Memeriksa salinan file host
+ Berhasil memperbarui file host
+ Berhasil memperbarui konfigurasi VPN
+ Konfigurasi anda berubah. Anda perlu menerapkannya.
+ Terapkan
+ Menerapkan konfigurasi baru…
+ Gagal menerapkan konfigurasi baru
+
+
+ Symlink ke target file host tidak di temukan
+ Symlink dari target ke /system/etc/hosts tidak benar atau tidak ada! AdAway tidak akan bekerja jika hal itu tidak dibetulkan.\n\nApa anda ingin mencoba membuat symlink?
+ Symlink tidak ditemukan
+ Tidak ada cukup ruang di partisi!\nCobalah mengganti target file host di prefrensi menjadi /data/data/hosts.
+ Tidak cukup ruang
+ Berkas terunduh tidak dapat dibaca.
+ Berkas pribadi gagal
+ Mount ulang partisi sebagai read/write gagal!
+ remount gagal
+ Gagal menyalin file host
+ Penyalinan file host gagal!
+ Penyalinan gagal
+ Sumber host diterapan
+ Penerapan berhasil
+ Penerapan telah berhasil. Anda mungkin perlu melakukan reboot Android untuk perubahan berefek. Apakah Anda ingin reboot? (Untuk mencegah kehilangan data pastikan tidak ada aplikasi menggunakan sdcard saat ini!)
+ Symlink telah berhasil dibuat.\nIni mungkin membutuhkan memuat ulang Android untuk mendapatkan hasil dari perubahan.\n\nApakah anda ingin memuat ulang?\n(Untuk mencegah adanya kehilangan data, pastikan tidak ada aplikasi yang menggunakan kartu SD pada saat ini!)
+ Pembuatan symlink berhasil
+ Symlink tidak dapat di buat oleh Android.\nKebanyakan ini gagal karena \'fitur\' yang disebut S-ON pada ponsel HTC!\n\nSolusi untuk masalah ini adalah dengan masuk ke mode recovery lalu buat symlink dengan perintah \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nJika masih tidak mempan carilah di Internet cara untuk S-OFF ponselmu.
+ Pembuatan symlink gagal
+ Silahkan baca Help untuk informasi lebih lanjut.
+ Sebuah proksi APN terkonfigurasi pada Android mu!\nAdAway mungkin tidak berdungsi semestinya pada jaringan seperti 3G. Kamu bisa mematikan proksi pada APN terkonfigurasi (Pengaturan aplikasi: Jaringan & Internet -> Jaringan Mobile -> Lanjutan -> Nama Akses Poin) dan hapus nilai pada kolom proksi.
+ APN peladen pewali ditentukan!
+ Koneksi internet tidak berfungsi.
+ Tidak ada koneksi
+ Sedang mendownload…
+ Menerapkan perubahan…
+ Menerapkan daftar hitam dan putih
+ Mengakses dan menggabungkan file host
+ Menyusun file hosts
+ Menerapkan file host
+ Gagal menerapkan file host baru
+ Penerapan file host ke sistem anda gagal!\nCobalah untuk mengganti target file host di prefrensi ke /data/data/hosts.
+ Pemasangan gagal
+ Mohon cek aplikasi manajemen root Anda untuk memastikan akses root telah diberikan.
+ Anda mengembalikan ke file host bawaan.\nIni mungkin membutuhkan memuat ulang Android untuk mendapatkan hasil dari perubahan.\n\nApakah anda ingin memuat ulang?\n(Untuk mencegah adanya kehilangan data, pastikan tidak ada aplikasi yang menggunakan kartu SD pada saat ini!)
+ Pengembalian berhasil
+ Tidak bisa mengembalikan file host
+ Pengembalian gagal karena alasan yang tidak diketahui.
+ Pengembalian gagal
+ Tak satu pun dari sumber host yang Anda aktifkan bisa dijangkau! Apakah Anda terhubung dengan benar dengan internet?
+ Download gagal
+ Gagal membuat file hosts pribadi
+ Berkas pribadi tidak dapat dibuat.
+ Pembuatan berkas pribadi gagal
+ Kamu mengaktifkan mode systemless.\nlt perlu sekiranya untuk memulai ulang Android agar perubahan efektif.\n\nIngin memulai ulang?\n(Untuk mencegah kehilangan data pastikan tidak ada aplikasi yang menggunakan kartu SD saat ini!)
+ Aktivasi berhasil
+ Kamu mematikan mode systemless.\nlt perlu sekiranya untuk memulai ulang Android agar perubahan efektif.\n\nIngin memulai ulang?\n(Untuk mencegah kehilangan data pastikan tidak ada aplikasi yang menggunakan kartu SD saat ini!)
+ Berhasil menonaktifkan
+ Gagal mengaktifkan VPN pem-blok iklan
+ Gagal mematikan VPN pem-blok iklan
+ Mengaktifkan modul hosts Magisk
+ Aktifkan fitur systemless host dari Magisk Manager. Melalui pengaturan, aktifkan pilihan Systemless hosts lalu mulai ulang perangkatmu.
+ Menonaktifkan modul hosts Magisk
+ Matikan fitur systemless host dari Magisk Manager. Dari daftar modul, uninstall modul Systemless hosts lalu mulai ulang perangkatmu.
+
+
+ Masukan URL ke file hosts:
+ Ini bukan hostname yang benar!
+ Hostname tidak diformat dengan benar
+ Ini bukan IP yang benar!
+ IP tidak diformat dengan benar
+ Jangan pernah nyalakan ulang dan jangan tampilkan pertanyaan ini lain kali
+ Memuat…
+
+
+ Segarkan
+ Tambah
+ Bantuan
+ Impor cadangan
+ Ekspor cadangan
+
+
+ S-ON/S-OFF
+ FAQ
+ Masalah
+
+
+ Adware
+ Disini Anda dapat menemukan adware yang terpasang, aplikasi jelek yang tidak dapat diblok oleh AdAway. Aplikasi ini digunakan sebagai contoh, notifikasi Airpush yang muncul ketika aplikasi tidak berjalan ataupun mengganti ringtonemu. Satu-satunya penanggulangan yang tersedia adalah melepas aplikasi-aplikasi tersebut dengan mengklik pada daftar item.
+ Memindai…
+ Adware tidak ditemukan!
+
+
+ Ad blocker
+ Tidak terinstal pengedit teks
+ Tidak ada editor teks yang dapat ditemukan untuk membuka file host. Anda bisa menginstal Jota atau teks editor lain.\n\nApakah anda ingin menginstal Jota?
+ Tidak ada manager file yang terpasang
+ Tidak ada manajer file yang dapat ditemukan untuk membuka file. Anda bisa menginstal OI File Manager atau manajer file lain.\n\nApakah anda ingin menginstal OI File Manager?
+
+
+ Tcpdump
+ Tcpdump adalah alat untuk memonitor permintan DNS dan menyimpannya ke file. Anda bisa membuka aplikasi yang memunculkan iklan, dan selanjutnya menganalisai permintaan DNS. Server iklan bisa tisa di tambahkan ke daftar hitam anda.
+ Matikan pemantauan
+ Hidupkan pemantauan
+ Tampilkan hasil
+ Sortir domain
+ Bersihkan catatan
+ Tambahkan pada daftar hitam
+ Tambahkan pada daftar putih
+ Tambahkan pada daftar pengalihan
+
+ Ubah nilai preferensi teks
+ Buka menu
+ Tutup menu
+
+
+
+ Beranda
+ Sumber host
+ Daftar pribadi
+ Buka berkas hosts
+ Catatan permintaan DNS
+ Pindai terhadap adware
+ Pengaturan
+ Bantuan
+
+
+
+
+ Aktifitas DNS
+ Daftar pribadi
+ Pengaturan
+
+
+ Terpasang %1$s yang lalu
+ Pembaruan untuk %1$s
+ Pembaruan dibutuhkan untuk %1$s
+ Pembaruan terakhir %1$s yang lalu
+ Status pembaharuan tidak diketahui
+ Dimatikan
+ beberapa menit
+
+ %d menit
+
+
+ %d jam
+
+
+ %d hari
+
+
+ %d bulan
+
+
+
+ Host terkopi ke papan klip
+
+
+ memulai
+ Aktif
+ menghentikan
+ menunggu jaringan
+ menghubungkan
+ gagal menghubungkan
+ Jeda
+ berhenti
+ VPN Pem-blok iklan %1$s
+ Jeda
+ Lanjutkan
+
+
+ Izin AdAway
+ Izinkan untuk berinteraksi dengan AdAway
+ Kirim perintah ke AdAway
+ Izinkan untuk mengirim perintah ke AdAway, seperti mengaktifkan atau mematikan system-wide ad-blocking
+
+
diff --git a/app/src/main/res/values-in/strings_app.xml b/app/src/main/res/values-in/strings_app.xml
new file mode 100644
index 0000000..23843b5
--- /dev/null
+++ b/app/src/main/res/values-in/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Ad blocker Open Source
+ logo AdAway
+
diff --git a/app/src/main/res/values-in/strings_errors.xml b/app/src/main/res/values-in/strings_errors.xml
new file mode 100644
index 0000000..03a342f
--- /dev/null
+++ b/app/src/main/res/values-in/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Tidak ada koneksi internet
+ Tidak bisa menyambung koneksi ke internet. Tolong cek koneksi perangkat anda.
+ Gagal mengunduh sumber hosts
+ Tidak ada satupun sumber hosts anda dapat terjangkau. Tolong cek bahwa anda sudah benar terkoneksi ke internet.
+
+ Gagal untuk membuat file private
+ Gagal membuat file private untuk membangun sumber hosts baru. Tolong cek ruang penyimpanan yang tersedia di perangkat anda.
+ Tidak cukup ruang
+ Tidak bisa menduplikasi file hosts ke partisi system anda. Tolong cek modul Magisk systemless diaktifkan dan mulai ulang.
+ Gagal untuk memasang file hosts baru
+ Tidak dapat menyalin file ke partisi /system, cek modul systemless Magisk, aktifkan, kemudian reboot.
+ Gagal mengembalikan file host
+ Gagal mengembalikan host ke aturan bawaan
+
+ Gagal mengaktifkan VPN pem-blok iklan
+ Cek peraturan VPN untuk mengizinkan aplikasi memulai VPN
+ Gagal mematikan VPN pem-blok iklan
+ Cek peraturan VPN untuk menonaktifkan secara manual
+
diff --git a/app/src/main/res/values-in/strings_home.xml b/app/src/main/res/values-in/strings_home.xml
new file mode 100644
index 0000000..b344be4
--- /dev/null
+++ b/app/src/main/res/values-in/strings_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ Diblokir
+ Diizinkan
+ Dialihkan
+
+
+
+ %d sumber up-to-date
+
+
+ %d sumber usang
+
+ Mengecek pembaruan host
+ Perbaharui daftar
+
+
+ Perlihatkan log DNS requests
+
+
+ Tampilkan bantuan\ndan tips
+
+
+ Buka GitHub Page
+
+
+ Dukung proyek
+
+
+ Proyek GitHub
+ Pengaturan
+
+
+ Buka laci navigasi
+ Jeda / lanjutkan pemblokiran iklan
+ Perbarui domain yang diblokir
+ Tampilkan domain yang diminta
+
+
+ Silahkan baca Help untuk informasi lebih lanjut.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-in/strings_hosts.xml b/app/src/main/res/values-in/strings_hosts.xml
new file mode 100644
index 0000000..800befd
--- /dev/null
+++ b/app/src/main/res/values-in/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Sumber host
+
+ User list
+ Official AdAway host
+ Hosts StevenBlack Unified
+ Hosts Pete Lowe blocklist
+
+ Tidak tersedia
+ %s hosts
+
+ Tambah sumber
+ Ubah sumber
+ URL: (a https:// atau file:// sumber)
+ Alamat sumber daftar
+
diff --git a/app/src/main/res/values-in/strings_lists.xml b/app/src/main/res/values-in/strings_lists.xml
new file mode 100644
index 0000000..1a50511
--- /dev/null
+++ b/app/src/main/res/values-in/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Daftar pribadi
+ Tambah hosts
+
+ Diblokir
+ Diizinkan
+ Dialihkan
+
+ Filter host
+ Cari hostname…
+ Beralih sumber
+
+ Tambahkan pada daftar hitam
+ Tambahkan pada daftar putih
+ Tambahkan pada daftar pengalihan
+ Sunting host daftar hitam
+ Sunting host daftar putih host
+ Kelola pengalihan
+ Hostname:
+ Alamat sumber daftar
+ (Karakter * dan ? diperbolehkan)
+ IP (IPv4 atau IPv6):
+
diff --git a/app/src/main/res/values-in/strings_log.xml b/app/src/main/res/values-in/strings_log.xml
new file mode 100644
index 0000000..0383312
--- /dev/null
+++ b/app/src/main/res/values-in/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Tombol rekam log
+ Tekan rekam untuk memulai log, browsing atau gunakan aplikasi target, kemudian kembali atau refresh halaman ini
+ \n\nNonaktifkan ad-block dulu sebelum memuali log
+
+ Urutkan sesuai abjad
+ Urutkan sesuai TLD
+
+ Alihkan domain
+
diff --git a/app/src/main/res/values-in/strings_notification.xml b/app/src/main/res/values-in/strings_notification.xml
new file mode 100644
index 0000000..52370e9
--- /dev/null
+++ b/app/src/main/res/values-in/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Pembaruan
+ Notifikasi pembaruan
+ Sumber pembaruan tersedia
+ File host terbaru tersedia untuk di unduh
+ Pembaruan app tersedia
+ AdAway versi terbaru tersedia untuk di unduh.
+
+ VPN
+ Notifikasi VPN berjalan
+
diff --git a/app/src/main/res/values-in/strings_prefs_backup_restore.xml b/app/src/main/res/values-in/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..76477c6
--- /dev/null
+++ b/app/src/main/res/values-in/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Backup & pulihkan
+ Backup
+ Backup aturan blokir ke penyimpanan eksternal
+ Pulihkan
+ Pulihkan aturan blookir dari berkas backup
+
diff --git a/app/src/main/res/values-in/strings_prefs_main.xml b/app/src/main/res/values-in/strings_prefs_main.xml
new file mode 100644
index 0000000..6abae13
--- /dev/null
+++ b/app/src/main/res/values-in/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Pengaturan
+
+ Umum
+ Gunakan tema gelap
+
+ Terang
+ Gelap
+ Bawaan sistem
+
+ Pembaruan otomatis
+
+ Pemblokir iklan
+ Mode root
+ Mode vpn
+ Aktifkan IPv6
+ Backup / memulihkan aturan blokir
+
+ Debug
+ Nyalakan laporan crash
+ Ijinkan aplikasi untuk mengirim laporan error dan crash ke Sentry (sentry.io)
+ Tidak mendukung pada build ini
+ Nyalakan verbose logging
+ Anda perlu memulai kembali AdAway agar pengaturan ini berlaku.
+
diff --git a/app/src/main/res/values-in/strings_prefs_root.xml b/app/src/main/res/values-in/strings_prefs_root.xml
new file mode 100644
index 0000000..fc28f10
--- /dev/null
+++ b/app/src/main/res/values-in/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ pemblokir basis root
+
+ Install hosts
+ Buka berkas hosts
+ Target file host
+ Sebelum mengganti pengaturan. Baca panduan untuk fungsi tersebut.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Kustom target
+
+ Kustom target
+ Sembunyikan pesan reboot
+
+ Pengalihan
+ Masukkan kemana hosts akan dialihkan
+ Redireksi IPv4
+ Redireksi IPv6
+ Pengalihan salah
+
+ Peladen Web lokal
+ Server web lokal mendengarkan alamat IP lokal untuk menjawab permintaan nama host yang diblokir. Ini dapat membantu dengan pembekuan aplikasi pada koneksi yang diblokir.
+ Aktifkan peladen web
+ Tes server web
+ Instal sertifikat self-signed
+ Instal sertifikat manual
+ Mulai dari Android 11 (R), aplikasi tidak bisa menginstall certificate authority (CA).\n\nBuka \"keamanaan\" pada setelan, \"Enkripsi & kredensial\" kemudian \"menginstal sertifikat\". Setelah itu, pilih \"Sertifikat CA\" dan pilih file sertifikat yang baru dibuat.
+ Buka \"Keamanan\" di setelan
+ Memeriksa…
+ Tidak berjalan
+ Berjalan tapi tidak terinstal
+ Berjalan dan terinstal
+ Mengganti iklan yang terblokir dengan ikon app
+
diff --git a/app/src/main/res/values-in/strings_prefs_update.xml b/app/src/main/res/values-in/strings_prefs_update.xml
new file mode 100644
index 0000000..7a7cc98
--- /dev/null
+++ b/app/src/main/res/values-in/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Pembaruan
+ Notifikasi dinonaktifkan
+ Notifikasi aplikasi tidak dapat ditampilkan, Tap untuk mengaktifkan.
+
+ Update aplikasi
+ Periksa update tiap mulai
+ Periksa pembaruan setiap hari
+ menyertakan rilisan beta
+
+ Update hosts
+ Periksa update tiap mulai
+ Periksa pembaruan setiap hari
+ Sinkronisasi saat update
+ Hanya singkronisasi pada koneksi tak dibatasi
+
diff --git a/app/src/main/res/values-in/strings_prefs_vpn.xml b/app/src/main/res/values-in/strings_prefs_vpn.xml
new file mode 100644
index 0000000..f560b3c
--- /dev/null
+++ b/app/src/main/res/values-in/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Mode vpn
+
+ Mengizinkan saat mulai
+ Memonitor konneksi
+ Cek keadaan koneksi berkala untuk restart koneksi VPN
+
+ Aplikasi yang dikecualikan
+ Atur aplikasi yang tidak menggunakan VPN agar koneksi tidak terblokir
+ Kecualikan aplikasi sisttem
+
+ None
+ All except browsers
+ All
+
+ kecualikan aplikasi pengguna
+
+
+ Aplikasi yang dikecualikan
+ Pilih semua
+ Batal pilih semua
+ Ikon aplikasi
+
diff --git a/app/src/main/res/values-in/strings_source_edit.xml b/app/src/main/res/values-in/strings_source_edit.xml
new file mode 100644
index 0000000..dcf0bb4
--- /dev/null
+++ b/app/src/main/res/values-in/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Ubah sumber
+ Tambah sumber
+
+ Label
+ Label dibutuhkan
+ Tipe
+ URL
+ File
+ Lokasi
+ https://
+ Lokasi dibutuhkan
+ Tekan File untuk memilih sumber berkasnya
+ Lokasi salah
+ Daftar format
+ Blokir
+ Ijinkan
+ Perbolehkan pengalihan host
+ Memperbolehkan pengalihan host dapat menyebabkan masalah keamanan. Hanya gunakan pengaturan ini pada sumber yang terpercaya, karena ini dapat mengalihkan lalu lintas data sensitif ke server manapun.
+
diff --git a/app/src/main/res/values-in/strings_support.xml b/app/src/main/res/values-in/strings_support.xml
new file mode 100644
index 0000000..bca0f3f
--- /dev/null
+++ b/app/src/main/res/values-in/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Dukungan
+ Menjadi sponsor
+
diff --git a/app/src/main/res/values-in/strings_update.xml b/app/src/main/res/values-in/strings_update.xml
new file mode 100644
index 0000000..ee1bc5b
--- /dev/null
+++ b/app/src/main/res/values-in/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Pembaruan AdAway
+
+ Pembaruan tersedia!
+
+
+ Kamu sudah up-to-date
+ Pembaruan tersedia
+ Memperbarui AdAway
+ Perbarui sekarang
+ %1$s / %2$s
+ Perubahan terakhir
+ Changelog
+ Dukung pengembangan
+ Donasi
+ Sponsor
+
+
+ Mengunduh AdAway versi terbaru…
+
diff --git a/app/src/main/res/values-in/strings_welcome.xml b/app/src/main/res/values-in/strings_welcome.xml
new file mode 100644
index 0000000..241a07f
--- /dev/null
+++ b/app/src/main/res/values-in/strings_welcome.xml
@@ -0,0 +1,54 @@
+
+
+ Selamat datang
+ Langkah pertama
+ Langkah Kedua
+ Langkah ketiga
+
+
+ Selamat datang di AdAway!
+ AdAway menyediakan dua metode pemblokiran iklan.
+Pilih salah satu yang kamu inginkan:
+
+ Logo root
+ Pemblokiran iklan menggunakan root
+ Lebih cepat
+ Hemat baterai
+ Membutuhkan mode root
+
+ logo VPN
+ Pemblokiran iklan menggunakan VPN
+ Lebih lambat
+ Berjalan di latar belakang
+ Kompatibilitas
+
+ Dibutuhkan perangkat Android yang sudah di-root
+ Binary su tidak ditemukan atau anda tidak memberikan izin root untuk AdAway.\n\nIni dapat terjadi ketika perangkat anda tidak memiliki akses root. Anda dapat menemukan informasi mengenai cara root perangkat anda di wiki.lineageos.org atau webiste Android lainnya.
+
+ Kelebihan
+ Kekurangan
+
+
+ Singkronisasi selesai
+ Kesalahan saat melakukan sinkronisasi
+
+ Sedang menyinkronkan
+ Sudah tersinkron!
+ AdAway mengunduh jaringan iklan untuk memblokir dari sumber-sumber online. Anda dapat menyesuaikannya nanti di pengaturan.
+ Mengulang sinkorinisasi
+ Gagal saat sinkronisasi: %1$s Coba lagi?
+ dapat mengirimkan notifikasi tentang blok iklan dan pengaturan, juga notifikasi update aplikasi yang tersedia (beberapa kali per tahun). Aktifkan jika ingin tetap up-to-date
+
+
+ Dukungan
+ Dukung saya!
+ AdAway adalah aplikasi graris dan open-source yang dikembangkan pada waktu luang saya. Jika kamu menyukainya, terima kasih dukungannya:
+ Donasi di PayPal
+ Anda menyukai bug? Saya juga tidak.
+ Izinkan penggunaan telemetri untuk mengirimkan laporan kesalahan kepada saya
+
+
+ Kembali
+ Selanjutnya
+ Selesai
+
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-is/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-is/strings_app.xml b/app/src/main/res/values-is/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-is/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-is/strings_errors.xml b/app/src/main/res/values-is/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-is/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-is/strings_home.xml b/app/src/main/res/values-is/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-is/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-is/strings_hosts.xml b/app/src/main/res/values-is/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-is/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-is/strings_lists.xml b/app/src/main/res/values-is/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-is/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-is/strings_log.xml b/app/src/main/res/values-is/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-is/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-is/strings_notification.xml b/app/src/main/res/values-is/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-is/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-is/strings_prefs_backup_restore.xml b/app/src/main/res/values-is/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-is/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-is/strings_prefs_main.xml b/app/src/main/res/values-is/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-is/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-is/strings_prefs_root.xml b/app/src/main/res/values-is/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-is/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-is/strings_prefs_update.xml b/app/src/main/res/values-is/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-is/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-is/strings_prefs_vpn.xml b/app/src/main/res/values-is/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-is/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-is/strings_support.xml b/app/src/main/res/values-is/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-is/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-is/strings_update.xml b/app/src/main/res/values-is/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-is/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-is/strings_welcome.xml b/app/src/main/res/values-is/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-is/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
new file mode 100644
index 0000000..1eafc0b
--- /dev/null
+++ b/app/src/main/res/values-it/strings.xml
@@ -0,0 +1,267 @@
+
+
+
+ Esci
+ Chiudi
+ Sì
+ No
+ Aggiungi
+ Annulla
+ Salva
+ Aiuto
+
+
+ Benvenuto!
+ AdAway è un software gratuito e open-source progettato per bloccare pubblicità. Raccoglie gli indirizzi pubblicitari per bloccarli sul tuo dispositivo.\nVuoi saperne di più? Controlla la sezione di aiuto qui sotto!
+ Mostra più suggerimenti
+ Aggiorna stato
+ Tutti i file hosts vengono scaricati dalle sorgenti definite, uniti alle tue liste personali e installati come un unico file hosts nel sistema
+ Abilita blocco pubblicità
+ Disabilita blocco pubblicità
+ Web server
+ In esecuzione
+ Interrotto
+ Avvia o interrompe il web server su localhost per rispondere alle richieste degli hostname bloccati
+ Abilita il web server
+ Disabilita web server
+ VPN
+ In esecuzione
+ Interrotto
+ Avvia o interrompe la VPN per filtrare le richieste
+ Abilita VPN
+ Disabilita VPN
+
+
+ Modifica valore
+ Applica
+ Modifica
+ Elimina
+
+
+ Importazione…
+ Backup correttamente importato dalla SDcard
+ Importazione del backup non riuscita. Il formato è corretto? Controlla il log per maggiori dettagli
+ Esporto…
+ Backup correttamente esportato nel file \'%s\' nella memoria esterna.
+ È fallita l\'esportazione del file di backup \'%s\'.
+
+
+ Il file hosts
+ Il file hosts è un file di sistema che mappa gli hostnames in indirizzi IP. È un semplice file di testo la cui configurazione è gestita da AdAway. Ecco alcune righe:
+ Caricamento contenuto del file hosts…
+ Apri il file hosts
+
+
+ Controllo aggiornamenti in corso
+ Controllo aggiornamenti sorgente %s
+ Recupero delle sorgenti
+ Scarico sorgente %s
+ Leggo sorgente %s
+ Analizzo sorgente %s
+ Sincronizzazione del database delle regole
+ Ripristino in corso del file hosts predefinito
+ File hosts predefinito ripristinato
+ Creo file hosts standard
+ Aggiornamento sorgenti disponibile
+ File hosts più recenti disponibili
+ Nessuna sorgente da aggiornare
+ Nessuna connessione internet
+ Nessuna connessione internet disponibile
+ Sorgenti non disponibili
+ Nessuna sorgente hosts raggiungibile!
+ Permessi di root negati
+ Concedi i permessi di root dal root manager che utilizzi
+ Qualcosa è andato storto
+ Controlla il registro per i dettagli
+ Abilitato
+ File hosts più recente abilitato
+ Disabilitato
+ File host predefiniti installati
+ Applica sorgenti aggiornate
+ Creazione in corso del nuovo file hosts
+ Copio il nuovo file hosts
+ Controllo in corso della copia del file hosts
+ File hosts aggiornato con successo
+ Configurazione VPN aggiornata
+ Configurazione modificata. Ora devi applicarla
+ Applica
+ Applico nuova configurazione…
+ Applicazione nuova configurazione fallita
+
+
+ Symlink del file hosts di destinazione mancante
+ Il collegamento simbolico a /system/etc/hosts non esiste o non è corretto! AdAway non funzionerà se il collegamento non punta al file giusto.\n\nVuoi provare a creare un collegamento simbolico?
+ Collegamento simbolico mancante
+ Non c\'è abbastanza spazio nella partizione!\nProva a cambiare il percorso del file hosts in /data/data/hosts nelle preferenze.
+ Spazio non sufficiente
+ Il file scaricato non può essere letto
+ Creazione file privato fallita
+ Remount della partizione in lettura/scrittura fallito!
+ Remount fallito!
+ Impossibile copiare il file hosts
+ Copia del file host fallita!
+ Copia fallita
+ Sorgenti host applicate
+ Modifiche applicate!
+ Modifiche effettuate con successo.\nPotrebbe essere necessario riavviare Android affinché le modifiche abbiano effetto.\n\nVuoi riavviare?\n(Per evitare la perdita di dati assicurati che nessuna app utilizzi la SDcard al momento!)
+ Symlink è stato creato con successo.\nPotrebbe essere necessario riavviare Android affinché le modifiche abbiano effetto.\n\nVuoi riavviare?\n(Per evitare la perdita di dati assicurati che nessuna app utilizzi la SDcard al momento!)
+ Collegamento simbolico creato con successo
+ Il collegamento simbolico non può essere creato da Android.\nQuesto problema è dovuto quasi sicuramente a una \"caratteristica\" chiamata S-ON nei telefoni HTC!\n\nUna possibile soluzione è quella di avviare il telefono in modalità recovery e creare il collegamento simbolico con \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nSe questo non dovesse funzionare fai una ricerca su Internet su S-OFF e il tuo telefono
+ Creazione del collegamento simbolico fallita
+ Leggere l\'Aiuto per ulteriori informazioni
+ Un proxy APN è impostato sul tuo Android!\nAdAway non funzionerà in modo affidabile quando connesso a reti mobili come il 3G. Puoi disattivare il proxy andando nelle impostazioni del tuo APN (Nell\'app Impostazioni: Rete e Internet -> Rete mobile -> Avanzate -> Nomi punti di accesso) e rimuovendo il contenuto del campo proxy
+ Proxy APN impostato!
+ La connesione a internet non funziona
+ Nessuna connessione
+ Scarico…
+ Applico…
+ Applico Blacklist e Whitelist
+ Analizzo e unisco file hosts
+ Costruisco file hosts
+ Applico file hosts
+ Impossibile applicare il nuovo file host
+ L\'applicazione del file hosts è fallita!\nProva a cambiare il percorso del file hosts in /data/data/hosts nelle preferenze.
+ Modifiche non applicate!
+ Controlla il root manager per assicurarti che i permessi di root siano stati concessi
+ Sei tornato al file hosts predefinito.\nPotrebbe essere necessario riavviare Android affinché le modifiche abbiano effetto.\n\nVuoi riavviare?\n(Per evitare la perdita di dati assicurati che nessuna app utilizzi la scheda SD al momento!)
+ Ripristino effettuato!
+ Impossibile ripristinare il file hosts
+ Ripristino fallito per ragioni sconosciute
+ Ripristino fallito!
+ Nessuna delle sorgenti hosts che hai abilitato è raggiungibile! Sei connesso a internet?
+ Download fallito
+ Impossibile scrivere il nuovo file hosts privato
+ Il file privato non può essere creato
+ Creazione file privato fallita
+ Hai attivato la modalità systemless.\nPotrebbe essere necessario riavviare Android affinché le modifiche abbiano effetto.\n\nVuoi riavviare?\n(Per evitare perdite di dati assicurati che nessuna app utilizzi la scheda SD al momento!)
+ Attivazione completata
+ Hai disabilitato la modalità systemless.\nPotrebbe essere necessario riavviare Android per applicare i cambiamenti. .\n\nVuoi riavviare?\n(Per impedire perdita di dati assicurati che nessuna app al momento sta utilizzando la scheda SD!)
+ Disattivazione completata
+ Impossibile abilitare la VPN per il blocco pubblicità
+ Impossibile disabilitare la VPN per il blocco pubblicità
+ Abilito il modulo hosts di Magisk
+ Abilita la funzione hosts systemless da Magisk Manager. Dalle impostazioni, abilita l\'opzione Host systemless e poi riavvia il dispositivo
+ Disabilito il modulo hosts di Magisk
+ Disabilita la funzione host systemless da Magisk Manager. Dalla lista dei moduli, disinstalla il modulo Host systemless e poi riavvia il dispositivo
+
+
+ Inserisci URL al file hosts:
+ Questo non è un hostname valido!
+ Nome host non formattato correttamente
+ Questo non è un IP valido!
+ IP non formattato correttamente
+ Non riavviare e non mostrare più questo messaggio!
+ Caricamento…
+
+
+ Aggiorna
+ Aggiungi
+ Aiuto
+ Importa backup
+ Esporta backup
+
+
+ S-ON/S-OFF
+ FAQ
+ Problemi
+
+
+ Adware
+ Qui puoi troverai l\'adware installato, applicazioni malevole che non possono essere bloccate da AdAway. Queste applicazioni utilizzano, ad esempio, notifiche Airpush che appaiono anche quando l\'app non è in esecuzione o che modificano la tua suoneria. L\'unica contromisura disponibile è quella di disinstallare queste applicazioni cliccando sugli elementi dell\'elenco
+ Scansione in corso…
+ Nessun Adware trovato!
+
+
+ Blocca pubblicità
+ Nessun editor di testo installato
+ Nessun editor di testo trovato per aprire il file hosts. Puoi installare Jota o un altro editor di testo per rimediare.\n\nVuoi installare Jota?
+ Nessun file manager installato
+ Nessun file manager trovato per aprire i file. Puoi installare OI File Manager o altri file manager per rimediare.\n\n
+Vuoi installare OI File Manager?
+
+
+ Tcpdump
+ Tcpdump è uno strumento per monitorare le richieste DNS e salvarle in un file di log. E\' possibile eseguirlo in background, aprire l\'applicazione che visualizza la pubblicità, e poi analizzare le richieste fatte grazie al file di log. Eventuali server pubblicitari possono essere poi aggiunti alla blacklist
+ Disabilita monitoraggio
+ Abilita monitoraggio
+ Mostra risultati
+ Ordinamento per dominio
+ Pulisci i log
+ Aggiungi voce a blacklist
+ Aggiungi voce alla whitelist
+ Aggiungi voce alla lista reindirizzamenti
+
+ Modifica il valore di testo
+ Apri menù
+ Chiudi menù
+
+
+
+ Home
+ Sorgenti host
+ Le tue liste
+ Apri file hosts
+ Log richieste DNS
+ Scansione Adware
+ Preferenze
+ Aiuto
+
+
+
+
+ Richieste DNS
+ Le tue liste
+ Preferenze
+
+
+ Installato %1$s fa
+ Aggiornato %1$s fa
+ Richiede aggiornamento da %1$s
+ Ultimo aggiornamento %1$s fa
+ Stato aggiornamento sconosciuto
+ Disabilitato
+ pochi minuti
+
+ %d minuto
+ %d minuti
+ %d minuti
+
+
+ %d ora
+ %d ore
+ %d ore
+
+
+ %d giorno
+ %d giorni
+ %d giorni
+
+
+ %d mese
+ %d mesi
+ %d mesi
+
+
+
+ Host copiati negli appunti
+
+
+ Avvio in corso
+ attivo
+ Interruzione in corso
+ In attesa di rete
+ In riconnessione
+ Errore di riconnessione
+ In pausa
+ Interrotto
+ VPN Ad-blocker %1$s
+ Pausa
+ Riprendi
+
+
+ Permessi di AdAway
+ Permetti di interagire con AdAway
+ Manda comandi a AdAway
+ Permetti l\'invio di comandi a AdAway come attivare o disattivare il blocco pubblicità a livello di sistema
+
+
diff --git a/app/src/main/res/values-it/strings_app.xml b/app/src/main/res/values-it/strings_app.xml
new file mode 100644
index 0000000..2b3d0ca
--- /dev/null
+++ b/app/src/main/res/values-it/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Blocco pubblicità Open Source
+ Logo di AdAway
+
diff --git a/app/src/main/res/values-it/strings_errors.xml b/app/src/main/res/values-it/strings_errors.xml
new file mode 100644
index 0000000..6bdd8c4
--- /dev/null
+++ b/app/src/main/res/values-it/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Nessuna connessione Internet
+ Impossibile stabilire una connessione Internet. Controlla la connessione del tuo dispositivo
+ Impossibile scaricare dalla sorgente hosts
+ Nessuna delle sorgenti hosts abilitate è raggiungibile. Assicurati di essere correttamente connesso ad Internet
+
+ Impossibile creare file privato
+ Impossibile creare il file privato per assemblare la nuova sorgente hosts. Assicurati che ci sia spazio disponibile sul tuo dispositivo
+ Spazio non sufficiente
+ Impossibile copiare il file hosts nella partizione /system. Controlla se il modulo systemless di Magisk è attivo e riavvia il dispositivo
+ Impossibile installare il nuovo file hosts
+ Impossibile copiare il file hosts nella partizione /system. Controlla se il modulo systemless di Magisk è attivo e poi riavvia il dispositivo.
+ Impossibile ripristinare file hosts
+ Impossibile ripristinare la configurazione predefinita del file hosts
+
+ Impossibile abilitare VPN per blocco pubblicità
+ Controlla le impostazioni VPN per autorizzare l\'app ad avviare la VPN
+ Impossibile disabilitare la VPN per il blocco pubblicità
+ Controlla le impostazioni VPN per disabilitarla manualmente
+
diff --git a/app/src/main/res/values-it/strings_home.xml b/app/src/main/res/values-it/strings_home.xml
new file mode 100644
index 0000000..fba1ab4
--- /dev/null
+++ b/app/src/main/res/values-it/strings_home.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ Bloccati
+ Autorizzati
+ Reindirizzati
+
+
+
+ %d sorgente aggiornata
+ %d sorgenti aggiornate
+ %d sorgenti aggiornate
+
+
+ %d sorgente obsoleta
+ %d sorgenti obsolete
+ %d sorgenti obsolete
+
+ Controlla aggiornamenti host
+ Aggiorna gli hosts
+
+
+ Registro richieste DNS
+
+
+ Aiuto
+
+
+ GitHub
+
+
+ Supporto
+
+
+ Progetto GitHub
+ Preferenze
+
+
+ Apri menù di navigazione
+ Metti in pausa/riprendi blocco pubblicità
+ Aggiorna domini bloccati
+ Mostra domini richiesti
+
+
+ Leggi l\'aiuto per maggiori informazioni
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-it/strings_hosts.xml b/app/src/main/res/values-it/strings_hosts.xml
new file mode 100644
index 0000000..9e65517
--- /dev/null
+++ b/app/src/main/res/values-it/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Sorgenti hosts
+
+ Lista utente
+ Hosts ufficiali AdAway
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ non disponibile
+ %s hosts
+
+ Aggiungi sorgente
+ Modifica sorgente
+ URL: (una risorsa https:// o file://)
+ URL sorgente hosts
+
diff --git a/app/src/main/res/values-it/strings_lists.xml b/app/src/main/res/values-it/strings_lists.xml
new file mode 100644
index 0000000..6b628c3
--- /dev/null
+++ b/app/src/main/res/values-it/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Le tue liste
+ Aggiungi host
+
+ Bloccati
+ Autorizzati
+ Reindirizzati
+
+ Filtra hosts
+ Cerca hostname…
+ Attiva/disattiva sorgenti
+
+ Aggiungi host alla blacklist
+ Aggiungi host alla whitelist
+ Aggiungi reindirizzamento host
+ Modifica host in blacklist
+ Modifica host in whitelist
+ Modifica reindirizzamento
+ Hostname:
+ URL sorgente hosts
+ (I caratteri jolly * e ? sono consentiti)
+ IP (IPv4 o IPv6):
+
diff --git a/app/src/main/res/values-it/strings_log.xml b/app/src/main/res/values-it/strings_log.xml
new file mode 100644
index 0000000..f6fd6ec
--- /dev/null
+++ b/app/src/main/res/values-it/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Attiva/disattiva registrazione log
+ Premi registra per avviare la raccolta delle richieste, naviga su internet o usa le app, quindi torna indietro o scorri per aggiornare i log.
+ \n\nLe richieste bloccate non verranno registrate. Se vuoi includerle, devi prima disabilitare il blocco pubblicità.
+
+ Ordinamento alfabetico
+ Ordinamento per dominio di primo livello
+
+ Reindirizza dominio
+
diff --git a/app/src/main/res/values-it/strings_notification.xml b/app/src/main/res/values-it/strings_notification.xml
new file mode 100644
index 0000000..b35fb37
--- /dev/null
+++ b/app/src/main/res/values-it/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Aggiornamenti
+ Notifica nuovo aggiornamento
+ Aggiornamento sorgenti disponibile
+ File hosts più recente disponibile
+ Aggiornamento dell\'app disponibile
+ Nuova versione di AdAway disponibile
+
+ VPN
+ Notifica VPN in esecuzione
+
diff --git a/app/src/main/res/values-it/strings_prefs_backup_restore.xml b/app/src/main/res/values-it/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..57686f5
--- /dev/null
+++ b/app/src/main/res/values-it/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Backup e ripristino
+ Backup
+ Salva le regole di blocco sullo spazio di archiviazione esterno
+ Ripristina
+ Ripristina le regole di blocco da un file di backup
+
diff --git a/app/src/main/res/values-it/strings_prefs_main.xml b/app/src/main/res/values-it/strings_prefs_main.xml
new file mode 100644
index 0000000..8661950
--- /dev/null
+++ b/app/src/main/res/values-it/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferenze
+
+ Generale
+ Tema scuro
+
+ Chiaro
+ Scuro
+ Predefinito
+
+ Aggiornamenti automatici
+
+ Blocco pubblicità
+ Blocco pubblicità basato su root
+ Blocco pubblicità basato su VPN
+ Abilita supporto IPv6
+ Backup / ripristino regole di blocco
+
+ Debug
+ Invia segnalazioni errori
+ Inviare errori a Sentry (sentry.io)
+ Non supportato in questa versione
+ Log dettagliato
+ Riavviare AdAway per applicare le modifiche
+
diff --git a/app/src/main/res/values-it/strings_prefs_root.xml b/app/src/main/res/values-it/strings_prefs_root.xml
new file mode 100644
index 0000000..689f64e
--- /dev/null
+++ b/app/src/main/res/values-it/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Blocco pubblicità basato su root
+
+ Installazione file hosts
+ Apri file hosts
+ Percorso file hosts
+ Leggi l\'Aiuto prima di usare questa funzione
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Destinazione personalizzata
+
+ Percorso personalizzato
+ Nascondi la richiesta di riavvio
+
+ Reindirizzamento
+ Specifica dove reindirizzare gli host bloccati
+ Reindirizzamento IPv4
+ Reindirizzamento IPv6
+ Reindirizzamento non valido
+
+ Web server locale
+ Il web server locale rimane in ascolto sugli indirizzi IP locali per rispondere alle richieste degli hostname bloccati. Può aiutare con le app che danno problemi sulle connessioni bloccate.
+ Abilita web server
+ Test web server
+ Installa certificato autofirmato
+ Installazione manuale del certificato
+ A partire da Android 11 (R), le app non possono più installare automaticamente un\'autorità di certificazione (CA). \n\nVai alle impostazioni di Sicurezza, \"Crittografia e Credenziali\" e a \"Installa un certificato\". Quindi scegli \"Certificato CA\" e seleziona il file del certificato appena esportato.
+ Apri impostazioni di Sicurezza
+ Verifica in corso…
+ Non in esecuzione
+ In esecuzione ma certificato non installato
+ In esecuzione con certificato installato
+ Riempi lo spazio pubblicitario con l\'icona dell\'app
+
diff --git a/app/src/main/res/values-it/strings_prefs_update.xml b/app/src/main/res/values-it/strings_prefs_update.xml
new file mode 100644
index 0000000..89eb58e
--- /dev/null
+++ b/app/src/main/res/values-it/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Aggiornamenti
+ Notifiche disabilitate
+ Le notifiche dell\'app non verranno mostrate. Tocca per abilitarle.
+
+ Aggiornamenti dell\'app
+ Controlla all\'avvio
+ Controlla periodicamente
+ Includi versioni beta
+
+ Aggiornamenti degli host
+ Controlla all\'avvio
+ Controlla periodicamente
+ Sincronizza all\'aggiornamento
+ Sincronizza solo su connessioni non a consumo
+
diff --git a/app/src/main/res/values-it/strings_prefs_vpn.xml b/app/src/main/res/values-it/strings_prefs_vpn.xml
new file mode 100644
index 0000000..dfd4856
--- /dev/null
+++ b/app/src/main/res/values-it/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Blocco pubblicità su VPN
+
+ Abilita all\'avvio
+ Monitora connessione
+ Controlla periodicamente lo stato della rete per riavviare la VPN quando si disconnette.
+
+ App escluse
+ Configura quali app non devono usare la VPN per non bloccare alcuna connessione
+ Escludi app di sistema
+
+ Nessuna
+ Tutte eccetto i browser
+ Tutte
+
+ Escludi app utente
+
+
+ App escluse
+ Seleziona tutte
+ Deseleziona tutte
+ Icona app
+
diff --git a/app/src/main/res/values-it/strings_source_edit.xml b/app/src/main/res/values-it/strings_source_edit.xml
new file mode 100644
index 0000000..28be21d
--- /dev/null
+++ b/app/src/main/res/values-it/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Modifica sorgente
+ Aggiungi sorgente
+
+ Etichetta
+ Etichetta obbligatoria
+ Tipo
+ URL
+ File
+ Posizione
+ https://
+ Posizione obbligatoria
+ Premi File per selezionare il file della sorgente
+ Posizione non valida
+ Formato lista
+ Blocca
+ Autorizza
+ Applica host reindirizzati
+ Consentire gli host reindirizzati può causare problemi di sicurezza. Usa questa opzione solo con una sorgente affidabile, dal momento che potrebbe reindirizzare del traffico sensibile a qualunque server essa specifichi.
+
diff --git a/app/src/main/res/values-it/strings_support.xml b/app/src/main/res/values-it/strings_support.xml
new file mode 100644
index 0000000..4a521d9
--- /dev/null
+++ b/app/src/main/res/values-it/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Supporto
+ Diventa uno sponsor
+
\ No newline at end of file
diff --git a/app/src/main/res/values-it/strings_update.xml b/app/src/main/res/values-it/strings_update.xml
new file mode 100644
index 0000000..a97edf6
--- /dev/null
+++ b/app/src/main/res/values-it/strings_update.xml
@@ -0,0 +1,22 @@
+
+
+ Aggiornamento di AdAway
+
+ Aggiornamento disponibile!
+
+
+ Sei aggiornato
+ Aggiornamento disponibile
+ Aggiornando AdAway
+ Aggiorna ora
+ %1$s/%2$s
+ Completato
+ Le ultime novità:
+ Registro modifiche
+ Supporta lo sviluppo
+ Fai una donazione
+ Sponsor
+
+
+ Download in corso dell\'ultima versione di AdAway…
+
diff --git a/app/src/main/res/values-it/strings_welcome.xml b/app/src/main/res/values-it/strings_welcome.xml
new file mode 100644
index 0000000..df318f8
--- /dev/null
+++ b/app/src/main/res/values-it/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Benvenuto
+ Procedura Guida primo passo
+ Procedura Guida secondo passo
+ Procedura Guida ultimo passo
+
+
+ Benvenuto in AdAway!
+ AdAway ha due modalità per bloccare le pubblicità. Scegli quella che preferisci:
+
+ Logo root
+ Blocco pubblicità\ntramite root
+ Più veloce
+ Non ha impatto sulla batteria
+ Richiede il root
+
+ Logo VPN
+ Blocco pubblicità\ntramite VPN
+ Più lento
+ Esecuzione in background
+ Compatibilità
+
+ Richiesto Android con root
+ Non è stato trovato il binario SU o non hai concesso i permessi di root ad AdAway.\n\nPuò succedere quando il tuo dispositivo non ha i permessi di root.\nPuoi trovare maggiori informazioni su come abilitarli per il tuo dispositivo su wiki.lineageos.org o su altri siti web riguardanti Android.
+
+ Pro
+ Contro
+
+
+ Sincronizzazione completata
+ Errore durante la sincronizzazione
+
+ Sincronizzazione in corso
+ Sincronizzato!
+ AdAway scarica da sorgenti online le reti pubblicitarie da bloccare. Puoi personalizzarle dalle impostazioni
+ Riprova sincronizzazione
+ Sincronizzazione fallita: %1$s Vuoi riprovare adesso?
+ Può inviare notifiche per mostrare lo stato e i controlli del blocco pubblicità, e per segnalare la disponibilità di aggiornamenti dell\'app (poche volte all\'anno). Abilitale se vuoi rimanere aggiornato.
+
+
+ Supporto
+ Supportami!
+ AdAway è un\'app gratuita e open-source che sviluppo nel mio tempo libero. Se ti piace, sentiti libero di mostrare il tuo sostegno:
+ Dona tramite PayPal
+ Ti piacciono i bug? Neanche a me.
+ Abilita la telemetria per inviarmi le segnalazioni di errori
+
+
+ Indietro
+ Avanti
+ Fine
+
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
new file mode 100644
index 0000000..de6cde6
--- /dev/null
+++ b/app/src/main/res/values-iw/strings.xml
@@ -0,0 +1,272 @@
+
+
+
+ יציאה
+ סגירה
+ כן
+ לא
+ הוספה
+ ביטול
+ שמירה
+ עזרה
+
+
+ ברוך הבא!
+ AdAway היא תוכנת קוד פתוח חינמית לחסימת פרסומות. התוכנה שולפת כתובות רשת של מפרסמים כדי לחסום אותן במכשיר שלך.\nרוצה לדעת עוד? היעזר בעזרה למטה!
+ הצג עזרה נוספת
+ מצב העדכון
+ כל קבצי המארחים מהמקורות המוגדרים הורדו, מוזגו עם הרשימות שלך והותקנו כקובץ מארח יחיד במערכת שלך.
+ הפעל חסימת פרסומות
+ בטל חסימת פרסומות
+ שרת אינטרנט
+ פעיל
+ כבוי
+ הפעל או עצור את השרת המקומי כדי לענות על בקשות לשמות מארח חסומים.
+ הפעל שרת אינטרנט
+ בטל שרת אינטרנט
+ VPN
+ פעיל
+ כבוי
+ הפעל או הפסק VPN כדי לסנן בקשות.
+ VPN פעיל
+ VPN מושבת
+
+
+ ערוך רשומה
+ החל
+ ערוך
+ מחק
+
+
+ מייבא…
+ גיבוי יובא בהצלחה מהאחסון החיצוני
+ ייבוא הגיבוי נכשל. האם פורמט הגיבוי נכון? בדוק את logcat לפרטים נוספים.
+ מייצא…
+ הגיבוי יוצא בהצלחה לקובץ \'%s\' באחסון החיצוני שלך.
+ ייצוא קובץ הגיבוי \'%s\' נכשל.
+
+
+ קובץ מארחים
+ קובץ המארחים הוא קובץ מערכת הממפה שמות מארחים לכתובות IP. זהו קובץ טקסט רגיל שנוצר ומתוחזק על־ידי AdAway. להלן כמה שורות ראשונות:
+
+
+ טוען תוכן קובץ מארחים…
+ פתח קובץ מארחים
+
+
+ בדיקת עדכונים
+ בדיקת עדכון במקור %s
+ אחזור מקורות
+ מוריד את מקור %s
+ קורא את מקור %s
+ מנתח את מקור%s
+ מסנכרן חוקי מסד נתונים
+ מאחזר לברירת מחדל את קובץ המארחים
+ קובץ מארחים שוחזר לברירת מחדל
+ יוצר קובץ מארחים רגיל
+ קיים עידכון
+ קבצי מארחים חדשים זמינים להורדה
+ לא נמצאו עדכוני מקורות
+ אין חיבור לאינטרנט
+ אין חיבור זמין לאינטרנט
+ מקורות לא זמינים
+ לא הושגו מקורות מארחים!
+ אין גישת root
+ אפשר גישת root מאפליקציית ה-root שלך
+ משהו לא תקין קרה
+ בדוק ב-logcat על מנת לקבל מידע נוסף
+ פעיל
+ קבצי מארחים חדשים פעילים
+ לא פעיל
+ קובץ מארחים ברירת המחדל הותקן
+ החלת מקורות אחרונים
+ יצירת קובץ מארחים חדש
+ העתקת קובץ מארחים חדש
+ בדיקת העתק קובץ מארחים
+ קובץ מארחים עודכן בהצלחה
+ תצורת ה־VPN עודכנה בהצלחה
+ התצורה שלך השתנתה. עליך להחיל אותה.
+ החל
+ מחיל תצורה חדשה…
+ החלת התצורה החדשה נכשלה.
+
+
+ ההפניה ליעד של קובץ המארחים חסרה.
+ קישור המערכת שלך אל /system/etc/hosts אינו קיים או אינו נכון! AdAway לא יפעל אם לא תבחר את הקובץ הנכון.\n\nהאם ברצונך לנסות ליצור קישור מערכת?
+ קישור סימבולי לא קיים
+ אין מספיק שטח איחסון בדיכרון!\nנסה לשנות בהעדפות התוכנה את הגדרת היעד ל /data/data/hosts.
+ אין מספיק זיכרון
+ לא ניתן לקרוא מהקובץ שהתקבל
+ החלת קובץ פרטי נכשל
+ הענקת הרשאות קריאה/כתיבה נכשלו!
+ הענקת הרשאות נכשלה
+ נכשל בהעתקת קובץ מארחים
+ העתקת קובץ מארחים נכשלה
+ העתקה נכשלה
+ עדכן מקורות מארחים
+ החלת ההגדרות הושלמה בהצלחה
+ החלת השינויים בוצעה בהצלחה. אך יתכן שיהיה צורך להפעיל מחדש את אנדרואיד כדי שהשינויים ייכנסו לתוקף.\n\nהאם ברצונך לאתחל מחדש?\n(כדי למנוע אובדן נתונים וודא שאף אפליקציה לא משתמשת בכרטיס ה- SD כרגע!)
+ הקישור הסימבולי נוצר בהצלחה.\nכדי להחיל את השינויים ייתכן שיש צורך בהפעלה מחדש.\n\nלהפעיל מחדש עכשיו?\n(כדאי להמנע מאיבוד מידע יש לוודא שאף אפליקציה לא משתמשת בכרטיס הזיכרון!)
+ קישור סימבולי נוצר בהצלחה
+ אנדרואיד לא יכול היה ליצור את Symlink.\n הכישלון בד״כ בעיקר בגלל \'פיצ\'ר\' שנקרא S-ON בטלפונים של HTC! \n\n הפיתרון הוא לאתחל את הטלפון שלך למצב שחזור וליצור שם את ה- symlink עם \'ln -s /data/data/hosts /system/etc/hosts\'.\n\n אם זה לא עובד חפש באינטרנט ובטלפון שלך את: S-OFF.
+ יצירת קישור סימבולי נכשלה
+ קרא את העזרה למידע נוסף.
+ פרוקסי APN מוגדר באנדרואיד שלך!\n AdAway לא יעבוד באופן אמין ברשתות סלולריות כמו 3G. אתה יכול להשבית את ה- proxy הזה על ידי מעבר ל- APN שבחרת. (בתפריט הגדרות רשת -> רשתות מובייל -> מתקדם -> APN והסר משם את הערך בשדה proxy).
+ פרוקסי APN הוגדר!
+ החיבור לאינטרנט אינו פעיל
+ אין חיבור
+ מוריד…
+ מחיל…
+ החל רשימה שחורה ולבנה
+ מאחד קבצי מארחים
+ בונה קובץ מארחים
+ מחיל קובץ מארחים
+ כשלון בהגדרת קובץ מארחים חדש
+ החלת קובץ מארחים במערכת נכשלה!\nנסה לשנות בהעדפות התוכנה את הגדרת היעד ל /data/data/hosts.
+ החלת הגדרות נכשלה
+ אנא בדוק את אפליקציית ניהול ה-root שלך כדי לוודא שניתנה גישה ל-root.
+ חזרת לקובץ המארחים המוגדר כברירת מחדל.\nייתכן שיהיה צורך לאתחל את המכשיר כדי שהשינויים ייכנסו לתוקף. \n\nהאם ברצונך לאתחל מחדש?\n(כדי למנוע אובדן נתונים, ודא שאף אפליקציה לא משתמשת כרגע בכרטיס ה־SD!)
+ החזרת ההגדרות הושלמה בהצלחה
+ לא ניתן להחזיר את קובץ המארחים
+ שיחזור נכשל מסיבות לא ידועות.
+ שחזור נכשל!
+ אף אחד ממקורות המארחים שלך לא הושג, בטוח שיש חיבור לאינטרנט? נא לבדוק שוב
+ הורדה נכשלה
+ כישלון בכתיבת קובץ מארחים פרטי חדש
+ לא ניתן ליצור קובץ פרטי.
+ יצירת קובץ פרטי נכשלה
+ הפעלת מצב ללא מערכת.\nיתכן שיהיה צורך לאתחל את המכשיר כדי שהשינויים ייכנסו לתוקף.\n\nהאם ברצונך לאתחל מחדש?\n(כדי למנוע אובדן נתונים, ודא שאף אפליקציה לא משתמשת בכרטיס ה־SD כרגע!)
+ הופעל בהצלחה
+ השבתת את מצב ללא מערכת.\nייתכן שיהיה צורך לאתחל את המכשיר כדי שהשינויים ייכנסו לתוקף.\n\nהאם ברצונך לאתחל מחדש?\n(כדי למנוע אובדן נתונים, ודא שאף אפליקציה לא משתמשת בכרטיס ה־SD כרגע!)
+ כובה בהצלחה
+ הפעלת חסימת מודעות באמצעות VPN נכשלה.
+ השבתת חסימת מודעות באמצעות VPN נכשלה.
+ הפעלת מודול מארחים Magisk
+ אפשר תכונת מארחים ללא מערכת מ־Magisk manager. מהגדרות האפליקציה, הפעל את האפשרות Systemless hosts ואז אתחל את המכשיר שלך.
+ כיבוי מודול מארחים Magisk
+ השבת תכונת מארחים ללא מערכת מ־Magisk manager. מרשימת המודולים, הסר את המודול Systemless hosts ואז אתחל את המכשיר שלך.
+
+
+ הכנס כתובת לקובץ מארחים:
+ שם השרת אינו חוקי!
+ שם השרת בתבנית לא נכונה
+ כתובת ה IP אינה חוקית!
+ כתובת IP בתבנית לא נכונה
+ לעולם אל תפעיל מחדש ואל תשאל אותי זאת שוב!
+ טוען…
+
+
+ רענן
+ הוסף
+ עזרה
+ ייבא גיבוי
+ ייצא גיבוי
+
+
+ S-ON/S-OFF
+ שאלות ותשובות
+ תקלות
+
+
+ תוכנת פירסום
+ כאן תוכלו למצוא תוכנות פרסום מותקנות ויישומים שלא ניתן לחסום בהם על־ידי AdAway. אפליקציות אלה משתמשות למשל בהתראות דחיפה שצצות גם כאשר האפליקציה אינה פועלת וביכולתן אפילו לשנות את הצלצול שלכם. אמצעי הנגד היחידי הזמין הוא הסרת התקנה של יישומים אלה על־ידי לחיצה על רשימת הפריטים הללו.
+ סורק…
+ לא נמצאו תוכנות פרסום!
+
+
+ חסום פרסומות
+ לא מותקן עורך טקסט
+ לא נמצא עורך טקסט כל שהוא מותקן עבור פתיחת קובץ מארחים. אתה יכול להתקין את העורך Jota או כל עורך טקסט אחר כדי לפתוח את הקובץ.\n\nאתה רוצה להתקין את Jota כעת?
+ לא מותקן מנהל קבצים
+ לא נמצא מנהל קבצים לפתיחת קובץ זה. תוכל להתקין את OI File Manager או כל מנהל קבצים אחר כדי לפתור זאת.\n\nהאם אתה רוצה להתקין את OI File Manager כעת?
+
+
+ Tcpdump
+ Tcpdump הוא כלי לניטור בקשות DNS ושמירה שלהם בקובץ יומן. אתה יכול להפעיל אותו ברקע, ולהפעיל יישומים שמציגים פרסומות, ולאחר מכן להסתכל ביומן בקשות ה DNS על ידי שימוש בקובץ היומן. וכך להוסיף שרתי פרסומות לרשימה השחורה שלך.
+ בטל ניטור
+ הפעל ניטור
+ הצג תוצאות
+ מיין דומיין
+ נקה לוג
+ הוסף לרשימה שחורה
+ הוסף לרשימה לבנה
+ הוסף לרשימת הפניות
+
+ ערוך את ערך העדפת הטקסט
+ פתח תפריט
+ סגור תפריט
+
+
+
+ בית
+ מקורות מארחים
+ הרשימות שלך
+ פתיחת קובץ מארחים
+ לוג בקשות DNS
+ סרוק תוכנות פירסום
+ העדפות
+ עזרה
+
+
+
+
+ בקשות DNS
+ הרשימות שלך
+ העדפות
+
+
+ הותקנו לפני %1$s
+ עודכן לפני %1$s
+ נדרש עדכון עבור %1$s
+ עדכון אחרון לפני %1$s
+ מצב עדכון לא ידוע
+ לא פעיל
+ כמה דקות
+
+ דקה %d
+ %d דקות
+ %d דקות
+ %d דקות
+
+
+ שעה %d
+ %d שעות
+ %d שעות
+ %d שעות
+
+
+ יום %d
+ %d ימים
+ %d ימים
+ %d ימים
+
+
+ חודש %d
+ %d חודשים
+ %d חודשים
+ %dחודשים
+
+
+
+ המארח הועתק ללוח
+
+
+ מפעיל
+ פעיל
+ עוצר
+ ממתין לרשת
+ מתחבר מחדש
+ שגיאת התחברות מחדש
+ מושהה
+ נעצר
+ חוסם פרסומות VPN %1$s
+ השהה
+ קורות חיים
+
+
+ הרשאות AdAway
+ אפשר אינטראקציה עם AdAway
+ שלח פקודות אל AdAway
+ אפשר לשלוח פקודות ל-AdAway כמו הפעלה או השבתה של חסימת מודעות בכל המערכת
+
+
diff --git a/app/src/main/res/values-iw/strings_app.xml b/app/src/main/res/values-iw/strings_app.xml
new file mode 100644
index 0000000..cc13250
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ חוסם פרסומות עם קוד מקור פתוח
+ לוגו AdAway
+
diff --git a/app/src/main/res/values-iw/strings_errors.xml b/app/src/main/res/values-iw/strings_errors.xml
new file mode 100644
index 0000000..f06e283
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ אין חיבור לאינטרנט
+ לא ניתן ליצור חיבור לאינטרנט. אנא בדוק את קישוריות המכשיר שלך.
+ הורדת מקור קובץ המארחים נכשלה
+ לא ניתן להגיע לאף אחד ממקורות המארחים המופעלים שלך. אנא בדוק שאתה מחובר כראוי לאינטרנט.
+
+ יצירת קובץ פרטי נכשלה
+ לא ניתן היה ליצור קובץ פרטי לבניית מקור מארחים חדש. אנא בדוק את שטח האחסון הפנוי הזמין במכשיר שלך.
+ אין מספיק מקום אחסון
+ לא ניתן להעתיק את קובץ המארחים למחיצת המערכת שלך. אנא בדוק שהמודול ללא מערכת ב־Magisk מופעל ואז אתחל מחדש.
+ התקנת קובץ מארחים חדש נכשלה
+ לא ניתן להעתיק את קובץ המארחים למחיצת המערכת. אנא בדוק אם מודול Magisk systemless מופעל ואז לאתחל מחדש.
+ ביטול קובץ המארחים נכשל
+ לא ניתן היה לשחזר את תצורת הקבצים המוגדרת כברירת מחדל.
+
+ הפעלת חסימת מודעות באמצעות VPN נכשלה.
+ אנא בדוק את הגדרות ה־VPN שלך כדי לאשר ליישום את הפעלת ה־VPN.
+ השבתת חסימת מודעות באמצעות VPN נכשלה.
+ נא בדוק את הגדרות ה־VPN שלך כדי להשבית אותו ידנית.
+
diff --git a/app/src/main/res/values-iw/strings_home.xml b/app/src/main/res/values-iw/strings_home.xml
new file mode 100644
index 0000000..1a55367
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ חסום
+ מאופשר
+ מופנה
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+ %d up-to-date sources
+ %d מקורות מעודכנים
+
+
+ %d outdated source
+ %d outdated sources
+ %d outdated sources
+ %d מקורות לא מעודכנים
+
+ בדוק אחר עדכוני מארחים
+ עדכן מארחים
+
+
+ הצג יומן בקשות DNS
+
+
+ הצג טיפים/עזרה
+
+
+ פתיחת דף GitHub
+
+
+ תמיכה בפרוייקט
+
+
+ פרויקט ה־GitHub
+ העדפות
+
+
+ פתיחת מגירת הניווט
+ השהה/המשך חוסם פרסומות
+ עדכון דומיינים חסומים
+ הצגת דומיינים מבוקשים
+
+
+ קרא את העזרה למידע נוסף.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-iw/strings_hosts.xml b/app/src/main/res/values-iw/strings_hosts.xml
new file mode 100644
index 0000000..81c3a18
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ מקורות מארחים
+
+ רשימת משתמש
+ מארחים רשמיים של AdAway
+ איחוד מארחים StevenBlack
+ Pete Lowe רשימת חסימת מארחים
+
+ לא זמין
+ %s מארחים
+
+ הוסף מקור
+ ערוך מקור
+ כתובת URL: (כתובת https:// או file://)
+ כתובת URL למקור מארחים
+
diff --git a/app/src/main/res/values-iw/strings_lists.xml b/app/src/main/res/values-iw/strings_lists.xml
new file mode 100644
index 0000000..0007bc5
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ הרשימות שלך
+ הוספת מארח
+
+ חסום
+ מאופשר
+ מופנה
+
+ סינון מארחים
+ חיפוש שם מארח…
+ החלפת מקורות
+
+ הוסף מארח לרשימה שחורה
+ הוסף מארח לרשימה לבנה
+ הוסף הפניית מארח
+ ערוך מארח ברשימה שחורה
+ ערוך מארח ברשימה לבנה
+ ערוך הפנייה
+ שם שרת:
+ כתובת URL למקור מארחים
+ (תווים כלליים * ו ? מותרים)
+ IP (IPv4 או IPv6):
+
diff --git a/app/src/main/res/values-iw/strings_log.xml b/app/src/main/res/values-iw/strings_log.xml
new file mode 100644
index 0000000..b836f30
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ החלפת הקלטת היומן
+ לחץ על הקלט כדי להתחיל ברישום בקשות, לגלוש באינטרנט או להשתמש ביישומים, ואז לחזור אחורה או להחליק כדי לרענן את היומנים.
+ \n\nבקשות חסומות לא יירשמו. יש להשבית תחילה את חסימת המודעות אם ברצונך לרשום גם אותן.
+
+ מיון אלפביתי
+ מיון דומיין ברמה העליונה
+
+ הפניית דומיין
+
diff --git a/app/src/main/res/values-iw/strings_notification.xml b/app/src/main/res/values-iw/strings_notification.xml
new file mode 100644
index 0000000..77bd403
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ עדכונים
+ התראות עדכון חדשות
+ עדכוני מקורות זמינים
+ קובץ hosts חדש יותר זמין להורדה
+ עדכון יישום זמין
+ גרסה חדשה של AdAway זמינה להורדה.
+
+ VPN
+ התראות ריצת VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-iw/strings_prefs_backup_restore.xml b/app/src/main/res/values-iw/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..f35e0f5
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ גיבוי &שיחזור
+ גיבוי
+ גיבוי לאיחסון חיצוני את חוקי החסימה שלך
+ שחזור
+ שחזור חוקי חסימה מקובץ גיבוי
+
diff --git a/app/src/main/res/values-iw/strings_prefs_main.xml b/app/src/main/res/values-iw/strings_prefs_main.xml
new file mode 100644
index 0000000..b78f5e2
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ העדפות
+
+ כללי
+ ערכת צבעים כהה
+
+ בהיר
+ כהה
+ ברירת מחדל מערכת
+
+ עדכון אוטומטי
+
+ חוסם פרסומות
+ חוסם פרסומות מבוסס גישת שורש
+ חוסם פרסומות מבוסס VPN
+ אפשר תמיכת IPv6
+ גיבוי / שחזור חוקי חסימה
+
+ ניפוי שגיאות
+ הפעל דוחות קריסה
+ אפשר לאפליקציה לשלוח שגיאות ודוחות קריסה ל-Sentry (sentry.io).
+ לא נתמך בבניה זו
+ הפעל לוג מפורט
+ יש להפעיל מחדש בכדי להגדיר
+
diff --git a/app/src/main/res/values-iw/strings_prefs_root.xml b/app/src/main/res/values-iw/strings_prefs_root.xml
new file mode 100644
index 0000000..ab25c91
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ חוסם פרסומות מבוסס גישת שורש
+
+ התקנת מארחים
+ פתח קובץ מארחים
+ יעד קובץ מארחים
+ לפני שימושש בהגדרה זו, יש לקרוא אודותיה
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ יעד מותאם אישית
+
+ מיקום יעד מותאם אישית
+ הסתרת תיבת דו שיח אודות אתחול לאחר הגדרה
+
+ הפניה
+ הגדר לאן להפנות מארחים חסומים
+ הפניית IPv4
+ הפניית IPv6
+ ניתוב מחדש לא חוקי
+
+ שרת מקומי
+ שרת האינטרנט המקומי מקשיב לכתובות IP מקומיות כדי לענות לבקשות של שם מארח חסום. זה עשוי לעזור בהקפאת אפליקציות בחיבור חסום.
+ הפעלת שרת Web
+ בדיקת שרת Web
+ התקן אישור בחתימה עצמית
+ התקנה ידנית של האישור
+ החל מ־Android 11 (R), היישום לא יכול להתקין יותר אוטומטית את רשות האישורים (CA).\n\nעבור אל הגדרות \"אבטחה\", \"הצפנה ואישורים\" ואז \"התקן אישור\". משם, בחר \"אישור CA\" ובחר את קובץ האישור החדש שיוצא.
+ פתיחת הגדרות \"אבטחה\"
+ בודק…
+ לא פעיל
+ פועל אך האישור לא הותקן
+ פועל והאישור הותקן
+ החלף שטח ריק של מודעות שנחסמו בסמל האפליקציה
+
diff --git a/app/src/main/res/values-iw/strings_prefs_update.xml b/app/src/main/res/values-iw/strings_prefs_update.xml
new file mode 100644
index 0000000..8a47231
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ עדכונים
+ ההתראות מושבתות
+ הודעות יישום לא יופיעו. הקש כדי להפעיל אותם.
+
+ עידכוני יישום
+ בדיקת קיום עדכונים בהפעלה
+ בדיקת קיום עדכונים מידי פעם
+ כולל גרסת בטא
+
+ עדכוני מארחים
+ בדיקת עדכונים בהפעלה
+ בדיקת קיום עדכונים מידי פעם
+ סנכרון בעת עדכון
+ סנכרון בעת שימוש ברשת לא נמדדת בלבד
+
diff --git a/app/src/main/res/values-iw/strings_prefs_vpn.xml b/app/src/main/res/values-iw/strings_prefs_vpn.xml
new file mode 100644
index 0000000..740cb5a
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ חוסם פרסומות מבוסס VPN
+
+ הפעלת בעת הפעלת המכשיר
+ צג חיבור
+ בדוק מעת לעת את מצב הרשת כדי להפעיל מחדש את ה־VPN בעת ניתוקו.
+
+ התעלם מיישומים
+ הגדר אילו יישומים לא יוכלו להשתמש ב-VPN כדי שלא יתנתקו חיבורים
+ התעלם מיישומי מערכת
+
+ ללא
+ הכל למעט דפדפנים
+ הכל
+
+ התעלם מאפליקציות משתמש
+
+
+ התעלם מאפליקציות
+ בחר הכל
+ הסר הכל
+ סמל יישום
+
diff --git a/app/src/main/res/values-iw/strings_source_edit.xml b/app/src/main/res/values-iw/strings_source_edit.xml
new file mode 100644
index 0000000..8bdc3fb
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ עריכת מקור
+ הוספת מקור
+
+ תווית
+ נדרש תווית
+ סוג
+ כתובת אתר
+ קובץ
+ מיקום
+ https://
+ מיקום נדרש
+ לחיצה על קובץ כדי לבחור קובץ מקור
+ מיקום לא חוקי
+ תבנית רשימה
+ חסימה
+ הרשאה
+ החלת מארחים שנותבו מחדש
+ מתן אפשרות למארחים המנותבים מחדש עלולה לגרום לבעיות אבטחה. יש להשתמש בהגדרות אלו רק במקור מהימן מכיוון שהוא יכול להפנות תנועה רגישה לאיזה שרת שהוא רוצה.
+
diff --git a/app/src/main/res/values-iw/strings_support.xml b/app/src/main/res/values-iw/strings_support.xml
new file mode 100644
index 0000000..b036237
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ תמיכה
+ הפוך להיות נותן חסות
+
\ No newline at end of file
diff --git a/app/src/main/res/values-iw/strings_update.xml b/app/src/main/res/values-iw/strings_update.xml
new file mode 100644
index 0000000..a86c740
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ עדכון AdAway
+
+ עדכון זמין!
+
+
+ זו הגרסה האחרונה
+ עדכון זמין
+ מעדכן את AdAway
+ עדכן כעת
+ %1$s / %2$s
+ שינויים אחרונים
+ רשימת שינויים
+ תמיכה בפיתוח
+ לתרום
+ נותן חסות
+
+
+ הורדת גרסה אחרונה של AdAway…
+
diff --git a/app/src/main/res/values-iw/strings_welcome.xml b/app/src/main/res/values-iw/strings_welcome.xml
new file mode 100644
index 0000000..2a2365e
--- /dev/null
+++ b/app/src/main/res/values-iw/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ ברוך הבא!
+ אשף הצעד הראשון
+ אשף הצעד השני
+ אשף הצעד האחרון
+
+
+ ברוכים הבאים אל AdAway!
+ AdAway מספק שתי שיטות חסימת פרסומות, נא לבחור את השיטה המועדפת עליכם:
+
+ לוגו גישת שורש
+ מבוסס גישת שורש\nחוסם פרסומות
+ מהיר יותר
+ ידידותי לסוללה
+ נדרש גישת שורש
+
+ לוגו VPN
+ מבוסס VPN\nחוסם פרסומות
+ איטי יותר
+ פועל ברקע
+ מותאם
+
+ גישת שורש אנדרואיד נדרשת
+ לא אפשרת הרשאת Root ל־AdAway.\n\nזה יכול לקרות כאשר המכשיר שלך אינו בעל גישת Root. תוכל למצוא מידע על אופן ביצוע Root במכשיר שלך ב־wiki.lineageos.org או באתרי דומים.
+
+ מקצועי
+ עם
+
+
+ סנכרון הושלם
+ שגיאת בעת סינכרון
+
+ מסנכרן
+ סונכרן!
+ AdAway מוריד רשתות של מודעות כדי לחסום אותן ממקורותיהן המקוונים. אתה יכול להתאים אותן מאוחר יותר בהגדרות.
+ נסה לסנכרן בשנית
+ נכשל בסנכרון: %1$s לנסות כעת?
+ זה יכול לשלוח הודעות כדי להציג סטטוס חסימת מודעות ושליטה, ולהודיע על עדכון יישום זמין (מספר פעמים בשנה). יש להפעיל אותם אם ברצונך להישאר מעודכן.
+
+
+ תמיכה
+ תמוך בי!
+ AdAway הוא יישום חינמי וקוד פתוח שאני מפתח בזמני הפנוי. אם הינך נהנה מזה, אל תהסס להראות את תמיכתך:
+ תרומה באמצעות PayPal
+ אתה אוהב באגים? גמאני לא.
+ הפעלת טלמטריה בכדי לשלוח לי דוחות קריסה
+
+
+ אחורה
+ קדימה
+ סיום
+
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000..f5a3b99
--- /dev/null
+++ b/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,258 @@
+
+
+
+ 終了
+ 閉じる
+ はい
+ いいえ
+ 追加
+ キャンセル
+ 保存
+ ヘルプ
+
+
+ ようこそ!
+ AdAwayは、広告をブロックするためのフリーでオープンソースのソフトウェアです。広告用ネットワークアドレスを取得して、あなたのデバイス上で遮断します。\nもっと知りたいですか? 以下のヘルプをチェックしてください!
+ 詳しいヘルプを表示
+ 最新状況
+ 定義されたソースからhostsファイルをダウンロードし、システムのhostsファイルに統合してインストールします
+ 広告ブロックを有効にする
+ 広告ブロックを無効にする
+ ウェブサーバー
+ 実行中
+ 停止中
+ ブロックしたホスト名に返答するローカルホストのウェブサーバーを開始/停止します
+ Webサーバーを有効にする
+ Webサーバーを無効にする
+ VPN
+ 実行中
+ 停止中
+ VPNによるフィルタリングを開始/停止します
+ VPN 有効
+ VPN 無効
+
+
+ 項目を編集する
+ 適用する
+ 編集
+ 削除
+
+
+ インポート中…
+ 外部ストレージからバックアップが正常にインポートされました。
+ バックアップのインポートに失敗しました。 バックアップの形式は正しいですか? 詳細は、 logcat を確認してください。
+ エクスポート中…
+ バックアップは、外部ストレージ上の \'%s\' へ正常にエクスポートされました。
+ バックアップ\'%s\'のエクスポートに失敗しました。
+
+
+ hostsファイル
+ hostsファイルはホスト名をIPアドレスに対応させるシステムファイルです。 AdAwayが処理する設定が書かれたただのテキストファイルです。 最初の数行はこんな感じです:
+ hostsファイルの内容を読み込み中…
+ hostsファイルを開く
+
+
+ 更新を確認中
+ %sの更新を確認中
+ ソースの取得
+ %sをダウンロード中
+ %sを読込中
+ %sを解析中
+ ルールデータベースを同期
+ デフォルトhostsファイルに戻す
+ デフォルトhostsファイルをリストアしました
+ 標準hostsファイルを作成中
+ 更新があります
+ 新しいhostsファイルがあります
+ ソースの更新はありません
+ ネット接続なし
+ ネットに接続されていません
+ 取得先が利用できません
+ どのhosts 取得先にも接続できません!
+ ルートアクセスが拒否されました
+ ルートアプリからのルート アクセスを許可する
+ 何らかの不具合が起きました
+ 詳細は logcat をチェックしてください
+ 有効です
+ 最新の hosts ファイルが有効になりました
+ 無効になっています
+ デフォルトの hosts ファイルがインストールされました
+ 最新のソースを適用
+ 新しいhostsファイルの作成
+ 新しいhostsファイルをコピー
+ hostsファイルのコピーを確認
+ hostsファイルの更新に成功
+ VPN構成の更新に成功
+ 設定が変更されました。適用する必要があります。
+ 適用する
+ 新しい設定を適用しています…
+ 新しい設定の適用に失敗しました
+
+
+ hostsファイルターゲットへのシンボリックリンクが不明です
+ /system/etc/hostsへのシンボリックリンクは存在しないか不正です! AdAwayは正しいファイルが指定されていないと動作しません。\n\nシンボリックリンクを作成しますか?
+ シンボリックリンクが見つかりません
+ このパーティションに十分な容量がありません!\n設定で対象とする hosts ファイルを /data/data/hosts に変更してみてください。
+ 空き容量不足
+ ダウンロードしたファイルが読み込めません
+ プライベートファイル失敗
+ パーティションの 読み/書き での再マウントに失敗しました!
+ 再マウント失敗
+ hostsファイルのコピーに失敗
+ hostsファイルのコピー失敗!
+ コピー失敗
+ hosts のソースを適用しました
+ 適用しました
+ 適用に成功しました。\n実際に変更されるには Android の再起動が必要なことがあります。\n\n再起動しますか?\n(データの損傷を防ぐため、現在 SDカードを使っているアプリが無いのを確認してください!)
+ シンボリックリンク作成に成功しました。\n実際に変更されるには Android の再起動が必要なことがあります。\n\n再起動しますか?\n(データの損傷を防ぐため、現在 SDカードを使っているアプリが無いのを確認してください!)
+ シンボリックリンク作成成功
+ Android が シンボリックリンクを作成できません。\nHTC 製端末にある S-ON という「機能」が原因です。\n\n解決するにはリカバリモードで起動し、コマンド 「 ln -s /data/data/hosts /system/etc/hosts 」 でシンボリックリンクを作成してください。\n\nそれでも動作しない場合 S-OFF について検索してください。
+ シンボリックリンク作成失敗
+ 詳しくはヘルプをご覧ください
+ ご使用の端末に APN プロキシが設定されています! 3G等のモバイルネットワークで AdAway がうまく動作しない場合があります。プロキシを無効にするには、選択されている APN (設定アプリから: ネットワーク → インターネット → モバイルネットワーク → 詳細設定 → アクセスポイント名) を選択して、「プロキシ」の欄を空白にしてください。
+ APNプロキシがセットされました!
+ ネット接続がありません
+ 接続なし
+ ダウンロード中…
+ 適用中…
+ ブラック/ホワイトリストを適用中
+ hostsファイルの解析・統合中…
+ hostsファイルを構築中…
+ hostsファイルを適用中
+ 新しいhostsファイルの適用に失敗
+ hostsファイルの適用に失敗しました!\n設定で対象とする hosts ファイルを /data/data/hosts に変更してみてください。
+ 適用に失敗
+ ルート管理アプリをチェックして、ルートアクセスが許可されていることを確認してください。
+ デフォルトの hosts ファイルに差し戻しました。\n実際に変更されるには Android の再起動が必要なことがあります。\n\n再起動しますか?\n(データの損傷を防ぐため、現在 SDカードを使っているアプリが無いのを確認してください!)
+ 元に戻しました
+ hostsファイルを元に戻せません
+ 何らかの理由により元に戻せませんでした
+ 元に戻せません!
+ どの hosts 取得先にも接続できません! インターネットに接続されていますか?
+ ダウンロード失敗
+ 新しいプライベートhostsファイルの書き込みに失敗しました
+ プライベートファイルが作成できません
+ プライベートファイルの作成失敗
+ システムレスモードを有効にしました。\n実際に変更されるには Android の再起動が必要なことがあります。\n\n再起動しますか?\n(データの損傷を防ぐため、現在 SDカードを使っているアプリが無いのを確認してください!)
+ 有効化は成功です
+ システムレスモードを無効にしました。\n実際に変更されるには Android の再起動が必要なことがあります。\n\n再起動しますか?\n(データの損傷を防ぐため、現在 SDカードを使っているアプリが無いのを確認してください!)
+ 無効化は成功です
+ VPN広告ブロックの有効化に失敗しました
+ VPN広告ブロックの無効化に失敗しました
+ Magisk の hosts モジュールの有効化
+ Magisk マネージャーから Systemless hosts 機能を有効にします。設定から Systemless hosts オプションを有効にしてから、デバイスを再起動します。
+ Magisk の hosts モジュールの無効化
+ Magisk マネージャー から Systemless hosts 機能を無効にします。モジュールリストから、 Systemless hosts モジュールをアンインストールしてから、デバイスを再起動します。
+
+
+ hostsファイルのURLを入力:
+ 正しいホスト名ではありません!
+ ホスト名が正しくありません
+ 不正なIPです!
+ IPが正しくありません
+ 再起動せずに、この質問を二度と表示しない
+ 読み込み中…
+
+
+ 更新
+ 追加
+ ヘルプ
+ バックアップのインポート
+ バックアップのエクスポート
+
+
+ S-ON/S-OFF
+ FAQ
+ 問題
+
+
+ アドウェア
+ ここではAdAway によってブロックできない、インストール済みの有害アプリ (アドウェア) を一覧化しています。 これらのアプリは例えば、プッシュ通知を使用してアプリが実行されていないときにもポップアップしたり、着信音を無断で変更したりします。 対策はリスト項目をタップして、アプリをアンインストールすることだけです。
+ スキャン中…
+ アドウェアは検出されませんでした!
+
+
+ 広告排除!
+ テキストエディタがありません
+ hostsファイルを開くためのテキストエディタが見つかりません。Jotaなどテキストエディタをインストールしてください。\n\nJotaをインストールしますか?
+ ファイルマネージャがインストールされていません
+ ファイルマネージャが見つかりません。OI File ManagerやTetraなどをインストールしてください。\n\nOI File Managerをインストールしますか?
+
+
+ TCPダンプ
+ TCPダンプはDNS要求を監視してログファイルに保存する機能です。 バックグラウンドで開始して、広告を表示するアプリを起動するとログファイルでDNS要求を調べられます。広告のサーバーだと思われるものはブラックリストに追加出来ます
+ 監視を無効にする
+ 監視を有効にする
+ 結果を表示
+ ドメインを並べ替える
+ ログを消去
+ ブラックリストにエントリーを追加する
+ ホワイトリストにエントリーを追加する
+ リダイレクトリストにエントリを追加する
+
+ テキスト設定値を編集する
+ メニューを開く
+ メニューを閉じる
+
+
+
+ ホーム
+ hosts 取得先
+ あなたのリスト
+ hostsファイルを開く
+ DNS 要求のログ
+ アドウェアをスキャン
+ 設定
+ ヘルプ
+
+
+
+
+ DNSリクエスト
+ あなたのリスト
+ 設定
+
+
+ インストール済み %1$s
+ 最新 %1$s
+ 更新が必要 %1$s
+ 最後の更新 %1$s
+ 更新ステータスが不明
+ 無効になっています
+ 数分前
+
+ %d 分
+
+
+ %d 時間
+
+
+ %d 日
+
+
+ %d ヶ月
+
+
+
+ ホストをクリップボードにコピーしました
+
+
+ 開始
+ 動作中
+ 停止
+ ネットワークを待機中
+ 再接続
+ 再接続エラー
+ 一時停止
+ 停止
+ Ad-blocker VPN %1$s
+ 一時停止
+ 復帰
+
+
+ AdAway 権限
+ AdAwayとの連携を許可する
+ AdAwayにコマンドを送信
+ システムの広告ブロックを切り替える等のコマンドをAdAwayへ送信することを許可します。
+
+
diff --git a/app/src/main/res/values-ja/strings_app.xml b/app/src/main/res/values-ja/strings_app.xml
new file mode 100644
index 0000000..2ce8555
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Open Source ad blocker
+ AdAway ロゴ
+
diff --git a/app/src/main/res/values-ja/strings_errors.xml b/app/src/main/res/values-ja/strings_errors.xml
new file mode 100644
index 0000000..21a2d6e
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ ネット接続なし
+ インターネットへの接続を確立できません。端末の接続状態を確認してください。
+ hostsソースのダウンロードに失敗しました
+ 有効にしたhostsソースに到達できません。インターネットに正しく接続されているか確認してください。
+
+ プライベートファイルの作成に失敗しました
+ 新しいhostsソースを構築するためのプライベートファイルを作成できません。端末の空き容量を確認してください。
+ 空き容量不足
+ hostsファイルをシステムパーティションにコピーできません。Magiskのシステムレスモジュールが有効になっているか確認し、再起動してください。
+ 新しいhostsファイルのインストールに失敗しました
+ hostsファイルを/systemパーティションにコピーすることができません。Magiskのシステムレスモジュールが有効になっているか確認し、再起動してください。
+ hostsファイルの復元に失敗しました
+ デフォルトのhostsファイル構成を復元できません。
+
+ VPN広告ブロックの有効化に失敗しました
+ 端末のVPN設定を確認して、アプリからのVPNの起動を許可してください。
+ VPN広告ブロックの無効化に失敗しました
+ 端末のVPN設定を確認して、手動で無効にしてください。
+
diff --git a/app/src/main/res/values-ja/strings_home.xml b/app/src/main/res/values-ja/strings_home.xml
new file mode 100644
index 0000000..fba20ba
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ 禁止
+ 許可
+ 転送
+
+
+
+ %d 最新ソース
+
+
+ %d 古いソース
+
+ hostsの更新を確認
+ hostsを更新
+
+
+ DNSリクエストログを表示
+
+
+ ヘルプを表示
+
+
+ GitHub ページを開く
+
+
+ プロジェクト サポート
+
+
+ GitHub プロジェクト
+ 設定
+
+
+ ナビゲーションドロワーを開く
+ 広告ブロックの一時停止/再開
+ ブロックされたドメインの更新
+ 要求されたドメインの表示
+
+
+ 詳しくはヘルプをご覧ください
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ja/strings_hosts.xml b/app/src/main/res/values-ja/strings_hosts.xml
new file mode 100644
index 0000000..0bfa7e1
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ hosts 取得先
+
+ ユーザーリスト
+ AdAway official hosts
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ 日時不明
+ %s hosts
+
+ ソースを追加
+ ソースを編集
+ URL: (https:// または file:// の情報源)
+ hosts が置いてある URL
+
diff --git a/app/src/main/res/values-ja/strings_lists.xml b/app/src/main/res/values-ja/strings_lists.xml
new file mode 100644
index 0000000..2dc1dfa
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ あなたのリスト
+ ホストを追加
+
+ ブロック
+ 許可
+ 転送
+
+ hostsのフィルタリング
+ hostnameを検索…
+ ソースを切り替える
+
+ ホストをブラックリストに追加する
+ ホストをホワイトリストに追加する
+ ホストリダイレクトを追加
+ ブラックリスト内のホストを編集する
+ ホワイトリスト内のホストを編集する
+ リダイレクト先を編集
+ ホスト名:
+ hosts が置いてある URL
+ (ワイルドカード文字 「*」 および 「?」 が使用できます)
+ IP (IPv4 か IPv6):
+
diff --git a/app/src/main/res/values-ja/strings_log.xml b/app/src/main/res/values-ja/strings_log.xml
new file mode 100644
index 0000000..28e3845
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ ログ取得切替
+ 記録ボタンを押してログの取得を開始後、Web閲覧やアプリを使用してから、再度この画面に戻るかスワイプすることでログが更新されます。
+ \n\nブロックされたDNS要求はログに記録されません。広告ブロックを解除してからログを記録してください。
+
+ アルファベット順
+ トップレベルドメイン順
+
+ ドメインをリダイレクトする
+
diff --git a/app/src/main/res/values-ja/strings_notification.xml b/app/src/main/res/values-ja/strings_notification.xml
new file mode 100644
index 0000000..85849a9
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ アップデート
+ 新しいアップデートの通知
+ 更新があります
+ 新しいhostsファイルがダウンロード可能になりました
+ アプリを更新できます
+ AdAwayの新しいバージョンがダウンロードできます
+
+ VPN
+ VPN実行中の通知
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ja/strings_prefs_backup_restore.xml b/app/src/main/res/values-ja/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..b822fe7
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ バックアップ & リストア
+ バックアップ
+ ブロックルールを外部ストレージにバックアップ
+ リストア
+ バックアップファイルからブロックルールを復元
+
diff --git a/app/src/main/res/values-ja/strings_prefs_main.xml b/app/src/main/res/values-ja/strings_prefs_main.xml
new file mode 100644
index 0000000..9cb9739
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ 設定
+
+ 一般
+ ダークテーマ
+
+ ライト
+ ダーク
+ システムのデフォルト
+
+ 自動更新
+
+ 広告ブロッキング
+ Root based ad blocker
+ VPN based ad blocker
+ IPv6 サポートの有効化
+ ブロックルールのバックアップ/リストア
+
+ デバッグ
+ クラッシュレポートの送信
+ Sentryへ報告(sentry.io)
+ このバージョンではサポートされていません
+ 徹底したログ収集
+ 適用するにはアプリの再起動が必要です
+
diff --git a/app/src/main/res/values-ja/strings_prefs_root.xml b/app/src/main/res/values-ja/strings_prefs_root.xml
new file mode 100644
index 0000000..a64d42a
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Root based ad blocker
+
+ hostsインストール
+ hostsファイルを開く
+ ターゲットhostsファイル
+ この機能を使用する前に、ヘルプをお読みください
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ カスタムターゲット
+
+ カスタムターゲットの場所
+ 適用後の再起動ダイアログを表示しない
+
+ リダイレクト
+ ブロックされたホストのリダイレクト先を定義します
+ IPv4リダイレクト
+ IPv6リダイレクト
+ 無効なリダイレクト
+
+ ローカルWebサーバー
+ ローカルWebサーバーがブロックされたホスト名のリクエストに答えます。接続がブロックされた影響によるアプリのフリーズを防ぐことができます。
+ Webサーバーを有効にする
+ Webサーバーのテスト
+ 自己署名証明書のインストール
+ 証明書の手動インストール
+ Android 11 (R)以降、アプリから認証局(CA)の自動インストールができなくなりました。\n\n\"セキュリティ\"設定の\"暗号化と認証情報\"から\"証明書のインストール\"を選択してください。そこから\"CA証明書\"を選択し、エクスポートした証明書ファイルを選択してください。
+ \"セキュリティ\"設定を開く
+ 確認中…
+ 実行していません
+ 実行中ですが証明書がインストールされていません
+ 実行中で証明書がインストールされています
+ 空白になる広告スペースをアプリアイコンで置き換える
+
diff --git a/app/src/main/res/values-ja/strings_prefs_update.xml b/app/src/main/res/values-ja/strings_prefs_update.xml
new file mode 100644
index 0000000..2319aae
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ アップデート
+ 通知がオフされています
+ アプリケーションの通知は表示されません。タップして有効にする。
+
+ アプリケーションの更新
+ 起動時にアップデートを確認する
+ 定期的なアップデートの確認
+ ベータ版のリリースを含める
+
+ hostsの更新
+ 起動時にアップデートを確認する
+ 定期的なアップデートの確認
+ 更新時に同期する
+ 非課金ネットワークでのみ同期
+
diff --git a/app/src/main/res/values-ja/strings_prefs_vpn.xml b/app/src/main/res/values-ja/strings_prefs_vpn.xml
new file mode 100644
index 0000000..8d7c25d
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN based ad blocker
+
+ 起動時に有効にする
+ 接続を監視する
+ 定期的にネットワークの状態を確認し、切断時にVPNを再起動します
+
+ 対象外のアプリケーション
+ VPNを使用しないアプリケーションを設定すると、接続がブロックされなくなります
+ システムアプリを除外する
+
+ 除外しない
+ ブラウザを除くすべて
+ すべて
+
+ ユーザーアプリを除外する
+
+
+ 対象外のアプリケーション
+ すべて選択
+ すべての選択を解除
+ Application icon
+
diff --git a/app/src/main/res/values-ja/strings_source_edit.xml b/app/src/main/res/values-ja/strings_source_edit.xml
new file mode 100644
index 0000000..48b30b8
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ ソースを編集
+ ソースを追加
+
+ ラベル
+ ラベルは必須です
+ タイプ
+ URL
+ ファイル
+ 場所
+ https://
+ 場所は必須です
+ ファイルを押すとソースファイルとして選べます
+ 場所が間違っています
+ リスト形式
+ ブロック
+ 許可
+ リダイレクトホストの適用
+ リダイレクトホストを許可するとセキュリティの問題を起こす可能性があります。重要なトラフィックを他のサーバーに転送してしまう恐れがあるため、信頼できるソースでのみこの設定を使ってください。
+
diff --git a/app/src/main/res/values-ja/strings_support.xml b/app/src/main/res/values-ja/strings_support.xml
new file mode 100644
index 0000000..8479178
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Support
+ スポンサーになる
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ja/strings_update.xml b/app/src/main/res/values-ja/strings_update.xml
new file mode 100644
index 0000000..803860d
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway update
+
+ アップデートできます!
+
+
+ 最新版です
+ 更新があります
+ AdAway 更新中
+ 今すぐ更新
+ %1$s / %2$s
+ 変更点:
+ 変更履歴:
+ 開発の支援
+ 寄付
+ スポンサー
+
+
+ 最新のAdAwayをダウンロードしています…
+
diff --git a/app/src/main/res/values-ja/strings_welcome.xml b/app/src/main/res/values-ja/strings_welcome.xml
new file mode 100644
index 0000000..805d452
--- /dev/null
+++ b/app/src/main/res/values-ja/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ ようこそ
+ 最初のウィザード
+ 次のウィザード
+ 最後のウィザード
+
+
+ AdAwayへようこそ!
+ AdAwayには2つの広告ブロック方法があります。好きな方を選んでください。
+
+ Root logo
+ Root based\nad blocking
+ 高速
+ バッテリーに優しい
+ Rootが必要
+
+ VPN logo
+ VPN based\nad blocking
+ 低速
+ バックグラウンドで動作
+ 互換性が高い
+
+ root化されたAndroidが必要です
+ suのバイナリが見つからなかったか、AdAwayにroot権限が許可されていないかのどちらかです。\n\nこれは、お使いのデバイスがroot化されていない場合に発生する可能性があります。デバイスをroot化する方法については、wiki.lineageos.orgやその他のAndroidのウェブサイトで確認できます。
+
+ Pro
+ Con
+
+
+ Sync done
+ Error during sync
+
+ 同期中
+ 同期しました!
+ AdAwayは、オンラインソースからブロックする広告ネットワークをダウンロードします。後から設定でカスタマイズすることができます。
+ Retry sync
+ 同期失敗: %1$s リトライしますか?
+
+
+ Support
+ サポートしてね!
+ これは無料のオープンソースアプリです。私は自由な時間を使って開発しています。ですから、もし楽しんでいただけたなら遠慮なくサポートしてください。
+ PayPalで寄付する
+ バグは嫌いですよね?私もです。
+ クラッシュレポートの収集と報告を有効にする
+
+
+ 戻る
+ 次へ
+ 完了
+
diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml
new file mode 100644
index 0000000..490f651
--- /dev/null
+++ b/app/src/main/res/values-km/strings.xml
@@ -0,0 +1,57 @@
+
+
+
+ ចាកចេញ
+ បិទ
+ បាទ
+ ទេ
+ បន្ថែម
+ បោះបង់
+ រក្សាទុក
+ ជំនួយ
+ កែប្រែ
+ លុបចេញ
+
+ រកឃើញមានជំនាន់ថ្មី
+ ពុំមានតំនរភ្ជាប់អ៊ិនធឺណែត
+ ពុំមានឃើញមានតំនរភ្ជាប់អ៊ិនធឺណែត
+ គ្មានប្រភពឯកសារម៉ាស៊ីនណាអាចទាក់ទងបាន
+ ត្រូវបានបញ្ចូល
+ ត្រូវបានបណ្តាច់
+ ពុំមានប្រលោះទំនេរគ្រប់គ្រាន់
+ ចម្លងបរាជ័យ
+ ស្នើរសុំជោគជ័យ
+ សូមអាន \"ជំនួយ\" សម្រាប់ព័តមានបន្ថែម
+ បានកំណត់ APN ប្រូកស៊ី!
+ ការភ្ជាប់អ៊ិនធឺណែតគឺមិនដំនើរការ
+ គ្មានការតភ្ជាប់
+ កំពុងអនុវត្តបញ្ជីខ្មៅ និង បញ្ជីស
+ កំពុងបង្កើតឯកសារ
+ កំពុងអនុវត្តឯកសារ
+ ការអនុវត្តបានបរាជ័យ
+ ត្រឡប់ដូចដើមជោគជ័យ
+ ធ្វើឲ្យដូចដើមបរាជ័យ
+ ទាញយកបរាជ័យ
+ កំពុងផ្ទុកទិន្ន័យ…
+
+ បន្ថែម
+ ជំនួយ
+
+ S-ON/S-OFF
+
+ អ្នកបំបិទការឃោសនា
+ ពុំមានកម្មវិធីគ្រប់គ្រងឯកសារត្រូវបានបញ្ចូល
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ ការកំណត់
+ ជំនួយ
+
+ ការកំណត់
+
+
diff --git a/app/src/main/res/values-km/strings_app.xml b/app/src/main/res/values-km/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-km/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-km/strings_errors.xml b/app/src/main/res/values-km/strings_errors.xml
new file mode 100644
index 0000000..2fee285
--- /dev/null
+++ b/app/src/main/res/values-km/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ ពុំមានតំនរភ្ជាប់អ៊ិនធឺណែត
+ ពុំមានប្រលោះទំនេរគ្រប់គ្រាន់
+
\ No newline at end of file
diff --git a/app/src/main/res/values-km/strings_home.xml b/app/src/main/res/values-km/strings_home.xml
new file mode 100644
index 0000000..1a68a36
--- /dev/null
+++ b/app/src/main/res/values-km/strings_home.xml
@@ -0,0 +1,9 @@
+
+
+
+ ការកំណត់
+
+
+ សូមអាន \"ជំនួយ\" សម្រាប់ព័តមានបន្ថែម
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-km/strings_hosts.xml b/app/src/main/res/values-km/strings_hosts.xml
new file mode 100644
index 0000000..033e676
--- /dev/null
+++ b/app/src/main/res/values-km/strings_hosts.xml
@@ -0,0 +1,6 @@
+
+
+ Hosts sources
+
+ មិនមានរកឃើញ
+
diff --git a/app/src/main/res/values-km/strings_lists.xml b/app/src/main/res/values-km/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-km/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-km/strings_log.xml b/app/src/main/res/values-km/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-km/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-km/strings_notification.xml b/app/src/main/res/values-km/strings_notification.xml
new file mode 100644
index 0000000..b52dc27
--- /dev/null
+++ b/app/src/main/res/values-km/strings_notification.xml
@@ -0,0 +1,4 @@
+
+
+ រកឃើញមានជំនាន់ថ្មី
+
\ No newline at end of file
diff --git a/app/src/main/res/values-km/strings_prefs_backup_restore.xml b/app/src/main/res/values-km/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-km/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-km/strings_prefs_main.xml b/app/src/main/res/values-km/strings_prefs_main.xml
new file mode 100644
index 0000000..3483c2f
--- /dev/null
+++ b/app/src/main/res/values-km/strings_prefs_main.xml
@@ -0,0 +1,6 @@
+
+
+ ការកំណត់
+
+ បំបាត់កំហុស
+
diff --git a/app/src/main/res/values-km/strings_prefs_root.xml b/app/src/main/res/values-km/strings_prefs_root.xml
new file mode 100644
index 0000000..fd139d5
--- /dev/null
+++ b/app/src/main/res/values-km/strings_prefs_root.xml
@@ -0,0 +1,11 @@
+
+
+ Open hosts file
+ គោលដៅឯកសារម៉ាស៊ីន
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-km/strings_prefs_update.xml b/app/src/main/res/values-km/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-km/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-km/strings_prefs_vpn.xml b/app/src/main/res/values-km/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-km/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-km/strings_support.xml b/app/src/main/res/values-km/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-km/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-km/strings_update.xml b/app/src/main/res/values-km/strings_update.xml
new file mode 100644
index 0000000..f186884
--- /dev/null
+++ b/app/src/main/res/values-km/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ រកឃើញមានជំនាន់ថ្មី
+
diff --git a/app/src/main/res/values-km/strings_welcome.xml b/app/src/main/res/values-km/strings_welcome.xml
new file mode 100644
index 0000000..27c8543
--- /dev/null
+++ b/app/src/main/res/values-km/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ តម្រូវការ Root ទូរស័ព្ធ
+
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
new file mode 100644
index 0000000..6c66b86
--- /dev/null
+++ b/app/src/main/res/values-ko/strings.xml
@@ -0,0 +1,258 @@
+
+
+
+ 종료
+ 닫기
+ 예
+ 아니오
+ 추가
+ 취소
+ 저장
+ 도움말
+
+
+ 환영합니다!
+ AdAway는 광고를 막기 위해 고안된 무료 오픈 소스 소프트웨어입니다. 이는 광고들의 네트워크 주소를 찾아 당신의 디바이스에서 막습니다.\n더 알고 싶다면 밑의 도움말을 확인해주세요!
+ 도움말 더보기
+ 업데이트 상태
+ 지정한 소스의 모든 호스트 파일이 사용자 목록과 다운로드 및 병합되었고 시스템에 하나의 호스트 파일로 설치되었습니다.
+ 광고차단 활성화
+ 광고차단 비활성화
+ 웹 서버
+ 실행중
+ 중지됨
+ 로컬호스트의 웹서버를 시작 또는 중지하여 차단된 호스트명의 요청에 응답합니다.
+ 웹 서버 활성화
+ 웹 서버 비활성화
+ VPN
+ 실행중
+ 중지됨
+ 필터를 요청하려면, VPN을 시작하거나 중단해야합니다.
+ VPN 활성화
+ VPN 비활성화
+
+
+ 항목 편집
+ 적용
+ 편집
+ 삭제
+
+
+ 가져오는 중…
+ 백업이 성공적으로 외부 저장소에서부터 불러와졌습니다.
+ 백업을 불러오는데 실패했습니다. 해당 파일 형식이 옳바릅니까? 자세한 내용은 로그캣을 확인해주십시오.
+ 내보내는 중…
+ Backup successfully exported to file \'%s\' on your external storage.
+ 백업 파일 \'%s\'를 내보내지 실패했어요.
+
+
+ 호스트 파일
+ 호스트 파일은 호스트이름을 IP주소로 변환하는 파일입니다. AdAway에서 처리되는 간단한 텍스트 파일입니다. 파일의 시작은 다음과 같습니다:
+ 호스트 파일 컨텐츠 불러오는 중…
+ 호스트 파일 열기
+
+
+ 업데이트 확인 중
+ 업데이트를 위한 %s 소스 확인 중
+ 소스 검색 중
+ 소스 다운로드 중 %s
+ 소스 읽는 중 %s
+ 소스 분석 중 %s
+ 규칙 데이터베이스 동기화
+ 기본 호스트 파일로 되돌리는 중
+ 기본 호스트 파일로 복구 됨
+ 표준 호스트 파일 생성 중
+ 업데이트 가능
+ 최신 호스트 파일 사용 가능
+ 소스 업데이트를 찾을 수 없음
+ 인터넷 연결 안됨
+ 사용 가능한 인터넷 연결이 없음
+ 사용할수없는 소스
+ 접근 가능한 호스트 소스가 없습니다!
+ 루팅 권한이 거부됨
+ 루팅앱에서 루팅 권한을 허용하십시오.
+ 뭔가 잘못되었습니다
+ 자세한 내용은 로그캣을 확인해주세요.
+ 활성화됨
+ 최신 호스트 파일이 활성화됨
+ 비활성화됨
+ 기본 호스트 파일들이 설치 됨
+ 최근 소스 적용
+ 새 호스트 파일 생성 중
+ 새 호스트 파일 복사 중
+ 복사 된 새 호스트 파일 확인 중
+ 호스트 파일이 성공적으로 업데이트 됨
+ VPN 구성이 성공적으로 업데이트 됨
+ 변경된 설정을 저장하려면, 적용을 해야합니다.
+ 적용
+ 새 설정 적용 중…
+ 새 설정 적용에 실패했습니다.
+
+
+ 호스트 파일 대상에 대한 심링크가 누락 됨
+ 대상에서 /system/etc/host으로 연결되는 심링크가 존재하지 않거나 올바르지 않습니다! 올바른 파일을 가르키지 않을 경우 AdAway가 작동하지 않습니다.\n\n심링크 생성을 시도하시겠습니까?
+ 심링크가 누락됨
+ 파티션에 공간이 부족합니다!\n환경 설정에서 대상 호스트 파일을 /data/data/hosts로 변경해보십시오.
+ 공간 부족
+ 다운로드한 파일을 읽을 수 없습니다.
+ 개인 파일 적용 실패
+ 읽기/쓰기 가능한 파티션으로 재장착에 실패되었습니다!
+ 재장착 실패
+ 호스트 파일 복사 실패
+ 호스트 파일 복사에 실패하였습니다!
+ 복사 실패
+ 호스트 소스 적용됨
+ 적용 성공
+ 성공적으로 적용하였습니다.\n변경 사항을 적용하려면 재부팅이 필요할 수 있습니다.\n\n재부팅 하시겠습니까?\n(데이터 손실 방지를 위해 현재 SD카드를 사용 중인 앱이 없는지 확인하십시오!)
+ 심링크를 성공적으로 생성하였습니다.\n변경 사항을 적용하려면 재부팅이 필요할 수 있습니다.\n\n재부팅 하시겠습니까?\n(데이터 손실 방지를 위해 현재 SD카드를 사용 중인 앱이 없는지 확인하십시오!)
+ 심링크 생성 성공
+ 안드로이드가 심링크를 생성하지 못하였습니다.\n이것은 대부분 HTC 전화기의 S-ON이라 불리는 \'기능\'이 원인입니다!\n\n해결을 위해 전화기를 복구 모드로 부팅한 후 \'ln -s /data/data/hosts /system/etc/hosts\'에서 심링크를 생성하십시오.\n\n이 방법이 작동하지 않을 경우 인터넷에서 S-OFF 및 전화기 기종을 검색하십시오.
+ 심링크 생성 실패
+ 더 많은 정보는 도움말을 참조해주십시오.
+ 안드로이드에 APN 프록시가 설정되어 있습니다!\nAdAway는 3G와 같은 모바일 네트워크 상에서 안정적으로 작동하지 않습니다. 선택한 APN (설정 앱에서: 네트워크 및 인터넷 -> 모바일 네트워크 -> 고급 -> 액세스 포인트 이름)으로 이동하여 해당 프록시를 비활성화하고 프록시 입력란에 값을 제거할 수 있습니다.
+ APN 프록시가 설정됨!
+ 인터넷에 연결되지않아 작동하지않습니다
+ 연결 끊김
+ 다운로드 중…
+ 적용 중…
+ 허용 목록 및 차단 목록 적용 중
+ 호스트 파일 구문 분석 및 병합 중
+ 호스트 파일 생성 중
+ 호스트 파일 적용 중
+ 새 호스트 파일 적용 실패
+ 시스템에 호스트 파일 적용하는데 실패하였습니다!\n환경 설정에서 대상 호스트 파일을 /data/data/hosts(으)로 변경해보십시오.
+ 적용에 실패함
+ 당신의 루팅 관리자 앱을 확인하여 루팅 권한이 허용되어있는지 확인해주십시오.
+ 기본 호스트 파일로 되돌리셨습니다.\n변경 사항을 적용하려면 재부팅이 필요할 수 있습니다.\n\n재부팅 하시겠습니까?\n(데이터 손실 방지를 위해 현재 SD카드를 사용 중인 앱이 없는지 확인하십시오!)
+ 되돌리기 성공
+ 호스트 파일을 되돌릴 수 없음
+ 알 수 없는 이유로 되돌리기에 실패하였습니다.
+ 되돌리기에 실패함!
+ 활성화된 호스트 소스 중 어느 하나도 연결할 수 없습니다! 인터넷에 제대로 연결되어 있습니까?
+ 다운로드 실패
+ 새 개인 호스트 파일 작성 실패
+ 개인 파일을 생성할 수 없습니다.
+ 개인 파일 생성에 실패함
+ Systemless 모드를 활성화하였습니다.\n변경 사항을 적용하려면 재부팅이 필요할 수 있습니다.\n\n재부팅 하시겠습니까?\n(데이터 손실 방지를 위해 현재 SD카드를 사용 중인 앱이 없는지 확인하십시오!)
+ 활성화 성공
+ Systemless 모드를 비활성화하였습니다.\n변경 사항을 적용하려면 재부팅이 필요할 수 있습니다.\n\n재부팅 하시겠습니까?\n(데이터 손실 방지를 위해 현재 SD카드를 사용 중인 앱이 없는지 확인하십시오!)
+ 비활성화 성공
+ 광고 차단 활성화 실패
+ 광고 차단 비활성화 실패
+ 호스트 Magisk 모듈 활성화
+ Magisk 매니저에서 시스템없는 호스트 기능을 활성화합니다. Magisk 설정에서 Systemless hosts를 활성화한 다음 재부팅하십시오.
+ 호스트 Magisk 모듈 비활성화
+ Magisk 매니저에서 시스템없는 호스트 기능을 비활성화합니다. 모듈 목록에서, Systemless hosts를 제거한 다음 재부팅하십시오.
+
+
+ 호스트 파일에 URL 입력:
+ 잘못된 호스트명입니다!
+ 부적절한 형식의 호스트명
+ 이것은 올바른 IP가 아닙니다!
+ 부적절한 형식의 IP
+ 절대 재시작하지 말고 다시는 이 질문을 하지 마십시오!
+ 불러오는 중…
+
+
+ 새로 고침
+ 추가
+ 도움말
+ 백업 불러오기
+ 백업 저장하기
+
+
+ S-ON/S-OFF
+ FAQ
+ 문제
+
+
+ 애드웨어
+ 여기서 AdAway로 차단되지 않는 불량 애드웨어 앱을 검색할 수 있습니다. 이 앱들은 앱이 실행 중이지 않을 때나 벨소리를 변경할 때도 팝업 형식으로 나타나는 Alrpush 같은 알림을 사용합니다. 사용 가능한 유일한 대책은 목록 아이템을 클릭하여 제거하는 것입니다.
+ 스캔중…
+ 애드웨어가 없습니다!
+
+
+ 광고 차단기
+ 설치된 텍스트 편집기가 없음
+ 호스트 파일을 열기 위한 텍스트 편집기를 발견하지 못하였습니다. Jota 또는 기타 텍스트 편집기를 설치하여 이를 처리할 수 있습니다.\n\nJota를 설치하시겠습니까?
+ 파일 관리자가 설치되어있지 않음
+ 파일을 열기 위한 파일 관리자를 발견하지 못했습니다. OI 파일 관리자 또는 기타 파일 관리자를 설치하여 이를 처리할 수 있습니다.\n\nOI 파일 관리자를 설치하시겠습니까?
+
+
+ Tcpdump
+ Tcpdump는 DNS 요청을 감시하고 로그 파일에 저장하는 도구입니다. 배경에서 시작할 수 있고, 광고를 표시하는 앱을 실행할 수 있으며, 추후 로그 파일을 이용하여 DNS 요청을 분석할 수 있습니다. 그런 다음 의심스러운 광고 서버를 차단 목록에 추가할 수 있습니다.
+ 감시 비활성화
+ 감시 활성화
+ 결과 보기
+ 도메인 정렬
+ 로그 지우기
+ 블랙리스트에 추가
+ 화이트리스트에 추가
+ 리다이렉트 리스트에 추가
+
+ 텍스트 값 수정
+ 메뉴 열기
+ 메뉴 닫기
+
+
+
+ 홈
+ 호스트 소스
+ 사용자 리스트
+ 호스트 파일 열기
+ DNS 리퀘스트 로그
+ 애드웨어 검색
+ 환경 설정
+ 도움말
+
+
+
+
+ DNS 리퀘스트
+ 사용자 목록
+ 환경 설정
+
+
+ %1$s 전에 설치 됨
+ %1$s 전에 갱신 됨
+ %1$s개의 업데이트가 필요
+ %1$s일 전에 업데이트 됨
+ 업데이트 상태 확인 불가
+ 비활성화됨
+ 몇 분
+
+ %d 분
+
+
+ %d 시간
+
+
+ %d 일
+
+
+ %d 개월
+
+
+
+ 클립보드에 복사된 호스트
+
+
+ 시작 중
+ 활성화
+ 중단 중
+ 네트워크 기다리는 중
+ 재접속 중
+ 재접속 오류
+ 일시정지됨
+ 중단됨
+ 광고 차단 VPN %1$s
+ 일시정지
+ 탭하여 재개
+
+
+ AdAway의 허가
+ Adaway와 상호작용하도록 허용
+ 시스템 광고 차단을 활성화하거나 비활성화
+ Adaway에 시스템 전체 광고 차단을 활성화또는 비활성화와 같은 명령을 보낼수 있게 허용
+
+
diff --git a/app/src/main/res/values-ko/strings_app.xml b/app/src/main/res/values-ko/strings_app.xml
new file mode 100644
index 0000000..0f0a38a
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ 오픈 소스 광고 차단기
+ AdAway 로고
+
diff --git a/app/src/main/res/values-ko/strings_errors.xml b/app/src/main/res/values-ko/strings_errors.xml
new file mode 100644
index 0000000..f2f809e
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ 인터넷 연결 안됨
+ 인터넷 연결을 설정할 수 없습니다. 장치 연결을 확인하십시오.
+ 호스트 소스 다운로드 실패
+ 활성화된 호스트 소스에 연결할 수 없습니다. 인터넷에 제대로 연결되어 있는지 확인하십시오.
+
+ 개인 파일 생성 실패
+ 새 호스트 소스를 빌드하기 위한 개인 파일을 생성할 수 없습니다. 장치에서 사용 가능한 고간을 확인하십시오.
+ 공간 부족
+ 호스트 파일이 시스템 파티션에 복사 할 수 없습니다. Magisk 시스템 제외 모듈이 재부팅 후 활성화 되어있는지 확인하십시오.
+ 새 호스트 파일 설치 실패
+ 호스트 파일이 /system 파티션에 복사할 수 없습니다. Magisk 시스템 제외 모듈이 재부팅 후 활성화 되어있는지 확인하십시오.
+ 호스트 파일 되돌리기 실패
+ 호스트 파일 구성을 기본값으로 복원할 수 없습니다.
+
+ 광고 차단 활성화 실패
+ VPN 설정을 확인하여 VPN이 실행되도록 권한을 부여해주십시오.
+ 광고 차단 비활성화 실패
+ VPN 설정을 수동으로 비활성화하려면 VPN 설정을 확인하십시오.
+
diff --git a/app/src/main/res/values-ko/strings_home.xml b/app/src/main/res/values-ko/strings_home.xml
new file mode 100644
index 0000000..8b4293c
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ 차단 됨
+ 허용 됨
+ 리다이렉트 됨
+
+
+
+ %d개의 갱신된 소스
+
+
+ %d개의 오래된 소스
+
+ 호스트 업데이트 확인
+ 호스트 업데이트
+
+
+ DNS 요청 기록 보기
+
+
+ 도움말 보기
+
+
+ GitHub 접속
+
+
+ 지원하기
+
+
+ Github 프로젝트
+ 환경 설정
+
+
+ 네비게이션 서랍 열기
+ 광고 차단 일시정지/재개
+ 차단된 도메인 업데이트
+ 요청된 도메인 보기
+
+
+ 더 많은 정보는 도움말을 참조해주세요.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ko/strings_hosts.xml b/app/src/main/res/values-ko/strings_hosts.xml
new file mode 100644
index 0000000..8369795
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ 호스트 소스
+
+ 사용자 리스트
+ AdAway 공식 호스트
+ StevenBlack 통합 호스트
+ Pete Lowe 블락리스트 호스트
+
+ 사용 불가
+ %s 호스트
+
+ 소스 추가
+ 소스 수정
+ URL: (https://로 시작하거나 file://로 시작)
+ 호스트 소스 URL
+
diff --git a/app/src/main/res/values-ko/strings_lists.xml b/app/src/main/res/values-ko/strings_lists.xml
new file mode 100644
index 0000000..d531a1a
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ 사용자 목록
+ 호스트 추가
+
+ 차단 됨
+ 허용 됨
+ 리다이렉트 됨
+
+ 호스트 필터
+ 호스트 이름 검색…
+ 소스 전환
+
+ 블랙리스트에 호스트 추가
+ 화이트리스트에 호스트 추가
+ 리다이렉트에 호스트 추가
+ 블랙리스트 호스트 수정
+ 화이트리스트 호스트 수정
+ 리다이렉트 수정
+ 호스트명:
+ 호스트 소스 URL
+ (*과 ? 2가지의 와일드카드 문자들이 허용됩니다)
+ IP (IPv4 또는 IPv6):
+
diff --git a/app/src/main/res/values-ko/strings_log.xml b/app/src/main/res/values-ko/strings_log.xml
new file mode 100644
index 0000000..1b78f75
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ 로그 기록 전환
+ 기록을 눌러 요청 로그를 시작하고, 웹을 탐색하거나 앱을 사용한 다음 뒤로 돌아가거나 스와이프하여 로그를 새로 고칩니다.
+ \n\n차단된 요청은 로그를 남기지 않습니다. 이것들도 로그를 남기고 싶다면 먼저 광고차단을 비활성화하십시오.
+
+ 알파벳순 정렬
+ 레벨순 정렬
+
+ 도메인 리다이렉트
+
diff --git a/app/src/main/res/values-ko/strings_notification.xml b/app/src/main/res/values-ko/strings_notification.xml
new file mode 100644
index 0000000..c40ef66
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ 업데이트
+ 새 업데이트 알림
+ 업데이트 가능
+ 다운로드 가능한 새 호스트 파일이 있습니다.
+ 앱 업데이트 사용가능
+ AdAway의 새로운 버전을 다운로드할 수 있습니다.
+
+ VPN
+ VPN 실행 알림
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ko/strings_prefs_backup_restore.xml b/app/src/main/res/values-ko/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..823c082
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ 백업 및 복원
+ 백업
+ 차단 규칙을 외부 저장소에 백업합니다
+ 복원
+ 백업된 차단 규칙을 복원합니다
+
diff --git a/app/src/main/res/values-ko/strings_prefs_main.xml b/app/src/main/res/values-ko/strings_prefs_main.xml
new file mode 100644
index 0000000..f2ecf66
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ 환경 설정
+
+ 일반
+ 테마
+
+ 밝음
+ 어두움
+ 시스템 기본값
+
+ 자동 업데이트
+
+ 광고 차단
+ 루팅 기반 광고 차단
+ VPN 기반 광고 차단
+ IPv6 지원 적용
+ 차단 규칙 백업 / 복원하기
+
+ 디버깅
+ 충돌 보고서 전송
+ Sentry (sentry.io)에 보고
+ 이 빌드에서는 지원되지 않습니다
+ 상세 로그
+ 적용하려면 앱 재시작이 필요합니다
+
diff --git a/app/src/main/res/values-ko/strings_prefs_root.xml b/app/src/main/res/values-ko/strings_prefs_root.xml
new file mode 100644
index 0000000..f0cf641
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ 루팅 기반 광고 차단
+
+ 호스트 설치
+ 호스트 파일 열기
+ 대상 호스트 파일
+ 이 기능을 사용하기 전에 도움말을 읽으십시오
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ 사용자 지정 대상
+
+ 사용자 지정 대상 위치
+ 적용 후 재부팅 대화상자 숨기기
+
+ 리다이렉트
+ 차단된 호스트를 리다이렉트할 위치 정의
+ IPv4 리다이렉트
+ IPv6 리다이렉트
+ 잘못된 리다이렉션
+
+ 로컬 웹 서버
+ 로컬 웹 서버는 차단 된 호스트 이름을 요청에 응답하기 위해 로컬 IP 주소를 수신합니다. 차단된 연결로 앱 프리징을 막을 수 있습니다.
+ 웹 서버 활성화
+ 시험 웹 서버
+ 자체 서명된 인증서 설치
+ 수동 설치 인증
+ Android 11 (R)부터 애플리케이션은 자동으로 인증 기관 (CA)를 설치할 수 없습니다.\n\n\"보안\" 설정으로 이동한 다음 \" 암호화 및 사용자 인증 정보\"에서 \"인증서 설치\"를 해주세요. 그리고 \"CA 인증서\"를 선택한 다음 최근에 내보낸 인증서 파일을 선택해 주세요.
+ \"보안\" 설정 열기
+ 확인 중…
+ 실행중이 아님
+ 실행 중이지만 인증서가 설치되지 않음
+ 실행 중이며 인증서가 설치되어 있음
+ 빈 광고 공간을 앱 아이콘으로 대체하기
+
diff --git a/app/src/main/res/values-ko/strings_prefs_update.xml b/app/src/main/res/values-ko/strings_prefs_update.xml
new file mode 100644
index 0000000..5fa06ee
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ 업데이트
+
+ 앱 업데이트
+ 시작 시 업데이트 확인
+ 주기적으로 업데이트 확인
+ 베타 릴리즈 포함
+
+ 호스트 업데이트
+ 시작 시 업데이트 확인
+ 주기적으로 업데이트 확인
+ 업데이트 시 동기화
+ 무제한 네트워크 환경에서만 동기화
+
diff --git a/app/src/main/res/values-ko/strings_prefs_vpn.xml b/app/src/main/res/values-ko/strings_prefs_vpn.xml
new file mode 100644
index 0000000..1c2b6d6
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN 기반 광고 차단
+
+ 앱 실행시 활성화
+ 연결 감시
+ 주기적으로 네트워크 상태를 확인하여 연결 끊김시 VPN을 재시작하기
+
+ 앱 제외하기
+ VPN을 사용하지 않아야 하는 앱을 설정하여 연결이 차단되지 않도록 하십시오.
+ 시스템 앱 제외하기
+
+ 없음
+ 모든 브라우저 제외
+ 전부
+
+ 사용자 앱 제외하기
+
+
+ 앱 제외하기
+ 모두 선택
+ 모두 선택 해제
+ 앱 아이콘
+
diff --git a/app/src/main/res/values-ko/strings_support.xml b/app/src/main/res/values-ko/strings_support.xml
new file mode 100644
index 0000000..75c6a5f
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ 지원
+ 스폰서가 되기
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ko/strings_update.xml b/app/src/main/res/values-ko/strings_update.xml
new file mode 100644
index 0000000..fa1514e
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway 업데이트
+
+ 업데이트 가능!
+
+
+ 최신 버전입니다
+ 업데이트 가능
+ AdAway를 업데이트 중
+ 지금 업데이트하기
+ %1$s / %2$s
+ 마지막 변경:
+ 변경사항:
+ 도와준 사람들
+ 기부
+ 후원
+
+
+ 최신 AdAway 버전을 다운로드 중…
+
diff --git a/app/src/main/res/values-ko/strings_welcome.xml b/app/src/main/res/values-ko/strings_welcome.xml
new file mode 100644
index 0000000..86842dc
--- /dev/null
+++ b/app/src/main/res/values-ko/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ 환영합니다
+ 마법사 첫번째 설정
+ 마법사 두번째 설정
+ 마법사 마지막 설정
+
+
+ AdAway에 오신 걸 환영합니다!
+ AdAway는 두 가지 광고 차단을 제공하고 있습니다. 원하시는 기능을 선택해 주십시오:
+
+ Root logo
+ 루팅 기반\n광고 차단
+ 빠름
+ 저전력
+ 루팅이 필요함
+
+ VPN logo
+ VPN 기반\n광고 차단
+ 느림
+ 백그라운드 실행
+ 호환성
+
+ 루팅 필수
+ su 바이너리를 찾을 수 없거나 AdAway에 대한 루팅 권한을 허용하지 않은 경우.\n\n이 문제는 장치가 루팅되지 않은 경우에 발생할 수 있습니다. wiki.lineageos.org 또는 다른 안드로이드 웹 사이트에서 장치를 루팅하는 방법에 대한 정보를 찾을 수 있습니다.
+
+ Pro
+ Con
+
+
+ 동기화 완료
+ 동기화 도중 오류
+
+ 동기화 중
+ 동기화 됨!
+ AdAway는 온라인 소스로 부터 차단하기 위해 광고 네트워크를 다운로드합니다. 나중에 설정에서 수정할 수 있습니다.
+ 동기화 재시도
+ 동기화 실패 됨: %1$s 재시도하시겠습니까?
+
+
+ 지원
+ 지원해주세요!
+ 이 앱은 무료이면서 오픈 소스입니다. 저는 여가 시간에 개발하고 있습니다. 만약 만족하신다면, 여러분의 지원을 자유롭게 보내주세요:
+ PayPal로 기부하기
+ 버그 좋아하시나요? 전 싫어합니다.
+ 충돌 보고서를 전송하려면, 원격 분석을 활성화 해야합니다.
+
+
+ 뒤로
+ 다음
+ 완료
+
diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml
new file mode 100644
index 0000000..68d11cc
--- /dev/null
+++ b/app/src/main/res/values-ku/strings.xml
@@ -0,0 +1,20 @@
+
+
+
+ دەرچوون
+ بە
+ نا
+ ھەڵوەشاندن
+ دەستکاری
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-ku/strings_app.xml b/app/src/main/res/values-ku/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-ku/strings_errors.xml b/app/src/main/res/values-ku/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ku/strings_home.xml b/app/src/main/res/values-ku/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ku/strings_hosts.xml b/app/src/main/res/values-ku/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-ku/strings_lists.xml b/app/src/main/res/values-ku/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-ku/strings_log.xml b/app/src/main/res/values-ku/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-ku/strings_notification.xml b/app/src/main/res/values-ku/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ku/strings_prefs_backup_restore.xml b/app/src/main/res/values-ku/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ku/strings_prefs_main.xml b/app/src/main/res/values-ku/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-ku/strings_prefs_root.xml b/app/src/main/res/values-ku/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-ku/strings_prefs_update.xml b/app/src/main/res/values-ku/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ku/strings_prefs_vpn.xml b/app/src/main/res/values-ku/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-ku/strings_support.xml b/app/src/main/res/values-ku/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ku/strings_update.xml b/app/src/main/res/values-ku/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ku/strings_welcome.xml b/app/src/main/res/values-ku/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-ku/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
new file mode 100644
index 0000000..ba7e7b1
--- /dev/null
+++ b/app/src/main/res/values-lt/strings.xml
@@ -0,0 +1,266 @@
+
+
+
+ Išeiti
+ Uždaryti
+ Taip
+ Ne
+ Pridėti
+ Atšaukti
+ Išsaugoti
+ Pagalba
+
+
+ Sveiki!
+ AdAway yra nemokama ir atviro kodo programinė įranga sukurta blokuoti reklamas. Ši programa filtruoja reklamų tinklo adresus jūsų įrenginyje, taip jas blokuodama. Norite sužinoti daugiau? Patikrinkite pagalbą apačioje!
+ Parodyti daugiau pagalbos
+ Atnaujinti būseną
+ Visi hosts failai atsiųsti ir apjungti su įdiegtu hosts failu.
+ Įjungti reklamų blokavimą
+ Išjungti reklamų blokavimą
+ Web tinklo serveris
+ Veikia
+ Sustabdytas
+ Pradėti arba sustabdyti tinklo web serverį jūsų vietiniame įrenginyje kuris atsako į blokuotų domenų užklausas.
+ Įjungti web serverį
+ Išjungti tinklo web serverį
+ VPN
+ Įjungta
+ Sustabdyta
+ Pradeti arba sustabdyti VPN kad pradėtų filtruoti užklausas.
+ Įjungti VPN
+ Išjungti VPN
+
+
+ Redeguoti Įrašą
+ Pritaikyti
+ Redeguoti
+ Ištrinti
+
+
+ Importuoju…
+ Atsarginė kopija sėkmingai importuota iš jūsų išorinės atminties.
+ Nepavyko importuoti atsarginės kopijos. Ar jos formatas teisingas? Patikrinkite logcat failą dėl išsamesnių detalių.
+ Eksportuojama…
+ Atsarginė kopija sėkmingai eksportuota į failą \'%s\' jūsų išorinėje saugykloje.
+ Nepavyko eksportuoti atsarginės kopijos failą%s
+
+
+ Hosts failas
+ Hosts failas yra sistemos failas kuris pritaiko domenus prie IP adresų. Tai yra paprastas teksto failas kurio konfiguraciją tvarko ir naudoja AdAway. Čia yra jos pirmos eilutės:
+ Kraunama hosts failo duomenys…
+ Atverti hosts failą
+
+
+ Tikrinama ar yra atnaujinimų
+ Tikrinama %s šaltinį dėl atnaujinimo
+ Gaunama šaltinius
+ Atsisiunčiama šaltinį %s
+ Skaitoma šaltinį %s
+ Nagrinėjamas %s šaltinis
+ Sinchronizuojamų taisyklių duomenų bazė
+ Atstatomas originalus hosts failas
+ Originalus hosts failas atkurtas
+ Kuriu standartinį hosts failą
+ Pasiekiamas atnaujinimas
+ Pasiekiamas naujesnis host failas
+ Šaltinio atnaujinimų nerasta.
+ Nėra interneto
+ Neprisijungęs prie interneto
+ Šaltiniai nepasiekiami
+ Nepasiekiami hosts šaltiniai!
+ Root priėjimas atmestas
+ Leisti root prieigą iš jūsų root programos
+ Kažkas nesutapo
+ Patikrinkite logcat failą dėl išsamesnių detalių
+ Įjungta
+ Naujausias host failas ijungtas
+ Išjungta
+ Originalus hosts failas instaliuotas
+ Pritaikyti naujausius šaltinius
+ Kuriamas naujas hosts failas
+ Kopijuojamas naujas hosts failas
+ Tikrinama hosts failo kopija
+ Hosts failas sėkmingai atnaujintas
+ VPN konfigūracija sėkmingai atnaujinta
+ Jūsų konfiguracija išsaugota. Jums reikia ją pritaikyti.
+ Pritaikyti
+ Pritaikoma nauja konfigūracija…
+ Nepavyko pritaikyti naujos konfigūracijos.
+
+
+ Trūksta symlink nuorodos į hosts failą
+ Symlink nuoroda /system/etc/hosts neteisinga! AdAway neveiks jei neteisingai nurodytas kelias.\n\nPabandyti sukurti teisingą symlink nuorodą?
+ Nėra symlink
+ Particijoje neužtenka vietos!\nPabandykite pakeisti pasirenkamą hosts failą nustatymuose /data/data/hosts.
+ Nepakanka vietos
+ Nepavyksta nuskaityti atsiųsto failo.
+ Asmeninio failo klaida
+ Nepavyko skirsnio padaryti įrašomu!
+ Permantavimo klaida
+ Nepavyko nukopijuoti hosts failo
+ Hosts file kopijavimas nepavyko!
+ Kopijavimas nepavyko
+ Pritaikyti hosts šaltiniai
+ Pritaikymas sėkmingas
+ Pritaikymas sėkmingas.\nlt gali būti kad reikės perkrauti jūsų Android įrenginį kad pritaikyti naujus pakeitimus.n\nAr jūs norite perkauti įrenginį?\n(Kad neprarastumėte duomenų įsitikinkite kad programa naudoja SD kortelę šio momentu!)
+ Symlink nuorodos sukūrimas sėkmingas.\nGali būti kad reikės perkrauti jūsų Android įrenginį kad pritaikyti naujus pakeitimus.n\nAr jūs norite perkauti įrenginį?\n(Kad neprarastumėte duomenų įsitikinkite kad programa naudoja SD kortelę šiuo momentu!)
+ Symlink sukurtas
+ Symlink nuoroda jūsų įrenginyje negalėjo būti sukurta.\nTaip įvyksta dėl \'funkcijos\' pavadinimu S-ON HTC telefonuose!\n\nA Sprendimas yra įjungti jūsų įrenginį į atsarginių kopijų rėžimą recovery mode ir sukurti nuorodą symlink, ten, naudojant \'In -s /data/data/hosts /system/etc/hosts\'.\n\n Jei nesuveiks jums reikės internete surasti S-OFF jūsų įrenginiui.
+ Nepavyko sukurti symlink
+ Detalesnę informaciją rasite skiltyje Pagalba
+ APN proxy serveris yra įjungtas jūsų įrenginyje!\nAdAway neveiks patikimai kai naujomi mobilieji tinklai kaip 3G. Jūs galite deaktyvuoti jūsų proxy pasirenkant jūsų pasirinktą APN (Nustatymuose: Tinklas & Internetas -> Mobilusis tinklas -> Sudėtingiau -> Prieigų Taškų Pavadinimai) ir ištrinti adresą iš proxy laukelio.
+ APN proxy nustatytas!
+ Prisijungti pire interneto nepavyko.
+ Nėra Interneto
+ Atsisiunčiama…
+ Pritaikoma…
+ Pritaikomas Juodasis ir Baltasis sąrašas.
+ Nagrinėjamas ir suliejamas host faias
+ Tvarkomas host failas
+ Pritaikomas host failas
+ Nepavyko pritakyti naujam hosts failui.
+ Nepavyko pritaikyti hosts failo!\nPabandykite pakeisti paskirties vietą nustatymuose į /data/data/hosts.
+ Pritaikymas nepavyko
+ Prašome patikrinti jūsų root prieigos tvarkymo programėlę, įsitikinkite kad leista root prieiga.
+ Jūs atstatėte originalų hosts failą.\nlt gali būti kad reikės perkrauti jūsų Android įrenginį kad pritaikyti naujus pakeitimus.n\nAr jūs norite perkauti įrenginį?\n(Kad nesukurti duomenų praradimo įsitikinkite kad programa naudoja SD kortelę šio momentu!)
+ Atkūrimas sėkmingas
+ Hosts failo atstatymas negalimas
+ Nepavyko atstatyti dėl nežinomų priežasčių.
+ Atkūrimas nepavyko!
+ Nepasiekiamas nei vienas iš pasirinktų hosts šaltinių! Ar tikrai prisijungėte prie interneto?
+ Atsisiuntimas nepavyko
+ Nėra prieigos koreguoti naujo privataus hosts failo
+ Nepavyko sukurti asmeninio failo.
+ Nepavyko sukurti asmeninio failo
+ Jūs įjungėte ne sisteminį rėžimą.\nGali būti kad reikės perkrauti jūsų Android įrenginį kad pritaikyti naujus pakeitimus.n\nAr jūs norite perkauti įrenginį?\n(Kad neprarastumėte duomenų įsitikinkite kad programa naudoja SD kortelę šiuo momentu!)
+ Pavyko įjungti
+ Jūs išjungėte ne sisteminį rėžimą.\nGali būti kad reikės perkrauti jūsų Android įrenginį kad pritaikyti naujus pakeitimus.n\nAr jūs norite perkauti įrenginį?\n(Kad neprarastumėte duomenų įsitikinkite kad programa naudoja SD kortelę šiuo momentu!)
+ Pavyko išjungti
+ Nepavyko įjungti VPN reklamų blokavimo.
+ Nepavyko išjungti VPN reklamų blokavimo.
+ Įjungiamas hosts Magisk modulis
+ Įjungkite ne sisteminę hosts funkciją iš Magisk tvarkytuvo. Jo nustatymuose įjungkite Ne sisteminiai hosts šaltiniai funkciją ir perkraukite jūsų įrenginį.
+ Išjungiamas hosts Magisk modulis
+ Išjungti ne sisteminių šaltinių hosts šaltinių funkciją Magisk tvarkytuve. Iš modulių sarašo, ištrinkite Ne sisteminiai hosts šaltiniai modulį ir perkraukite jūsų įrenginį.
+
+
+ Įterpti URL į hosts failą:
+ Neteisingas host vardas!
+ Neteisingas host vardo formatas
+ Neteisingas IP
+ Neteisingas IP formatas
+ Niekada neperkrauti ir neberodyti šio klausimo!
+ Kraunama…
+
+
+ Atnaujinti
+ Pridėti
+ Pagalba
+ Imporuoti atsarginę kopiją
+ Eksportuoti atsarginę kopiją
+
+
+ S-ON/S-OFF
+ DUK
+ Problemos
+
+
+ Adware Reklamų virusas
+ Čia jūs galite rasti blogas programas kurios negali būti užblokuotos AdAway programoje. Šios programos naudoja Airpush pranėšimus, kurie iššoka net jei ir programa išjungta, gali net pakeisti skambučio toną. Vienintelis būdas to išvengti - Ištrinti šias programas paspaudžiant ant programų sarašo.
+ Skanuojama…
+ Nerasta Adware Reklamų virusų.
+
+
+ Reklamos blokavimas
+ Neradau teksto redagavimo programos
+ Neturite jokios teksto redagavimo programos, su kuria galėtume atidaryti host failą.\n\nĮdiegti Jota?
+ Nėra failų tvarkyklės
+ Neturite failų tvarkymo programos, su kuria galėtume atidaryti failus. Galite įdiegti OI Failų Tvarkyklę\n\nĮdiegti Dabar?
+
+
+ Tcpdump
+ Tcpdump tai įrankis DNS užklausų stebėjimui ir iįsaugoimui log faile. Galite paleisti fone, įjungti programą, kuri rodo reklamą ir po to analizuoti DNS užklausas log faile. Reklamos serverį galėsite pridėti į juodąjį sąrašą.
+ Išjungti sekimą
+ įjungti sekimą
+ Parodyti rezultatus
+ Rūsiuoti domenus
+ Išvalyti surinktą informaciją
+ Įdėti įėjima į juodą sąrašą
+ Įdėti įėjimą į baltajį sąrašą
+ Įdėti įėjima į nukreipimo sąrašą
+
+ Redaguoti teksto pasirinkimo vertę
+ Atverti meniu
+ Uždaryti meniu
+
+
+
+ Namai
+ Hosts šaltiniai
+ Jūsų sarašai
+ Atverti hosts failą
+ Rinkti DNS užklausas
+ Skanuoti dėl reklamų virusų
+ Nustatymai
+ Pagalba
+
+
+
+
+ DNS užklausos
+ Jūsų sarašai
+ Nustatymai
+
+
+ Instaliuotos nuo %1$s
+ Galiojančios iki %1$s
+ Reikia atnaujinimo dėl %1$s
+ Paskutinis atnaujinimas %1$s
+ Nežinomas atnaujinimo statusas
+ kelios minutės
+
+ %d minutė
+ %d minutės
+ %d minutės
+ %d minutės
+
+
+ %d valanda
+ %d valandos
+ %d valandos
+ %d valandos
+
+
+ %d diena
+ %d dienos
+ %d dienos
+ %d dienos
+
+
+ %d mėnesis
+ %d mėnesiai
+ %d mėnesiai
+ %d mėnesiai
+
+
+
+ Pradedama
+ aktyvus
+ stabdoma
+ laukiama tinklo
+ prisijungiama iš naujo
+ prisijungimo klaida
+ pauzė
+ sustabdyta
+ Reklamų-blokavimo VPN %1$s
+ Pauzė
+ Tęsti
+
+
+ AdAway leidimai
+ Leisti bendrauti su AdAway
+ Siųsti komandas AdAway
+ Leisti siųsti komandas AdAway, pvz., Įjungti arba išjungti sistemos reklamų blokavimą
+
+
diff --git a/app/src/main/res/values-lt/strings_app.xml b/app/src/main/res/values-lt/strings_app.xml
new file mode 100644
index 0000000..848d561
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Atviro Kodo reklamų blokatorius
+ AdAway logotipas
+
diff --git a/app/src/main/res/values-lt/strings_errors.xml b/app/src/main/res/values-lt/strings_errors.xml
new file mode 100644
index 0000000..bae60a3
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Nėra interneto
+ Negalimas sujingimas internetu. Prašome patkikrinti įrenginio sujungimą.
+ Nepavyko atsisiųsti hosts failo
+ Nei vienas jūsų įjungtas domeno šaltinis yra pasiekiamas. Prašome patikrinti ar esate gerai prisijungę prie interneto.
+
+ Nepavyko sukurti privataus failo
+ Nepavyko sukurti privataus failo kad sukurti naujo domeno šaltinio. Prašome patikrintai ar yra laisvos vietos jūsų įrenginyje.
+ Nepakanka vietos
+ Nepavyko nukopijuoti domeno failo į jūsų sistemos particijos skirsnį. Prašome patikrinti ar Magisk ne sisteminis modulis įjungtas, tada perkraukite įrenginį
+ Nepavyko instaliuoti naujo hosts domeno failo.
+ Nepavyko nukopijuoti domeno failo į jūsų /system particijos skirsnį. Prašome patikrinti ar Magisk ne sisteminis modulis įjungtas, tada perkraukite įrenginį.
+ Nepavyko atkurti praėjusio hosts domeno failo
+ Nepavyko atkrurti originalaus hosts domeno failo konfiguracijos
+
+ Nepavyko įjungti VPN reklamų blokavimo.
+ Prašome patikrinti jūsų VPN nustatymus kurie atsakingi už aplikacijos VPN paleidimą.
+ Nepavyko išjungti VPN reklamų blokavimo.
+ Prašome patikrinti jūsų VPN nustatymus kad juos išjungti rankiniu būdu.
+
diff --git a/app/src/main/res/values-lt/strings_home.xml b/app/src/main/res/values-lt/strings_home.xml
new file mode 100644
index 0000000..95f2aca
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ Užblokuotos
+ Leistos
+ Nukreiptos
+
+
+
+ %d galiojantis kodas
+ %d galiojantys kodai
+ %d galiojantys kodai
+ %d galiojantys kodai
+
+
+ %d nebegaliojantis kodas
+ %d nebeagliojantys kodai
+ %d nebeagliojantys kodai
+ %d nebeagliojantys kodai
+
+
+
+ Rodyti pagalbą
+
+
+ Atverti GitHub svetainę
+
+
+ Palaikyti projektą
+
+
+ Nustatymai
+
+
+ Atverti navigacijos stalčių
+ Stabdyti/tęsti reklamų blokavimą
+ Atnaujinti užblokuotus domenus
+ Rodyti užklaustus domenus
+
+
+ Detalesnę informaciją rasite skiltyje Pagalba
+
+
diff --git a/app/src/main/res/values-lt/strings_hosts.xml b/app/src/main/res/values-lt/strings_hosts.xml
new file mode 100644
index 0000000..cb2a9bf
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Host domenų šaltiniai
+
+ Vartotojų sąrašas
+ AdAway oficialūs domenai
+ StevenBlack Unified sujungti domenai
+ Pete Lowe blokavimo domenai
+
+ nepasiekiama
+ %s hosts domenų sąrašai
+
+ Įdėti šaltinį
+ Redaguoti šaltinį
+ URL: (https:// arba file:// išteklius)
+ Domeno išteklio URL
+
diff --git a/app/src/main/res/values-lt/strings_lists.xml b/app/src/main/res/values-lt/strings_lists.xml
new file mode 100644
index 0000000..9283877
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_lists.xml
@@ -0,0 +1,23 @@
+
+
+ Your lists
+
+ Užblokuotos
+ Leistos
+ Nukreiptos
+
+ Filtruoti domenenai hosts
+ Ieškoti domeno…
+ Pakeisti šaltinius
+
+ Įtraukti į juodą sąrašą
+ Įtraukti į baltą sąrašą
+ Įdėti domeno nukreipimą
+ Redaguoti juodai pažymėtą domeną
+ Redaguoti baltai pažymėtą domeną
+ Redaguoti nukreipimą
+ Host domeno vardas:
+ Domeno išteklio URL
+ (Charakteriai * ir ? leidžiami)
+ IP (IPv4 ar IPv6):
+
diff --git a/app/src/main/res/values-lt/strings_log.xml b/app/src/main/res/values-lt/strings_log.xml
new file mode 100644
index 0000000..15008e6
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Alfabetinis rūšiavimas
+ Viršutinio lygio domeno rūšiavimas
+
+ Nukreipti domeną
+
diff --git a/app/src/main/res/values-lt/strings_notification.xml b/app/src/main/res/values-lt/strings_notification.xml
new file mode 100644
index 0000000..38120ba
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Atnaujinimai
+ Naujų atnaujinimų pranešimai
+ Šaltinio atnaujinimas galimas
+ Naujesni domeno failai su galimybe atsisiūsti
+ Programos ataujinimas galimas
+ Nauja AdAway versija yra galima atsisiuntimui.
+
+ VPN
+ VPN paleisti pranešimai
+
\ No newline at end of file
diff --git a/app/src/main/res/values-lt/strings_prefs_backup_restore.xml b/app/src/main/res/values-lt/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..5209ae4
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Padaryti atsarginę kopiją; atkurti
+ Atsarginė kopija
+ Sukurti atsarginę kopiją į blokavimo taisyklių į išorinę duomenų laikmeną
+ Atkurti
+ Atkrurti jūsų blokavimo taisykles iš atsarginės kopijos
+
diff --git a/app/src/main/res/values-lt/strings_prefs_main.xml b/app/src/main/res/values-lt/strings_prefs_main.xml
new file mode 100644
index 0000000..a9a8253
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Nustatymai
+
+ Bendri
+ Tamsi tema
+
+ Šviesi
+ Tamsi
+ Sistemos pasirinkta
+
+ Automatiniai naujinimai
+
+ Reklamų blokavimas
+ Root pagrįstas\nad blokavimas
+ VPN pagrįstas reklamų blokavimas
+ Įjungti IPv6
+ Padaryti atsarginę kopiją / atkurti blokavimo taisykles
+
+ Derinti
+ Siūsti klaidų įrašus
+ Pateikti sargybai (sentry.io)
+ Nepalaikoma šios programos versijoje
+ Platus įrašų saugojimas
+ Reikia paleisti iš naujo AdAway, kad veiktų nustatymai.
+
diff --git a/app/src/main/res/values-lt/strings_prefs_root.xml b/app/src/main/res/values-lt/strings_prefs_root.xml
new file mode 100644
index 0000000..c54ffea
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_prefs_root.xml
@@ -0,0 +1,36 @@
+
+
+ Root pagrįstas\nad blokavimas
+
+ Domeno instaliacija
+ Atidaryti host faila
+ Nukreipti host failą
+ Prieš keičiant šį nustatymą, perskaitykite Pagalbą apie funkcionalumą.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Pasirinktinis nukreipimas
+
+ Pasirinktinis nukreipimas
+ Slepti perkrovimo užklausą
+
+ Nukreipimas
+ Pasirinkti kur nukreipti užblokuotus hosts domenus
+ IPv4 nukreipimas
+ IPv6 nukreipimas
+
+ Vietinis serveris
+ Lokalus web serveris klauso lokalių IP adresų ir blokuoja domenų adresų užklausas. Tai gali padėti su programos strigimu su blokuotu sujungimu.
+ Įjungti web serverį
+ Testuoti web serverį
+ Instaliuoti savo pažymėtus sertifikatus
+ Sertifikato instrukcijos instaliavimas
+ Pradedant nuo Android 11 (R), programa nebegali automatiškai instaliuoti autorizacijos sertifikato (CA).n\n\ Eikite į \"Saugos\" nustatymus, \"Šifravimas ir Identifikacija\" tada \"Instaliuoti serfifikatą\". Nuo ten, pasirinkti \"CA sertifikatas\" ir naujai eksportuotą sertifikato failą.
+ Atverty \"Saugos\" nustatymus
+ Tikrinama…
+ Neveikia
+ Veikia bet serfikatas neįdiegtas
+ Veikia, serifikatas instaliuotas
+ Pakeisti tuščios reklamos vietą su programėles ikona
+
diff --git a/app/src/main/res/values-lt/strings_prefs_update.xml b/app/src/main/res/values-lt/strings_prefs_update.xml
new file mode 100644
index 0000000..a6820f5
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_prefs_update.xml
@@ -0,0 +1,12 @@
+
+
+ Atnaujinimai
+
+ Programos atnaujinimai
+ Periodiškai ieškoti atnaujinimų
+
+ Domeno hosts atnaujinimai
+ Periodiškai ieškoti atnaujinimų
+ Sinchronizuoti atnaujinimo metu
+ Sinchronizuoti tik neribotu tinklu
+
diff --git a/app/src/main/res/values-lt/strings_prefs_vpn.xml b/app/src/main/res/values-lt/strings_prefs_vpn.xml
new file mode 100644
index 0000000..a86680c
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_prefs_vpn.xml
@@ -0,0 +1,22 @@
+
+
+ VPN pagrįstas reklamų blokavimas
+
+ Įjungti įjungimo metu
+
+ Išskirtos aplikacijos
+ Sukonfigūruoti kurios aplikacijos nenaudos VPN kad sujungimai nebūtų blokuojami.
+ Išskirti sistemos aplikacijos
+
+ Nei viena
+ Visos išskyrus naršykles
+ Visos
+
+ Išskirti vartotojo aplikacijas
+
+
+ Išskirtos programos
+ Pasirinkti visas
+ Nebepasirinkti visų
+ Programos ikona
+
diff --git a/app/src/main/res/values-lt/strings_support.xml b/app/src/main/res/values-lt/strings_support.xml
new file mode 100644
index 0000000..78eaff1
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Palaikymas
+ Tapkite sponsoriumi
+
\ No newline at end of file
diff --git a/app/src/main/res/values-lt/strings_update.xml b/app/src/main/res/values-lt/strings_update.xml
new file mode 100644
index 0000000..e2f0ec4
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_update.xml
@@ -0,0 +1,18 @@
+
+
+ AdAway atnaujinimas
+
+ Atnaujinimas galimas!
+
+
+ Jūs turite naujausią versiją
+ Galimas atnaujinimas
+ Atnaujiname AdAway
+ Atnaujinti dabar
+ %1$s / %2$s
+ Paskutiniai pakeitimai:
+ Pakeitimų įrašai:
+
+
+ Atsisunčiame naujausią AdAway versiją…
+
diff --git a/app/src/main/res/values-lt/strings_welcome.xml b/app/src/main/res/values-lt/strings_welcome.xml
new file mode 100644
index 0000000..0933baa
--- /dev/null
+++ b/app/src/main/res/values-lt/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Sveiki
+ Pirmas žingsnis
+ Antras žingsnis
+ Paskutinis žingsnis
+
+
+ Sveiki, čia AdAway!
+ AdAway teikia du reklamų blokavimo metodus. Pasirinkite norimą:
+
+ Root logotipas
+ Root pagrįstas\nad blokavimas
+ Greitesnis
+ Draugiškas baterijai
+ Root privalomas
+
+ VPN logotipas
+ VPN pagrįstas\nad blokavimas
+ Lėtesnis
+ Veikti fone
+ Suderinamumas
+
+ Root Android prieiga būtina!
+ Arba su binary nerasta arba jūs neleidote root leidimo AdAway.\n\nTai gali atsitikti kai jūsų įrenginys neturi root prieigos. Galite rasti daugiau informacijos kaip gauti root prieigą wiki.lineageos.org ar kituose Android puslapiuose
+
+ Pro
+ Negatyvai
+
+
+ Sinchronizavimas baigtas
+ Klaidos sinchronizavimo metu
+
+ Sinchronizavimas
+ Susinchronizuota!
+ AdAway atsiunčia reklamų adresus kad juos užblokuotų iš tinklo. Jūs galite juos pasirinkti veliau nustatymuose.
+ Bandyti sinchronizuoti iš naujo
+ Sinchronizacija nepavyko %1$s Bandyti iš naujo?
+
+
+ Palaikymas
+ Palaikyk mane!
+ Tai yra nemokama atviro kodo programa. Aš ją sukūriau mano laisvu laiku. Jeigu jums ji patinka, galite mane palaikyti:
+ Donuoti per PayPal
+ Ar jums patinka klaidos? Man irgi ne.
+ Įjungti telemetiją kad man atsiūstu užstrigusios programos įrašus
+
+
+ Atgal
+ Kitas
+ Pabaiga
+
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
new file mode 100644
index 0000000..c069e4d
--- /dev/null
+++ b/app/src/main/res/values-ml/strings.xml
@@ -0,0 +1,196 @@
+
+
+
+ പുറത്തേക് ഉള്ള വഴി
+ അവസാനിപ്പിക്കുക
+ ആണ്
+ അല്ല
+ ചേർക്കുക
+ ഉപേക്ഷിക്കുക
+ സൂക്ഷിക്കുക
+ സഹായം
+
+
+ സ്വാഗതം
+ പരസ്യംചെയ്യൽ തടയുന്നതിനുള്ള ഒരു സൗജന്യ ,ഓപ്പൺ സോഴ്സ് സോഫ്റ്റ്വെയർ ഡിസൈനാണ് AdAway.നിങ്ങളുടെ ഉപകരണത്തിൽ പരസ്യങ്ങൾ തടയുന്നതിന് ഇത് പരസ്യ നെറ്റ്വർക്ക് വിലാസങ്ങൾ നേടുന്നു.കൂടുതൽ അറിയണോ?ചുവടെയുള്ള സഹായം പരിശോധിക്കുക!
+ കൂടുതൽ സഹായം കാണിക്കുക
+ നില മെച്ചപ്പെടുത്തുക
+ നിർവചിക്കപ്പെട്ട ഉറവിടങ്ങളിൽ നിന്നുള്ള എല്ലാ ഹോസ്റ്റ് ഫയലുകളും ഡൗൺലോഡ് ചെയ്തു,നിങ്ങളുടെ സ്വന്തം ലിസ്റ്റുകളുമായി ലയിപ്പിച്ച് നിങ്ങളുടെ സിസ്റ്റത്തിൽ ഒരു ഹോസ്റ്റ് ഫയലായി ഇൻസ്റ്റാൾ ചെയ്തു
+ പരസ്യ-തടയൽ പ്രാപ്തമാക്കുക
+ പരസ്യ-തടയൽ അപ്രാപ്തമാക്കുക
+ വെബ് സെർവർ
+ പ്രവർത്തിക്കുന്നു
+ നിർത്തലാക്കപ്പെട്ടു
+ വെബ് സെർവർ പ്രാപ്തമാക്കുക
+ വെബ് സെർവർ അപ്രാപ്തമാക്കുക
+
+ ചേർത്തത് തിരുത്തുക
+ പ്രയോഗിക്കുക
+ തിരുത്തുക
+ നീക്കം ചെയ്യുക
+
+
+ ഇറക്കുമതി ചെയ്യുന്നു…
+ നിങ്ങളുടെ ബാഹ്യ സംഭരണത്തിൽ നിന്ന് ബാക്കപ്പ് വിജയകരമായി ഇറക്കുമതി ചെയ്തു.
+ ബാക്കപ്പ് ഇറക്കുമതി ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു.അതിന്റെ ഫോർമാറ്റ് ശരിയാണോ?കൂടുതൽ വിവരങ്ങൾക്ക് ലോഗ്കാറ്റ് പരിശോധിക്കുക.
+ കയറ്റുമതി ചെയ്യുന്നു
+
+ ഹോസ്റ്റുകളുടെ ഫയൽ
+ ഹോസ്റ്റ്നാമങ്ങൾ IP വിലാസങ്ങളിലേക്ക് മാപ്പ് ചെയ്യുന്ന ഒരു സിസ്റ്റം ഫയലാണ് ഹോസ്റ്റ്സ് ഫയൽ.AdAway കോൺഫിഗറേഷൻ കൈകാര്യം ചെയ്യുന്ന ഒരു പ്ലെയിൻ ടെക്സ്റ്റ് ഫയലാണിത്.അതിന്റെ ആദ്യ വരികൾ ഇതാ:
+ ഹോസ്റ്റുകളുടെ ഫയൽ ഉള്ളടക്കം ലോഡുചെയ്യുന്നു…
+ ഹോസ്റ്റുകളുടെ ഫയൽ തുറക്കുക
+
+ സ്റ്റാൻഡേർഡ് ഹോസ്റ്റ് ഫയൽ സൃഷ്ടിക്കുന്നു
+ നവീകരണം ലഭ്യമാണ്
+ പുതിയ ഹോസ്റ്റുകളുടെ ഫയലുകൾ ലഭ്യമാണ്
+ ഇന്റർനെറ്റ് കണക്ഷനില്ല
+ ഇന്റർനെറ്റ് കണക്ഷനൊന്നും ലഭ്യമല്ല
+ ലഭ്യമല്ലാത്ത ഉറവിടങ്ങൾ
+ ഹോസ്റ്റ് ഉറവിടങ്ങളൊന്നും എത്തിച്ചേരാനാവില്ല !
+ റൂട്ട് ആക്സസ്സ് നിരസിച്ചു
+ നിങ്ങളുടെ റൂട്ട് അപ്ലിക്കേഷനിൽ നിന്ന് റൂട്ട് ആക്സസ്സ് അനുവദിക്കുക
+ എന്തോ കുഴപ്പം സംഭവിച്ചു
+ കൂടുതൽ വിവരങ്ങൾക്ക് ലോഗ്കാറ്റ് പരിശോധിക്കുക
+ പ്രവർത്തനക്ഷമമാക്കി
+ ഏറ്റവും പുതിയ ഹോസ്റ്റുകളുടെ ഫയലുകൾ പ്രവർത്തനക്ഷമമാക്കി
+ അപ്രാപ്തമാക്കി
+ സ്ഥിരസ്ഥിതി ഹോസ്റ്റുകളുടെ ഫയൽ ഇൻസ്റ്റാൾ ചെയ്തു
+ പ്രയോഗിക്കുക
+ നിങ്ങളുടെ ടാർഗെറ്റിൽ നിന്ന് / സിസ്റ്റം / etc / ഹോസ്റ്റുകളിലേക്കുള്ള സിംലിങ്ക് നിലവിലില്ല അല്ലെങ്കിൽ തെറ്റാണു ! ശരിയായ ഫയലിലേക്ക് പോയിന്റുചെയ്യുന്നില്ലെങ്കിൽ AdAway പ്രവർത്തിക്കില്ല.\n\nഒരു സിംലിങ്ക് സൃഷ്ടിക്കാൻ ശ്രമിക്കണോ?
+ സിംലിങ്ക് കാണുന്നില്ല
+ പാർട്ടീഷനിൽ മതിയായ ഇടമില്ല.\nടാർഗെറ്റ് ഹോസ്റ്റുകളുടെ ഫയൽ / data / data / hosts നു മുൻഗണന മാറ്റാൻ ശ്രമിക്കുക.
+ മതിയായ സ്ഥലമില്ല
+ ഡൗൺലോഡുചെയ്ത ഫയൽ വായിക്കാൻ കഴിഞ്ഞില്ല.
+ സ്വകാര്യ ഫയൽ പരാജയപ്പെട്ടു
+ പാർട്ടീഷൻ read / write ആയി റീമൗണ്ട് ചെയ്യുന്നത് പരാജയപ്പെട്ടു
+ റീമൗണ്ട് പരാജയപെട്ടു
+ ഹോസ്റ്റുകളുടെ ഫയൽ പകർത്തുന്നത് പരാജയപ്പെട്ടു
+ പകർപ്പ് പരാജയപ്പെട്ടു
+ പ്രയോഗിച്ച ഹോസ്റ്റുകളുടെ ഉറവിടങ്ങൾ
+ പ്രയോഗിക്കുന്നത് വിജയകരമാണ്
+ പ്രയോഗിച്ചിരുന്നത് വിജയകരമായിരുന്നു.\nമാറ്റങ്ങൾ പ്രാബല്യത്തിൽ വരാൻ ആൻഡ്രോയിഡ് റീബൂട്ട് ചെയ്യേണ്ടത് ആവശ്യമായി വന്നേക്കാം.\n\nനിങ്ങൾക്ക് റീബൂട്ട് ചെയ്യണോ?(ഡാറ്റ നഷ്ടപ്പെടുന്നത് തടയാൻ ഇപ്പോൾ ഒരു അപ്ലിക്കേഷനും എസ്ഡി. കാർഡ് ഉപയോഗിക്കുന്നില്ലെന്ന് ഉറപ്പാക്കുക!)
+ സിംലിങ്ക് വിജയകരമായി സൃഷ്ടിച്ചു.\nമാറ്റങ്ങൾ പ്രാബല്യത്തിൽ വരാൻ ആൻഡ്രോയിഡ് റീബൂട്ട് ചെയ്യേണ്ടത് ആവശ്യമായി വന്നേക്കാം.\n\nനിങ്ങൾക്ക് റീബൂട്ട് ചെയ്യണോ?(ഡാറ്റ നഷ്ടപ്പെടുന്നത് തടയാൻ ഇപ്പോൾ ഒരു അപ്ലിക്കേഷനും എസ്ഡി. കാർഡ് ഉപയോഗിക്കുന്നില്ലെന്ന് ഉറപ്പാക്കുക!)
+ സിംലിങ്ക് സൃഷ്ടിക്കൽ വിജയിച്ചു
+ ആൻഡ്രോയ്ഡിന് സിംലിങ്ക് സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.എച്ച്ടിസി ഫോണുകളിലെ എസ്-ഓൺ എന്ന സവിശേഷത കാരണം ഇത് പരാജയപ്പെടുന്നു!.നിങ്ങളുടെ ഫോൺ റിക്കവറി മോഡിലേക്ക് ബൂട്ട് ചെയ്ത് \'ln -s / data / data / host / system / etc / host\' ഉപയോഗിച്ച് സിംലിങ്ക് സൃഷ്ടിക്കുക എന്നതാണ് ഒരു പരിഹാരം.ഇത് പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ എസ്-ഓഫിനും നിങ്ങളുടെ ഫോണിനുമായി ഇന്റർനെറ്റിൽ തിരയുക.
+ സിംലിങ്ക് സൃഷ്ടിക്കൽ പരാജയപ്പെട്ടു
+ കൂടുതൽ വിവരങ്ങൾക്ക് സഹായം വായിക്കുക.
+ നിങ്ങളുടെ ആൻഡ്രോയിഡിൽ ഒരു APN പ്രോക്സി സജ്ജമാക്കി!3 ജി പോലുള്ള മൊബൈൽ നെറ്റ്വർക്കുകളിൽ ആയിരിക്കുമ്പോൾ AdAway വിശ്വസനീയമായി പ്രവർത്തിക്കില്ല.നിങ്ങൾ തിരഞ്ഞെടുത്ത APN- ലേക്ക് പോയി (From the Settings app: Network & Internet -> Mobile network -> Advanced -> Access Point Names) ആ പ്രോക്സി നിർജ്ജീവമാക്കി പ്രോക്സി ഫീൽഡിലെ മൂല്യം നീക്കംചെയ്യാം.
+ APN പ്രോക്സി നേരെയാക്കി!
+ ഇന്റർനെറ്റിലേക്കുള്ള കണക്ഷൻ പ്രവർത്തിക്കുന്നില്ല.
+ ബന്ധമില്ല
+ ഡൗൺലോഡുചെയ്യുന്നു…
+ പ്രയോഗിക്കുന്നു…
+ ബ്ലാക്ക് ലിസ്റ്റും വൈറ്റ്ലിസ്റ്റും പ്രയോഗിക്കുന്നു
+ ഹോസ്റ്റ് ഫയലുകൾ വിശകലനം ചെയ്യുകയും ലയിപ്പിക്കുകയും ചെയ്യുന്നു
+ ഹോസ്റ്റുകളുടെ ഫയൽ നിർമ്മിക്കുന്നു
+ ഹോസ്റ്റുകളുടെ ഫയൽ പ്രയോഗിക്കുന്നു
+ നിങ്ങളുടെ സിസ്റ്റത്തിലേക്ക് ഹോസ്റ്റ്സ് ഫയൽ പ്രയോഗിക്കുന്നത് പരാജയപ്പെട്ടു!ടാർഗെറ്റ് ഹോസ്റ്റുകൾ ഫയൽ / data / data / hosts മുൻഗണനയായി മാറ്റാൻ ശ്രമിക്കുക.
+ പ്രയോഗിക്കുന്നത് പരാജയപ്പെട്ടു
+ റൂട്ട് ആക്സസ് അനുവദിച്ചുവെന്ന് ഉറപ്പാക്കാൻ ദയവായി നിങ്ങളുടെ റൂട്ട് മാനേജുമെന്റ് അപ്ലിക്കേഷൻ പരിശോധിക്കുക.
+ നിങ്ങൾ സ്ഥിരസ്ഥിതി ഹോസ്റ്റ് ഫയൽ പഴയപടിയാക്കി.മാറ്റങ്ങൾ പ്രാബല്യത്തിൽ വരാൻ ആൻഡ്രോയിഡ് റീബൂട്ട് ചെയ്യേണ്ടത് ആവശ്യമായി വന്നേക്കാം.നിങ്ങൾക്ക് റീബൂട്ട് ചെയ്യണോ?(ഡാറ്റ നഷ്ടപ്പെടുന്നത് തടയാൻ ഇപ്പോൾ ഒരു അപ്ലിക്കേഷനും എസ്ഡി കാർഡ് ഉപയോഗിക്കുന്നില്ലെന്ന് ഉറപ്പാക്കുക!)
+ പഴയപടിയാക്കുന്നു പഴയപടിയാക്കുന്നതിൽ വിജയിച്ചു
+ അജ്ഞാതമായ കാരണങ്ങളാൽ പഴയപടിയാക്കൽ പരാജയപ്പെട്ടു.
+ പഴയപടിയാക്കൽ പരാജയപ്പെട്ടു!
+ നിങ്ങളുടെ പ്രാപ്തമാക്കിയ ഹോസ്റ്റ് ഉറവിടങ്ങളൊന്നും എത്തിച്ചേരാനാകില്ല!നിങ്ങൾ ശരിയായി ഇന്റർനെറ്റുമായി ബന്ധിപ്പിച്ചിട്ടുണ്ടോ?
+ ഡൗൺലോഡ് പരാജയപ്പെട്ടു
+ സ്വകാര്യ ഫയൽ സൃഷ്ടിക്കാൻ കഴിയില്ല.
+ സ്വകാര്യ ഫയൽ സൃഷ്ടിക്കൽ പരാജയപ്പെട്ടു
+ നിങ്ങൾ സിസ്റ്റമില്ലാത്ത മോഡ് പ്രവർത്തനക്ഷമമാക്കി..മാറ്റങ്ങൾ പ്രാബല്യത്തിൽ വരാൻ ആൻഡ്രോയിഡ് റീബൂട്ട് ചെയ്യേണ്ടത് ആവശ്യമായി വന്നേക്കാം.നിങ്ങൾക്ക് റീബൂട്ട് ചെയ്യണോ?(ഡാറ്റ നഷ്ടപ്പെടുന്നത് തടയാൻ ഇപ്പോൾ ഒരു അപ്ലിക്കേഷനും എസ്ഡി കാർഡ് ഉപയോഗിക്കുന്നില്ലെന്ന് ഉറപ്പാക്കുക!)
+ പ്രവർത്തനക്ഷമംമാക്കുന്നതിൽ വിജയിച്ചു
+ നിങ്ങൾ സിസ്റ്റമില്ലാത്ത മോഡ് അപ്രാപ്തമാക്കി.മാറ്റങ്ങൾ പ്രാബല്യത്തിൽ വരാൻ ആൻഡ്രോയിഡ് റീബൂട്ട് ചെയ്യേണ്ടത് ആവശ്യമായി വന്നേക്കാം.നിങ്ങൾക്ക് റീബൂട്ട് ചെയ്യണോ?(ഡാറ്റ നഷ്ടപ്പെടുന്നത് തടയാൻ ഇപ്പോൾ ഒരു അപ്ലിക്കേഷനും എസ്ഡി കാർഡ് ഉപയോഗിക്കുന്നില്ലെന്ന് ഉറപ്പാക്കുക!)
+ പ്രവർത്തനരഹിതമാക്കുന്നതിൽ വിജയിച്ചു
+ ഹോസ്റ്റുകളുടെ മാജിസ്ക് മൊഡ്യൂൾ പ്രവർത്തനക്ഷമമാക്കുന്നു
+ മാജിസ്ക് മാനേജറിൽ നിന്ന് സിസ്റ്റമില്ലാത്ത ഹോസ്റ്റ് സവിശേഷത പ്രാപ്തമാക്കുക.അതിന്റെ ക്രമീകരണങ്ങളിൽ നിന്ന്, സിസ്റ്റംലെസ്സ് ഹോസ്റ്റുകൾ ഓപ്ഷൻ പ്രാപ്തമാക്കി നിങ്ങളുടെ ഉപകരണം റീബൂട്ട് ചെയ്യുക.
+ ഹോസ്റ്റുകൾ മാജിസ്ക് മൊഡ്യൂൾ പ്രവർത്തനരഹിതമാക്കുന്നു
+ മാജിസ്ക് മാനേജറിൽ നിന്ന് സിസ്റ്റമില്ലാത്ത ഹോസ്റ്റ് സവിശേഷത അപ്രാപ്തമാക്കുക.മൊഡ്യൂൾ ലിസ്റ്റിൽ നിന്ന്,സിസ്റ്റംലെസ്സ് ഹോസ്റ്റ് മൊഡ്യൂൾ അൺഇൻസ്റ്റാൾ ചെയ്ത് നിങ്ങളുടെ ഉപകരണം റീബൂട്ട് ചെയ്യുക.
+
+
+ ഹോസ്റ്റ് ഫയലിലേക്ക് URL ഇൻപുട്ട് ചെയ്യുക:
+ ഇതൊരു സാധുവായ ഹോസ്റ്റ്നാമമല്ല!
+ അനുചിതമായി ഫോർമാറ്റുചെയ്ത ഹോസ്റ്റ്നാമം
+ ഇതൊരു സാധുവായ IP അല്ല!
+ അനുചിതമായി ഫോർമാറ്റുചെയ്ത IP
+ ഒരിക്കലും റീബൂട്ട് ചെയ്യരുത്, അടുത്ത തവണ ഈ ചോദ്യം കാണിക്കരുത്!
+ ലോഡിംഗ്…
+
+
+ പുതുക്കുക
+ ചേർക്കുക
+ സഹായം
+ ബാക്കപ്പ് ഇമ്പോർട്ടുചെയ്യുക
+ ബാക്കപ്പ് എക്സ്പോർട്ട് ചെയ്യുക
+
+
+ എസ്-ഓൺ / എസ്-ഓഫ്
+ പതിവുചോദ്യങ്ങൾ
+ പ്രശ്നങ്ങൾ
+
+
+ ആഡ് വെയർ
+ ഇവിടെ നിങ്ങൾക്ക് ഇൻസ്റ്റാൾ ചെയ്ത ആഡ്വെയർ കണ്ടെത്താം,AdAway- ന് തടയാൻ കഴിയാത്ത മോശം അപ്ലിക്കേഷനുകൾ.അപ്ലിക്കേഷൻ പ്രവർത്തിക്കാത്തപ്പോഴും നിങ്ങളുടെ റിംഗ്ടോൺ മാറ്റുമ്പോഴും പോപ്പ് അപ്പ് ചെയ്യുന്ന എയർപുഷ് അറിയിപ്പുകൾ ഈ അപ്ലിക്കേഷനുകൾ ഉപയോഗിക്കുന്നു.ലിസ്റ്റ് ഇനങ്ങളിൽ ക്ലിക്കുചെയ്ത് ആ അപ്ലിക്കേഷനുകൾ അൺഇൻസ്റ്റാൾ ചെയ്യുക എന്നതാണ് ലഭ്യമായ ഒരേയൊരു പ്രതിവാദം.
+ സ്കാൻ ചെയ്യുന്നു…
+ ആഡ് വെയർ ഒന്നും കണ്ടെത്തിയില്ല!
+
+
+ Ad blocker
+ ടെക്സ്റ്റ് എഡിറ്ററൊന്നും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല
+ ഹോസ്റ്റ് ഫയൽ തുറക്കുന്നതിന് ടെക്സ്റ്റ് എഡിറ്ററൊന്നും കണ്ടെത്താൻ കഴിഞ്ഞില്ല.ഇത് കൈകാര്യം ചെയ്യാൻ നിങ്ങൾക്ക് ജോറ്റ അല്ലെങ്കിൽ മറ്റ് ടെക്സ്റ്റ് എഡിറ്ററുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയും.\n\nനിങ്ങൾക്ക് ജോറ്റ ഇൻസ്റ്റാൾ ചെയ്യണോ?
+ ഫയൽ മാനേജറൊന്നും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല
+ ഫയലുകൾ തുറക്കാൻ ഒരു ഫയൽ മാനേജറും കണ്ടെത്താനായില്ല.ഇത് കൈകാര്യം ചെയ്യുന്നതിന് നിങ്ങൾക്ക് OI ഫയൽ മാനേജർ അല്ലെങ്കിൽ മറ്റ് ഫയൽ മാനേജർമാർ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയും.\n\nOI ഫയൽ മാനേജർ ഇൻസ്റ്റാൾ ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?
+
+
+ Tcpdump
+ DNS അഭ്യർത്ഥനകൾ നിരീക്ഷിക്കാനും അവ ഒരു ലോഗ് ഫയലിൽ സംരക്ഷിക്കാനും ഉള്ള ഉപകരണമാണ് Tcpdump.നിങ്ങൾക്ക് ഇത് പശ്ചാത്തലത്തിൽ ആരംഭിക്കാൻ കഴിയും,പരസ്യങ്ങൾ പ്രദർശിപ്പിക്കുന്ന അപ്ലിക്കേഷനുകൾ പ്രവർത്തിപ്പിക്കുക,അതിനുശേഷം ലോഗ് ഫയൽ ഉപയോഗിച്ച് DNS അഭ്യർത്ഥനകൾ വിശകലനം ചെയ്യുക.സാധ്യമായ പരസ്യ സെർവർ നിങ്ങളുടെ ബ്ലാക്ക് ലിസ്റ്റിൽ ചേർക്കാൻ കഴിയും.
+ നിരീക്ഷണം അപ്രാപ്തമാക്കുക
+ നിരീക്ഷണം പ്രാപ്തമാക്കുക
+ ഫലങ്ങൾ കാണിക്കുക
+ ഡൊമെയ്നുകൾ അടുക്കുക
+ ലോഗ് മായ്ക്കുക
+ ബ്ലാക്ക് ലിസ്റ്റിലേക് എൻട്രി ചേർക്കുക
+ വൈറ്റ് ലിസ്റ്റിലേക്ക് എൻട്രി ചേർക്കുക
+ റീഡയറക്ട് ലിസ്റ്റിലേക്ക് എൻട്രി ചേർക്കുക
+
+ വാചക മുൻഗണന മൂല്യം എഡിറ്റുചെയ്യുക
+ മെനു തുറക്കുക
+ മെനു അടയ്ക്കുക
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
+
+
+ DNS അഭ്യർത്ഥനകൾ
+ നിങ്ങളുടെ ലിസ്റ്റുകൾ
+ മുൻഗണനകൾ
+
+ %1$sഇതിനകം കാലികമാണ്
+ %1$s ന് അപ്ഡേറ്റ് ആവശ്യമാണ്
+ അവസാന അപ്ഡേറ്റ് %1$s മുമ്പ്
+ അജ്ഞാത അപ്ഡേറ്റ് നില
+
+ %dമിനിറ്റ്
+ %d മിനിറ്റ്
+
+
+ %dമണിക്കൂറുകൾ
+ %dമണിക്കൂറുകൾ
+
+
+ %dദിവസങ്ങൾ
+ %dദിവസങ്ങൾ
+
+
+ %dമാസങ്ങൾ
+ %dമാസങ്ങൾ
+
+
+
diff --git a/app/src/main/res/values-ml/strings_app.xml b/app/src/main/res/values-ml/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-ml/strings_errors.xml b/app/src/main/res/values-ml/strings_errors.xml
new file mode 100644
index 0000000..4bda602
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ ഇന്റർനെറ്റ് കണക്ഷനില്ല
+ മതിയായ സ്ഥലമില്ല
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ml/strings_home.xml b/app/src/main/res/values-ml/strings_home.xml
new file mode 100644
index 0000000..2368bfe
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ മുൻഗണനകൾ
+
+
+ കൂടുതൽ വിവരങ്ങൾക്ക് സഹായം വായിക്കുക.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ml/strings_hosts.xml b/app/src/main/res/values-ml/strings_hosts.xml
new file mode 100644
index 0000000..c53891b
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_hosts.xml
@@ -0,0 +1,11 @@
+
+
+ ഹോസ്റ്റുകളുടെ ഉറവിടങ്ങൾ
+
+ ലഭ്യമല്ല
+
+ ഉറവിടം ചേർക്കുക
+ ഉറവിടം എഡിറ്റുചെയ്യുക
+ URL: (a https:// or file:// resource)
+ ഹോസ്റ്റ്കളുടെ ഉറവിടമായ URL
+
diff --git a/app/src/main/res/values-ml/strings_lists.xml b/app/src/main/res/values-ml/strings_lists.xml
new file mode 100644
index 0000000..dea986a
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_lists.xml
@@ -0,0 +1,15 @@
+
+
+ നിങ്ങളുടെ ലിസ്റ്റുകൾ
+
+ ഹോസ്റ്റ് ബ്ലാക്ക് ലിസ്റ്റിലേക് ചേർക്കുക
+ ഹോസ്റ്റ് ബ്ലാക്ക്ലിസ്റ്റിലേക് ചേർക്കുക
+ ഹോസ്റ്റ് വ്യതിചലിക്കുന്നതിലെക് ചേർക്കുക
+ ബ്ലാക്ക് ലിസ്റ്റ് ചെയ്ത ഹോസ്റ്റ്കൾ തിരുത്തുക
+ വൈറ്റ് ലിസ്റ്റ് ചെയ്ത ഹോസ്റ്റ്കൾ തിരുത്തുക
+ വ്യതിചലനം തിരുത്തുക
+ ഹോസ്റ്റ്നാമം
+ ഹോസ്റ്റ്കളുടെ ഉറവിടമായ URL
+ (വൈൽഡ്കാർഡ് പ്രതീകങ്ങൾ * ഉം ? അനുവദനീയമാണ്)
+ IP (IPv4 or IPv6):
+
diff --git a/app/src/main/res/values-ml/strings_log.xml b/app/src/main/res/values-ml/strings_log.xml
new file mode 100644
index 0000000..4efb3de
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ അക്ഷരമാലാക്രമത്തിൽ
+ ടോപ്പ് ലെവൽ ഡൊമെയ്ൻ അടുക്കൽ
+
+ ഡൊമെയ്ൻ റീഡയറക്ട് ചെയ്യുക
+
diff --git a/app/src/main/res/values-ml/strings_notification.xml b/app/src/main/res/values-ml/strings_notification.xml
new file mode 100644
index 0000000..478e5cd
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_notification.xml
@@ -0,0 +1,6 @@
+
+
+
+ നവീകരങ്ങൾ
+ നവീകരണം ലഭ്യമാണ്
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ml/strings_prefs_backup_restore.xml b/app/src/main/res/values-ml/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ml/strings_prefs_main.xml b/app/src/main/res/values-ml/strings_prefs_main.xml
new file mode 100644
index 0000000..60d255b
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_prefs_main.xml
@@ -0,0 +1,7 @@
+
+
+ മുൻഗണനകൾ
+ റൂട്ട് അടിസ്ഥാനമാക്കിയുള്ള പരസ്യ ബ്ലോക്കർ
+
+ ഡീബഗ് ചെയ്യുക
+
diff --git a/app/src/main/res/values-ml/strings_prefs_root.xml b/app/src/main/res/values-ml/strings_prefs_root.xml
new file mode 100644
index 0000000..c1e1da4
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_prefs_root.xml
@@ -0,0 +1,26 @@
+
+
+ റൂട്ട് അടിസ്ഥാനമാക്കിയുള്ള പരസ്യ ബ്ലോക്കർ
+
+ hosts ഇൻസ്റ്റാൾ ചെയുന്നു
+ Open hosts file
+ ടാർഗെറ്റ് ഹോസ്റ്റസ് ഫയൽ
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
+ റീഡയറക്ഷൻ
+ റീഡയറക്ഷൻ IPv4
+ റീഡയറക്ഷൻ IPv6
+
+ പ്രാദേശിക വെബ്സർവർ
+ വെബ് സെർവർ പ്രാപ്തമാക്കുക
+ വെബ് സെർവർ പരിശോധിക്കുക
+ സർട്ടിഫിക്കറ്റ് മാനുവൽ ഇൻസ്റ്റാൾ
+ സുരക്ഷാ ക്രമീകരണങ്ങൾ തുറക്കുക
+ പരിശോധിക്കുന്നു
+ പ്രവർത്തിക്കുന്നില്ല
+
diff --git a/app/src/main/res/values-ml/strings_prefs_update.xml b/app/src/main/res/values-ml/strings_prefs_update.xml
new file mode 100644
index 0000000..ab9a3aa
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_prefs_update.xml
@@ -0,0 +1,4 @@
+
+
+ നവീകരങ്ങൾ
+
diff --git a/app/src/main/res/values-ml/strings_prefs_vpn.xml b/app/src/main/res/values-ml/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-ml/strings_support.xml b/app/src/main/res/values-ml/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ml/strings_update.xml b/app/src/main/res/values-ml/strings_update.xml
new file mode 100644
index 0000000..8ade0ed
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ നവീകരണം ലഭ്യമാണ്
+
diff --git a/app/src/main/res/values-ml/strings_welcome.xml b/app/src/main/res/values-ml/strings_welcome.xml
new file mode 100644
index 0000000..b6e6a42
--- /dev/null
+++ b/app/src/main/res/values-ml/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ റൂട്ട് ചെയ്ത ആൻഡ്രോയിഡ് ആവശ്യമാണ്
+
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-ms/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-ms/strings_app.xml b/app/src/main/res/values-ms/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-ms/strings_errors.xml b/app/src/main/res/values-ms/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ms/strings_home.xml b/app/src/main/res/values-ms/strings_home.xml
new file mode 100644
index 0000000..a530b93
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_home.xml
@@ -0,0 +1,6 @@
+
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ms/strings_hosts.xml b/app/src/main/res/values-ms/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-ms/strings_lists.xml b/app/src/main/res/values-ms/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-ms/strings_log.xml b/app/src/main/res/values-ms/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-ms/strings_notification.xml b/app/src/main/res/values-ms/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ms/strings_prefs_backup_restore.xml b/app/src/main/res/values-ms/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ms/strings_prefs_main.xml b/app/src/main/res/values-ms/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-ms/strings_prefs_root.xml b/app/src/main/res/values-ms/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-ms/strings_prefs_update.xml b/app/src/main/res/values-ms/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ms/strings_prefs_vpn.xml b/app/src/main/res/values-ms/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-ms/strings_support.xml b/app/src/main/res/values-ms/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ms/strings_update.xml b/app/src/main/res/values-ms/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ms/strings_welcome.xml b/app/src/main/res/values-ms/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-ms/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-my/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-my/strings_app.xml b/app/src/main/res/values-my/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-my/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-my/strings_errors.xml b/app/src/main/res/values-my/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-my/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-my/strings_home.xml b/app/src/main/res/values-my/strings_home.xml
new file mode 100644
index 0000000..a530b93
--- /dev/null
+++ b/app/src/main/res/values-my/strings_home.xml
@@ -0,0 +1,6 @@
+
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-my/strings_hosts.xml b/app/src/main/res/values-my/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-my/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-my/strings_lists.xml b/app/src/main/res/values-my/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-my/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-my/strings_log.xml b/app/src/main/res/values-my/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-my/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-my/strings_notification.xml b/app/src/main/res/values-my/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-my/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-my/strings_prefs_backup_restore.xml b/app/src/main/res/values-my/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-my/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-my/strings_prefs_main.xml b/app/src/main/res/values-my/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-my/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-my/strings_prefs_root.xml b/app/src/main/res/values-my/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-my/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-my/strings_prefs_update.xml b/app/src/main/res/values-my/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-my/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-my/strings_prefs_vpn.xml b/app/src/main/res/values-my/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-my/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-my/strings_support.xml b/app/src/main/res/values-my/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-my/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-my/strings_update.xml b/app/src/main/res/values-my/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-my/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-my/strings_welcome.xml b/app/src/main/res/values-my/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-my/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
new file mode 100644
index 0000000..5b2104a
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -0,0 +1,109 @@
+
+
+
+ Avslutt
+ Lukk
+ Ja
+ Nei
+ Legg til
+ Lukk
+ Lagre
+ Hjelp
+
+
+ Velkommen!
+ Vis mere hjelp
+ Oppdater statusen
+ Alle vertsfiler fra de valgte kildene blir lastet ned, slått sammen med dine egne lister, og installert som én vertsfil på systemet ditt.
+ Kjører
+ Stoppet
+
+ Rediger oppføring
+ Rediger
+ Slett
+
+
+ Importerer …
+ Eksporterer …
+ Lager standard-vertsfilen
+ Nyere vertsfiler er tilgjengelig
+ Ingen internettilkobling
+ Ingen internettilkobling er tilgjengelig
+ Utilgjengelige kilder
+ Ingen vertsfiler kan bli nådd!
+ Skrudd på
+ De nyeste vertsfilene er skrudd på
+ Skrudd av
+ Symlinken fra målet ditt til /system/etc/hosts finnes ikke eller er feil! AdAway vil ikke virke dersom den ikke peker mot den riktige filen.\n\nVil du forsøke å lage en symlink?
+ Symlinken mangler
+ Ikke nok plass på partisjonen!\nPrøv å skifte målvertsfilen i innstillingene til /data/data/hosts.
+ Ikke nok plass
+ Den nedlastede filen kunne ikke bli lest inn.
+ Feil med privat fil
+ Gjenmontering av partisjonen som les+skriv mislyktes!
+ Gjenmontering mislyktes
+ Kopiering av vertsfilen mislyktes!
+ Kopiering mislyktes
+ Benyttelsen var vellykket
+ Symlink-opprettelsen var vellykket
+ Symlink-opprettelsen mislyktes
+ Se i Hjelp for mere informasjon.
+ APN-mellomtjeneren ble valgt!
+ TIlkoblingen til internettet virker ikke.
+ Ingen tilkobling
+ Laster ned …
+ Benytter …
+ Benytter svartelisten og hvitelisten
+ Parser og slår sammen vertsfilene
+ Bygger vertsfilen
+ Benytter vertsfilen
+ Å få systemet ditt til å benytte vertsfilen mislyktes!\nPrøv å skifte målvertsfilen i innstillingene til /data/data/hosts.
+ Benyttelse mislyktes
+ Tilbakestillingen var vellykket
+ Tilbakestillingen mislyktes av ukjente grunner.
+ Tilbakestillingen mislyktes!
+ Ingen av dine vertsfiler kan bli koblet til! Er du riktig tilkoblet til internettet?
+ Nedlastningen mislyktes
+ Privatfilen kan ikke bli opprettet.
+ Privatfil-opprettelsen mislyktes
+ Påskruingen var vellykket
+ Avskruingen var vellykket
+
+ Inndata-URLen til vertsfilen:
+ Dette er ikke et gyldig vertsnavn!
+ Ugyldig formattert vertsnavn
+ Dette er ikke gyldig IP!
+ Ugyldig formattert IP
+ Laster inn …
+
+
+ Oppfrisk
+ Legg til
+ Hjelp
+
+ S-ON/S-OFF
+ FAQ
+ Problemer
+
+
+ Reklameblokkerer
+ Ingen tekstredigerere er installert
+ Ingen tekstredigerer som kunne åpne vertsfilen kunne bli funnet. Du kan installere Jota eller andre tekstredigerere for å håndtere dette.\n\nVil du installere Jota?
+ Ingen filbehandlere er installert
+ Ingen filbehandler som kunne åpne filer kunne bli funnet. Du kan installere OI File Manager eller andre tekstredigerere for å håndtere dette.\n\nVil du installere OI File Manager?
+
+ Tcpdump er et verktøy for å overvåke DNS-forespørsler og lagre dem i en loggfil. Du kan starte den i bakgrunnen, kjøre apper som viser reklamer, og etterpå analysere DNS-forespørslene ved hjelp av loggfilen. Mulige reklametjenere kan deretter bli lagt til i svartelisten din.
+
+
+ Home
+ Vertsfilkilder
+ Your lists
+ Åpne vertsfilen
+ Log DNS requests
+ Scan for adware
+ Preferanser
+ Hjelp
+
+ Preferanser
+
+
diff --git a/app/src/main/res/values-nb-rNO/strings_app.xml b/app/src/main/res/values-nb-rNO/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-nb-rNO/strings_errors.xml b/app/src/main/res/values-nb-rNO/strings_errors.xml
new file mode 100644
index 0000000..4b99e25
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ Ingen internettilkobling
+ Ikke nok plass
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nb-rNO/strings_home.xml b/app/src/main/res/values-nb-rNO/strings_home.xml
new file mode 100644
index 0000000..eb55407
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferanser
+
+
+ Se i Hjelp for mere informasjon.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nb-rNO/strings_hosts.xml b/app/src/main/res/values-nb-rNO/strings_hosts.xml
new file mode 100644
index 0000000..004c241
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_hosts.xml
@@ -0,0 +1,6 @@
+
+
+ Vertsfilkilder
+
+ ikke tilgjengelig
+
diff --git a/app/src/main/res/values-nb-rNO/strings_lists.xml b/app/src/main/res/values-nb-rNO/strings_lists.xml
new file mode 100644
index 0000000..13a0402
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_lists.xml
@@ -0,0 +1,6 @@
+
+
+ Your lists
+ Vertsnavn:
+ IP (IPv6 eller IPv4):
+
diff --git a/app/src/main/res/values-nb-rNO/strings_log.xml b/app/src/main/res/values-nb-rNO/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-nb-rNO/strings_notification.xml b/app/src/main/res/values-nb-rNO/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nb-rNO/strings_prefs_backup_restore.xml b/app/src/main/res/values-nb-rNO/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-nb-rNO/strings_prefs_main.xml b/app/src/main/res/values-nb-rNO/strings_prefs_main.xml
new file mode 100644
index 0000000..fceee36
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_prefs_main.xml
@@ -0,0 +1,6 @@
+
+
+ Preferanser
+
+ Avlusing
+
diff --git a/app/src/main/res/values-nb-rNO/strings_prefs_root.xml b/app/src/main/res/values-nb-rNO/strings_prefs_root.xml
new file mode 100644
index 0000000..b85af8b
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_prefs_root.xml
@@ -0,0 +1,13 @@
+
+
+ Åpne vertsfilen
+ Målpunktsvertsfilen
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Tilpasset målpunkt
+
+
+ Omdirigering
+
diff --git a/app/src/main/res/values-nb-rNO/strings_prefs_update.xml b/app/src/main/res/values-nb-rNO/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-nb-rNO/strings_prefs_vpn.xml b/app/src/main/res/values-nb-rNO/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-nb-rNO/strings_support.xml b/app/src/main/res/values-nb-rNO/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nb-rNO/strings_update.xml b/app/src/main/res/values-nb-rNO/strings_update.xml
new file mode 100644
index 0000000..dd21545
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ Oppdatering tilgjengelig
+
diff --git a/app/src/main/res/values-nb-rNO/strings_welcome.xml b/app/src/main/res/values-nb-rNO/strings_welcome.xml
new file mode 100644
index 0000000..dde7a13
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ En rootet Android er påkrevd
+
diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-ne/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-ne/strings_app.xml b/app/src/main/res/values-ne/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-ne/strings_errors.xml b/app/src/main/res/values-ne/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ne/strings_home.xml b/app/src/main/res/values-ne/strings_home.xml
new file mode 100644
index 0000000..a530b93
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_home.xml
@@ -0,0 +1,6 @@
+
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ne/strings_hosts.xml b/app/src/main/res/values-ne/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-ne/strings_lists.xml b/app/src/main/res/values-ne/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-ne/strings_log.xml b/app/src/main/res/values-ne/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-ne/strings_notification.xml b/app/src/main/res/values-ne/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ne/strings_prefs_backup_restore.xml b/app/src/main/res/values-ne/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ne/strings_prefs_main.xml b/app/src/main/res/values-ne/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-ne/strings_prefs_root.xml b/app/src/main/res/values-ne/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-ne/strings_prefs_update.xml b/app/src/main/res/values-ne/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ne/strings_prefs_vpn.xml b/app/src/main/res/values-ne/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-ne/strings_support.xml b/app/src/main/res/values-ne/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ne/strings_update.xml b/app/src/main/res/values-ne/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ne/strings_welcome.xml b/app/src/main/res/values-ne/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-ne/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml
new file mode 100644
index 0000000..542543d
--- /dev/null
+++ b/app/src/main/res/values-night/colors.xml
@@ -0,0 +1,10 @@
+
+
+
+ #B71C1C
+ #e53935
+ #ffffff
+ #EF9A9A
+ #80CBC4
+ #9FA8DA
+
diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..413ae88
--- /dev/null
+++ b/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
new file mode 100644
index 0000000..ccbf924
--- /dev/null
+++ b/app/src/main/res/values-nl/strings.xml
@@ -0,0 +1,272 @@
+
+
+
+ Afsluiten
+ Sluiten
+ Ja
+ Nee
+ Toevoegen
+ Annuleren
+ Bewaren
+ Help
+
+
+ Welkom!
+ AdAway is vrije software, ontworpen om advertenties te blokkeren. Het haalt de adressen van reclamenetwerken en blokkeert deze op uw apparaat.\nWilt u meer weten? Bekijk de hulpsectie hieronder.
+ Meer help tonen
+ Status bijwerken
+ Alle hosts-bestanden van de gedefinieerde bronnen worden gedownload, samengevoegd met uw eigen lijsten en als één hosts-bestand op uw systeem geïnstalleerd.
+ Advertentieblokkering inschakelen
+ Advertentieblokkering uitschakelen
+ Webserver
+ Actief
+ Gestopt
+ Start of stop de webserver op localhost om verzoeken aan geblokkeerde hostnamen te beantwoorden.
+ Webserver inschakelen
+ Webserver uitschakelen
+ VPN
+ Actief
+ Gestopt
+ Start of stop de VPN die verzoeken filtert.
+ VPN gebruiken
+ Geen VPN gebruiken
+
+
+ Invoer bewerken
+ Toepassen
+ Bewerken
+ Verwijder
+
+
+ Bezig met importeren…
+ De back-up is geïmporteerd van uw externe opslag.
+ Het importeren is mislukt. Is het formaat juist? Bekijk de logcat voor meer informatie.
+ Bezig met exporteren…
+ De back-up is succesvol geëxporteerd naar \'%s\' op uw externe opslag.
+ Het exporteren van backup file \'%s\' is mislukt.
+
+
+ Het hosts-bestand
+ Het hosts-bestand is een systeembestand dat ip-adressen toewijst aan hostnamen. Het is een tekstbestand waarvan de configuratie door AdAway wordt afgehandeld. Hier zijn de eerste regels:
+ Bezig met laden van inhoud van hosts-bestand…
+ Hosts-bestand openen
+
+
+ Bezig met controleren op updates
+ Controleer %s bron om te updaten
+ Bezig met ophalen van bronnen
+ Bezig met ophalen van bron \'%s\'
+ Lezen bron %s
+ Verwerken %s bron
+ Database synchroniseren
+ Bezig met terugzetten van standaard hosts-bestand
+ Het standaard hosts-bestand is teruggezet
+ Bezig met aanmaken van nieuw hosts-bestand
+ Er is een bronupdate beschikbaar
+ Er zijn nieuwere hosts-bestanden beschikbaar.
+ Geen bronupdates gevonden
+ Geen internetverbinding
+ Geen internetverbinding beschikbaar
+ Bronnen zijn niet beschikbaar
+ Er zijn geen hosts-bronnen bereikbaar!
+ Root toegang geweigerd
+ Root toegang toestaan
+ Er ging iets mis
+ Bekijk de logcat voor details
+ Ingeschakeld
+ Nieuwste hosts-bestanden ingeschakeld
+ Uitgeschakeld
+ Standaard hosts-bestand geïnstalleerd
+ Nieuwste bronnen toepassen
+ Bezig met aanmaken van nieuw hosts-bestand
+ Bezig met kopiëren van nieuw hosts-bestand
+ Bezig met controleren van hosts-kopie
+ Het hosts-bestand is bijgewerkt
+ VPN configuratie succesvol bijgewerkt
+ Je configuratie is gewijzigd. Je moet het toepassen.
+ Toepassen
+ Toepassen van nieuwe configuratie…
+ Toepassen van nieuwe configuratie is mislukt.
+
+
+ De symlink naar het hosts-bestand ontbreekt
+ Symlink van de gekozen locatie naar /system/etc/hosts bestaat niet, of verwijst niet naar het juiste bestand! AdAway werkt niet als de symlink niet naar het juiste bestand verwijst. Wilt u proberen een symlink te maken?
+ Symlink ontbreekt
+ Onvoldoende ruimte op de systeempartitie!
+Verander de locatie van het hosts-bestand naar /data/data/hosts in de voorkeuren.
+ Onvoldoende ruimte
+ Gedownload bestand kan niet worden gelezen.
+ Privébestandsfout
+ Het opnieuw koppelen van de partitie als lezen/schrijven is mislukt!
+ Opnieuw koppelen mislukt
+ Het hosts-bestand kan niet worden gekopieerd
+ Kopiëren van hosts-bestand is mislukt!
+ Kopiëren mislukt
+ Hosts-bronnen toegepast
+ Toepassen voltooid
+ Toepassen voltooid.
+Android moet mogelijk worden herstart om de wijzigingen door te voeren.
+
+Wilt u herstarten?
+(Om gegevensverlies te voorkomen moet u zorgen dat geen enkele app op dit moment de SD-kaart gebruikt!)
+ Symlink aangemaakt.
+Android moet mogelijk worden herstart om de wijzigingen door te voeren.
+
+Wilt u herstarten?
+(Om gegevensverlies te voorkomen moet u zorgen dat geen enkele app op dit moment de SD-kaart gebruikt!)
+ Symlink aangemaakt
+ De symlink kon niet door Android worden aangemaakt. Dit mislukt meestal door een \'feature\' genaamd S-ON op HTC telefoons! Een oplossing is uw telefoon in recoverymodus opstarten en hier de symlink aanmaken met \'ln -s /data/data/hosts /system/etc/hosts\'. Als dit niet werkt, zoek dan op internet naar S-OFF en uw telefoon.
+ Symlink aanmaken mislukt
+ Bekijk de hulpsectie voor meer informatie.
+ Een APN proxy is ingesteld op jouw Android! AdAway zal niet betrouwbaar werken als er gebruik gemaakt wordt van mobiele netwerken zoals 3G/4G. Je kan je proxy uitschakelen door naar je geselecteerde APN te gaan. (Op Android 4: draadloos en netwerken -> meer… -> Mobiele netwerken -> namen toegangspunten) en de waarde in het proxy veld te verwijderen.
+ APN-proxy ingesteld!
+ De internetverbinding werkt niet.
+ Geen verbinding
+ Downloaden…
+ Toepassen…
+ Black en whitelist toepassen
+ Lezen en samenvoegen van hosts-bestanden
+ Hosts-bestand opbouwen
+ Hosts-bestand plaatsen
+ Het nieuwe hosts-bestand kan niet worden toegepast.
+ Het plaatsen van het hosts-bestand is mislukt!\nVerander de locatie van het hosts-bestand naar /data/data/hosts in de voorkeuren.
+ Hosts-bestand plaatsen mislukt
+ Controleer uw Root app om zeker te zijn dat Root toegang is toegestaan.
+ U hebt het standaard hosts bestand teruggezet. Het kan nodig zijn om Android te herstarten om de wijzigingen effect te laten hebben. Wilt u herstarten? (Om data verlies te voorkomen moet u zorgen dat geen enkele applicatie op dit moment de sdkaart gebruikt)
+ Terugzetten voltooid
+ Het hosts-bestand kan niet worden teruggezet
+ Terugzetten is door onbekende redenen mislukt.
+ Terugzetten mislukt!
+ Geen van uw geselecteerde hosts-bronnen zijn bereikbaar! Bent u verbonden met het internet?
+ Downloaden mislukt
+ Het nieuwe privéhosts-bestand kan niet worden toegepast
+ Privébestanden kunnen niet worden aangemaakt.
+ Aanmaken privébestand mislukt
+ U heeft de systeemloze modus ingeschakeld. Het kan nodig zijn om Android opnieuw op te starten om de wijzigingen effect te laten hebben. Wilt u nu opnieuw opstarten? (Om dataverlies te voorkomen, moet u zorgen dat geen enkele app op dit moment de SD-kaart gebruikt.)
+
+ Inschakelen gelukt
+ U heeft systemless mode uitgeschakeld. Het kan nodig zijn om Android opnieuw op te starten om de wijzigingen effect te laten hebben. Wilt u nu herstarten? (Om dataverlies te voorkomen, moet u zorgen dat geen enkele app op dit moment de SD-kaart gebruikt.)
+ Uitschakelen gelukt
+ De VPN kan niet worden ingeschakeld.
+ De VPN kan niet worden uitgeschakeld.
+ Activeer Magisk module
+ Activeer systemless hosts van Magisk manager. Activeer in de instellingen Systemless hosts optie en start de telefoon opnieuw op.
+ De-activeer Magisk module
+ De-activeer systemless hosts van Magisk manager. De-installeer uit de module lijstSystemless hosts en start de telefoon opnieuw op.
+
+
+ Voer URL naar het hosts-bestand in:
+ Dit is geen correcte hostnaam!
+ Host-naam onjuist geformatteerd
+ Dit is geen correct IP-adres!
+ IP-adres is verkeerd opgemaakt
+ Herstart nooit en laat deze vraag niet meer zien.
+ Bezig met laden…
+
+
+ Verversen
+ Toevoegen
+ Help
+ Back-up importeren
+ Back-up exporteren
+
+
+ S-ON/S-OFF
+ VGV
+ Problemen
+
+
+ Adware
+ Hier kunt u scannen naar slechte Adware applicaties, welke niet door AdAway geblokkeerd kunnen worden. Deze applicaties gebruiken bijvoorbeeld Airpush notificaties, welke zelfs opkomen als de applicatie niet draait, of veranderen zelfs uw ringtone. De enige beschikbare oplossing is deze applicaties te deïnstalleren door op de lijst elementen te klikken!
+ Scannen…
+ Geen slechte Adware apps gevonden!
+
+
+ Adblocker
+ Geen tekstverwerker geïnstalleerd
+ Geen tekstverwerker gevonden om het hosts-bestand mee te openen. U kunt Jota of een andere tekstverwerker installeren om dit te verhelpen.\n\nWilt u Jota installeren?
+ Geen bestandsbeheerder aangetroffen
+ Geen bestandsbeheerder gevonden om bestanden te openen. U kunt OI Bestandsbeheer of een andere bestandsbeheerder installeren om dit af te handelen.\n\nWilt u OI Bestandsbeheer installeren?
+
+
+ Tcpdump
+ Tcpdump is een hulpmiddel om DNS-verzoeken te bekijken en deze op te slaan in een logbestand. U kunt het in de achtergrond starten, een app met reclames gebruiken, en achteraf de DNS-verzoeken analyseren middels het logbestand. Mogelijke reclameservers kunnen dan aan uw zwarte lijst worden toegevoegd.
+ Monitoring uitschakelen
+ Monitoring inschakelen
+ Laat resultaat zien
+ Sorteer domeinen
+ Wis log
+ Host toevoegen aan blacklist
+ Host toevoegen aan whitelist
+ Hostdoorschakeling toevoegen
+
+ Wijzig tekst voorkeurswaarde
+ Menu openen
+ Menu sluiten
+
+
+
+ Startpagina
+ Hosts-bronnen
+ Mijn lijsten
+ Hosts-bestand openen
+ Log DNS verzoeken
+ Scan op Adware
+ Voorkeuren
+ Help
+
+
+
+
+ DNS verzoeken
+ Mijn lijsten
+ Voorkeuren
+
+
+ %1$s geleden toegepast
+ Up-to-date van %1$s
+ Update nodig van%1$s
+ Laatste update %1$s geleden
+ Onbekende update status
+ Uitgeschakeld
+ enkele minuten
+
+ %d minuten
+ %d minuten
+
+
+ %duren
+ %duren
+
+
+ %d dagen
+ %d dagen
+
+
+ %dmaanden
+ %dmaanden
+
+
+
+ Host gekopieerd naar het klembord.
+
+
+ bezig met starten
+ actief
+ bezig met stoppen
+ wachten op een netwerk
+ bezig met herverbinden
+ fout tijdens herverbinden
+ onderbroken
+ gestopt
+ Advertentieblokkering-VPN %1$s
+ Onderbreken
+ Hervat
+
+
+ AdAway rechten
+ Toestaan om samen te werken met AdAway
+ Zend opdrachten naar AdAway
+ Toestaan om opdrachten te verzenden naar AdAway zoals het aan- of uitzetten van de advertentieblokkering
+
+
diff --git a/app/src/main/res/values-nl/strings_app.xml b/app/src/main/res/values-nl/strings_app.xml
new file mode 100644
index 0000000..f0edac1
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Open source advertentieblokkeerder
+ AdAway logo
+
diff --git a/app/src/main/res/values-nl/strings_errors.xml b/app/src/main/res/values-nl/strings_errors.xml
new file mode 100644
index 0000000..5e48de2
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Geen internetverbinding
+ Er kan geen verbinding worden gemaakt met het internet. Controleer uw internetverbinding.
+ De hosts-bron kan niet worden opgehaald
+ Geen van de geselecteerde hosts-bronnen zijn bereikbaar. Controleer uw internetverbinding.
+
+ Het privébestand kan niet worden aangemaakt
+ Het privébestand, dat nodig is voor de nieuwe hosts-bron, kan niet worden aangemaakt. Controleer of u beschikt over voldoende schijfruimte.
+ Onvoldoende ruimte
+ Het hosts-bestand kan niet worden gekopieerd naar de systeempartitie. Controleer of de systeemloze module van Magisk is geactiveerd en herstart uw apparaat.
+ Het nieuwe hosts-bestand kan niet worden toegepast
+ Het hosts-bestand kan niet worden gekopieerd naar de /system-partitie. Controleer of de systeemloze module van Magisk is geactiveerd en herstart uw apparaat.
+ Het hosts-bestand kan niet worden teruggezet
+ Het standaard hosts-bestand kan niet worden teruggezet.
+
+ De VPN kan niet worden ingeschakeld.
+ Controleer uw VPN-instellingen en geef toestemming om de VPN applicatie te mogen starten.
+ De VPN kan niet worden uitgeschakeld.
+ Controleer uw VPN-instellingen en schakel deze handmatig uit.
+
diff --git a/app/src/main/res/values-nl/strings_home.xml b/app/src/main/res/values-nl/strings_home.xml
new file mode 100644
index 0000000..3bb1762
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Geblokkeerd
+ Toegestaan
+ Doorverwezen
+
+
+
+ %d up-to-date bron
+ %d up-to-date bronnen
+
+
+ %d verouderde bron
+ %d verouderde bronnen
+
+ Controleer op host updates
+ Hosts bijwerken
+
+
+ Toon DNS request log
+
+
+ Toon help\nand tips
+
+
+ GitHub-pagina openen
+
+
+ Project steunen
+
+
+ GitHub project
+ Instellingen
+
+
+ Navigatiemenu openen
+ Advertentieblokkering onderbreken/hervatten
+ Geblokkeerde domeinen bijwerken
+ Domeinaanvragen tonen
+
+
+ Bekijk de hulpsectie voor meer informatie.
+
+
diff --git a/app/src/main/res/values-nl/strings_hosts.xml b/app/src/main/res/values-nl/strings_hosts.xml
new file mode 100644
index 0000000..b786f5d
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts-bronnen
+
+ Gebruikerslijst
+ AdAway official hosts
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ niet beschikbaar
+ %s hosts
+
+ Bron toevoegen
+ Bron aanpassen
+ URL: (een bron beginnend met https:// of file://)
+ De url van de hosts-bron
+
diff --git a/app/src/main/res/values-nl/strings_lists.xml b/app/src/main/res/values-nl/strings_lists.xml
new file mode 100644
index 0000000..94442de
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Mijn lijsten
+ Host toevoegen
+
+ Geblokkeerd
+ Toegestaan
+ Doorverwezen
+
+ Hosts filteren
+ Zoek hostnaam…
+ Wissel van bronnen
+
+ Host toevoegen aan zwarte lijst
+ Host toevoegen aan witte lijst
+ Hostdoorschakeling toevoegen
+ Host op zwarte lijst bewerken
+ Host op witte lijst bewerken
+ Doorverwijzing bewerken
+ Hostnaam:
+ De url van de hosts-bron
+ (jokertekens * en ? zijn toegestaan)
+ IP-adres (IPv4 of IPv6):
+
diff --git a/app/src/main/res/values-nl/strings_log.xml b/app/src/main/res/values-nl/strings_log.xml
new file mode 100644
index 0000000..a889068
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Schakelaar Log opslaan
+ Druk op \"record\" om de aanvragen te loggen, surf het web of gebruik apps, kom dan terug of swipe om de logs te vernieuwen.
+ \n\nBlocked aanvragen worden niet gelogd. Schakel advertentieblokkering eerst uit als je deze ook wilt gaan loggen.
+
+ Sorteer alfabetisch
+ Bovenste niveau domein sortering
+
+ Doorverwijzingsdomein
+
diff --git a/app/src/main/res/values-nl/strings_notification.xml b/app/src/main/res/values-nl/strings_notification.xml
new file mode 100644
index 0000000..7914ce5
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Updates
+ Updatemeldingen
+ Er is een bronupdate beschikbaar
+ Er zijn nieuwere hosts-bestanden beschikbaar.
+ Er is een app-update beschikbaar
+ Er is een nieuwe versie van AdAway beschikbaar.
+
+ VPN
+ VPN-meldingen
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nl/strings_prefs_backup_restore.xml b/app/src/main/res/values-nl/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..d8447f9
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Backup & restore
+ Backup
+ Backup je blokkeerregels naar een externe locatie
+ Restore
+ Restore je blokkeerregels vanuit een backup bestand
+
diff --git a/app/src/main/res/values-nl/strings_prefs_main.xml b/app/src/main/res/values-nl/strings_prefs_main.xml
new file mode 100644
index 0000000..4fff27a
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Instellingen
+
+ Algemeen
+ Donker thema
+
+ Licht
+ Donker
+ Systeem default
+
+ Automatisch bijwerken
+
+ Advertentieblokkering
+ Advertentieblokkeerder voor geroote apparaten
+ Advertentieblokkering op basis van VPN
+ IPv6-ondersteuning inschakelen
+ Backup/herstel blokkaderegels
+
+ Foutopsporing
+ Crashverslagen versturen
+ Melden aan Sentry (sentry.io)
+ Niet ondersteund in deze bouwversie
+ Uitgebreid logboek
+ Herstart de app om toe te passen
+
diff --git a/app/src/main/res/values-nl/strings_prefs_root.xml b/app/src/main/res/values-nl/strings_prefs_root.xml
new file mode 100644
index 0000000..34af218
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Advertentieblokkeerder voor geroote apparaten
+
+ Host installeren
+ Hosts-bestand openen
+ Locatie van hosts-bestand
+ Lees Help voordat je deze functie gebruikt
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Aangepaste locatie
+
+ Aangepaste doellocatie
+ Verberg herstart dialoogscherm
+
+ Doorverwijzing
+ Bepaal waar de geblokkeerde hosts naar moeten worden omgeleid
+ IPv4 doorverwijzing
+ IPv6 doorverwijzing
+ Ongeldige doorverwijzing
+
+ Lokale webserver
+ De lokale webserver luistert naar lokale ip-adressen om aanvragen van geblokkeerde hostnamen te beantwoorden. indien de connectie blokkeert kan app freezing helpen.
+ Webserver inschakelen
+ Test webserver
+ Installeer zelf ondertekend certificaat
+ Installeer certificaten handmatig
+ Vanaf Android 11 (R), applicaties kunnen niet meer automatisch geautoriseerde certificaten (CA) installeren.\n\nGa naar \"Beveiliging\" in settings, \"Encrypty & credentials\" en dan \"Installeer een certificaat\". Vanaf daar kies voor \"CA certificaat\" en selecteer het nieuwe geëxporteerde certificaat bestand.
+ Open \"Beveiliging\" in settings
+ Controleer…
+ Niet actief
+ Actief maar certificaat is niet geinstalleerd
+ Actief en certificaat is geinstalleerd
+ Vervang lege advertentieruimte met app incon
+
diff --git a/app/src/main/res/values-nl/strings_prefs_update.xml b/app/src/main/res/values-nl/strings_prefs_update.xml
new file mode 100644
index 0000000..2107464
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Updates
+ Notificaties zijn uitgeschakeld
+ Applicatie notificaties zijn niet zichtbaar. Tik om in te schakelen.
+
+ App-updates
+ Controleer voor updates tijdens opstarten
+ Regelmatig controleren op updates
+ Inclusief beta releases
+
+ Hosts-updates
+ Controleer voor updates tijdens opstarten
+ Regelmatig controleren op updates
+ Synchroniseren na updates
+ Alleen synchroniseren via Wi-Fi
+
diff --git a/app/src/main/res/values-nl/strings_prefs_vpn.xml b/app/src/main/res/values-nl/strings_prefs_vpn.xml
new file mode 100644
index 0000000..2a9a010
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Advertentieblokkering op basis van VPN
+
+ Inschakelen bij opstarten
+ Controleer verbinding
+ Controleer periodiek de netwerkstatus om VPN te herstarten bij disconnectie
+
+ Uitgesloten applicaties
+ Geef aan welke applicaties niet VPN mogen gebruiken zodat er geen connecties zullen worden geblokkeerd.
+ Uitgesloten systeem applicaties
+
+ None
+ All except browsers
+ All
+
+ Uitgesloten gebruiker applicaties
+
+
+ Uitgesloten applicaties
+ Selecteer alles
+ Deselecteer alles
+ Applicatie icon
+
diff --git a/app/src/main/res/values-nl/strings_source_edit.xml b/app/src/main/res/values-nl/strings_source_edit.xml
new file mode 100644
index 0000000..a00c441
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Bron aanpassen
+ Bron toevoegen
+
+ Label
+ Label verplicht
+ Type
+ URL
+ Bestand
+ Locatie
+ https://
+ Locatie verplicht
+ Druk op bestand om het bronbestand te selecteren
+ Ongeldige locatie
+ Lijst format
+ Blokkeer
+ Toestaan
+ Doorverwezen hosts toepassen
+ Het toestaan van doorverwezen hosts kan beveiligingsproblemen veroorzaken. Gebruik deze instelling alleen bij een vertrouwde bron want het kan gevoelig verkeer doorsturen naar elke willekeurige server.
+
diff --git a/app/src/main/res/values-nl/strings_support.xml b/app/src/main/res/values-nl/strings_support.xml
new file mode 100644
index 0000000..77ef4bb
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Ondersteuning
+ Wordt sponsor
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nl/strings_update.xml b/app/src/main/res/values-nl/strings_update.xml
new file mode 100644
index 0000000..0386ad4
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway update
+
+ Update beschikbaar!
+
+
+ Je bent up-to-date
+ Er is een update beschikbaar
+ Updating AdAway
+ Update nu
+ %1$s / %2$s
+ Laatste wijzigingen
+ Wijzigingslog
+ Steun de ontwikkeling
+ Doneren
+ Sponsor
+
+
+ Downloading nieuwste AdAway versie…
+
diff --git a/app/src/main/res/values-nl/strings_welcome.xml b/app/src/main/res/values-nl/strings_welcome.xml
new file mode 100644
index 0000000..ebda2e3
--- /dev/null
+++ b/app/src/main/res/values-nl/strings_welcome.xml
@@ -0,0 +1,54 @@
+
+
+ Welkom
+ Wizard 1e stap
+ Wizard 2e stap
+ Wizard 3e stap
+
+
+ Welkom bij AdAway!
+ AdAway biedt twee blokkeermethoden aan. Kies de gewenste methode:
+
+ Rootlogo
+ Blokkering op basis van root
+ Sneller
+ Bespaart accu
+ Root vereist
+
+ VPN-logo
+ Blokkering op basis van VPN
+ Langzamer
+ Actief op de achtergrond
+ Comptabiliteit
+
+ Geroote Android vereist
+ De su-binary is niet aangetroffen of u heeft AdAway geen roottoegang verleend.\n\nDit komt voor als uw apparaat niet geroot is. Informatie over het rooten van uw apparaat vindt u op wiki.lineageos.org of andere Android-websites.
+
+ Voordeel
+ Nadeel
+
+
+ Synchroniseren voltooid
+ Fout tijdens synchronisatie
+
+ Bezig met synchroniseren
+ Gesynchroniseerd!
+ AdAway haalt reclamenetwerken op uit online-bronnen. U kunt deze later aanpassen in de instellingen.
+ Opnieuw proberen
+ 81%match
+Het synchroniseren is mislukt: %1$s Wilt u het opnieuw proberen?
+ Het kan notificaties sturen om de blokkeerstatus te laten zien en te controleren, je op de hoogte stellen van een bestaande app update (een paar per jaar). Schakel in als je up-to-date wilt blijven.
+
+
+ Ondersteuning
+ Ondersteun mij!
+ AdAway is een gratis en open-source app dat ik ontwikkel in mijn vrije tijd. Als je het dus leuk vindt, voel je vrij om je support te laten zien:
+ Doneren via PayPal
+ Houdt u van bugs? Nee, ik ook niet.
+ Schakel telemetrie in om crashverslagen te sturen
+
+
+ Vorige
+ Volgende
+ Afronden
+
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
new file mode 100644
index 0000000..34f3724
--- /dev/null
+++ b/app/src/main/res/values-no/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+ Lukk
+ Lukk
+ Ja
+ Nei
+ Legg til
+ Avbryt
+ Lagre
+ Alle vertsfiler fra valgte kilder er nedlastet, legg dem sammen med din egen liste og installer som en vertsfil.
+ Legg til
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-no/strings_app.xml b/app/src/main/res/values-no/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-no/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-no/strings_errors.xml b/app/src/main/res/values-no/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-no/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-no/strings_home.xml b/app/src/main/res/values-no/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-no/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-no/strings_hosts.xml b/app/src/main/res/values-no/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-no/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-no/strings_lists.xml b/app/src/main/res/values-no/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-no/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-no/strings_log.xml b/app/src/main/res/values-no/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-no/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-no/strings_notification.xml b/app/src/main/res/values-no/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-no/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-no/strings_prefs_backup_restore.xml b/app/src/main/res/values-no/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-no/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-no/strings_prefs_main.xml b/app/src/main/res/values-no/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-no/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-no/strings_prefs_root.xml b/app/src/main/res/values-no/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-no/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-no/strings_prefs_update.xml b/app/src/main/res/values-no/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-no/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-no/strings_prefs_vpn.xml b/app/src/main/res/values-no/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-no/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-no/strings_support.xml b/app/src/main/res/values-no/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-no/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-no/strings_update.xml b/app/src/main/res/values-no/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-no/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-no/strings_welcome.xml b/app/src/main/res/values-no/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-no/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-pa/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-pa/strings_app.xml b/app/src/main/res/values-pa/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-pa/strings_errors.xml b/app/src/main/res/values-pa/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pa/strings_home.xml b/app/src/main/res/values-pa/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pa/strings_hosts.xml b/app/src/main/res/values-pa/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-pa/strings_lists.xml b/app/src/main/res/values-pa/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-pa/strings_log.xml b/app/src/main/res/values-pa/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-pa/strings_notification.xml b/app/src/main/res/values-pa/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pa/strings_prefs_backup_restore.xml b/app/src/main/res/values-pa/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-pa/strings_prefs_main.xml b/app/src/main/res/values-pa/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-pa/strings_prefs_root.xml b/app/src/main/res/values-pa/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-pa/strings_prefs_update.xml b/app/src/main/res/values-pa/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-pa/strings_prefs_vpn.xml b/app/src/main/res/values-pa/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-pa/strings_support.xml b/app/src/main/res/values-pa/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pa/strings_update.xml b/app/src/main/res/values-pa/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-pa/strings_welcome.xml b/app/src/main/res/values-pa/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-pa/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
new file mode 100644
index 0000000..669971a
--- /dev/null
+++ b/app/src/main/res/values-pl/strings.xml
@@ -0,0 +1,270 @@
+
+
+
+ Wyjście
+ Zamknij
+ Tak
+ Nie
+ Dodaj
+ Anuluj
+ Zapisz
+ Pomoc
+
+
+ Witamy!
+ AdAway to darmowy i otwarty program do blokowania reklam. Pobiera adresy sieci reklamowych, aby zablokować je na urządzeniu.\nChcesz wiedzieć więcej? Sprawdź pomoc poniżej!
+ Pokaż więcej pomocy
+ Stan aktualizacji
+ Wszystkie pliki ze zdefiniowanych źródeł zostaną pobrane, połączone z twoją listą i dodane do pliku hosts.
+ Włącz blokowanie reklam
+ Wyłącz blokowanie reklam
+ Serwer internetowy
+ Uruchomiony
+ Zatrzymany
+ Uruchom lub zatrzymaj webserver na localhost, aby odpowiedzieć na prośby o zablokowanie nazwy hostów.
+ Włącz serwer www
+ Wyłącz serwer www
+ VPN
+ Uruchomiony
+ Zatrzymany
+ Uruchom lub zatrzymaj VPN, aby filtrować żądania.
+ Włącz VPN
+ Wyłącz VPN
+
+
+ Edytuj wpis
+ Zastosuj
+ Edytuj
+ Usuń
+
+
+ Importowanie…
+ Kopia zapasowa została pomyślnie zaimportowana z pamięci zewnętrznej.
+ Nie udało się zaimportować kopii zapasowej. Czy jego format jest poprawny? Sprawdź logat, aby uzyskać więcej szczegółów.
+ Eksportowanie…
+ Kopia zapasowa została pomyślnie wyeksportowana do pliku \'%s\' w pamięci zewnętrznej.
+ Nie udało się wyeksportować pliku kopii zapasowej \'%s\'.
+
+
+ Plik hosts
+ Plik hosts jest plikiem systemowym, który mapuje nazwy hostów na adresy IP. Jest to plik tekstowy, którego konfiguracja jest obsługiwana przez AdAway. Oto kilka pierwszych linii:
+ Ładowanie zawartości pliku hosts…
+ Otwórz plik hosts
+
+
+ Sprawdzanie aktualizacji
+ Sprawdzam %s źródło aktualizacji
+ Pobieranie źródeł
+ Pobieranie źródła %s
+ Czytanie źródła %s
+ Parsowanie źródła %s
+ Synchronizacja reguł bazy danych
+ Przywracanie domyślnego pliku hosts
+ Przywrócono domyślny plik hosts
+ Tworzenie standardowego pliku hosts
+ Aktualizacja jest dostępna
+ Nowe pliki hostów są dostępne
+ Nie znaleziono aktualizacji źródeł
+ Brak połączenia z Internetem
+ Połączenie z Internetem niedostępne
+ Źródła niedostępne
+ Wszystkie źródła są nieosiągalne!
+ Odmowa dostępu do root
+ Zezwól na dostęp root z aplikacji root
+ Coś poszło nie tak
+ Sprawdź kod logcat, aby uzyskać więcej informacji
+ Włączone
+ Najnowsze pliki hostów zostały włączone
+ Wyłączone
+ Domyślny plik hosts został zainstalowany
+ Stosowanie najnowszych źródeł
+ Tworzenie nowego pliku hostów
+ Kopiowanie nowego pliku hostów
+ Sprawdzanie kopii pliku hostów
+ Plik hosts został pomyślnie zaktualizowany
+ Konfiguracja VPN została zaktualizowana
+ Twoja konfiguracja została zmieniona. Musisz ją zastosować.
+ Zastosuj
+ Zastosowanie nowej konfiguracji…
+ Nie można zastosować nowej konfiguracji.
+
+
+ Brak dowiązania symbolicznego do docelowego pliku hosts
+ Symlink z Twojego celu do /system/etc/hosts nie istnieje lub nie jest poprawny! AdAway nie będzie działać jeśli nie jest wskazany poprawny plik.\n\n Czy chcesz spróbować stworzyć symlink?
+ Brak symlinka
+ Za mało miejsca na partycji!\nSpróbuj zmienić docelowy plik hosts w ustawieniach do /data/data/hosts.
+ Zbyt mało miejsca
+ Pobrany plik nie może zostać odczytany.
+ Błąd pliku osobistego
+ Zamontowanie partycji do odczytu/zapisu nieudane!
+ Montowanie nieudane
+ Nie można skopiować pliku hostów
+ Kopiowanie pliku hosts nieudane!
+ Nieudane kopiowanie
+ Zastosowane źródła hostów
+ Zastosowano pomyślnie
+ Zgłoszenie powiodło się.\nMoże być konieczne ponowne uruchomienie Androida, aby zmiany zaczęły obowiązywać.\n\nCzy chcesz zrestartować system?\n(Aby zapobiec utracie danych, upewnij się, że żadna aplikacja nie używa karty SD!)
+ Symlink został utworzony pomyślnie.\nMoże być konieczne ponowne uruchomienie Androida, aby zmiany zaczęły obowiązywać.\n\nCzy chcesz zrestartować system?\n(Aby zapobiec utracie danych, upewnij się, że żadna aplikacja nie używa karty SD!)
+ Symlink utworzony prawidłowo
+ Symlink nie mógł być utworzony przez system Android.\nBłąd ten występuje głównie na telefonach HTC z \'funkcją\' zwaną S-ON!\n\nRozwiązaniem jest uruchomienie w trybie recovery i ręczne utworzenie symlinka komendą \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nJeżeli to nie pomaga poszukaj w Internecie informacji o S-OFF i Twoim telefonie.
+ Symlink nie został utworzony
+ Proszę przeczytać Pomoc, aby uzyskać więcej informacji.
+ Serwer proxy APN jest ustawiony na twoim Androidzie!\nAdAway nie będzie działać niezawodnie w sieciach komórkowych takich jak 3G. Możesz wyłączyć ten serwer proxy, przechodząc do wybranego APN (z poziomu aplikacji Ustawienia: Sieć i Internet -> Sieć komórkowa -> Zaawansowane -> Punkty dostępu) i usuń wartość z pola proxy.
+ Ustawione proxy APN!
+ Połączenie z Siecią jest niedostępne.
+ Brak połączenia
+ Pobieranie…
+ Stosowanie…
+ Stosowanie Czarnej i Białej listy
+ Analizowanie i łączenie plików hosts
+ Budowanie pliku hosts
+ Stosowanie pliku hosts
+ Nie można zastosować nowego pliku hostów.
+ Stosowanie pliku hosts zakończone niepowodzeniem!\nSpróbuj zmienić w ustawieniach plik docelowy hosts na /data/data/hosts.
+ Zastosowanie nieudane
+ Sprawdź aplikację zarządzania rootem, aby upewnić się, że przyznano dostęp root.
+ Powróciłeś do domyślnego pliku hosts.\nMoże być konieczne ponowne uruchomienie Androida, aby zmiany zaczęły obowiązywać.\n\nCzy chcesz zrestartować system?\n(Aby zapobiec utracie danych, upewnij się, że żadna aplikacja nie używa karty SD!)
+ Przywracanie wykonane prawidłowo
+ Nie można przywrócić pliku hostów
+ Przywracanie zakończone niepowodzeniem z nieznanych przyczyn.
+ Przywracanie nieudane!
+ Wszystkie włączone źródła są nieosiągalne! Czy na pewno masz połączenie z Internetem?
+ Pobieranie nieudane
+ Nie można zapisać nowego pliku hostów prywatnych
+ Plik osobisty nie został utworzony.
+ Tworzenie pliku osobistego nieudane
+ Włączyłeś tryb bez systemu.\nMoże być konieczne ponowne uruchomienie Androida, aby zmiany zaczęły obowiązywać.\n\nCzy chcesz zrestartować system?\n(Aby zapobiec utracie danych, upewnij się, że żadna aplikacja nie używa karty SD!)
+ Pomyślnie włączono
+ Wyłączyłeś tryb bez systemu.\nMoże być konieczne ponowne uruchomienie Androida, aby zmiany zaczęły obowiązywać.\n\nCzy chcesz zrestartować system?\n(Aby zapobiec utracie danych, upewnij się, że żadna aplikacja nie używa karty SD!)
+ Wyłączono poprawnie
+ Nie można włączyć blokowania reklam VPN.
+ Nie można wyłączyć blokowania reklam VPN.
+ Włączanie modułu Magisk dla hostów
+ Włącz funkcję hostów bezsystemowych w menedżerze Magisk. W ustawieniach włącz opcję Hosty bez systemu, a następnie uruchom ponownie urządzenie.
+ Wyłączanie modułu Magisk hostów
+ Wyłącz funkcję bezsystemowych hostów w menedżerze Magisk. Z listy modułów odinstaluj moduł Hosty bez systemu, a następnie uruchom ponownie urządzenie.
+
+
+ Dopisz adres URL do pliku hosts:
+ To jest nieprawidłowa nazwa hosta!
+ Niepoprawna nazwa hosta
+ To nie jest prawidłowy adres IP!
+ Niepoprawny adres IP
+ Nigdy nie restartuj i nie pokazuj tego pytania ponownie!
+ Ładowanie…
+
+
+ Odśwież
+ Dodaj
+ Pomoc
+ Importuj kopię zapasową
+ Eksportuj kopię zapasową
+
+
+ S-ON/S-OFF
+ FAQ
+ Problemy
+
+
+ Adware
+ Tutaj możesz znaleźć zainstalowane adware, złe aplikacje, które nie mogą być blokowane przez AdAway. Te aplikacje używają na przykład powiadomień Airpush, które pojawiają się nawet wtedy, gdy aplikacja nie działa lub nawet zmienia dzwonek. Jedynym dostępnym środkiem zaradczym jest odinstalowanie tych aplikacji, klikając elementy listy.
+ Skanowanie…
+ Nie znaleziono adware!
+
+
+ Bloker reklam
+ Brak zainstalowanego edytora tekstu
+ Nie odnaleziono edytora tekstu aby otworzyć plik hosts. Możesz zainstalować edytor Jota lub inny edytor tekstu żeby tego dokonać./n/nCzy chcesz zainstalować Jota?
+ Brak zainstalowanego menedżera plików
+ Nie znaleziono menadżera plików aby otworzyć plik. Możesz zainstalować OI File Manager lub inne menadżery plików.\n\nCzy chcesz zainstalować OI File Manager?
+
+
+ Tcpdump
+ Tcpdump jest narzędziem do monitorowania żądań DNS i zapisywania ich w pliku dziennika. Możesz go uruchomić w tle, uruchomić aplikację, która wyświetla reklamy, a następnie przeanalizować zapisany dziennik żądań DNS. Ewentualny serwer reklam można następnie dodać do twojej Czarnej listy.
+ Wyłącz monitorowanie
+ Włącz monitorowanie
+ Pokaż wyniki
+ Sortuj domeny
+ Wyczyść dziennik
+ Dodaj wpis do czarnej listy
+ Dodaj wpis do białej listy
+ Dodaj wpis do listy przekierowań
+
+ Edytuj wartość preferencji tekstu
+ Otwórz menu
+ Zamknij menu
+
+
+
+ Ekran główny
+ Źródła hostów
+ Twoje listy
+ Otwórz plik hosts
+ Rejestruj żądania DNS
+ Skanuj w poszukiwaniu Adware
+ Ustawienia
+ Pomoc
+
+
+
+
+ Żądania DNS
+ Twoje listy
+ Ustawienia
+
+
+ Zainstalowano %1$s temu
+ Aktualne dla %1$s
+ Potrzebujesz aktualizacji dla %1$s
+ Ostatnia aktualizacja %1$s temu
+ Nieznany status aktualizacji
+ Wyłączone
+ kilka minut
+
+ %d minuta
+ %d minuty
+ %d minut
+ %d minut
+
+
+ %d godzina
+ %d godziny
+ %d godzin
+ %d godzin
+
+
+ %d dzień
+ %d dni
+ %d dni
+ %d dni
+
+
+ %d miesiąc
+ %d miesiące
+ %d miesięcy
+ %d miesięcy
+
+
+
+ Host skopiowany do schowka
+
+
+ uruchamianie
+ aktywny
+ zatrzymanie
+ czekam na sieć
+ ponowne łączenie
+ błąd ponownego łączenia
+ Wstrzymany
+ Zatrzymany
+ Blokowanie reklam VPN %1$s
+ Wstrzymaj
+ Wznów
+
+
+ AdAway uprawnienia
+ Pozwól na interakcję z AdAway
+ Wyślij polecenia do AdAway
+ Zezwalaj na wysyłanie poleceń do AdAway, takich jak włączanie lub wyłączanie blokowania reklam w całym systemie
+
+
diff --git a/app/src/main/res/values-pl/strings_app.xml b/app/src/main/res/values-pl/strings_app.xml
new file mode 100644
index 0000000..52282d8
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Bloker reklam typu open source
+ Logo AdAway
+
diff --git a/app/src/main/res/values-pl/strings_errors.xml b/app/src/main/res/values-pl/strings_errors.xml
new file mode 100644
index 0000000..443ca4e
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Brak połączenia z Internetem
+ Nie można nawiązać połączenia z Internetem. Sprawdź podłączenie urządzenia do sieci.
+ Nie można pobrać źródła hostów
+ Żadne z włączonych źródeł hostów nie jest osiągalne. Sprawdź, czy masz prawidłowe połączenie z Internetem.
+
+ Nie udało się utworzyć prywatnego pliku
+ Nie można utworzyć prywatnego pliku, aby zbudować nowe źródło hostów. Sprawdź wolne miejsce dostępne w urządzeniu.
+ Zbyt mało miejsca
+ Nie można skopiować pliku hosts na partycję systemową. Sprawdź, czy moduł systemowy Magisk jest włączony, a następnie uruchom ponownie.
+ Nie udało się zainstalować nowego pliku hosts
+ Nie można skopiować pliku hosts do /system partycji. Proszę sprawdzić czy moduł Magisk niesystematyczny jest włączony, a następnie uruchom ponownie
+ Nie udało się przywrócić pliku hostów
+ Nie można przywrócić domyślnej konfiguracji pliku hosts.
+
+ Nie można włączyć blokowania reklam VPN.
+ Sprawdź ustawienia VPN, aby autoryzować aplikację VPN do uruchomienia.
+ Nie można wyłączyć blokowania reklam VPN.
+ Sprawdź ustawienia VPN, aby wyłączyć je ręcznie.
+
diff --git a/app/src/main/res/values-pl/strings_home.xml b/app/src/main/res/values-pl/strings_home.xml
new file mode 100644
index 0000000..318793d
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Zablokowane
+ Dozwolone
+ Przekierowany
+
+
+
+ %d aktualne źródło
+ %d aktualne źródła
+ %d aktualnych źródeł
+ %d aktualne źródła
+
+
+ %d nieaktualne źródło
+ %d nieaktualne źródła
+ %d nieaktualnych źródeł
+ %d nieaktualnych źródeł
+
+ Sprawdź aktualizacje hostów
+ Zaktualizuj hosty
+
+
+ Pokaż dziennik żądań DNS
+
+
+ Pokaż pomoc\i wskazówki
+
+
+ Otwórz stronę GitHub
+
+
+ Wsparcie projektu
+
+
+ Projekt GitHub
+ Ustawienia
+
+
+ Otwórz szufladę nawigacji
+ Wstrzymaj/wznów blokowanie reklam
+ Zaktualizuj zablokowane domeny
+ Pokaż żądane domeny
+
+
+ Proszę przeczytać Pomoc, aby uzyskać więcej informacji.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pl/strings_hosts.xml b/app/src/main/res/values-pl/strings_hosts.xml
new file mode 100644
index 0000000..f3f4eb2
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Źródła hostów
+
+ Lista użytkownika
+ Oficjalny plik hostów AdAway
+ Plik hostów StevenBlack Unified
+ Plik listy bloków hostów Pete Lowe
+
+ niedostępny(e)
+ %s hostów
+
+ Dodaj źródło
+ Edytuj źródło
+ Adres URL: (https:// lub plik:// zasób)
+ Adres URL źródła hostów
+
diff --git a/app/src/main/res/values-pl/strings_lists.xml b/app/src/main/res/values-pl/strings_lists.xml
new file mode 100644
index 0000000..91bf942
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Twoje listy
+ Dodaj hosta
+
+ Zablokowany
+ Dozwolone
+ Przekierowany
+
+ Filtruj hosty
+ Wyszukaj nazwę hosta…
+ Przełącz źródła
+
+ Dodaj host do czarnej listy
+ Dodaj host do białej listy
+ Dodaj przekierowanie hosta
+ Edycja hostów umieszczonych na czarnej liście
+ Edycja hostów umieszczonych na białej liście
+ Edytuj przekierowanie
+ Nazwa hosta:
+ Adres URL źródła hostów
+ (Znaki wieloznaczne * i ? są dozwolone)
+ IP (IPv4 lub IPv6):
+
diff --git a/app/src/main/res/values-pl/strings_log.xml b/app/src/main/res/values-pl/strings_log.xml
new file mode 100644
index 0000000..6e053b4
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Przełącz rejestrowanie dziennika
+ Naciśnij rekord, aby rozpocząć rejestrowanie żądań, przeglądaj Internet lub korzystaj z aplikacji, a następnie wróć lub przesuń palcem, aby odświeżyć dzienniki.
+ \n\nZablokowane żądania nie będą rejestrowane. Najpierw wyłącz blokowanie reklam, jeśli chcesz je również rejestrować.
+
+ Sortuj alfabetycznie
+ Sortuj rosnąco
+
+ Przekieruj domenę
+
diff --git a/app/src/main/res/values-pl/strings_notification.xml b/app/src/main/res/values-pl/strings_notification.xml
new file mode 100644
index 0000000..65e6288
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Aktualizacje
+ Powiadomienia o nowych aktualizacjach
+ Aktualizacja jest dostępna
+ Nowsze pliki hostów są dostępne do pobrania.
+ Dostępna aktualizacja aplikacji
+ Nowa wersja AdAway jest dostępna do pobrania.
+
+ VPN
+ Powiadomienia o uruchomieniu sieci VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pl/strings_prefs_backup_restore.xml b/app/src/main/res/values-pl/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..ca85503
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Przywracania kopii zapasowej &
+ Kopia zapasowa
+ Utwórz kopię zapasową w pamięci zewnętrznej reguł blokowania
+ Przywróć
+ Przywracanie reguł bloku z pliku kopii zapasowej
+
diff --git a/app/src/main/res/values-pl/strings_prefs_main.xml b/app/src/main/res/values-pl/strings_prefs_main.xml
new file mode 100644
index 0000000..e49c9eb
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Ustawienia
+
+ Ogólne
+ Wygląd motywu
+
+ Jasny
+ Ciemny
+ Domyślne ustawienie systemowe
+
+ Aktualizacje automatyczne
+
+ Blokowanie reklam
+ Blokowanie reklam oparte na Root
+ Blokowanie reklam oparte na VPN
+ Włącz obsługę IPv6
+ Kopia zapasowa / przywracanie zasad blokowania
+
+ Debugowanie
+ Wysyłaj raporty o awariach
+ Zgłoś raport do Sentry (sentry.io)
+ Nieobsługiwany w tej wersji
+ Pełne rejestrowanie
+ Aby zastosować, konieczne jest ponowne uruchomienie aplikacji
+
diff --git a/app/src/main/res/values-pl/strings_prefs_root.xml b/app/src/main/res/values-pl/strings_prefs_root.xml
new file mode 100644
index 0000000..9889758
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Blokowanie reklam oparte na Root
+
+ Instalacja Hosts
+ Otwórz plik hosts
+ Docelowy plik hosts
+ Zanim zmienisz to ustawienie, przeczytaj pomoc dotyczącą tej funkcjonalności.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Niestandardowy plik docelowy
+
+ Niestandardowy plik docelowy
+ Ukryj komunikat o restarcie
+
+ Przekierowanie
+ Określ, gdzie przekierować blokowanie hosts
+ Przekierowanie IPv4
+ Przekierowanie IPv6
+ Nieprawidłowe przekierowanie
+
+ Lokalny serwer www
+ Lokalny serwer WWW nasłuchuje na lokalnych adresach IP, aby odpowiedzieć na zablokowane żądania nazwy hosta. Może to pomóc w zawieszaniu się aplikacji przy zablokowanym połączeniu.
+ Włącz serwer www
+ Przetestuj serwer WWW
+ Zainstaluj samopodpisany certyfikat
+ Instalacja ręczna certyfikatu
+ Począwszy od wersji Android 11 (R), aplikacja nie może już automatycznie instalować urzędu certyfikacji (CA).\n\ nPrzejdź do ustawień \"Zabezpieczenia\", \"Szyfrowanie i poświadczenia\", a następnie \"Zainstaluj certyfikat\". Stamtąd wybierz \"Certyfikat CA\" i wybierz nowo wyeksportowany plik certyfikatu.
+ Otwórz ustawienia \"Zabezpieczenia\"
+ Sprawdzanie…
+ Nie uruchomiony
+ Uruchomiony, ale certyfikat nie został zainstalowany
+ Uruchamianie i instalowanie certyfikatu
+ Zastąp puste miejsce reklamowe ikoną aplikacji
+
diff --git a/app/src/main/res/values-pl/strings_prefs_update.xml b/app/src/main/res/values-pl/strings_prefs_update.xml
new file mode 100644
index 0000000..0982568
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Aktualizacje
+ Powiadomienia wyłączone
+ Powiadomienia nie pojawią się. Kliknij, aby włączyć je.
+
+ Aktualizacje aplikacji
+ Sprawdź aktualizację podczas uruch
+ Szukaj codzień.. aktualizacji
+ Uwzględnij wersje beta
+
+ Aktualizacje hostów
+ Sprawdź aktualizację na starcie
+ Szukaj aktualizacji co jakiś czas
+ Synchronizuj podczas aktualizacji
+ Synchronizuj tylko w bezpłatnej sieci
+
diff --git a/app/src/main/res/values-pl/strings_prefs_vpn.xml b/app/src/main/res/values-pl/strings_prefs_vpn.xml
new file mode 100644
index 0000000..333051c
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Blokowanie reklam oparte na VPN
+
+ Włącz podczas uruchamiania
+ Monitoruj połączenie
+ Okresowo sprawdzaj stan sieci, aby ponownie uruchomić VPN po rozłączeniu.
+
+ Wykluczone aplikacje
+ Skonfiguruj, które aplikacje nie powinny korzystać z VPN, aby żadne połączenia nie były blokowane.
+ Wyklucz aplikacje systemowe
+
+ Żadne
+ Wszystkie oprócz przeglądarek
+ Wszystkie
+
+ Wyklucz aplikacje użytkownika
+
+
+ Wykluczone aplikacje
+ Zaznacz wszystkie
+ Odznacz wszystkie
+ Ikona aplikacji
+
diff --git a/app/src/main/res/values-pl/strings_source_edit.xml b/app/src/main/res/values-pl/strings_source_edit.xml
new file mode 100644
index 0000000..cd50060
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Edytuj źródło
+ Dodaj źródło
+
+ Etykieta
+ Wymagana etykieta
+ Typ
+ URL
+ Plik
+ Lokalizacja
+ https://
+ Wymagana lokalizacja
+ Kliknij Plik, aby wybrać źródło
+ Nieprawidłowa lokalizacja
+ Format listy
+ Zablokuj
+ Zezwól
+ Zastosuj przekierowane hosty
+ Zezwalanie na przekierowanie hostów może powodować problemy z bezpieczeństwem. Używaj tego ustawienia tylko na zaufanym źródle, ponieważ może ono przekierować wrażliwy ruch na dowolny serwer.
+
diff --git a/app/src/main/res/values-pl/strings_support.xml b/app/src/main/res/values-pl/strings_support.xml
new file mode 100644
index 0000000..e9fcd5b
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Wsparcie
+ Zostań sponsorem
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pl/strings_update.xml b/app/src/main/res/values-pl/strings_update.xml
new file mode 100644
index 0000000..a6db007
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Aktualizacja AdAway
+
+ Dostępna aktualizacja!
+
+
+ Jesteś na bieżąco
+ Aktualizacja jest dostępna
+ Aktualizowanie AdAway
+ Aktualizuj teraz
+ %1$s / %2$s
+ Ostatnie zmiany
+ Lista zmian
+ Wspieraj rozwój
+ Dotacja
+ Sponsor
+
+
+ Pobieram najnowszą wersję AdAway…
+
diff --git a/app/src/main/res/values-pl/strings_welcome.xml b/app/src/main/res/values-pl/strings_welcome.xml
new file mode 100644
index 0000000..28c2485
--- /dev/null
+++ b/app/src/main/res/values-pl/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Zapraszamy
+ Kreator pierwszy krok
+ Drugi krok kreatora
+ Ostatni krok kreatora
+
+
+ Witamy w AdAway!
+ AdAway zapewnia dwie metody blokowania reklam. Wybierz tę, którą lubisz:
+
+ Logo Root
+ Blokowanie bazowane na Root
+ Szybciej
+ Przyjazny dla baterii
+ Wymagany root
+
+ Logo VPN
+ Blokowanie przez VPN
+ Wolniej
+ Uruchom w tle
+ Zgodność
+
+ Wymagany jest zrootowany Android
+ Nie można znaleźć pliku binarnego su lub nie zezwolono na uprawnienia roota dla AdAway.\n\nMoże to się zdarzyć, gdy urządzenie nie jest zrootowane. Informacje na temat rootowania urządzenia można znaleźć na wiki.lineageos.org lub innych stronach o systemie Android.
+
+ Plusy
+ Minusy
+
+
+ Synchronizacja zakończona
+ Błąd podczas synchronizacji
+
+ Synchronizacja
+ Zsynchronizowany!
+ AdAway pobiera sieci reklamowe w celu blokowania ze źródeł internetowych. Możesz je później dostosować w ustawieniach.
+ Ponów synchronizację
+ Błąd synchronizacji: %1$s Powtórzyć?
+ Może wyświetlać powiadomienia o statusie AdAway i jego ustawieniach oraz informować o dostępnych aktualizacjach aplikacji (kilka w ciągu roku). Włącz, aby być na bieżąco.
+
+
+ Wsparcie
+ Wesprzyj mnie!
+ AdAway jest darmową aplikacją open-source, którą rozwijam w wolnym czasie. Jeśli podoba Ci się, pomyśl nad wsparciem projektu:
+ Darowizna na PayPal
+ Lubisz błędy? Ja też nie.
+ Włącz telemetrię, aby wysyłać mi raporty o awariach
+
+
+ Wstecz
+ Dalej
+ Zakończ
+
diff --git a/app/src/main/res/values-ps/strings.xml b/app/src/main/res/values-ps/strings.xml
new file mode 100644
index 0000000..55028e2
--- /dev/null
+++ b/app/src/main/res/values-ps/strings.xml
@@ -0,0 +1,211 @@
+
+
+
+ وتون
+ بندول
+ هو
+ نه
+ زیاتول
+ ړنګونه
+ ساتل
+ مرسته
+
+
+ ښه راغلاست!
+ اډاوې د ازادې سرچينې یو وړیا ساوتری دی کوم چې انګروزي تړي. دا د انګروزي شبکو پتې اخلي ترڅو ستاسې په وزله يې وتړي.n\نور معلومات غواړئ؟ د مرستې لپاره لاندې وګورئ!
+ د نورې مرستې ښودل
+ د انګروزيو تړل سالول
+ د انګروزيو تړل بندول
+ ګورت پالنګر
+ ځغلي
+ تمېدلی
+ د تړل شويو hostnames غوښتنو ته ځواب ورکولو لپاره په localhost باندې د ګورت پالنګر پیلول او یا تمول
+ ګورت پالنګر سالول
+ ګورت پالنګر بندول
+ اوڅاریز ځاني جال VPN
+ ځغلي
+ تمېدلی
+ د غوښتنو چاڼولو لپاره د اوڅاريز ځاني جال پیلول او یا تمول
+ اوڅاریز ځاني جال سالول
+ اوڅاریز ځاني جال بندول
+
+
+ د ننوت سمون
+ كارونګ
+ سمون
+ ړنګول
+
+
+ راوړل…
+ شاتړ په بريالي توګه له بهرنۍ زېرمې راوړل شو.
+ د شاتړ راوړنه نابريالۍ شوه. آیا ددې بڼه سمه ده؟ د نورو معلوماتو لپاره logcat وګورئ.
+ وړل…
+
+ hosts دوتنه
+ د hosts دوتنې منځپانګه لېښل…
+ د hosts دوتنه پرانیځئ
+
+
+ اوسمهالیز لپاره ګورو
+ سرچينې پلټل
+ سرچينه رالېښل %s
+ د hosts تلوالې دوتنې ته راګرځول
+ د hosts تلواله دوتنه بیازېرمه شوه
+ د hosts کره دوتنه پنځول
+ د سرچينې اوسمهاليز شته
+ نوي hosts دوتنې شته
+ هېڅ سرچينې اوسمهاليز و نه موندل شو
+ انټرنېټ پیوستون نشته
+ انټرنېټ پیوستون شتون نه لري
+ سرچينې نشته
+ هېڅ hosts سرچينې ته لاسرسۍ نشته!
+ وليز لاسرسۍ ور نه کړل شو
+ د خپل ولۍ کاريال نه د وليز لاسرسي پرېښلی ورکړئ
+ یو څه ناسم وشول
+ د نورې سپړنې لپاره logcat وګورئ
+ سالول شوی
+ نوي hosts دوتنې سالول شوي
+ بند شوی
+ د hosts تلواله دوتنه ولګول شوه
+ ترټولو وروستۍ سرچينې کارونګ
+ يوه نوې hosts دوتنه پنځول
+ يوه نوې hosts دوتنه لمېسل
+ د hosts دوتنې لمېسه کتل
+ hosts دوتنه په بريالي توګه اوسمهاله شوه
+ د اوڅاریز ځاني جال سازونه په بريالي توګه اوسمهاله شو
+ ستاسې سازونې بدلون وموند. تاسې اړ یاستۍ چې کارونګه يې کړئ.
+ كارونګ
+ د نوې سازونې کارونګ…
+ د نوې سازونې پر کارونګه کولو کښې نابریالۍ شو.
+
+ symlink بې درکه دی
+ تشه بس نه ده
+ رالېښل شوې دوتنه لوستل کېږي نه.
+ ځاني دوتنه نابريالۍ شوه
+ د وېش بیاځانښلول د لوستنې/ليکنې په توګه نابريالی شو!
+ بیاځانښلون نابريالی شو
+ د hosts دوتنې لمېسل نابريالي شو
+ د hosts دوتنې لمېسل نابريالي شو!
+ لمېسل نابريالي شو
+ کارونګه شوې hosts سرچينې
+ کارونګ بریالی شو
+ کارونګ بریالی شو.n\د بدلونونو د اغېزمن کېدو لپاره ښايي چې د انډروېډ بیاپيلون اړین وي.n\n\آیا تاسې بیاپيلول غواړئ؟n\(د اومتوک د لاسه ورکولو د مخنيوي لپاره دا باوري کړئ چې دم ګړۍ هېڅ کاريال له یاد پاڼې (SD کارټ) څخه ګټه نه اخلي!)
+ symlink په بريالۍ توګه وپنځول شو.n\د بدلونونو د اغېزمن کېدو لپاره ښايي چې د انډروېډ بیاپيلون اړین وي.n\n\آیا تاسې بیاپيلول غواړئ؟n\(د اومتوک د لاسه ورکولو د مخنيوي لپاره دا باوري کړئ چې دم ګړۍ هېڅ کاريال له یاد پاڼې (SD کارټ) څخه ګټه نه اخلي!)
+ د symlink پنځونه بريالۍ شوه
+ د symlink پنځونه نابريالۍ شوه
+ مهرباني وکړئ، د لا نورو معلوماتو لپاره مرسته ولولئ.
+ يو رسي ټکي نوم APN ګوډاګى ستاسې پر انډروېډ باندې امستل شوی دی!n/اډاوې به پر ګرځند شبکه لکه، 3جي، باندې باوري کار و نه کړي. تاسې کولای شئ چې هغه ګوډاګی ناچارند کړئ د خپل ټاکلي رسي ټکي نوم ته په تګ سره (د امستنو کاريال نه: Network & Internet -> Mobile network -> Advanced -> Access Point Names) او بیا د ګوډاګي ډګر نه ارزښت لېرې کړئ.
+ رسي ټکي نوم ګوډاګی امستل شو!
+ انټرنېټ پيوستون کار نه کوي.
+ پیوستون نشته
+ رالېښل…
+ كارونګ…
+ د تورلړ او سپینلړ کارونګ
+ د hosts دوتنې تجزیه کول او سره ننوېستل
+ د hosts دوتنې جوړول
+ د hosts دوتنې کارونګ
+ د نوي hosts دوتنې په کارونګ کې نابریالی شو.
+ ستاسې پر غونډال کښې د hosts دوتنې کارونګ نابریالي شو!n\په غورتياوو کښې د موخې د hosts دوتنې بدلولو هڅه وکړئ.
+ کارونګ نابریالي شو
+ تاسې د hosts تلوالې دوتنې ته راوګرځېدلئ.n\د بدلونونو د اغېزمن کېدو لپاره ښايي چې د انډروېډ بیاپيلون اړین وي.n\n\آیا تاسې بیاپيلول غواړئ؟n\(د اومتوک د لاسه ورکولو د مخنيوي لپاره دا باوري کړئ چې دم ګړۍ هېڅ کاريال له یاد پاڼې (SD کارټ) څخه ګټه نه اخلي!)
+ راګرځول بریالي شو
+ راګرځول نابریالي شو!
+ رالېښل نابريالي شو
+ د نوي hosts دوتنې په ليکنه کښې نابريالی شو
+ ځاني دوتنه پنځول کېدای نه شي.
+ د ځاني دوتنې پنځونه نابريالۍ شوه
+ تاسې بې غونډاله اکر سال کړ.n\د بدلونونو د اغېزمن کېدو لپاره ښايي چې د انډروېډ بیاپيلون اړین وي.n\n\آیا تاسې بیاپيلول غواړئ؟n\(د اومتوک د لاسه ورکولو د مخنيوي لپاره دا باوري کړئ چې دم ګړۍ هېڅ کاريال له یاد پاڼې (SD کارټ) څخه ګټه نه اخلي!)
+ سالول بريالي شو
+ تاسې بې غونډاله اکر بند کړ.n\د بدلونونو د اغېزمن کېدو لپاره ښايي چې د انډروېډ بیاپيلون اړین وي.n\n\آیا تاسې بیاپيلول غواړئ؟n\(د اومتوک د لاسه ورکولو د مخنيوي لپاره دا باوري کړئ چې دم ګړۍ هېڅ کاريال له یاد پاڼې (SD کارټ) څخه ګټه نه اخلي!)
+ بندول بريالي شو
+ د اوڅاريز ځاني جال انګروزي تړنه سالول نابريالي شو.
+ د اوڅاريز ځاني جال انګروزي تړنه بندول نابريالي شو.
+ د hosts Magisk رغبېلګه سالول
+ له Magisk سمبالګر نه د بې غونډاله hosts ځانګړنه سال کړئ. ددې د امستنو نه د Systemless hosts غوراوى سال کړئ او خپله وزله بیاپيل کړئ.
+ د hosts Magisk رغبېلګه بندول
+ له Magisk سمبالګر نه د بې غونډاله hosts ځانګړنه بنده کړئ. د رغبېلګه لړ نه د Systemless hosts رغبېلګه لېرې کړئ او خپله وزله بیاپيل کړئ.
+
+ دا یو سم hostname نه دی!
+ ناسم بڼول شوی hostname
+ دا یوه سمه انټرنېټ باندره (IP) نه ده!
+ ناسمه بڼول شوې انټرنېټ باندره
+ لېښل…
+
+
+ تاندول
+ زیاتول
+ مرسته
+ شاتړ راوړنه
+ شاتړ وړنه
+
+ بيابيا كېدونكې پوښتنې
+ ستونزې
+
+
+ انګروزيز ساوتری
+ ځېرل…
+ هېڅ انګروزیز ساوتری و نه موندل شو
+
+
+ انګروزی تړونکی
+ د متن بیاسمونګر نه دی لګول شوی
+ دوتنه سمبالګر نه دی لګول شوی
+
+ tcpdump
+ څارنه بندول
+ څارنه سالول
+ پایلو ښودل
+ شپولو اڼل
+ خبرال پاکول
+ تور لړ کښې د ننوت زیاتول
+ سپين لړ کښې د ننوت زیاتول
+ غورنۍ پرانيځئ
+ غورنۍ بنده کړئ
+
+
+
+ کوربه سرچينې
+ ستاسې لړونه
+ د کوربانه دوتنه پرانیځئ
+ غورتياوې
+ مرسته
+
+ ستاسې لړونه
+ غورتياوې
+
+
+ ولګول شو %1$s مخکې
+
+ %dپېل
+ %dپېله
+
+
+ %dساعت
+ %dساعته
+
+
+ %dورځ
+ %dورځې
+
+
+ %dمیاشت
+ %dمیاشتې
+
+
+
+ پيلېدل
+ چارنده
+ تمېدل
+ شبکې ته په ځار شئ
+ بياپيوستل
+ بياپيوستلو کښې تېروتنه
+ ځنډېدلی
+ تمېدلی
+ انګروزی تړونکی اوڅاريز ځاني جال%1$s
+ ځنډول
+ بیاروانولو لپاره ووهئ
+
+
+ د غونډال انګروزي تړل سالول او بندول
+
+
diff --git a/app/src/main/res/values-ps/strings_app.xml b/app/src/main/res/values-ps/strings_app.xml
new file mode 100644
index 0000000..630c2b3
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_app.xml
@@ -0,0 +1,5 @@
+
+
+ اډاوې
+ د ازادې سرچينې انګروزی تړونکی
+
diff --git a/app/src/main/res/values-ps/strings_errors.xml b/app/src/main/res/values-ps/strings_errors.xml
new file mode 100644
index 0000000..bb14ff2
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_errors.xml
@@ -0,0 +1,9 @@
+
+
+
+ انټرنېټ پیوستون نشته
+ تشه بس نه ده
+
+ د اوڅاريز ځاني جال انګروزي تړنه سالول نابريالي شو.
+ د اوڅاريز ځاني جال انګروزي تړنه بندول نابريالي شو.
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ps/strings_home.xml b/app/src/main/res/values-ps/strings_home.xml
new file mode 100644
index 0000000..24094e1
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_home.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ تړلی
+ پرېښلی
+
+ مرسته ښودل
+
+ غورتياوې
+
+
+ مهرباني وکړئ، د لا نورو معلوماتو لپاره مرسته ولولئ.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ps/strings_hosts.xml b/app/src/main/res/values-ps/strings_hosts.xml
new file mode 100644
index 0000000..dc2ea3a
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_hosts.xml
@@ -0,0 +1,11 @@
+
+
+ Hosts سرچينې
+
+ شتون نه لري
+
+ سرچينه زیاتول
+ سرچينې سمون
+ URL: (یو https:// اویا file:// سرچينه)
+ د hosts سرچينې پته
+
diff --git a/app/src/main/res/values-ps/strings_lists.xml b/app/src/main/res/values-ps/strings_lists.xml
new file mode 100644
index 0000000..96de9ff
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_lists.xml
@@ -0,0 +1,8 @@
+
+
+ ستاسې لړونه
+
+ تړلی
+ پرېښلی
+ د کوربانه سرچيني URL
+
diff --git a/app/src/main/res/values-ps/strings_log.xml b/app/src/main/res/values-ps/strings_log.xml
new file mode 100644
index 0000000..4e144bd
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_log.xml
@@ -0,0 +1,6 @@
+
+
+
+ آبڅیز اڼل
+
+
diff --git a/app/src/main/res/values-ps/strings_notification.xml b/app/src/main/res/values-ps/strings_notification.xml
new file mode 100644
index 0000000..5b5faeb
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_notification.xml
@@ -0,0 +1,6 @@
+
+
+ د سرچينې اوسمهاليز شته
+
+ اوڅاریز ځاني جال (VPN)
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ps/strings_prefs_backup_restore.xml b/app/src/main/res/values-ps/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ps/strings_prefs_main.xml b/app/src/main/res/values-ps/strings_prefs_main.xml
new file mode 100644
index 0000000..0ce2028
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ غورتياوې
+
diff --git a/app/src/main/res/values-ps/strings_prefs_root.xml b/app/src/main/res/values-ps/strings_prefs_root.xml
new file mode 100644
index 0000000..357dcf5
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+
+ hosts لګول
+ د hosts دوتنه پرانیځئ
+
+ ځايي ګورت پالنګر
+ ګورت پالنګر سالول
+ نه ځغلي
+
diff --git a/app/src/main/res/values-ps/strings_prefs_update.xml b/app/src/main/res/values-ps/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ps/strings_prefs_vpn.xml b/app/src/main/res/values-ps/strings_prefs_vpn.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_prefs_vpn.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ps/strings_support.xml b/app/src/main/res/values-ps/strings_support.xml
new file mode 100644
index 0000000..04bfad6
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_support.xml
@@ -0,0 +1,4 @@
+
+
+ ملاتړ
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ps/strings_update.xml b/app/src/main/res/values-ps/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ps/strings_welcome.xml b/app/src/main/res/values-ps/strings_welcome.xml
new file mode 100644
index 0000000..f45eab6
--- /dev/null
+++ b/app/src/main/res/values-ps/strings_welcome.xml
@@ -0,0 +1,14 @@
+
+
+ ښه راغلاست
+
+ اډاوې ته ښه راغلاست!
+ ولۍ نښان
+ لاګړندى
+
+ ملاتړ
+
+ شا
+ بل
+ پاينه
+
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..2cc77ea
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,266 @@
+
+
+
+ Sair
+ Fechar
+ Sim
+ Não
+ Adicionar
+ Cancelar
+ Salvar
+ Ajuda
+
+
+ Bem-vindo!
+ O AdAway é um projeto de software livre e Open-Source para bloquear publicidade. Ele baixa endereços de rede de anúncios e configura o dispositivo para bloqueá-los.\nQuer saber mais? Veja a ajuda abaixo!
+ Mostrar mais ajuda
+ Atualizar status
+ Todos os arquivos hosts das fontes selecionadas já estão baixados, mesclados com suas listas personalizadas e instalados como um único arquivo hosts no seu sistema.
+ Ativar bloqueio de anúncios
+ Desativar bloqueio de anúncios
+ Servidor web
+ Em execução
+ Parado
+ Iniciar ou interromper servidor web no host local para responder solicitações de nomes de hosts bloqueados.
+ Ativar servidor web
+ Desativar servidor web
+ VPN
+ Em execução
+ Parado
+ Inicie ou pare o VPN para filtrar solicitações.
+ Ativar VPN
+ Desativar VPN
+
+
+ Editar Entrada
+ Aplicar
+ Editar
+ Excluir
+
+
+ Importando…
+ Backup importado com sucesso do seu armazenamento externo.
+ Falha ao importar backup. Seu formato está correto? Verifique o logcat para mais detalhes.
+ Exportando…
+ Backup exportado com sucesso para o arquivo \'%s\' em seu armazenamento externo.
+ Falha ao exportar arquivo de backup \'%s\'.
+
+
+ O arquivo de hosts
+ O arquivo hosts é um arquivo de sistema que mapeia nomes de host para endereços IP. É um arquivo de texto simples cuja configuração é gerenciada pela AdAway. Aqui estão suas poucas primeiras linhas:
+ Carregando o conteúdo do arquivo hosts…
+ Abrir arquivo hosts
+
+
+ Buscando atualização
+ Verificando atualização de fonte: %s
+ Obtendo fontes
+ Baixando fontes %s
+ Fonte de leitura %s
+ Fonte %s em análise
+ Sincronizando o banco de dados de regras
+ Revertendo para o arquivo de hosts padrão
+ Arquivo de hosts padrão restaurado
+ Criando arquivo hosts padrão
+ Atualização da fonte disponível
+ Hosts mais recentes disponíveis
+ Nenhuma atualização de fonte encontrada
+ Sem conexão à Internet
+ Nenhuma conexão à Internet disponível
+ Fontes indisponíveis
+ Nenhuma fonte de host está acessível!
+ Acesso root negado
+ Permitir acesso root do seu aplicativo de root
+ Algo deu errado
+ Verifique o logcat para mais detalhes
+ Ativado
+ Arquivos hosts mais recentes ativados
+ Desativado
+ Arquivo hosts padrão instalado
+ Aplicar as fontes mais recentes
+ Criando um novo arquivo de hosts
+ Copiando um novo arquivo de hosts
+ Verificando a cópia do arquivo de hosts
+ Arquivo de hosts atualizado com sucesso
+ Configuração da VPN atualizada com sucesso
+ Sua configuração foi alterada. Você precisa aplicá-la.
+ Aplicar
+ Aplicando nova configuração…
+ Falha ao aplicar nova configuração
+
+
+ O symlink para o destino do arquivo hosts está ausente
+ O link simbólico do seu destino para /system/etc/hosts não existe ou está incorreto! O AdAway não funcionará se ele não estiver direcionado ao arquivo certo.\n\nTentar criar um link simbólico?
+ Link simbólico ausente
+ Espaço insuficiente na partição!\nTente alterar o destino do arquivo hosts nas preferências para /data/data/hosts.
+ Espaço insuficiente
+ O arquivo baixado não pode ser lido.
+ Falha no arquivo privado
+ Falha ao remontar a partição como leitura/escrita!
+ Falha ao remontar
+ Falha ao copiar o arquivo hosts
+ Falha na cópia do arquivo hosts!
+ Falha ao copiar
+ Fontes de hosts aplicadas
+ Sucesso ao aplicar
+ A aplicação foi bem sucedida.\nPode ser necessário reiniciar o Android para as alterações fazerem efeito.\n\nDeseja reiniciar agora?\n(Para evitar perda de dados certifique-se de que nenhum app está usando o cartão SD no momento!)
+ O link simbólico foi criado com sucesso. Pode ser necessário reiniciar o Android para que as alterações entrem em vigor. Deseja reiniciar? (para evitar a perda de dados, certifique-se de que nenhum aplicativo está usando o cartão SD no momento!)
+ Sucesso ao criar link simbólico
+ O link simbólico não pôde ser criado pelo Android.\nIsso falha principalmente devido a um \'recurso\' chamado S-ON nos telefones HTC!\n\nUma solução é inicializar seu telefone no modo de recuperação e criar o link simbólico com \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nSe isso não funcionar, procure na Internet por S-OFF e seu telefone.
+ Falha ao criar link simbólico
+ Consulte a Ajuda para mais informações.
+ Um proxy APN está definido no seu Android!\nO AdAway não funcionará de forma confiável quando estiver em redes móveis como o 3G. Você pode desativar esse proxy acessando o APN selecionado (no aplicativo Configurações: Rede & Internet -> Rede móvel -> Avançado -> Nomes de pontos de acesso) e remova o valor no campo de proxy.
+ APN proxy definida!
+ A conexão à Internet não está funcionando.
+ Sem Conexão
+ Baixando…
+ Aplicando…
+ Aplicando Lista Negra e Lista Branca
+ Analisando e mesclando arquivos hosts
+ Compilando arquivo hosts
+ Aplicando arquivo hosts
+ Falha ao aplicar o novo arquivo de hosts.
+ Falha ao aplicar arquivo hosts no seu sistema!\nTente alterar o destino do arquivo hosts nas preferências para /data/data/hosts.
+ Falha ao aplicar
+ Por favor, verifique o seu aplicativo de gerenciamento de root para garantir que o acesso root tenha sido concedido.
+ Você reverteu para o arquivo de hosts padrão. Pode ser necessário reinicializar o Android para que as alterações entrem em vigor. Deseja reinicializar? (Para evitar a perda de dados, verifique se nenhum aplicativo usa o cartão SD no momento !)
+ Revertido com sucesso
+ Não foi possível reverter o arquivo hosts
+ Falha ao reverter devido a razões desconhecidas.
+ Falha ao reverter!
+ Nenhuma de suas fontes de hosts ativadas está acessível! Você está conectado devidamente à Internet?
+ Falha ao baixar
+ Falha ao gravar o novo arquivo de hosts privados
+ O arquivo privado não pode ser criado.
+ Falha ao criar arquivo privado
+ Você ativou o modo sem sistema. Pode ser necessário reinicializar o Android para que as alterações entrem em vigor. Deseja reinicializar? (Para evitar a perda de dados, certifique-se de que nenhum aplicativo use o cartão SD no momento!)
+ Ativado com sucesso
+ Você desativou o modo sem sistema. Pode ser necessário reiniciar o Android para que as alterações entrem em vigor. Deseja reiniciar? (Para evitar a perda de dados, certifique-se de que nenhum aplicativo use o cartão SD no momento!)
+ Desativado com sucesso
+ Falha ao ativar o bloqueio de anúncios VPN.
+ Falha ao desativar o bloqueio de anúncios VPN.
+ Ativando módulo Magisk de hosts
+ Habilite o recurso hosts sem sistema do gerenciador Magisk. Nas configurações, ative a opção Hosts sem sistema e reinicie o dispositivo.
+ Desativando módulo Magisk de hosts
+ Desative o recurso de hosts sem sistema do gerenciador Magisk. Na lista de módulos, desinstale o módulo Hosts sem sistema e reinicie o dispositivo.
+
+
+ URL de entrada para arquivo hosts:
+ Este não é um nome de host válido!
+ Nome de host incorretamente formatado
+ Este não é um IP válido!
+ IP incorretamente formatado
+ Nunca reinicie e não mostre esta pergunta na próxima vez!
+ Carregando…
+
+
+ Atualizar
+ Adicionar
+ Ajuda
+ Importar backup
+ Exportar backup
+
+
+ S-ON/S-OFF
+ FAQ
+ Problemas
+
+
+ Adware
+ Aqui você pode encontrar adwares instalados, aplicativos ruins que não podem ser bloqueados pelo AdAway. Esses aplicativos usam, por exemplo, notificações do Airpush que aparecem mesmo quando o aplicativo não está em execução ou até mesmo mudam seu toque. A única contramedida disponível é desinstalar esses aplicativos clicando nos itens da lista.
+ Escaneando…
+ Nenhum Adware foi encontrado!
+
+
+ Bloqueador de anúncios
+ Nenhum editor de texto instalado
+ Nenhum editor de texto pode ser encontrado para abrir o arquivo hosts. Você pode instalar Jota ou outros editores de texto para contornar isto.\n\nInstalar Jota?
+ Nenhum gerenciador de arquivos instalado
+ Nenhum gerenciador de arquivos pode ser encontrado para abrir arquivos. Você pode instalar OI Gerenciador de Arquivos ou outros gerenciadores de arquivos para contornar isto.\n\nInstalar OI Gerenciador de Arquivos?
+
+
+ Despejo TCP
+ Tcpdump é uma ferramenta para monitorar solicitações de DNS e salvá-las em um arquivo de registro. Você pode iniciá-la em segundo plano, executar apps que mostram anúncios, e logo após analisar as solicitações de DNS usando arquivo de registro. O possivel servidor de anúncios pode ser então adicionado na sua lista negra.
+ Desativar monitoramento
+ Ativar monitoramento
+ Mostrar resultados
+ Classificar domínios
+ Limpar registro
+ Adicionar entrada à lista negra
+ Adicionar entrada à lista branca
+ Adicionar entrada à lista de redirecionamento
+
+ Edite o valor em texto preferido
+ Abrir menu
+ Fechar menu
+
+
+
+ Início
+ Fontes de hosts
+ Suas listas
+ Abrir arquivo hosts
+ Registrar solicitações de DNS
+ Procurar por adware
+ Preferências
+ Ajuda
+
+
+
+
+ Pedidos DNS
+ Suas listas
+ Preferências
+
+
+ Instalado há %1$s
+ Atualizado há %1$s
+ Atualização necessária para %1$s
+ Última atualização há %1$s
+ Status de atualização desconhecido
+ Desativado
+ poucos minutos
+
+ %d minuto
+ %d minutos
+ %d minutos
+
+
+ %d hora
+ %d horas
+ %d horas
+
+
+ %d dia
+ %d dias
+ %d dias
+
+
+ %d mês
+ %d meses
+ %d meses
+
+
+
+ Host copiado para área da transferência
+
+
+ iniciando
+ ativo
+ parando
+ esperando pela rede
+ reconectando
+ erro de reconexão
+ pausado
+ parado
+ VPN bloqueadora de anúncios %1$s
+ Pausar
+ Retomar
+
+
+ Permissões do AdAway
+ Permitir a interação com o AdAway
+ Mandar comandos ao AdAway
+ Permitir o envio de comandos para o AdAway, como habilitar ou desabilitar o bloqueio de anúncios em todo o sistema
+
+
diff --git a/app/src/main/res/values-pt-rBR/strings_app.xml b/app/src/main/res/values-pt-rBR/strings_app.xml
new file mode 100644
index 0000000..b4415bb
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Bloqueador de anúncios de código aberto
+ Logo AdAway
+
diff --git a/app/src/main/res/values-pt-rBR/strings_errors.xml b/app/src/main/res/values-pt-rBR/strings_errors.xml
new file mode 100644
index 0000000..b72c534
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Sem conexão com a Internet
+ Não foi possível estabelecer uma conexão com a Internet. Por favor, verifique a conectividade do seu dispositivo.
+ Falha ao baixar a fonte dos hosts
+ Nenhuma das fontes de hosts ativadas está acessível. Por favor verifique se você está conectado corretamente à Internet.
+
+ Falha ao criar arquivo privado
+ Não foi possível criar um arquivo privado para criar uma nova fonte de hosts. Verifique o espaço livre disponível no seu dispositivo.
+ Espaço insuficiente
+ Não foi possível copiar o arquivo hosts para partição do sistema. Por favor, verifique se o módulo sem sistema Magisk está ativado e reinicie.
+ Falha ao instalar o novo arquivo de hosts
+ Não foi possível copiar o arquivo hosts para a partição do sistema. Verifique se o módulo systemless do Magisk está habilitado e reinicie.
+ Falha ao reverter o arquivo hosts
+ Não foi possível restaurar a configuração do arquivo de hosts padrão.
+
+ Falha ao ativar o bloqueio de anúncios VPN.
+ Verifique suas configurações de VPN para autorizar o aplicativo VPN a iniciar.
+ Falha ao desativar o bloqueio de anúncios VPN.
+ Por favor, verifique suas configurações de VPN para desativá-lo manualmente.
+
diff --git a/app/src/main/res/values-pt-rBR/strings_home.xml b/app/src/main/res/values-pt-rBR/strings_home.xml
new file mode 100644
index 0000000..c3fa0aa
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Bloqueado
+ Permitido
+ Redirecionado
+
+
+
+ %d up-to-date source
+ %d fontes atualizadas
+
+
+ %d outdated source
+ %d fontes desatualizadas
+
+ Checar por atualizações de hosts
+ Atualizar hosts
+
+
+ Mostrar registro de solicitação de DNS
+
+
+ Mostrar ajuda\ne dicas
+
+
+ Abrir página do GitHub
+
+
+ Apoie o projeto
+
+
+ Projeto GitHub
+ Preferências
+
+
+ Abrir gaveta de navegação
+ Pausar/retomar ad bloqueador
+ Atualizar domínios bloqueados
+ Mostrar solicitações de domínios
+
+
+ Consulte a Ajuda para mais informações.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rBR/strings_hosts.xml b/app/src/main/res/values-pt-rBR/strings_hosts.xml
new file mode 100644
index 0000000..b7aa779
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Fontes de hosts
+
+ Lista do usuário
+ Hosts oficiais do AdAway
+ Hosts StevenBlack Unificados
+ Lista negra de Pete Lowe
+
+ não disponível
+ %s hosts
+
+ Adicionar fonte
+ Editar fonte
+ URL: (https:// ou file:// recursos)
+ A URL da fonte de hosts
+
diff --git a/app/src/main/res/values-pt-rBR/strings_lists.xml b/app/src/main/res/values-pt-rBR/strings_lists.xml
new file mode 100644
index 0000000..e85442a
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Suas listas
+ Adicionar host
+
+ Bloqueado
+ Permitido
+ Redirecionado
+
+ Filtrar hosts
+ Pesquisar nome do host…
+ Alternar fontes
+
+ Adicionar host à lista negra
+ Adicionar host à lista branca
+ Adicionar redirecionamento de host
+ Editar host da lista negra
+ Editar host da lista branca
+ Editar redirecionamento
+ Nome do host:
+ A URL da fonte de hosts
+ (Caracteres curinga * e ? são permitidos)
+ IP (IPv4 ou IPv6):
+
diff --git a/app/src/main/res/values-pt-rBR/strings_log.xml b/app/src/main/res/values-pt-rBR/strings_log.xml
new file mode 100644
index 0000000..05c4907
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Ativar gravação do registro
+ Aperte gravar para começar a registrar solicitações, navegue a Web ou use aplicativos, então retorne ou deslize para atualizar os registros.
+ \n\nSolicitações bloqueadas não vão ser registradas. Desative o bloqueio de anúncios se quiser registrá-las também.
+
+ Ordem alfabética
+ Ordem de nível de domínio
+
+ Redirecionamento de domínio
+
diff --git a/app/src/main/res/values-pt-rBR/strings_notification.xml b/app/src/main/res/values-pt-rBR/strings_notification.xml
new file mode 100644
index 0000000..71427f2
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Atualizações
+ Novas notificações de atualização
+ Atualização da fonte disponível
+ Novos arquivos hosts disponíveis para download.
+ Atualização de aplicativo disponível
+ Uma nova versão do AdAway está disponível para download.
+
+ VPN
+ Notificações de execução de VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rBR/strings_prefs_backup_restore.xml b/app/src/main/res/values-pt-rBR/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..2920e78
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Backup & restaurar
+ Backup
+ Backup para armazenamento externo suas regras de bloqueio
+ Restaurar
+ Restaure suas regras de bloqueio do arquivo de backup
+
diff --git a/app/src/main/res/values-pt-rBR/strings_prefs_main.xml b/app/src/main/res/values-pt-rBR/strings_prefs_main.xml
new file mode 100644
index 0000000..f8933b9
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferências
+
+ Geral
+ Ativar tema escuro
+
+ Claro
+ Escuro
+ Padrão do sistema
+
+ Atualizações automáticas
+
+ Ad bloqueador
+ Bloqueador de anúncios baseado em Root
+ Bloqueador de anúncios baseado em VPN
+ Ativar IPv6
+ Backup / restaure regras de bloqueio
+
+ Depuração
+ Ativar relatório de erros
+ Permitir ao aplicativo enviar relatórios de erros e crashes para o Sentry (sentry.io).
+ Não suportado nesta compilação
+ Habilitar log detalhado
+ Você precisa reiniciar o AdAway para esta configuração ter efeito.
+
diff --git a/app/src/main/res/values-pt-rBR/strings_prefs_root.xml b/app/src/main/res/values-pt-rBR/strings_prefs_root.xml
new file mode 100644
index 0000000..da13062
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Bloqueador de anúncios baseado em Root
+
+ Instalar Hosts
+ Abrir arquivo hosts
+ Destino do arquivo hosts
+ Antes de alterar esta definição, consulte a Ajuda sobre esta funcionalidade.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Destino personalizado
+
+ Destino personalizado
+ Ocultar diálogo de reinicialização
+
+ Redirecionamento
+ Definir para onde redirecionar hosts bloqueados
+ Redirecionamento de IPv4
+ Redirecionamento de IPv6
+ Redirecionamento inválido
+
+ Servidor Web Local
+ O servidor da Web local escutam os endereços IP locais para responder a solicitações de nome de host bloqueadas. Pode ajudar com o congelamento de aplicativos na conexão bloqueada.
+ Ativar servidor web
+ Testar servidor web
+ Instalar certificado autoassinado
+ Instalação manual do certificado
+ A partir do Android 11 (R), o aplicativo não pode mais instalar automaticamente a autoridade de certificação (CA).\n\nVá para as configurações de \"Segurança\", \"Criptografia e credenciais\" e, em seguida, \"Instalar um certificado\". A partir daí, escolha \"certificado CA\" e selecione o arquivo de certificado recém-exportado.
+ Abra as configurações de \"Segurança\"
+ Checando…
+ Não executando
+ Em execução, mas o certificado não foi instalado
+ Em execução e certificado instalado
+ Substituir espaço em branco do anúncio pelo ícone do aplicativo
+
diff --git a/app/src/main/res/values-pt-rBR/strings_prefs_update.xml b/app/src/main/res/values-pt-rBR/strings_prefs_update.xml
new file mode 100644
index 0000000..a62cc03
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Atualizações
+ As notificações estão desativadas
+ As notificações de aplicativos não serão exibidas. Toque para ativá-las.
+
+ Atualizações do aplicativo
+ Verificar se há atualizações na inicialização
+ Verificar por atualizações diariamente
+ Incluir versões beta
+
+ Atualizações de hosts
+ Verificar se há atualizações na inicialização
+ Verificar por atualizações diariamente
+ Sincronizar na atualização
+ Sincronizar apenas em rede sem limites
+
diff --git a/app/src/main/res/values-pt-rBR/strings_prefs_vpn.xml b/app/src/main/res/values-pt-rBR/strings_prefs_vpn.xml
new file mode 100644
index 0000000..1c4f14b
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Bloqueador de anúncios baseado em VPN
+
+ Ativar na inicialização
+ Monitore a conexão
+ Verifique periodicamente o estado da rede para reiniciar a VPN em caso de desconexão.
+
+ Aplicativos excluídos
+ Configure quais aplicativos não devem usar a VPN para que nenhuma conexão seja bloqueada.
+ Excluir aplicativos do sistema
+
+ Nenhum
+ Todos, exceto navegadores
+ Todos
+
+ Excluir aplicativos do usuário
+
+
+ Aplicativos excluídos
+ Selecionar tudo
+ Remover todos
+ Ícone do aplicativo
+
diff --git a/app/src/main/res/values-pt-rBR/strings_source_edit.xml b/app/src/main/res/values-pt-rBR/strings_source_edit.xml
new file mode 100644
index 0000000..ca5021c
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Editar fonte
+ Adicionar fonte
+
+ Etiqueta
+ Etiqueta necessária
+ Tipo
+ URL
+ Arquivo
+ Localização
+ https://
+ Localização necessária
+ Toque em Arquivo para selecionar arquivo fonte
+ Localização inválida
+ Formato da lista
+ Bloquear
+ Permitir
+ Aplicar hosts redirecionados
+ Permitir hosts redirecionados poderá causar problemas de segurança. Usa esta definição apenas em fontes confiáveis, pois estas poderão redirecionar tráfego sensível para qualquer servidor que queiram.
+
diff --git a/app/src/main/res/values-pt-rBR/strings_support.xml b/app/src/main/res/values-pt-rBR/strings_support.xml
new file mode 100644
index 0000000..4c9a07d
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Suporte
+ Seja um patrocinador
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rBR/strings_update.xml b/app/src/main/res/values-pt-rBR/strings_update.xml
new file mode 100644
index 0000000..69e3edc
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Atualização do AdAway
+
+ Atualização disponível!
+
+
+ Você esta atualizado
+ Atualização disponível
+ Atualizando AdAway
+ Atualizar agora
+ %1$s / %2$s
+ Últimas modificações
+ Registro de mudanças
+ Apoiar o desenvolvimento
+ Doar
+ Patrocinador
+
+
+ Baixando a última versão do AdAway
+
diff --git a/app/src/main/res/values-pt-rBR/strings_welcome.xml b/app/src/main/res/values-pt-rBR/strings_welcome.xml
new file mode 100644
index 0000000..399e66d
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Bem-vindo
+ Primeira etapa do assistente
+ Segunda etapa do assistente
+ Última etapa do assistente
+
+
+ Bem-vindo ao AdAway!
+ O AdAway fornece dois métodos de bloqueio de anúncios. Escolha o que você gosta:
+
+ Root logo
+ Bloqueio baseado\nem root
+ Mais rápido
+ Economiza bateria
+ Requer acesso root
+
+ VPN logo
+ Bloqueio baseado\nem VPN
+ Mais lento
+ Executado em segundo plano
+ Maior compatibilidade
+
+ É obrigatório o acesso root
+ Não foi possível encontrar o binário su ou você não permitiu a permissão root do AdAway.\n\nIsso pode acontecer quando o dispositivo não está rooteado. Você pode encontrar informações sobre como fazer root no seu dispositivo em wiki.lineageos.org ou em outros sites Android.
+
+ Pró
+ Contra
+
+
+ Sincronização concluída
+ Erro durante a sincronização
+
+ Sincronizando
+ Sincronizado
+ O AdAway baixa redes de anúncios para bloquear de fontes on-line. Você pode personalizá-los posteriormente nas configurações.
+ Repetir sincronização
+ Falha ao sincronizar: %1$s Repetir agora?
+ Ele pode enviar notificações para exibir o status e o controle do bloqueio de anúncios e para notificar sobre atualizações disponíveis do aplicativo (algumas por ano). Ative-as se quiser se manter atualizado.
+
+
+ Suporte
+ Ajude-me!
+ O AdAway é um aplicativo gratuito e de código aberto que desenvolvo em meu tempo livre. Se você gostar dele, fique à vontade para mostrar seu apoio:
+ Doar pelo PayPal
+ Você gosta de bugs? Nem eu.
+ Ativar telemetria para me enviar relatórios de falhas
+
+
+ Voltar
+ Próximo
+ Terminar
+
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
new file mode 100644
index 0000000..7feb0fd
--- /dev/null
+++ b/app/src/main/res/values-pt/strings.xml
@@ -0,0 +1,267 @@
+
+
+
+ Sair
+ Fechar
+ Sim
+ Não
+ Adicionar
+ Cancelar
+ Guardar
+ Ajuda
+
+
+ Bem-vindo!
+ O AdAway é um projeto de programa de código aberto e gratuito que bloqueia publicidade. Este procura endereços de redes de anúncios para os bloquear no seu dispositivo.\nQuer saber mais? Consulte a ajuda abaixo!
+ Mostrar mais ajuda
+ Estado da atualização
+ Todos os ficheiros de hospedeiros das fontes definidas foram transferidos, unidos com as suas próprias listas e instalados como um único ficheiro de hospedeiros no seu sistema.
+ Ativar bloqueio de anúncios
+ Desativar bloqueio de anúncios
+ Servidor da Web
+ Em execução
+ Parado
+ Ligar ou desligar um servidor da Web no hospedeiro local para responder a pedidos de nomes de hospedeiro bloqueados.
+ Ativar servidor da Web
+ Desativar servidor da Web
+ VPN
+ Em funcionamento
+ Parado
+ Iniciar ou parar a VPN para filtrar os pedidos.
+ Ativar VPN
+ Desativar VPN
+
+
+ Editar entrada
+ Aplicar
+ Editar
+ Eliminar
+
+
+ A importar…
+ Cópia de segurança importada com sucesso do armazenamento externo.
+ A importação da cópia de segurança falhou. O formato é o correto? Verifique o logcat para mais informações.
+ A exportar…
+ Backup sucessivamente exportado para o ficheiro %sno seu armazenamento interno.
+ Falha ao exportar o arquivo de backup %s.
+
+
+ O ficheiro \'\'hosts\'\'
+ O ficheiro \'\'hosts\'\' é um ficheiro do sistema que mapeia os nomes de hospedeiro para os endereços de IP. É um ficheiro de texto simples cuja configuração é gerida pela AdAway. Aqui tem as suas poucas primeiras linhas:
+ A carregar o conteúdo do ficheiro \'\'hosts\'\'…
+ Abrir o ficheiro \'\'hosts\'\'
+
+
+ A procurar atualização
+ A verificar %s fonte por atualizações
+ A obter fontes
+ A baixar a fonte %s
+ A ler a fonte %s
+ A analisar a fonte %s
+ A sincronizar a database de regras
+ A reverter para o ficheiro hosts padrão
+ Ficheiro hosts padrão restaurado
+ A criar um ficheiro de hosts padrão
+ Atualização disponível
+ Novos ficheiros de hosts disponíveis
+ Nenhuma atualização das fontes encontradas
+ Sem ligação à internet
+ Sem ligação à internet disponível
+ Fontes indisponíveis
+ Impossível aceder às fontes de hosts!
+ Acesso root negado
+ Permitir acesso root na sua aplicação de root
+ Algo correu mal
+ Verifique logcat para mais detalhes
+ Ativado
+ Os ficheiros de hosts mais recentes estão ativos
+ Desativado
+ Instalado o ficheiro de hosts padrão.
+ Aplicar últimas fontes.
+ A criar um ficheiro hosts novo
+ A copiar o novo ficheiro hosts
+ A verificar o ficheiro hosts copiado
+ Ficheiro hosts atualizado com sucesso
+ Configuração da VPN atualizada com sucesso
+ As suas configurações foram alteradas.
+É necessário aplicá-las.
+ Aplicar
+ A aplicar nova configuração…
+ Falha ao aplicar nova configuração
+
+
+ O symlink do destino ficheiro hosts está em falta.
+ Uma ligação simbólica do seu destino para /system/etc/hosts não existe ou está incorreta! O AdAway não funcionará se não estiver a apontar para o ficheiro correto.\n\nPretende tentar criar uma ligação simbólica?
+ Ligação simbólica em falta
+ Não existe espaço suficiente na partição!\nExperimente alterar o ficheiro de hosts de destino nas preferências para /data/data/hosts.
+ Espaço insuficiente
+ Impossível ler o ficheiro descarregado.
+ Falha no ficheiro privado
+ Falha ao remontar a partição em modo leitura/escrita!
+ Falha ao remontar
+ Falha ao copiar o ficheiro hosts
+ Falha ao copiar o ficheiro de hosts!
+ Falha ao copiar
+ As fontes de hosts foram aplicadas
+ Aplicado com sucesso
+ Aplicado com sucesso.\nPoderá ser necessário reiniciar o Android para as alterações surtirem efeito.\n\nPretende reiniciar?\n(Para prevenir a perda de dados, certifique-se de que nenhuma aplicação está a utilizar o cartão SD neste momento!)
+ A ligação simbólica foi criada com sucesso.\nPoderá ser necessário reiniciar o Android para que as alterações surtem efeito.\n\nPretende reiniciar?\n(Para prevenir a perda de dados, certifique-se de que nenhuma aplicação está a utilizar o cartão SD neste momento!)
+ Ligação simbólica criada com sucesso
+ O link simbólico não pôde ser criado pelo Android.\nIsso acontece principalmente devido a um \'recurso\' chamado S-ON nos telefones HTC!\n\nUma solução é inicializar o telemóvel no modo de recuperação e criar o link simbólico com \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nSe isso não funcionar, procure na Internet por S-OFF e o seu telemóvel.
+ Falha ao criar a ligação simbólica
+ Para mais informações, por favor, leia a ajuda.
+ Está definido no seu Android um proxy APN!\nO AdAway não funcionará de forma confiável quando estiver em redes móveis como o 3G. Pode desativar este proxy acedendo ao APN selecionado (na aplicação Definições: Rede & Internet -> Rede móvel -> Avançado -> Nomes de pontos de acesso) e remova o valor no campo de proxy.
+ Proxy de APN definido!
+ A ligação à internet não está a funcionar.
+ Sem ligação
+ A descarregar…
+ A aplicar…
+ A aplicar listas negra e branca
+ A analisar e fundir os ficheiros de hosts
+ A construir o ficheiro de hosts
+ A aplicar o ficheiro de hosts
+ Falha ao aplicar o novo ficheiro hosts
+ Falha ao aplicar o ficheiro de hosts no sistema!\nExperimente alterar o ficheiro de hosts de destino nas preferências para /data/data/hosts.
+ Falha ao aplicar
+ Por favor verifique a sua app de gestão root para certificar-se que o acesso root foi concedido.
+ Reverteu o ficheiro de hosts predefinido.\nPoderá ser necessário reiniciar o Android para que as alterações surtem efeito.\n\nPretende reiniciar?\n(Para prevenir a perda de dados, certifique-se de que nenhuma aplicação está a utilizar o cartão SD neste momento!)
+ Revertido com sucesso
+ Incapaz de reverter o ficheiro hosts
+ Falha ao reverter por motivos desconhecidos.
+ Falha ao reverter!
+ Nenhuma das suas fontes de hosts ativadas está alcançável! Está corretamente ligado à internet?
+ Falha ao descarregar
+ Falha para escrever novo ficheiro hosts o privado.
+ Impossível criar ficheiro privado.
+ Falha ao criar ficheiro privado
+ Ativou o modo \"systemless\".\nPoderá ser necessário reiniciar o Android para que as alterações surtemefeito.\n\nPretende reiniciar?\n(Para impedir a perda de dados, certifique-se de que nenhuma aplicação esteja a utilizar o cartão SD neste momento!)
+ Ativação bem-sucedida
+ Desativou o modo \"systemless\".\nPoderá ser necessário reiniciar o Android para que as alterações surtam efeito.\n\nPretende reiniciar?\n(Para impedir a perda de dados, certifique-se de que nenhuma aplicação esteja a utilizar o cartão de memória neste momento!)
+ Desativação bem-sucedida
+ Falha para habilitar vpn bloquadora de anúncios.
+ Falha ao desativar o bloqueio de anúncios vpn.
+ Ativar systemless hosts
+ Ativar opção systemless hosts a partir do gestor Magisk. Nas definições do Magisk, ativar a opção Systemless hosts e de seguida reinicie o dispositivo.
+ Desativar módulo hosts do Magisk
+ Desativar opção systemless hosts no Magisk manager. Na lista de módulos, desinstalar o módulo Systemless hosts e de seguida reiniciar o dispositivo.
+
+
+ Introduza um URL para o ficheiro de hosts:
+ Este hostname não é válido!
+ Hostname incorretamente formatado
+ Este IP não é válido!
+ IP incorretamente formatado
+ Nunca reiniciar e não mostrar de novo esta mensagem.
+ A carregar…
+
+
+ Atualizar
+ Adicionar
+ Ajuda
+ Importar cópia de segurança
+ Exportar cópia de segurança
+
+
+ S-ON/S-OFF
+ Perguntas frequentes
+ Problemas
+
+
+ Adware
+ Aqui pode encontrar adwares instalados, aplicações indesejadas que não podem ser bloqueadas pelo AdAway. Estas aplicações usam, por exemplo, notificações do Airpush que aparecem mesmo quando a aplicação não está em execução e até podem alterar o seu toque de chamada. A única contramedida disponível é desinstalar essas aplicações clicando nos itens da lista.
+ A pesquisar…
+ Não foi encontrado o Adware!
+
+
+ Bloqueador de anúncios
+ Nenhum editor de texto instalado
+ Não foi encontrado nenhum editor de texto para abrir o ficheiro de hosts. Pode instalar o Jota ou outros editores de texto para solucionar isto.\n\nPretende instalar o Jota?
+ Nenhum gestor de ficheiros instalado
+ Não foi encontrado nenhum gestor de ficheiros para abrir ficheiros. Pode instalar o OI File Manager ou outros gestores de ficheiros para solucionar isto.\n\nPretende instalar o OI File Manager?
+
+
+ Tcpdump
+ Tcpdump é uma ferramenta para monitorizar os pedidos de DNS e guardá-los num ficheiro de registo. Pode iniciá-la em segundo plano, executar aplicações que exibem anúncios, e posteriormente analisar os pedidos de DNS utilizando o ficheiro de registo. Depois poderão ser adicionados à lista negra possíveis servidores de anúncios.
+ Desativar monitorização
+ Ativar monitorização
+ Mostrar resultados
+ Ordenar domínios
+ Limpar registo
+ Adicionar entrada à lista negra
+ Adicionar entrada à lista branca
+ Adicionar entrada à lista de redirecionamentos
+
+ Editar valor da preferência do texto
+ Abrir menu
+ Fechar menu
+
+
+
+ Início
+ Fontes de hosts
+ As suas listas
+ Abrir ficheiro de hosts
+ Registar pedidos de DNS
+ Procurar adware
+ Preferências
+ Ajuda
+
+
+
+
+ Pedidos de DNS
+ As suas listas
+ Preferências
+
+
+ Instalado à%1$satrás
+ Atualizado para %1$s
+ Precisa de atualização para %1$s
+ Última atualização há %1$s
+ Estado de atualização desconhecido
+ Desativado
+ alguns minutos
+
+ %d minuto
+ %d minutos
+ %d minutos
+
+
+ %d hora
+ %d horas
+ %d horas
+
+
+ %d dia
+ %d dias
+ %d dias
+
+
+ %d mês
+ %d meses
+ %d meses
+
+
+
+ Host copiado para a área de transferências
+
+
+ A começar
+ Ativo
+ a parar
+ espere por internet
+ a reconnectar
+ Erro de conexão
+ pausado
+ parado
+ Vpn bloqueadora de anúncios%1$s
+ pausar
+ continuar
+
+
+ Permissions do AdAway.
+ Permitir a interação com o AdAway.
+ Enviar comandos para o AdAway
+ Permitir mandar comandos para o AdAway como habilitar or desabilitar o o bloqueio de anúncios no sistema
+
+
diff --git a/app/src/main/res/values-pt/strings_app.xml b/app/src/main/res/values-pt/strings_app.xml
new file mode 100644
index 0000000..610f42f
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Bloqueador de anúncios de código aberto
+ Logótipo do AdAway
+
diff --git a/app/src/main/res/values-pt/strings_errors.xml b/app/src/main/res/values-pt/strings_errors.xml
new file mode 100644
index 0000000..f087011
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Sem ligação à Internet
+ Incapaz de estabelecer ligação à Internet. Verifique a conexão do seu dispositivo.
+ Falha no descarregamento da fonte de hosts
+ Nenhuma das fontes de hosts ativadas está acessível. Verifique se está corretamente conectado à Internet.
+
+ Falha ao criar ficheiro privado
+ Não foi possível criar um ficheiro privado para construir uma nova fonte de hosts. Verifique o espaço livre disponível no seu dispositivo.
+ Espaço insuficiente
+ Incapaz de copiar o ficheiro hosts para a partição de sistema. Verifique se o módulo fora de sistema do Magisk está ativado e reinicie.
+ Falha ao instalar um novo ficheiro hosts
+ Incapaz de copiar o ficheiro hosts para a partição /system. Verifique se o módulo fora de sistema do Magisk está ativado e reinicie.
+ Falha ao reverter o ficheiro hosts
+ Incapaz de restaurar a configuração predefinida do ficheiro hosts.
+
+ Falha ao ativar VPN de bloqueio de anúncios.
+ Verifique a configuração da sua VPN para autorizar a VPN da aplicação a iniciar.
+ Falha ao desativar VPN de bloqueio de anúncios.
+ Verifique a configuração da sua VPN para a desativar manualmente.
+
diff --git a/app/src/main/res/values-pt/strings_home.xml b/app/src/main/res/values-pt/strings_home.xml
new file mode 100644
index 0000000..41e9a01
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_home.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ Bloqueado
+ Permitido
+ Redirecionado
+
+
+
+ %d fonte atualizada
+ %d fontes atualizadas
+ %d fontes atualizadas
+
+
+ %d fonte desatualizada
+ %d fontes desatualizadas
+ %d fontes desatualizadas
+
+ Verificar atualizações junto dos hospedeiros
+ Atualizar hospedeiros
+
+
+ Mostrar registo de pedidos DNS
+
+
+ Mostrar ajuda/e dicas
+
+
+ Abrir página do GitHub
+
+
+ Apoiar o projeto
+
+
+ Projeto no GitHub
+ Preferências
+
+
+ Abrir painel de navegação
+ Parar/retomar bloqueio de publicidade
+ Atualizar domínios bloqueados
+ Mostrar domínios pedidos
+
+
+ Para mais informação, por favor, leia a Ajuda.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pt/strings_hosts.xml b/app/src/main/res/values-pt/strings_hosts.xml
new file mode 100644
index 0000000..a8bc538
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Fontes de hosts
+
+ Lista do utilizador
+ Hosts oficiais do AdAway
+ Hosts unificados de StevenBlack
+ Hosts de listas de bloqueio de Pete Lowe
+
+ não disponível
+ %s hosts
+
+ Adicionar fonte
+ Editar fonte
+ URL: (um recurso https:// ou file://)
+ O URL fonte de hosts
+
diff --git a/app/src/main/res/values-pt/strings_lists.xml b/app/src/main/res/values-pt/strings_lists.xml
new file mode 100644
index 0000000..e6861e3
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ As suas listas
+ Adicionar host
+
+ Bloqueado
+ Permitido
+ Redirecionado
+
+ Filtrar hosts
+ Pesquisar nome do host…
+ Alternar fontes
+
+ Adicionar host à lista negra
+ Adicionar host à lista branca
+ Adicionar redirecionamento de host
+ Editar lista negra de hosts
+ Editar lista branca de hosts
+ Editar redirecionamento
+ Hostname:
+ O URL fonte de hosts
+ (São permitidos carateres de substituição * e ?)
+ IP (IPv4 ou IPv6):
+
diff --git a/app/src/main/res/values-pt/strings_log.xml b/app/src/main/res/values-pt/strings_log.xml
new file mode 100644
index 0000000..1b2f3b6
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Ativar gravação de registo
+ Pressione \"Gravar\" para começar a registar os pedidos, explorar a Web ou utilize aplicações, e depois volte ou deslize para atualizar os registos.
+ \n\nOs pedidos bloqueados não serão registados. Desative primeiro o bloqueio de anúncios se também os quiser registar.
+
+ Ordenar alfabeticamente
+ Ordenação de domínio de nível superior
+
+ Domínio de redirecionamento
+
diff --git a/app/src/main/res/values-pt/strings_notification.xml b/app/src/main/res/values-pt/strings_notification.xml
new file mode 100644
index 0000000..39c6a29
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Atualizações
+ Notificações de nova atualização
+ Atualização disponível
+ Novos ficheiros de hosts disponíveis para descarregamento
+ Atualização da aplicação disponível
+ Uma versão nova do AdAway está disponível para descarregamento.
+
+ VPN
+ Notificações recorrentes da VPN
+
diff --git a/app/src/main/res/values-pt/strings_prefs_backup_restore.xml b/app/src/main/res/values-pt/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..425f0f4
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Backup e restauro
+ Backup
+ Fazer backup para armazenamento externo das regras de bloqueio
+ Restaurar
+ Restaurar regras de bloqueio do ficheiro de backup
+
diff --git a/app/src/main/res/values-pt/strings_prefs_main.xml b/app/src/main/res/values-pt/strings_prefs_main.xml
new file mode 100644
index 0000000..39a1901
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferências
+
+ Geral
+ Tema escuro
+
+ Claro
+ Escuro
+ Pré-definição do sistema
+
+ Atualizações automáticas
+
+ Bloqueio de anúncios
+ Bloqueador de anúncios baseado em acesso root
+ Bloqueador de anúncios baseado em VPN
+ Ativar IPv6
+ Guardar cópia de segurança / restaurar regras de bloqueio
+
+ Depuração
+ Enviar relatórios de quebras
+ Enviar relatórios para o Sentry (sentry.io)
+ Não suportado nesta compilação
+ Registo verboso
+ Reinício da aplicação necessário para entrada em efeito
+
diff --git a/app/src/main/res/values-pt/strings_prefs_root.xml b/app/src/main/res/values-pt/strings_prefs_root.xml
new file mode 100644
index 0000000..be4d95e
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Bloqueador de anúncios baseado em acesso root
+
+ Instalar hosts
+ Abrir ficheiro de hosts
+ Ficheiro de hosts de destino
+ Lê a Ajuda antes de usar esta funcionalidade
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Destino personalizado
+
+ Localização do destino personalizado
+ Ocultar diálogo de reinício após aplicação
+
+ Redirecionamento
+ Definir para onde redirecionar hosts bloqueados
+ Configurar redirecionamento de IPv4
+ Configurar redirecionamento de IPv6
+ Redirecionamento inválido
+
+ Servidor web local
+ O servidor web local escuta os endereços IP locais para responder a pedidos de hostnames bloqueados. Isto poderá ajudar com o congelamento de aplicações com conexões bloqueadas.
+ Ativar servidor web
+ Testar servidor web
+ Instalar certificado auto-assinado
+ Instalação manual de certificado
+ A partir do Android 11 (R), a aplicação não pode instalar automaticamente a autoridade de certificação (CA).\n\nVai às configurações de \"Segurança\", \"Encriptação e credenciais\" e, de seguida, \"Instalar um certificado\". A partir daí, escolhe \"Certificado CA\" e seleciona o ficheiro de certificado recém-exportado.
+ Abre as configurações de \"Segurança\"
+ A verificar…
+ Não está em execução
+ Em execução, mas o certificado não está instalado
+ Em execução, com certificado instalado
+ Substituir espaço vazio do anúncio pelo ícone da aplicação
+
diff --git a/app/src/main/res/values-pt/strings_prefs_update.xml b/app/src/main/res/values-pt/strings_prefs_update.xml
new file mode 100644
index 0000000..f76c0f8
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Atualizações
+ As notificações estão desativadas
+ As notificações da aplicação não serão exibidas. Toca aqui para ativá-las.
+
+ Atualizações da aplicação
+ Verificar atualizações ao iniciar
+ Verificar atualizações diariamente
+ Incluir versões beta
+
+ Atualização de hosts
+ Verificar atualizações ao iniciar
+ Verificar atualizações periodicamente
+ Sincronizar ao atualizar
+ Sincronizar apenas em redes sem limites de tráfego
+
diff --git a/app/src/main/res/values-pt/strings_prefs_vpn.xml b/app/src/main/res/values-pt/strings_prefs_vpn.xml
new file mode 100644
index 0000000..c3d0a01
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Bloqueador de anúncios baseado em VPN
+
+ Ativar ao iniciar
+ Monitorizar conexão
+ Verificar periodicamente o estado da rede para reiniciar a VPN em cao de desconexão.
+
+ Aplicações excluídas
+ Configurar quais aplicações não deverão usar a VPN para que nenhuma conexão seja bloqueada.
+ Excluir aplicações de sistema
+
+ Nenhuma
+ Todas, exceto navegadores
+ Todas
+
+ Excluir aplicações de utilizador
+
+
+ Aplicações excluídas
+ Selecionar tudo
+ De-selecionar tudo
+ Ícone da aplicação
+
diff --git a/app/src/main/res/values-pt/strings_source_edit.xml b/app/src/main/res/values-pt/strings_source_edit.xml
new file mode 100644
index 0000000..887b949
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Editar fonte
+ Adicionar fonte
+
+ Etiqueta
+ Etiqueta necessária
+ Tipo
+ URL
+ Ficheiro
+ Localização
+ https://
+ Localização necessária
+ Carrega em Ficheiro para selecionar o ficheiro fonte
+ Localização inválida
+ Formato da lista
+ Bloquear
+ Permitir
+ Aplicar hosts redirecionados
+ Permitir hosts redirecionados poderá causar problemas de segurança. Usa esta definição apenas em fontes confiáveis, pois estas poderão redirecionar tráfego sensível para qualquer servidor que queiram.
+
diff --git a/app/src/main/res/values-pt/strings_support.xml b/app/src/main/res/values-pt/strings_support.xml
new file mode 100644
index 0000000..f07a5ae
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Suporte
+ Torne-se patrocinador
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pt/strings_update.xml b/app/src/main/res/values-pt/strings_update.xml
new file mode 100644
index 0000000..75922fb
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Atualização do AdAway
+
+ Atualização disponível!
+
+
+ Está actualizado
+ Atualização disponível
+ Atualizando o AdAway
+ Atualizar agora
+ %1$s / %2$s
+ Últimas alterações
+ Novidades
+ Apoie o desenvolvimento
+ Doar
+ Patrocinador
+
+
+ Descarregando a última versão do AdAway
+
diff --git a/app/src/main/res/values-pt/strings_welcome.xml b/app/src/main/res/values-pt/strings_welcome.xml
new file mode 100644
index 0000000..b2adc6c
--- /dev/null
+++ b/app/src/main/res/values-pt/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Bem-vindo!
+ Primeira etapa do assistente
+ Segunda etapa do assistente
+ Última etapa do assistente
+
+
+ Bem-vindo ao AdAway!
+ O AdAway oferece dois métodos de bloqueio de anúncios. Escolha o que gostar:
+
+ Logótipo raiz
+ Bloqueio baseado\nem raiz
+ Mais rápido
+ Poupa bateria
+ Requer acesso raiz
+
+ Logótipo VPN
+ Bloqueio baseado\nem VPN
+ Mais lento
+ Funciona em segundo plano
+ Compatibilidade
+
+ É necessário um sistema Android com acesso à raiz
+ Ou o binário SU não foi encontrado ou não concedeste permissão de root ao AdAway.\n\nIsto pode acontecer quando o dispositivo não tem acesso root.\nPodes encontrar informação sobre como obter acesso root no dispositivo em wiki.lineageos.org ou noutros websites sobre Android.
+
+ Prós
+ Contra
+
+
+ Sincronização concluída
+ Erro durante sincronização
+
+ A sincronizar
+ Sincronizado!
+ O AdAway transfere redes de anúncios para bloquear das fontes \'\'on-line\'\'. Pode personalizá-las mais tarde nas definições.
+ Tentar sincronização novamente
+ Falha ao sincronizar: %1$s Tentar novamente?
+ Pode enviar notificações para exibir o estado e o controle do bloqueio de anúncios e notificar sobre atualizações disponíveis para a aplicação (algumas por ano). Ativa-as se quiseres manter-te atualizado(a).
+
+
+ Apoio
+ Apoie-me!
+ O AdAway é uma aplicação de código aberto e gratuito que eu desenvolvo no meu tempo livre. Se aprecia a aplicação, fique à vontade para mostrar o seu apoio:
+ Doar com PayPal
+ Gostas de erros? Eu também não.
+ Ative a telemetria para enviar-me os relatórios de erros.
+
+
+ Anterior
+ Seguinte
+ Terminar
+
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
new file mode 100644
index 0000000..851d39e
--- /dev/null
+++ b/app/src/main/res/values-ro/strings.xml
@@ -0,0 +1,266 @@
+
+
+
+ Ieșire
+ Închide
+ Da
+ Nu
+ Adaugă
+ Anulează
+ Salvează
+ Ajutor
+
+
+ Bine ați venit!
+ AdAway este un software gratuit cu sursă deschisă proiectat pentru blocarea anunțurilor. Acesta preia adresele reclamelor pentru a le restricționa pe dispozitivul tău.\nVrei să aflii mai multe? Vezi secțiunea de ajutor de mai jos!
+ Afișează mai multe sfaturi
+ Starea actualizărilor
+ Toate fișierele \"host\" din sursa definită vor fi descărcate, combinate cu lista personală și apoi instalate ca un fișier \"hosts\" unitar.
+ Activare blocare reclame
+ Dezactivare blocare reclame
+ Server web
+ Pornit
+ Oprit
+ Pornire sau oprire server web local pentru a răspunde cererilor pe domeniile restricționate.
+ Activează server web
+ Dezactivează server web
+ VPN
+ Rulează
+ Oprit
+ Pornire sau oprire VPN pentru filtrare cereri.
+ Pornire VPN
+ Oprire VPN
+
+
+ Editare intrare
+ Aplică
+ Editare
+ Ștergere
+
+
+ Importă…
+ Copie de rezervă importată cu succes din stocarea externă.
+ Imposibil de importat copia de rezervă. Ați verificat corectitudinea formatului? Analizează logcat-ul pentru mai multe detalii.
+ Exportă…
+ Exportul s-a realizat cu succes, fișierul %s a fost scris în memoria externă.
+ Exportul a eșuat, fișierul %s nu a fost scris.
+
+
+ Fișierul \'hosts\'
+ Fișierul hosts este un fișier de sistem care mapează numele serverelor la adrese IP. Este pur și simplu un fișier text a cărui configurație este gestionată de către AdAway. Iată câteva linii din începutul fișierului:
+ Încărcare conținut din fișierul hosts…
+ Deschidere fișier hosts
+
+
+ Verificare pentru actualizări
+ Verificare sursă %s pentru actualizări
+ Se citesc surse
+ Descărcare sursă %s
+ Se citește sursa %s
+ Analizare sursă %s
+ Sincronizare bază de date cu reguli
+ Restaurare valori implicite pentru fișierul hosts
+ Valorile implicite pentru fișierul hosts au fost restaurate
+ Sistemul creaza fisiere \"hosts\" standard.
+ Sursă actualizată disponibilă
+ Noi fisiere \"host\" sunt disponibile
+ Nu au fost găsite actualizări pentru surse
+ Nu există conexiune internet
+ Nu este disponibilă o conexiune internet
+ Surse indisponibile
+ N-au fost gasite surse pentru fisierele \"hosts\"
+ Acces root refuzat
+ Permiteți mai întâi accesul root din aplicația de rooting
+ Ceva nu a funcționat corespunzător
+ Analizați logcat pentru mai multe detalii
+ Activat
+ Cele mai noi versiuni ale fisierelor \"host\" au fost activate
+ Dezactivat
+ Fișier implicit de hosts instalat
+ Aplicați ultimele actualizări ale surselor
+ Creare fișier hosts nou
+ Copiere fișier hosts nou
+ Verificare copie fișier hosts
+ Fișierul hosts a fost actualizat cu succes
+ Configurația VPN a fost actualizată cu succes
+ Configurația a fost modificată. Modificările necesită aplicare.
+ Aplică
+ Aplicare configurație nouă…
+ Imposibil de aplicat noua configurație.
+
+
+ Legătura simbolică către fișierul hosts lipsește
+ Legătura simbolică de la ținta dumneavoastră către /system/etc/hosts nu există sau este incorectă! AdAway nu va funcționa dacă nu este direcționat către fișierul corect.\n\nVreți să încercați să creați o nouă legătură simbolică?
+ Legătura simbolică lipsește
+ Spațiu insuficient pe partiție! \nÎncercați să schimbați din setări fișierul hosts către /data/data/hosts.
+ Spațiu insuficient
+ Fișierul descărcat nu poate fi citit
+ Lansare nereusita a fisierul cu atribute speciale (private)
+ Reactivarea partiției pentru citire/scriere nereușită!
+ Remontare partiție nereușită
+ Imposibil de copiat fișierul hosts
+ Copierea fișierelor \"hosts\" nereușită!
+ Copiere nereușită
+ Surse aplicate pe hosts
+ Aplicare reușită
+ Aplicarea modificărilor nu a reușit.\nPoate fi necesară repornirea Android pentru ca modificările să aibă efect.\n\nContinuați cu repornirea?\n(Pentru a preveni pierderi de date asigurați-vă că nicio aplicație nu utilizează stocarea SD în prezent!)
+ Legătura simbolică a fost creată cu succes.\nPoate fi necesară repornirea Android pentru ca modificările să aibă efect.\n\nContinuați cu repornirea?\n(Pentru a preveni pierderi de date asigurați-vă că nicio aplicație nu utilizează stocarea SD în prezent!)
+ Legătura simbolică a fost creată cu succes
+ Legătura simbolică nu a putut fi creată de către Android.\nAcest lucru se întâmplă de obicei datorită \'funcției\' S-ON pe dispozitivele HTC!\n\nO soluție ar putea fi repornirea în modul de recuperare și realizarea arborelui legăturii simbolice de acolo prin \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nDacă nici această soluție nu funcționează căutați pe Internet despre S-OFF pentru dispozitivul curent.
+ Crearea legăturii simbolice a eșuat
+ Citește secțiunea \"Ajutor\" pentru mai multe informații.
+ Un proxy de la furnizorul mobil de tip APN este activat pe Android!nAdAway nu va funcționa corespunzător când se află pe rețele de date mobile 3G/4G/5G. Poți dezactiva acel proxy din lista de APN (Aplicația de Setări: Conexiuni & Internet -> Rețele Mobile -> Avansat->Nume puncte de acces) prin ștergea valorii introduse în câmpul de proxy.
+ Punctul de acces APN proxy a fost setat!
+ Conexiunea la Internet nu funcționează.
+ Nu există conexiune!
+ Descărcare…
+ Aplicare modificări…
+ Sistemul aplică atributele listelor permise și restricționate
+ Analizează și combină nodurile în fișierul hosts
+ Sistemul generează fișierul hosts
+ Sistemul aplică fișierul hosts
+ Imposibil de aplicat noul fișier hosts.
+ Aplicarea fișierului hosts pe sistemul dumneavoastră a eșuat!\nÎncercați să schimbați fișierul hosts țintă din preferințe în /data/data/hosts.
+ Aplicare nereușită
+ Verifică te rog aplicația de rooting pentru asigurarea faptului că accesul este permis acestei aplicații.
+ A fost restaurat foșierul hosts inițial.\nPoate fi necesară repornirea Android pentru ca modificările să aibă efect.\n\nContinuați cu repornirea?\n(Pentru a preveni pierderi de date asigurați-vă că nicio aplicație nu utilizează stocarea SD în prezent!)
+ Restaurare reușită
+ Imposibil de restaurat fișierul hosts la starea precedentă
+ Restaurare nereușită din cauze necunoscute.
+ Restaurare nereușită!
+ Nici una din sursele active pentru fisierele \"hosts\" nu pot fi accesate! Exista conexiune internet?
+ Descărcare nereușită
+ Imposibil de scris noul fișier hosts cu atribut privat
+ Fisierul cu atribute speciale nu poate fi creat
+ Incercare nereusita de creeare a fisierului cu atribute speciale.
+ Ați activat modul systemless.\nPoate fi necesară repornirea Android pentru ca modificările să aibă efect.\n\nContinuați cu repornirea?\n(Pentru a preveni pierderi de date asigurați-vă că nicio aplicație nu utilizează stocarea SD în prezent!)
+ Activarea a fost reușită
+ Ați dezactivat modul systemless.\nPoate fi necesară repornirea Android pentru ca modificările să aibă efect.\n\nContinuați cu repornirea?\n(Pentru a preveni pierderi de date asigurați-vă că nicio aplicație nu utilizează stocarea SD în prezent!)
+ Dezactivarea a fost reușită
+ Imposibil de activat VPN pentru îndepărtarea reclamelor.
+ Imposibil de dezactivat VPN pentru îndepărtarea reclamelor.
+ Activare modul Magisk pentru hosts
+ Activați funcția de hosting fără suport de sistem din Magisk manager. Din setările managerului, activați Systemless hosts apoi reporniți dispozitivul.
+ Dezactivare modul Magisk pentru hosts
+ Dezactivați funcția de hosting fără suport de sistem din Magisk manager. Din lista de module a managerului, dezinstalați modulul Systemless hosts apoi reporniți dispozitivul.
+
+
+ Adăugare adresă (URL) la fișierul \'hosts\':
+ Nume invalid pentru fisierul \"host\"
+ Hostname formatat incorect
+ IP incorect!
+ IP formatat incorect
+ Nu reporni și nu mă mai întreba data viitoare!
+ Se încarcă…
+
+
+ Regenerare
+ Adaugă
+ Ajutor
+ Importare fișier de rezervă
+ Exportare fișier de rezervă
+
+
+ S-ON/S-OFF
+ Listă cu întrebări frecvente
+ Probleme
+
+
+ Aplicație cu reclame
+ Aici se regăsesc aplicațiile ce conțin reclame, aplicații pe care AdAway nu le poate bloca. Aceste aplicații pot de exemplu să trimită notificări chiar dacă aplicația nu rulează sau pot chiar modifica tonul de apel. Singura măsură împotriva acestora este dezinstalarea prin atingerea lor în această listă.
+ Scanare…
+ Niciun Adware găsit!
+
+
+ Program care blocheaza reclame
+ Nu există instalat un editor text
+ Niciun editor de text nu a fost găsit pentru a deschide fișierul hosts. Puteți instala Jota sau alte editoare text pentru a face asta.\n\nVreți să instalați Jota?
+ Nu exista un manager de fisiere instalat in sistem
+ Nici un manager de fișiere nu a putut fi găsit pentru a deschide fișiere. Puteți sa instalați OI File Manager sau alți manageri de fișiere pentru a face asta.\n\nVreți să instalați OI File Manager?
+
+
+ Dumping din TCP
+ Tcpdump este un utilitar care monitorizeaza si salveaza cererile DNS intr-un fisier dedicat (log). Pentru a-l folosi, lanseaza utilitarul in \"background\", lanseaza aplicatiile care contin reclame, dupa care poti analiza cererile DNS folosing fisierul generat.
+ Dezactivare monitorizare
+ Activare monitorizare
+ Afișare rezultate
+ Sortare domenii
+ Șterge log-uri
+ Adăugare intrare în lista neagră
+ Adăugare intrare în lista albă
+ Adăugare înregistrare pe lista de redirecționare
+
+ Editare valori text din fișierul de preferințe
+ Deschideți meniul
+ Închideți meniul
+
+
+
+ Home
+ Sursele (hosts)
+ Listele dvs.
+ Deschide fișierul \'hosts\'
+ Log DNS requests
+ Scan for adware
+ Preferințe
+ Ajutor
+
+
+
+
+ Solicitări pe DNS
+ Listele dvs.
+ Preferințe
+
+
+ Instalat de %1$s
+ Actualizat de %1$s
+ Actualizare necesară de acum %1$s
+ Actualizat acum %1$s
+ Status de actualizare necunoscut
+ Dezactivat
+ câteva minute
+
+ %d minut
+ %d minute
+ %d minute
+
+
+ %d oră
+ %d ore
+ %d ore
+
+
+ %d zi
+ %d zile
+ %d zile
+
+
+ %d lună
+ %d luni
+ %d luni
+
+
+
+ Adresă copiată
+
+
+ se activează
+ activ
+ se oprește
+ se așteaptă rețeaua
+ reconectare
+ eroare la reconectare
+ în pauză
+ oprit
+ VPN %1$s cu blocare de anunțuri
+ Pauză
+ Atingeți pentru continuare
+
+
+ Permisiuni AdAway
+ Permite interacțiune cu AdAway
+ Activare sau dezactivare sistem de blocare al reclamelor
+ Permite trimiterea comenzilor către AdAway, precum activarea/dezactivarea protecției globale AdAway.
+
+
diff --git a/app/src/main/res/values-ro/strings_app.xml b/app/src/main/res/values-ro/strings_app.xml
new file mode 100644
index 0000000..a270b18
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Software cu sursă deschisă pentru blocarea reclamelor
+ Logo AdAway
+
diff --git a/app/src/main/res/values-ro/strings_errors.xml b/app/src/main/res/values-ro/strings_errors.xml
new file mode 100644
index 0000000..2b942e9
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Nu există conexiune la internet
+ Imposibil de conectat la internet. Verificați conexiunea dispozitivului.
+ Imposibil de descărcat sursele hosts
+ Nici una din sursele active pentru fisierele \"hosts\" nu pot fi accesate! Exista conexiune internet?
+
+ Imposibil de creat fișierul hosts
+ Imposibil de creat fișierul hosts privat pentru generarea unei noi surse. Verifică dacă există spațiu de stocare disponibil pe dispozitiv.
+ Spațiu insuficient
+ Imposibil de copiat fișierul hosts pe partiția de sistem. Verifică dacă modulul Magisk systemless este activ apoi repornește dispozitivul.
+ Imposibil de instalat noul fișier hosts.
+ Imposibil de copiat fișierul hosts pe partiția de sistem. Verifică dacă modulul Magisk systemless este activ apoi repornește dispozitivul.
+ Imposibil de restaurat fișierul hosts la starea precedentă
+ Imposibil de restaurat fișierul hosts la starea inițială
+
+ Imposibil de activat VPN pentru îndepărtare reclame.
+ Verifică setările VPN și permite accesul aplicației pentru a porni serverul VPN.
+ Imposibil de dezactivat VPN pentru îndepărtare reclame.
+ Verifică setările pentru VPN și dezactivează-l manual.
+
diff --git a/app/src/main/res/values-ro/strings_home.xml b/app/src/main/res/values-ro/strings_home.xml
new file mode 100644
index 0000000..e8baa5e
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_home.xml
@@ -0,0 +1,42 @@
+
+
+
+
+ Blocate
+ Permise
+ Redirecționate
+
+
+
+ %d sursă la zi
+ %d surse la zi
+ %d surse la zi
+
+
+ %d sursă învechită
+ %d surse învechite
+ %d surse învechite
+
+
+
+ Arată ajutor
+
+
+ Deschide pagina GitHub
+
+
+ Susține proiectul
+
+
+ Setări
+
+
+ Deschide meniul cu aplicații
+ Pauză/reluare blocare anunțuri
+ Actualizează domeniile blocate
+ Afișează cererile domeniilor
+
+
+ Citește secțiunea de Ajutor pentru mai multe informații!
+
+
diff --git a/app/src/main/res/values-ro/strings_hosts.xml b/app/src/main/res/values-ro/strings_hosts.xml
new file mode 100644
index 0000000..949708c
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Sursele (hosts)
+
+ Listă personală
+ AdAway - surse oficiale
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ Indisponibil
+ %s surse
+
+ Adăugare sursă
+ Editare sursă
+ URL: (sursă https:// sau file://)
+ Sursa pt fisier \'host\'
+
diff --git a/app/src/main/res/values-ro/strings_lists.xml b/app/src/main/res/values-ro/strings_lists.xml
new file mode 100644
index 0000000..6279321
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_lists.xml
@@ -0,0 +1,23 @@
+
+
+ Liste personale
+
+ Blocate
+ Permise
+ Redirecționate
+
+ Filtrare domenii
+ Căutare nume domeniu…
+ Comutare surse
+
+ Adăugare domeniu în lista neagră
+ Adăugare domeniu în lista albă
+ Adăugare redirecționare
+ Editare domeniu blocat
+ Editare domeniu permis
+ Editare redirecționare
+ Nume domeniu:
+ URL domeniu
+ (Sunt permise caracterele generice * și ?)
+ Adresă IP (IPv4 sau IPv6):
+
diff --git a/app/src/main/res/values-ro/strings_log.xml b/app/src/main/res/values-ro/strings_log.xml
new file mode 100644
index 0000000..13eebc8
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ Sortare alfabetică
+ Sortare domeniu pe nivel superior
+
+ Redirecționare domeniu
+
diff --git a/app/src/main/res/values-ro/strings_notification.xml b/app/src/main/res/values-ro/strings_notification.xml
new file mode 100644
index 0000000..b21a528
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Actualizări
+ Notificări pentru actualizări noi
+ Sursele au actualizări disponibile
+ Sunt disponibile fișiere noi hosts pentru descărcare.
+ Este disponibilă o actualizare aplicației
+ O nouă versiune AdAway este disponibilă pentru descărcare.
+
+ VPN
+ Notificări în timpul rulării VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ro/strings_prefs_backup_restore.xml b/app/src/main/res/values-ro/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..596e6f4
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Salvare & restabilire
+ Salvare
+ Salvează pe memoria externă regulile de blocare
+ Restabilire
+ Restaurare reguli de blocare din fișier
+
diff --git a/app/src/main/res/values-ro/strings_prefs_main.xml b/app/src/main/res/values-ro/strings_prefs_main.xml
new file mode 100644
index 0000000..5700f07
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Setări
+
+ Generale
+ Temă întunecată
+
+ Luminoasă
+ Întunecată
+ Valoare implicită sistem
+
+ Actualizări automate
+
+ Blocarea reclamelor
+ Blocarea prin root a reclamelor
+ Blocarea prin server VPN a reclamelor
+ Activare suport IPv6
+ Salvare / restabilire copie de rezervă pentru regulile de blocare
+
+ Depanare
+ Trimitere raport erori
+ Raportează către Sentry (sentry.io)
+ Nesuportat în această versiune
+ Depanare cu jurnal în timp real
+ Este necesară repornirea aplicației pentru aplicare
+
diff --git a/app/src/main/res/values-ro/strings_prefs_root.xml b/app/src/main/res/values-ro/strings_prefs_root.xml
new file mode 100644
index 0000000..5d106a9
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_prefs_root.xml
@@ -0,0 +1,36 @@
+
+
+ Blocarea prin root\na reclamelor
+
+ Instalare hosts
+ Deschide fișierul hosts
+ Locația fișierului hosts
+ Citiți sfaturile de ajutor înainte de a utiliza funcția
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Locație personalizată
+
+ Locație personalizată hosts
+ Ascunde dialogul de repornire după aplicare
+
+ Redirecționare
+ Definire domeniu de redirecționare pentru domeniile blocate din hosts
+ Redirecționare IPv4
+ Redirecționare IPv6
+
+ Server web local
+ Serverul web local ascultă pe adresa IP locală pentru a răspunde cererilor făcute de către domeniile blocate. Poate fi de ajutor dacă aplicația nu funcționează fără conexiune.
+ Activare server web
+ Testare server web
+ Instalare certificat subsemnat
+ Instalare manuală certificat
+ Începând cu versiunea 11 a Android (R), nu se mai pot instala automat certificate de autoritate (CA).\n\nAccesați setarea \"Securitate\", \"Criptare și date de conectare\" apoi \"Instalați de pe stocare\". Alegeți \"Certificat CA\" și instalați certificatul exportat de aplicație.
+ Accesați setarea \"Securitate\" (Security)
+ Verificare…
+ Nu rulează
+ Rulează fără certificat instalat
+ Rulează cu certificat instalat
+ Înlocuiește spațiul liber destinat reclamelor cu pictograma aplicației
+
diff --git a/app/src/main/res/values-ro/strings_prefs_update.xml b/app/src/main/res/values-ro/strings_prefs_update.xml
new file mode 100644
index 0000000..0df5a9d
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Actualizări
+
+ Actualizări aplicație
+ Verificare actualizări la pornire
+ Verificare periodică
+ Include versiuni in stadiul \"beta\"
+
+ Actualizări fișier hosts
+ Verificare actualizări la pornire
+ Verificare periodică
+ Sincronizare la actualizare
+ Sincronizare doar pe rețea necontorizată
+
diff --git a/app/src/main/res/values-ro/strings_prefs_vpn.xml b/app/src/main/res/values-ro/strings_prefs_vpn.xml
new file mode 100644
index 0000000..9eac5df
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Blocarea prin server VPN a reclamelor
+
+ Activare la pornire
+ Monitorizare conexiune
+ Verificare periodică a stării internetului pentru repornirea VPN la deconectare
+
+ Aplicații excluse
+ Alegeți aplicațiile care nu ar trebui să fie blocate de către VPN deci conexiunea lor va rămâne nerestricționată
+ Excludere aplicații de sistem
+
+ Niciuna
+ Toate cu excepția navigatoarelor web
+ Toate
+
+ Excludere aplicații instalate de utilizator
+
+
+ Aplicații excluse
+ Selectare toate
+ Anulare selecție
+ Pictograma aplicației
+
diff --git a/app/src/main/res/values-ro/strings_support.xml b/app/src/main/res/values-ro/strings_support.xml
new file mode 100644
index 0000000..efbdf53
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Suport
+ Devino sponsor
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ro/strings_update.xml b/app/src/main/res/values-ro/strings_update.xml
new file mode 100644
index 0000000..16405f8
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_update.xml
@@ -0,0 +1,18 @@
+
+
+ Actualizare AdAway
+
+ Actualizare disponibilă!
+
+
+ Aveți ultimele actualizări
+ Actualizare disponibilă
+ AdAway se actualizează
+ Actualizează acum
+ %1$s / %2$s
+ Modificări recente:
+ Modificări:
+
+
+ Se descarcă ultima versiune a AdAway…
+
diff --git a/app/src/main/res/values-ro/strings_welcome.xml b/app/src/main/res/values-ro/strings_welcome.xml
new file mode 100644
index 0000000..5ddcfc9
--- /dev/null
+++ b/app/src/main/res/values-ro/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Bun venit
+ Configurator - primul pas
+ Configurator - Pasul 2
+ Configurator - utlimul pas
+
+
+ Bun venit la AdAway!
+ AdAway dispune de două metode pentru a bloca reclamele. Alege-o pe cea potrivită:
+
+ Logo rooting
+ Blocarea prin root\na reclamelor
+ Rapidă
+ Consum redus al bateriei
+ Acces root necesar
+
+ Logo VPN
+ Blocarea prin server VPN\na reclamelor
+ Lentă
+ Rulează în fundal
+ Compatibilitate
+
+ Necesită acces root pe Android
+ Este posibil ca fișierul binar SU să nu fie găsit sau nu ai acordat permisiunea de acces root pentru AdAway.\n\nAcest lucru se poate întâmpla dacă dispozitivul tău nu este root-at. Poți afla mai multe informații despre cum să obții acces root pe dispozitivul tău pe wiki.lineageos.org sau alte site-uri despre Android.
+
+ Pro
+ Contra
+
+
+ Sincronizare finalizată
+ Eroare în timpul sincronizării
+
+ Sincronizare
+ Sincronizat!
+ AdAway descarcă conținut online din serverele cu reclame pentru a le restricționa. Poți alege ulterior conținutul blocat din setări.
+ Reîncearcă sincronizarea
+ Imposibil de sincronizat: %1$s Reîncercați acum?
+
+
+ Suport
+ Susține-mă!
+ Este un program cu sursă deschisă. Îl programez în timpul meu liber.
+Dacă ți-a plăcut, îți poți arăta recunoștința astfel:
+ Donează pe PayPal
+ Îți plac erorile? Nici mie.
+ Activare serviciu de urmărire pentru trimiterea de rapoarte cu erori.
+
+
+ Înapoi
+ Următorul
+ Finalizare
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..dcd01b3
--- /dev/null
+++ b/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,290 @@
+
+
+
+ Выйти
+ Закрыть
+ Да
+ Нет
+ Добавить
+ Отменить
+ Сохранить
+ Помощь
+
+
+ Добро пожаловать!
+ AdAway — это бесплатное приложение с открытым исходным кодом для блокировки рекламы. Оно собирает адреса из рекламной сети и блокирует их на вашем устройстве.\nХотите узнать больше? Читайте справку!
+ Расширенная справка
+ Обновить статус
+ Все списки хостов загружаются из определенных источников, объединяются с вашими собственными списками и устанавливаются в вашу систему в виде единого файла hosts.
+ Вкл. блокировку рекламы
+ Откл. блокировку рекламы
+ Веб-сервер
+ Работает
+ Остановлено
+ Запуск или остановка веб-сервера в локальной системе для ответов на запросы на заблокированные хосты.
+ Включить веб-сервер
+ Отключить веб-сервер
+ VPN
+ Работает
+ Остановлено
+ Запустить или остановить VPN для фильтрации запросов.
+ Включить VPN
+ Отключить VPN
+
+
+ Редактировать запись
+ Применить
+ Изменить
+ Удалить
+
+
+ Импорт…
+ Резервная копия успешно импортирована из вашего внешнего хранилища.
+ Не удалось импортировать резервную копию. Возможно, её формат не верен? Проверьте logcat для подробностей.
+ Экспорт…
+ Резервная копия успешно экспортирована в файл \'%s\' в вашем внешнем хранилище.
+ Не удалось экспортировать файл резервной копии \'%s\'.
+
+
+ Файл hosts
+ Файл hosts — это системный файл, сопоставляющий имена узлов с IP-адресами. Это обычный текстовый файл, содержимое которого обрабатывается в AdAway. Вот несколько его первых строк:
+ Загружается содержимое файла hosts…
+ Открыть файл hosts
+
+
+ Проверка обновлений
+ Проверяем %s на наличие обновлений
+ Получение источников
+ Загрузка источника %s
+ Чтение источник %s
+ Обработка источника %s
+ Синхронизация правил базы данных
+ Восстановление стандартного файла hosts
+ Стандартный файл hosts восстановлен
+ Создание стандартного файла hosts
+ Доступно обновление источников
+ Доступны более новые списки хостов
+ Обновления источников не найдены
+ Подключение к Интернету отсутствует
+ Нет доступного подключения к интернету
+ Недоступные источники
+ Нет доступных источников хостов!
+ Доступ root был отклонён
+ Разрешите root-доступ из вашего приложения для root
+ Что-то пошло не так
+ Смотрите logcat для подробностей
+ Подключено
+ Используются свежие списки
+ Отключено
+ Установлен стандартный файл hosts
+ Применить свежие источники
+ Создание нового файла hosts
+ Копирование нового файла hosts
+ Проверка копии файла hosts
+ Файл hosts успешно обновлён
+ Конфигурация VPN успешно обновлена
+ Конфигурация изменена. Вам нужно применить её.
+ Применить
+ Применение новой конфигурации…
+ Не удалось применить новую конфигурацию.
+
+
+ Символическая ссылка на целевой файл hosts отсутствует
+ Символическая ссылка на ваш /system/etc/hosts не существует или неверна! AdAway не будет работать, если не указать правильный файл.\n\nВы хотите попробовать создать символическую ссылку?
+ Символическая ссылка отсутствует
+ Не хватает места на дисковом разделе!\nПопробуйте заменить путь к файлу hosts в настройках на /data/data/hosts.
+ Недостаточно места
+ Не получается прочитать загруженный файл
+ Сбой личного файла
+ Не получилось перемонтировать раздел в режим чтения/записи!
+ Перемонтирование не удалось
+ Не удалось скопировать файл hosts
+ Копирование файлов hosts не удалось
+ Копирование не удалось
+ Применены источники хостов
+ Применение прошло успешно
+ Применение прошло успешно.
+Возможно, потребуется перезагрузить Android, чтобы изменения вступили в силу.
+
+Вы хотите перегрузить Android?
+(Для предотвращения потери данных убедитесь, что никакие приложения в данный момент не используют карту памяти!)
+ Ссылка создана успешно.
+Возможно, потребуется перезагрузить Android, чтобы изменения вступили в силу.
+
+Вы хотите перегрузить Android?
+(Для предотвращения потери данных убедитесь, что никакие приложения в данный момент не используют карту памяти!)
+ Символическая ссылка создана успешно
+ Android не смог создать символическую ссылку.\nВозможно, это из-за \'функции\' телефонов HTC, называемой S-ON!\n\nРешение состоит в том, чтобы загрузить телефон в режим восстановления и создать там символическую ссылку при помощи \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nЕсли это не поможет, то надо искать информацию в интернете по S-OFF и вашему телефону.
+ Не удалось создать символическую ссылку
+ Пожалуйста, прочтите Справку, чтобы узнать больше.
+ В настройках APN вашего Android указан прокси-сервер!\nAdAway не будет работать надежно в мобильных сетях, таких как 3G. Вы можете отключить этот сервер прокси в настройках используемой APN (из приложения Настройки: Сеть и Интернет -> Мобильная сеть -> Дополнительно -> Точки доступа APN) и удалить значение в поле прокси.
+ Используемая точка доступа работает через прокси-сервер!
+ Подключение к Интернету не работает
+ Нет подключения
+ Загрузка…
+ Применение…
+ Применить Чёрный и Белый списки
+ Разбор и объединение файлов со списками хостов
+ Построение файла hosts
+ Применение файла hosts
+ Не удалось применить новый файл hosts.
+ Не удалось применить файл hosts на вашей системе!\nПопробуйте изменить путь к файлу hosts в настройках на /data/data/hosts.
+ Не удалось
+ Пожалуйста, проверьте ваше приложение для управления root-доступом, чтобы убедиться, что root-доступ был предоставлен.
+ Вы вернулись к файлу hosts по умолчанию.
+Возможно, потребуется перезагрузить Android, чтобы изменения вступили в силу.
+
+Вы хотите перегрузить Android?
+(Для предотвращения потери данных убедитесь, что никакие приложения в данный момент не используют карту памяти!)
+ Возврат произошёл успешно
+ Не удалось восстановить файл hosts
+ Восстановление не удалось по неизвестным причинам.
+ Восстановление не удалось!
+ Ни один из ваших активных источников хостов недоступен! Вы правильно подключены к интернету?
+ Загрузка не удалась
+ Не удалось записать новый личный файл hosts
+ Личный файл не может быть создан.
+ Не удалось создать личный файл
+ Вы активировали бессистемный режим.
+Возможно, потребуется перезагрузка, чтобы изменения вступили в силу.
+
+Вы хотите перезагрузить систему?
+(Для предотвращения потери данных убедитесь, что никакие приложения в данный момент не используют карту памяти!)
+ Активация прошла успешно
+ Вы отключили бессистемный режим.
+Возможно, потребуется перезагрузка, чтобы изменения вступили в силу.
+
+Вы хотите перезагрузить систему?
+(Для предотвращения потери данных убедитесь, что никакие приложения в данный момент не используют карту памяти!)
+ Успешно отключено
+ Не удалось включить VPN блокировку рекламы.
+ Не удалось отключить VPN блокировку рекламы.
+ Включить модуль хостов Magisk
+ Включить функцию бессистемных хостов из Magisk. В его настройках включите параметр Бессистемный hosts, затем перезапустите ваше устройство.
+ Отключить модуль хостов Magisk
+ Выключить функцию бессистемных хостов из Magisk. Из списка модулей удалите модуль Бессистемный hosts, затем перезапустите ваше устройство.
+
+
+ Вставьте URL-адрес в файл hosts:
+ Это недопустимое имя хоста!
+ Неправильно отформатированное имя хоста
+ Это недопустимый IP-адрес!
+ Неправильно отформатированный IP-адрес
+ Никогда не перезагружать и не показывать этот вопрос в дальнейшем!
+ Загрузка…
+
+
+ Обновить
+ Добавить
+ Помощь
+ Импортировать резервную копию
+ Экспортировать резервную копию
+
+
+ S-ON/S-OFF
+ FAQ
+ Проблемы
+
+
+ Приложения с рекламой
+ Поиск приложений с рекламой, называемые Adware, и которые AdAway не может заблокировать. Эти приложения используют, например, систему уведомлений Airpush, которая показывает рекламу даже тогда, когда приложение не работает, или даже может изменить мелодию вашего звонка. Избавиться от такой рекламы можно только удалив приложения, указанные в результатах сканирования, путём нажатия на элементы списка.
+ Сканирование…
+ Приложения с рекламой не найдены!
+
+
+ Блокировщик рекламы
+ Текстовый редактор не установлен
+ Не найден текстовый редактор для открытия файла hosts. Вы можете установить редактор Jota или другой текстовый редактор, чтобы это исправить.\n\nВы хотите установить редактор Jota?
+ Файловый менеджер не установлен
+ Нет файлового менеджера для открытия файла. Вы можете установить OI File Manager или другой файловый менеджер, чтобы это исправить.\n\nВы хотите установить OI File Manager?
+
+
+ Tcpdump
+ Tcpdump — это инструмент для мониторинга запросов DNS и их сохранения в файле журнала. Запустите Tcpdump, он будет работать в фоновом режиме до перезагрузки устройства — запустите приложение, в котором на экране показывается реклама — проанализируйте запросы DNS, используя файл журнала. Найденные в нём подозрительные серверы, возможные источники рекламы, могут быть внесены в чёрный список.
+ Откл. мониторинг
+ Вкл. мониторинг
+ Результаты
+ Сортировать домены
+ Очистить журнал
+ Добавить запись в Чёрный список
+ Добавить запись в Белый список
+ Добавить запись в список Перенаправлений
+
+ Править значение текстового предпочтения
+ Открыть меню
+ Закрыть меню
+
+
+
+ Главная
+ Источники хостов
+ Ваши списки
+ Открыть файл hosts
+ Журнал DNS-запросов
+ Сканирование на наличие приложений с рекламой
+ Настройки
+ Помощь
+
+
+
+
+ Запросы DNS
+ Ваши списки
+ Настройки
+
+
+ Установлено %1$s назад
+ Актуально %1$s
+ Требуется обновление %1$s
+ Последнее обновление %1$s назад
+ Неизвестный статус обновления
+ Отключено
+ несколько минут
+
+ %d минута
+ %d минуты
+ %d минут
+ %d минут
+
+
+ %d час
+ %d часа
+ %d часов
+ %d часов
+
+
+ %d день
+ %d дня
+ %d дней
+ %d дней
+
+
+ %d месяц
+ %d месяца
+ %d месяцев
+ %d месяцев
+
+
+
+ Хост скопирован в буфер обмена
+
+
+ начинается
+ активно
+ остановлено
+ ожидание сети
+ переподключение
+ ошибка переподключения
+ приостановлено
+ остановлено
+ Блокировщик рекламы VPN %1$s
+ Приостановить
+ Продолжить
+
+
+ Разрешения AdAway
+ Разрешить взаимодействие с AdAway
+ Отправить команды в AdAway
+ Разрешить AdAway отправлять такие команды, как включение или отключение общесистемной блокировки рекламы.
+
+
diff --git a/app/src/main/res/values-ru/strings_app.xml b/app/src/main/res/values-ru/strings_app.xml
new file mode 100644
index 0000000..b05f0e6
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Блокировщик рекламы с открытым исходным кодом
+ Логотип AdAway
+
diff --git a/app/src/main/res/values-ru/strings_errors.xml b/app/src/main/res/values-ru/strings_errors.xml
new file mode 100644
index 0000000..cb657b9
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Подключение к Интернету отсутствует
+ Невозможно установить соединение с интернетом. Пожалуйста, проверьте подключение вашего устройства.
+ Не удалось загрузить источники хоста
+ Ни один из ваших включенных источников хостов недоступен. Пожалуйста, проверьте подключение к интернету.
+
+ Не удалось создать личный файл
+ Невозможно создать личный файл для создания нового источника. Пожалуйста, проверьте свободное место на вашем устройстве.
+ Не хватает места
+ Невозможно скопировать файл hosts в системный раздел. Убедитесь, что бессистемный модуль Magisk включен, затем перезагрузите смартфон.
+ Не удалось установить новый файл hosts
+ Не удалось скопировать файл hosts в раздел /system. Пожалуйста, проверьте включен ли бессистемный модуль Magisk, а затем перезагрузитесь.
+ Не удалось восстановить файл hosts
+ Невозможно восстановить конфигурацию файла host по умолчанию.
+
+ Не удалось включить VPN блокировку рекламы.
+ Пожалуйста, проверьте настройки VPN, чтобы авторизовать приложение VPN для запуска.
+ Не удалось отключить VPN блокировку рекламы.
+ Пожалуйста, проверьте настройки VPN, чтобы отключить его вручную.
+
diff --git a/app/src/main/res/values-ru/strings_home.xml b/app/src/main/res/values-ru/strings_home.xml
new file mode 100644
index 0000000..30c61d3
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Блокировано
+ Разрешено
+ Перенаправлено
+
+
+
+ %d обновлённый источник
+ %d обновлённых источника
+ %d обновлённых источников
+ %d обновлённых источников
+
+
+ %d устаревший источник
+ %d устаревших источника
+ %d устаревших источников
+ %d устаревших источников
+
+ Проверить обновления хостов
+ Обновить хосты
+
+
+ Показать журнал запросов DNS
+
+
+ Показать справку\nи советы
+
+
+ Открыть страницу GitHub
+
+
+ Поддержать проект
+
+
+ Проект на GitHub
+ Настройки
+
+
+ Открыть боковое меню
+ Приостановить/продолжить блокировку рекламы
+ Обновить заблокированные домены
+ Показать запрошенные домены
+
+
+ Пожалуйста, прочтите Справку, чтобы узнать больше.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings_hosts.xml b/app/src/main/res/values-ru/strings_hosts.xml
new file mode 100644
index 0000000..d51e37d
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Источники хостов
+
+ Список пользоватей
+ Официальные списки от AdAway
+ Единые списки от StevenBlack
+ Списки блокировки от Pete Lowe
+
+ недоступен
+ %s списки
+
+ Добавить источник
+ Редактировать источник
+ URL: (ресурс https:// или file://)
+ URL-адрес источника хостов
+
diff --git a/app/src/main/res/values-ru/strings_lists.xml b/app/src/main/res/values-ru/strings_lists.xml
new file mode 100644
index 0000000..78dc714
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Ваши списки
+ Добавить хост
+
+ Блокировано
+ Разрешено
+ Перенаправлено
+
+ Фильтровать хосты
+ Поиск имени хоста…
+ Переключить источники
+
+ Добавить хост в Чёрный список
+ Добавить хост в Белый список
+ Добавить перенаправление хоста
+ Редактировать хост Чёрного списка
+ Редактировать хост Белого списка
+ Редактировать перенаправление
+ Имя источника:
+ URL-адрес источника хостов
+ (Допускаются подстановочные символы * и ?)
+ IP (IPv4 или IPv6):
+
diff --git a/app/src/main/res/values-ru/strings_log.xml b/app/src/main/res/values-ru/strings_log.xml
new file mode 100644
index 0000000..6762f23
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Переключить запись журнала
+ Нажмите кнопку записи, чтобы начать логирование запросов, поищите что-нибудь в интернете или воспользуйтесь другими приложениями, а затем вернитесь назад или потяните вниз, чтобы обновить логи.
+ \n\nBlocked запросы не будут логированы. Сначала отключите блокировку рекламы, если вы также хотите их логировать.
+
+ Сортировка по алфавиту
+ Сортировка по наивысшему уровню домена
+
+ Перенаправить домен
+
diff --git a/app/src/main/res/values-ru/strings_notification.xml b/app/src/main/res/values-ru/strings_notification.xml
new file mode 100644
index 0000000..22c4637
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Обновления
+ Уведомления об обновлении
+ Доступно обновление
+ Доступны более новые списки хостов для загрузки.
+ Доступно обновление приложения
+ Новая версия AdAway доступна для загрузки.
+
+ VPN
+ Уведомления о работе VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings_prefs_backup_restore.xml b/app/src/main/res/values-ru/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..f3cf048
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Резервная копия и восстановление
+ Резервная копия
+ Сохранить резервную копию ваших правил блокировки на внешний носитель
+ Восстановление
+ Восстановить ваши правила блокировки из файла резервной копии
+
diff --git a/app/src/main/res/values-ru/strings_prefs_main.xml b/app/src/main/res/values-ru/strings_prefs_main.xml
new file mode 100644
index 0000000..0654e90
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Настройки
+
+ Главные
+ Выбрать тему
+
+ Светлая
+ Темная
+ На основе системной
+
+ Автоматические обновления
+
+ Блокировка рекламы
+ Блокировщик рекламы на основе root
+ Блокировщик рекламы на основе VPN
+ Включить поддержку IPv6
+ Резервная копия / восстановление правил блокировки
+
+ Режим отладки
+ Отправлять отчёты об ошибках
+ Отправлять в Sentry (sentry.io)
+ Не поддерживается в этой сборке
+ Подробный журнал отладки
+ Для применения требуется перезапуск приложения
+
diff --git a/app/src/main/res/values-ru/strings_prefs_root.xml b/app/src/main/res/values-ru/strings_prefs_root.xml
new file mode 100644
index 0000000..2553ce1
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Блокировщик рекламы на основе root
+
+ Установка хостов
+ Открыть файл hosts
+ Путь к файлу hosts
+ Прочитайте Справку перед использованием этой функции
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Пользовательские настройки
+
+ Пользовательское целевое расположение
+ Скрыть диалог перезагрузки после применения
+
+ Переадресация
+ Определить куда переадресовывать заблокированные хосты
+ Перенаправление IPv4
+ Перенаправление IPv6
+ Неверное перенаправление
+
+ Локальный веб-сервер
+ Локальный веб-сервер прослушивает локальные IP адреса и отвечает на запросы к заблокированным хостам. Это поможет избегать зависаний при блокировке подключений.
+ Включить веб-сервер
+ Проверить веб-сервер
+ Установить самоподписанный сертификат
+ Установка сертификата вручную
+ Начиная с Android 11 (R), приложение больше не может автоматически устанавливать центр сертификации (CA).\n\nПерейдите в настройки \"Безопасность\", \"Шифрование личных данных\", затем \"Установить сертификат\". Оттуда выберите \"Сертификат CA\" и выберите только что экспортированный файл сертификата.
+ Откройте настройки безопасности
+ Проверка…
+ Не запущен
+ Запущен, но сертификат не установлен
+ Запущен и сертификат установлен
+ Заменить пустое место от рекламы логотипом приложения
+
diff --git a/app/src/main/res/values-ru/strings_prefs_update.xml b/app/src/main/res/values-ru/strings_prefs_update.xml
new file mode 100644
index 0000000..391914e
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Обновления
+ Уведомления отключены
+ Уведомления приложений не будут отображаться. Нажмите, чтобы включить их.
+
+ Обновления приложения
+ Проверять обновления при запуске
+ Периодическая проверка обновлений
+ Включая бета-версии
+
+ Обновления хостов
+ Проверять обновления при запуске
+ Периодическая проверка обновлений
+ Синхронизация при обновлении
+ Синхронизация только в нетарифицируемой сети
+
diff --git a/app/src/main/res/values-ru/strings_prefs_vpn.xml b/app/src/main/res/values-ru/strings_prefs_vpn.xml
new file mode 100644
index 0000000..822f81d
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Блокировщик рекламы на основе VPN
+
+ Включить при запуске
+ Проверка соединения
+ Периодически проверяйте состояние сети, чтобы перезапустить VPN при отключении.
+
+ Исключённые приложения
+ Настройте, какие приложения не должны использовать VPN, чтобы никакие соединения не блокировались.
+ Исключить системные приложения
+
+ Никакие
+ Все, кроме браузеров
+ Все
+
+ Исключить пользовательские приложения
+
+
+ Исключённые приложения
+ Выбрать все
+ Отменить выбрать все
+ Значок приложения
+
diff --git a/app/src/main/res/values-ru/strings_source_edit.xml b/app/src/main/res/values-ru/strings_source_edit.xml
new file mode 100644
index 0000000..d6d4029
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Редактировать источник
+ Добавить источник
+
+ Метка
+ Требуется метка
+ Тип
+ URL
+ Файл
+ Местоположение
+ https://
+ Требуется доступ к Местоположению
+ Нажмите Файл, чтобы выбрать исходный файл
+ Неверное местоположение
+ Формат списка
+ Блокировать
+ Разрешить
+ Применить перенаправленные хосты
+ Разрешение перенаправления хостов может вызвать проблемы с безопасностью. Используйте эти настройки только для надежного источника, поскольку он может перенаправить некоторый конфиденциальный трафик на любой сервер, который ему нужен.
+
diff --git a/app/src/main/res/values-ru/strings_support.xml b/app/src/main/res/values-ru/strings_support.xml
new file mode 100644
index 0000000..ef64378
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Поддержать
+ Стать спонсором
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings_update.xml b/app/src/main/res/values-ru/strings_update.xml
new file mode 100644
index 0000000..5a431a4
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Обновление AdAway
+
+ Доступно обновление!
+
+
+ У вас актуальная версия
+ Доступно обновление
+ Обновление AdAway
+ Обновить сейчас
+ %1$s / %2$s
+ Последние изменения
+ Список изменений
+ Поддержать разработку
+ Пожертвовать
+ Спонсор
+
+
+ Скачивание последней версии AdAway…
+
diff --git a/app/src/main/res/values-ru/strings_welcome.xml b/app/src/main/res/values-ru/strings_welcome.xml
new file mode 100644
index 0000000..6f3542b
--- /dev/null
+++ b/app/src/main/res/values-ru/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Добро пожаловать
+ Первый шаг
+ Второй шаг
+ Последний шаг
+
+
+ Добро пожаловать в AdAway!
+ AdAway предоставляет два метода блокировки рекламы. Выберите тот, который вам подходит:
+
+ Логотип root
+ Root\nблокировка рекламы
+ Быстрее
+ Экономит батарею
+ Требуются рут права
+
+ Логотип VPN
+ VPN\nблокировка рекламы
+ Медленнее
+ Работает в фоне
+ Совместимый
+
+ Требуется Android с Root-правами
+ Либо двоичный файл su не найден, либо вы не предоставили AdAway права root.\n\nЭто может случиться тогда, когда ваше устройство не имеет root-прав. Вы можете найти информацию о том, как получить root права на ваше устройство, на wiki.lineageos.org или других сайтах Android.
+
+ Плюсы
+ Минусы
+
+
+ Синхронизация выполнена
+ Ошибка при синхронизации
+
+ Синхронизация
+ Синхронизировано!
+ AdAway загружает списки блокировки из онлайн-источников. Вы можете изменить их позже в настройках.
+ Повторить синхронизацию
+ Ошибка синхронизации: %1$s Повторить сейчас?
+ Это поможет отправлять уведомления для отображения статуса блокировки рекламы и управления, а также уведомит, когда будет доступно обновление приложения (несколько раз в год). Включите, если хотите быть в курсе событий.
+
+
+ Поддержать
+ Поддержать меня!
+ AdAway — это бесплатное приложение с открытым исходным кодом, которое я разрабатываю в свободное время. Если она вам нравится, не стесняйтесь оказать свою поддержку:
+ Пожертвовать на PayPal
+ Вам не нравятся ошибки? Мне тоже.
+ Включить телеметрию для отправки мне отчетов о сбоях
+
+
+ Назад
+ Далее
+ Закончить
+
diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-si/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-si/strings_app.xml b/app/src/main/res/values-si/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-si/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-si/strings_errors.xml b/app/src/main/res/values-si/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-si/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-si/strings_home.xml b/app/src/main/res/values-si/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-si/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-si/strings_hosts.xml b/app/src/main/res/values-si/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-si/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-si/strings_lists.xml b/app/src/main/res/values-si/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-si/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-si/strings_log.xml b/app/src/main/res/values-si/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-si/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-si/strings_notification.xml b/app/src/main/res/values-si/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-si/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-si/strings_prefs_backup_restore.xml b/app/src/main/res/values-si/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-si/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-si/strings_prefs_main.xml b/app/src/main/res/values-si/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-si/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-si/strings_prefs_root.xml b/app/src/main/res/values-si/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-si/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-si/strings_prefs_update.xml b/app/src/main/res/values-si/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-si/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-si/strings_prefs_vpn.xml b/app/src/main/res/values-si/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-si/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-si/strings_support.xml b/app/src/main/res/values-si/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-si/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-si/strings_update.xml b/app/src/main/res/values-si/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-si/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-si/strings_welcome.xml b/app/src/main/res/values-si/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-si/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000..f80c1a4
--- /dev/null
+++ b/app/src/main/res/values-sk/strings.xml
@@ -0,0 +1,270 @@
+
+
+
+ Ukončiť
+ Zavrieť
+ Áno
+ Nie
+ Pridať
+ Zrušiť
+ Uložiť
+ Pomoc
+
+
+ Vitajte!
+ AdAway je bezplatný, open sourceový softvér navrhnutý na blokovanie reklamy. Získava adresy reklamných sietí a blokuje ich na vašom zariadení.\nChcete vedieť viac? Pozrite si pomocníka nižšie!
+ Zobraziť ďalšiu pomoc
+ Aktualizovať status
+ Všetky hosts súbory z vybraných zdrojov budú stiahnuté, zlúčené s vašimi zoznamami a nainštalované ako jeden hosts súbor do vášho systému.
+ Povoliť blokovanie reklám
+ Zakázať blokovanie reklám
+ Web server
+ Spustený
+ Zastavený
+ Spustiť alebo zastaviť webserver na zariadení pre odpovedanie na požiadavky blokovaných adries.
+ Povoliť web server
+ Zakázať web server
+ VPN
+ Spustené
+ Zastavené
+ Spustiť alebo zastaviť VPN na filtrovanie požiadaviek.
+ Povoliť VPN
+ Zakázať VPN
+
+
+ Upraviť položku
+ Aplikovať
+ Upraviť
+ Vymazať
+
+
+ Importovanie…
+ Záloha úspešne importovaná z vášho externého úložiska.
+ Nepodarilo sa importovať zálohu. Je jeho formát správny? Ďalšie podrobnosti nájdete v protokole logcat.
+ Exportovanie…
+ Záloha bola úspešne exportovaná do súboru \'%s\' na externom úložisku.
+ Nepodarilo sa exportovať súbor zálohy \'%s\'.
+
+
+ Hosts súbor
+ Súbor hosts je systémový súbor, ktorý mapuje názvy hostiteľov k IP adresám. Je to jednoduchý textový súbor, ktorého konfiguráciu spracováva AdAway. Tu je zopár jeho prvých riadkov:
+ Načítavanie obsahu hosts súboru…
+ Otvoriť hosts súbor
+
+
+ Kontrola aktualizácií
+ Kontroluje sa aktualizácia pre zdroj %s
+ Získavanie zdrojov
+ Sťahovanie zdroja %s
+ Čítanie zdroja %s
+ Analyzuje sa zdroj %s
+ Synchronizácia databázy pravidiel
+ Obnovuje sa pôvodný súbor hosts
+ Pôvodný súbor hosts obnovený
+ Vytváranie štandardného hosts súboru
+ Aktualizácia dostupná
+ Sú dostupné novšie hosts súbory
+ Neboli nájdené žiadne aktualizácie pre zdroj
+ Bez internetového pripojenia
+ Internetové pripojenie nie je dostupné
+ Nedostupné zdroje
+ Nie sú dostupné žiadne hosts zdroje!
+ Prístup ROOT bol odmietnutý
+ Povoľte prístup ROOT z aplikácie určenej na správu prístupu ROOT
+ Niečo sa pokazilo
+ Pre viac informácií skontrolujte logcat
+ Povolené
+ Máte najnovšie hosts súbory
+ Zakázané
+ Predvolený súbor host nainštalovaný
+ Použiť najnovšie zdroje
+ Vytváranie nového súboru hosts
+ Kopírovanie nového súboru hosts
+ Kontrola kópie súboru hosts
+ Súbor hosts úspešne aktualizovaný
+ Nastavenie VPN úspešne aktualizované
+ Konfigurácia sa zmenila. Musíte ju aplikovať.
+ Aplikovať
+ Aplikuje sa nová konfigurácia…
+ Nepodarilo sa aplikovať novú konfiguráciu
+
+
+ Chýba symbolický odkaz na cieľový súbor hosts
+ Odkaz z vášho cieľa do /system/etc/hosts neexistuje alebo je nesprávny! AdAway nebude fungovať, pokiaľ odkaz nebude smerovať na správny súbor.\n\nChcete sa pokúsiť vytvoriť odkaz?
+ Odkaz chýba
+ Nedostatok miesta na partícii!\nSkúste zmeniť umiestnenie hosts súboru v nastaveniach na /data/data/hosts.
+ Nedostatok miesta
+ Stiahnutý súbor sa nedá čítať
+ Chyba v súkromnom súbore
+ Znovupripojenie partície na čítanie aj zápis zlyhalo!
+ Znovupripojenie zlyhalo
+ Nepodarilo sa skopírovať súbor hosts
+ Kopírovanie hosts súboru zlyhalo!
+ Kopírovanie zlyhalo
+ Zdroje hosts aplikované
+ Aplikovanie úspešné
+ Aplikovanie bolo úspešné.\nPre aplikovanie zmien budete musieť reštartovať zariadenie.\n\nChcete reštartovať?\n(Aby ste predišli strate dát, uistite sa, že žiadna aplikácie práve teraz nepoužíva SD kartu!)
+ Symbolický odkaz bol úspešne vytvorený.\nPre aplikovanie zmien budete musieť reštartovať zariadenie.\n\nChcete reštartovať?\n(Aby ste predišli strate dát, uistite sa, že žiadna aplikácie práve teraz nepoužíva SD kartu!)
+ Vytvorenie odkazu úspešné
+ Symbolický odkaz nemohol byť vytvorený Androidom.\nTúto chybu zväčša spôsobuje \"funkcia S-ON na telefónoch HTC!\"\n\nRiešením je spustiť telefón do režimu recovery a vytvoriť symbolický odkaz tam pomocou \"n -s /data/data/hosts /system/etc/hosts\".\n\nAk to nepomôže, vyhľadajte na internete informácie o S-OFF pre váš telefón.
+ Vytvorenie odkazu zlyhalo
+ Prosím, pre viac informácií si prečítajte Pomoc.
+ Na zariadení je nastavené APN proxy!\nAdAway nebude správne fungovať na mobilných sieťach, napr. 3G. Proxy môžete deaktivovať v nastaveniach APN (Nastavenia -> Bezdrôtové pripojenia a siete -> Viac… -> Mobilné siete -> Názvy prístupových bodov) a vymazaním hodnoty Server proxy.
+ Nastavené APN proxy!
+ Pripojenie k internetu nefunguje.
+ Bez pripojenia
+ Sťahovanie…
+ Aplikovanie…
+ Aplikovanie čiernej a bielej listiny
+ Analyzovanie a zlučovanie hosts súborov
+ Vytváranie hosts súboru
+ Aplikovanie hosts súboru
+ Nepodarilo sa aplikovať nový súbor hosts.
+ Aplikovanie hosts súboru do vašeho systému zlyhalo!\nSkúste zmeniť umiestnenie hosts súboru v nastaveniach na /data/data/hosts.
+ Aplikovanie zlyhalo
+ Prosím, skontrolujte aplikáciu pre správu prístupu ROOT, aby ste sa uistili, že ste získali ROOT prístup
+ Obnovili ste súbor hosts na pôvodný.\nPre aplikovanie zmien budete musieť reštartovať zariadenie.\n\nChcete reštartovať?\n(Aby ste predišli strate dát, uistite sa, že žiadna aplikácie práve teraz nepoužíva SD kartu!)
+ Obnovenie úspešné
+ Súbor hosts sa nedá obnoviť
+ Obnovenie zlyhalo z neznámeho dôvodu.
+ Obnovenie zlyhalo!
+ Žiadny z vašich povolených hosts zdrojov nie je dostupný! Ste správne pripojený k internetu?
+ Sťahovanie zlyhalo
+ Nepodarilo sa zapísať nový súkromný súbor hosts
+ Súkromný súbor nemožno vytvoriť.
+ Vytváranie súboru zlyhalo
+ Povolili ste bezsystémový režim.\nPre aplikovanie zmien budete musieť reštartovať zariadenie.\n\nChcete reštartovať?\n(Aby ste predišli strate dát, uistite sa, že žiadna aplikácie práve teraz nepoužíva SD
+ Úspešne povolené
+ Zakázali ste bezsystémový režim.\nPre aplikovanie zmien budete musieť reštartovať zariadenie.\n\nChcete reštartovať?\n(Aby ste predišli strate dát, uistite sa, že žiadna aplikácie práve teraz nepoužíva SD kartu!)
+ Zakázanie úspešné
+ Nepodarilo sa povoliť blokovanie reklamy pomocou VPN.
+ Nepodarilo sa zakázať blokovanie reklamy pomocou VPN.
+ Povolenie Magisk modulu hosts
+ Povoľte funkciu Systemless hosts v Magisk Manageri. V jeho nastavení povoľte voľbu Systemless hosts, a potom reštartujte zariadenie.
+ Zakázanie Magisk modulu hosts
+ Zakážte funkciu Systemless hosts v Magisk Manageri. V zozname modulov odinštalujte 1Systemless hosts1, a potom reštartujte zariadenie.
+
+
+ Zadajte URL k hosts súboru:
+ Toto nie je platný názov hostiteľa!
+ Nesprávne formulovaný názov hostiteľa
+ Toto nie je platná IP!
+ Nesprávne formulovaná IP
+ Nikdy nereštartovať a túto otázku už nezobrazovať!
+ Načítavanie…
+
+
+ Obnoviť
+ Pridať
+ Pomoc
+ Importovať zálohu
+ Exportovať zálohu
+
+
+ S-ON/S-OFF
+ FAQ
+ Problémy
+
+
+ Adware
+ Tu môžete nájsť nainštalované Adware aplikácie, zlé aplikácie, ktoré AdAway nemôže zablokovať. Tieto aplikácie používajú napríklad Airpush upozornenia, ktoré sa zobrazujú aj keď aplikácia nie je spustená alebo vám môžu zmeniť zvonenie. Jediné dostupné protiopatrenie je odinštalovať tieto aplikácie kliknutím na položku v zozname.
+ Vyhľadávanie…
+ Nebol nájdený žiadny adware.
+
+
+ Blokovanie reklám
+ Nie je nainštalovaný žiadny textový editor
+ Nebol nájdený žiadny textový editor na otvorenie hosts súboru. Môžete nainštalovať aplikáciu Jota alebo iný textový editor.\n\nChcete nainštalovať aplikáciu Jota?
+ Nie je nainštalovaný žiadny správca súborov
+ Nebol nájdený žiadny správca súborov na otvorenie súborov. Môžete nainštalovať aplikáciu OI File Manager alebo iného správcu súborov.\n\nChcete nainštalovať aplikáciu OI File Manager?
+
+
+ Tcpdump
+ Tcpdump je nástroj na monitorovanie DNS žiadostí a ich ukladanie do záznamu. Môžete ho spustiť na pozadí, spustiť aplikáciu, ktorá zobrazuje reklamy a potom analyzovať DNS požiadavky pomocou záznamu. Adresy serverov s reklamami si potom môžete pridať do čiernej listiny.
+ Zakázať monitorovanie
+ Povoliť monitorovanie
+ Zobraziť výsledky
+ Zoradiť domény
+ Vymazať záznam
+ Pridať položku do čiernej listiny
+ Pridať položku do bielej listiny
+ Pridať položku do zoznamu presmerovaných
+
+ Upraviť hodnotu predvoľby textu
+ Otvoriť menu
+ Zatvoriť menu
+
+
+
+ Domov
+ Hosts zdroje
+ Vaše zoznamy
+ Otvoriť súbor hosts
+ Zaznamenať DNS požiadavky
+ Vyhľadať adware
+ Nastavenia
+ Pomoc
+
+
+
+
+ DNS žiadosti
+ Vaše zoznamy
+ Nastavenia
+
+
+ Nainštalované pred %1$s
+ Aktuálne %1$s
+ Dostupná aktualizácia %1$s
+ Posledná aktualizácia pred %1$s
+ Neznámy stav aktualizácie
+ Zakázané
+ pár minútami
+
+ %dminútu
+ %d minúty
+ %d minúť
+ %d minút
+
+
+ %d hodinu
+ %dhodiny
+ %dhodín
+ %dhodín
+
+
+ %d deň
+ %d dni
+ %d dní
+ %d dní
+
+
+ %d mesiac
+ %d mesiace
+ %d mesiacov
+ %d mesiacov
+
+
+
+ Host skopírovaný do schránky
+
+
+ spúšťa sa
+ aktívne
+ zastavuje sa
+ čaká sa na sieť
+ znovu sa pripája
+ chyba pripájania
+ pozastavená
+ zastavené
+ Blokovanie reklamy pomocou VPN %1$s
+ Pozastaviť
+ Pokračovať
+
+
+ Povolenia AdAway
+ Povoliť interakciu s AdAway
+ Odoslať príkazy do AdAway
+ Umožňuje odoslať príkazy do AdAway ako zapnutie alebo vypnutie blokovania reklamy v systéme
+
+
diff --git a/app/src/main/res/values-sk/strings_app.xml b/app/src/main/res/values-sk/strings_app.xml
new file mode 100644
index 0000000..8467749
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Blokovač reklamy s otvoreným kódom
+ AdAway logo
+
diff --git a/app/src/main/res/values-sk/strings_errors.xml b/app/src/main/res/values-sk/strings_errors.xml
new file mode 100644
index 0000000..4b27c82
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Bez internetového pripojenia
+ Nepodarilo sa nadviazať pripojenie na internet. Prosím, skontrolujte pripojenie.
+ Sťahovanie zdrojov hosts zlyhalo
+ Žiaden z vašich povolených zdrojov hosts nie je dostupný. Prosím, skontrolujte pripojenie na internet.
+
+ Nepodarilo sa vytvoriť súkromný súbor
+ Nepodarilo sa vytvoriť súkromný súbor na vytvorenie nového zdroja hosts. Prosím, skontrolujte dostupné voľné miesto na zariadení.
+ Nedostatok miesta
+ Nepodarilo sa skopírovať súbor hosts na systémový oddiel. Prosím, skontrolujte, či je povolený systemless modul Magisku, a potom reštartujte.
+ Nepodarilo sa nainštalovať nový súbor hosts
+ Nepodarilo sa skopírovať súbor hosts na oddiel /system. Prosím, skontrolujte, či je povolený systemless modul Magisku, a potom reštartujte.
+ Nepodarilo obnoviť súbor hosts
+ Nepodarilo obnoviť pôvodné nastavenie súboru hosts.
+
+ Nepodarilo sa povoliť blokovanie reklamy pomocou VPN.
+ Prosím, skontrolujte nastavenia VPN, aby aplikácia mohla spustiť VPN pri štarte.
+ Nepodarilo sa zakázať blokovanie reklamy pomocou VPN.
+ Skontroluje nastavenie VPN a vypnite ju manuálne.
+
diff --git a/app/src/main/res/values-sk/strings_home.xml b/app/src/main/res/values-sk/strings_home.xml
new file mode 100644
index 0000000..71f5df0
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Blokované
+ Povolené
+ Presmerované
+
+
+
+ %d aktualizovaný zdroj
+ %d aktualizované zdroje
+ %d aktualizovaných zdrojov
+ %d aktualizovaných zdrojov
+
+
+ %d neaktualizovaný zdroj
+ %d neaktualizované zdroje
+ %d neaktualizovaných zdrojov
+ %d neaktualizovaných zdrojov
+
+ Skontrolovať aktualizácie pre hosts
+ Aktualizovať hosts súbor
+
+
+ Zobraziť záznam požiadaviek DNS
+
+
+ Zobraziť pomocníka a tipy
+
+
+ Otvoriť stránku GitHub
+
+
+ Podporiť projekt
+
+
+ Projekt na Githube
+ Nastavenia
+
+
+ Otvoriť bočný panel
+ Pozastaviť/obnoviť blokovanie reklamy
+ Aktualizovať blokované domény
+ Zobraziť požadované domény
+
+
+ Prosím, pre viac informácií si prečítajte Pomoc.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sk/strings_hosts.xml b/app/src/main/res/values-sk/strings_hosts.xml
new file mode 100644
index 0000000..376eaa4
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts zdroje
+
+ Používateľský zoznam
+ Hosts AdAway official
+ Hosts StevenBlack Unified
+ Hosts Pete Lowe blocklist
+
+ nie je dostupné
+ Hosts %s
+
+ Pridať zdroj
+ Upraviť zdroj
+ URL: (https:// alebo file:// zdroja)
+ URL zdroja hosts súboru
+
diff --git a/app/src/main/res/values-sk/strings_lists.xml b/app/src/main/res/values-sk/strings_lists.xml
new file mode 100644
index 0000000..ced8022
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Vaše zoznamy
+ Pridať hostiteľa
+
+ Blokované
+ Povolené
+ Presmerované
+
+ Filtrovať hostiteľov
+ Nájsť hostiteľa…
+ Prepnúť zdroje
+
+ Pridať host do čiernej listiny
+ Pridať host do bielej listiny
+ Pridať host do presmerovania
+ Upraviť hostiteľa na čiernej listine
+ Upraviť hostiteľa na bielej listine
+ Upraviť presmerovania
+ Názov hostiteľa:
+ URL zdroja hosts súboru
+ (Zástupné znaky * a ? sú povolené!)
+ IP (IPv4 alebo IPv6):
+
diff --git a/app/src/main/res/values-sk/strings_log.xml b/app/src/main/res/values-sk/strings_log.xml
new file mode 100644
index 0000000..ef55945
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Prepnúť zaznamenávanie logu
+ Stlačením tlačidla záznamu spustite zaznamenávanie požiadaviek, prehliadania webu alebo používaných aplikácií, a potom sa vráťte späť alebo potiahnutím obnovte logy.
+ \n\nBlokované požiadavky nebudú zaznamenané. Najprv zakážte blokovanie, ak ich chcete zahrnúť do logu.
+
+ Zoradenie podľa abecedy
+ Zoradenie podľa domény najvyššej úrovne
+
+ Presmerovať doménu
+
diff --git a/app/src/main/res/values-sk/strings_notification.xml b/app/src/main/res/values-sk/strings_notification.xml
new file mode 100644
index 0000000..3f75c60
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Aktualizácie
+ Nové upozornenia na aktualizáciu
+ Aktualizácia dostupná
+ Novšie súbory hosts sú dostupné na stiahnutie.
+ Je dostupná aktualizácia aplikácie
+ Nová verzia AdAway je dostupná na stiahnutie.
+
+ VPN
+ Upozornenia na spustenú VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sk/strings_prefs_backup_restore.xml b/app/src/main/res/values-sk/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..6a09c0c
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Zálohovať a obnoviť
+ Zálohovať
+ Zálohovať pravidlá blokovania na externé úložisko
+ Obnoviť
+ Obnoviť pravidlá blokovania zo záložného súboru
+
diff --git a/app/src/main/res/values-sk/strings_prefs_main.xml b/app/src/main/res/values-sk/strings_prefs_main.xml
new file mode 100644
index 0000000..3fca651
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Nastavenia
+
+ Všeobecné
+ Tmavý motív
+
+ Svetlý
+ Tmavý
+ Podľa systému
+
+ Automatické aktualizácie
+
+ Blokovanie reklamy
+ Blokovač reklám s rootom
+ Blokovač reklám pomocou VPN
+ Povoliť podporu IPv6
+ Zálohovať / obnoviť pravidlá blokovania
+
+ Odstraňovanie chýb
+ Odoslať hlásenie o zlyhaní
+ Nahlásiť na Sentry (sentry.io)
+ Toto zostavenie nie je podporované
+ Podrobné zaznamenávanie
+ Aplikáciu je potrebné reštartovať
+
diff --git a/app/src/main/res/values-sk/strings_prefs_root.xml b/app/src/main/res/values-sk/strings_prefs_root.xml
new file mode 100644
index 0000000..42c9c4a
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Blokovač reklám s rootom
+
+ Inštalácia hosts
+ Otvoriť súbor hosts
+ Umiestnenie hosts súboru
+ Pre použitím tejto funkcie si prečítajte pomocníka
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Vlastné umiestnenie
+
+ Vlastné umiestnenie
+ Po aplikovaní skryť dialógové okno reštartu
+
+ Presmerovania
+ Zadať, kam presmerovať blokované domény
+ Presmerovanie IPv4
+ Presmerovanie IPv6
+ Neplatné presmerovanie
+
+ Miestny webserver
+ Miestny webserver počúva na miestnej IP adrese, aby odpovedal za požiadavky blokovaných domén.
+ Povoliť web server
+ Testovať web server
+ Inštalovať certifikát s vlastným podpisom
+ Ručná inštalácia certifikátu
+ Od Androidu 11 (R) aplikácie nemôžu automaticky inštalovať dôveryhodné certifikáty (CA).\n\nPrejdite na nastavenie \"Zabezpečenie\", \"Šifrovanie a poverenia\", potom \"Inštalovať certifikát\". Tam vyberte \"Certifikát CA\" a vyberte nový exportovaný súbor s certifikátom.
+ Otvoriť nastavenie Zabezpečenie
+ Kontrolovanie…
+ Nie je spustený
+ Spustený, ale certifikát nie je nainštalovaný
+ Spustený a certifikát je nainštalovaný
+ Vyplniť prázdne reklamné miesto ikonou apky
+
diff --git a/app/src/main/res/values-sk/strings_prefs_update.xml b/app/src/main/res/values-sk/strings_prefs_update.xml
new file mode 100644
index 0000000..c511326
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Aktualizácie
+ Upozornenia sú vypnuté
+ Upozornenia aplikácie sa nezobrazia. Klepnutím ich povolíte.
+
+ Aktualizácie aplikácie
+ Skontrolovať aktualizácie pri spustení
+ Pravidelne kontrolovať aktualizácie
+ Aj betaverzie
+
+ Aktualizácie hosts
+ Skontrolovať aktualizácie pri spustení
+ Pravidelne kontrolovať aktualizácie
+ Synchronizovať pri aktualizácii
+ Synchronizovať len na neplatenej sieti
+
diff --git a/app/src/main/res/values-sk/strings_prefs_vpn.xml b/app/src/main/res/values-sk/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d9e051d
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Blokovač reklám pomocou VPN
+
+ Povoliť pri štarte
+ Sledovanie pripojenia
+ Pravidelne kontrolovať stav siete, pri odpojení reštartovať VPN.
+
+ Vylúčené aplikácie
+ Nastavte, ktoré aplikácie by nemali používať VPN a nebudú sa blokovať žiadne ich pripojenia.
+ Vylúčiť systémové aplikácie
+
+ Žiadne
+ Všetky okrem prehliadačov
+ Všetky
+
+ Vylúčiť užívateľské aplikácie
+
+
+ Vylúčené aplikácie
+ Vybrať všetky
+ Nevybrať nič
+ Ikona aplikácie
+
diff --git a/app/src/main/res/values-sk/strings_source_edit.xml b/app/src/main/res/values-sk/strings_source_edit.xml
new file mode 100644
index 0000000..c06c594
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Upraviť zdroj
+ Pridať zdroj
+
+ Menovka
+ Menovka je povinná
+ Typ
+ URL
+ Súbor
+ Adresa
+ https://
+ Adresa je povinná
+ Stlačením tlačidla Súbor vyberte zdrojový súbor
+ Neplatná cesta
+ Formát zoznamu
+ Blokovať
+ Povoliť
+ Použiť presmerovaných hostiteľov
+ Povolenie presmerovaných hostiteľov môže spôsobiť bezpečnostné problémy. Toto nastavenie používajte len na dôveryhodnom zdroji, pretože by mohlo presmerovať citlivú komunikáciu na ľubovoľný server.
+
diff --git a/app/src/main/res/values-sk/strings_support.xml b/app/src/main/res/values-sk/strings_support.xml
new file mode 100644
index 0000000..83b2849
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Podpora
+ Staňte sa sponzorom
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sk/strings_update.xml b/app/src/main/res/values-sk/strings_update.xml
new file mode 100644
index 0000000..c701500
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_update.xml
@@ -0,0 +1,22 @@
+
+
+ Aktualizácia AdAway
+
+ Aktualizácia je dostupná!
+
+
+ Aktualizované
+ Aktualizácia dostupná
+ Aktualizovanie AdAway
+ Aktualizovať teraz
+ %1$s / %2$s
+ Hotovo
+ Posledné zmeny
+ Zoznam zmien
+ Podpora vývoja
+ Podporiť
+ Sponzor
+
+
+ Sťahovanie najnovšej verzie AdAway
+
diff --git a/app/src/main/res/values-sk/strings_welcome.xml b/app/src/main/res/values-sk/strings_welcome.xml
new file mode 100644
index 0000000..7036871
--- /dev/null
+++ b/app/src/main/res/values-sk/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Vitajte
+ Sprievodca – 1. krok
+ Sprievodca – 2. krok
+ Sprievodca – posledný krok
+
+
+ Vitajte v AdAway!
+ AdAway poskytuje 2 metódy blokovania. Vyberte si jednu:
+
+ Logo rootu
+ Blokovač reklám\npomocou rootu
+ Rýchlejšie
+ Šetrné k batérii
+ Vyžaduje root
+
+ Logo VPN
+ Blokovač reklám\npomocou VPN
+ Pomalšie
+ Beží na pozadí
+ Kombatibilita
+
+ Je potrebné rootnuté zariadenie
+ Buď sa nepodarilo nájsť binárny súbor SU alebo ste nepovolili oprávnenie roota v AdAway.\n\nK tomuto dochádza, keď vaše zariadenie nie je rootnuté. Informácie o tom, ako rootnuť vaše zariadenia nájdete na wiki.lineageos.org alebo na inej stránke o zariadeniach s Androidom.
+
+ Výhody
+ Nevýhody
+
+
+ Synchronizácia skončila
+ Nastala chyba počas synchronizácie
+
+ Synchronizácia
+ Synchronizované!
+ AdAway sťahuje reklamné siete na blokovanie z online zdrojov. Neskôr ich môžete upraviť.
+ Zopakovať synchronizáciu
+ Synchronizácia zlyhala: %1$s Skúsiť znova?
+ Môže posielať upozornenia na zobrazenie stavu a kontroly blokovania reklám a upozorniť na dostupnú aktualizáciu aplikácie (niekoľko za rok). Ak ich chcete mať stále aktuálne, povoľte ich.
+
+
+ Podpora
+ Podporte ma!
+ Je bezplatná aplikácia s otvoreným kódom, ktorú robím vo svojom voľnom čase. Ak sa Vám teda páči, neváhajte vyjadriť svoju podporu:
+ Podpora na PayPal
+ Máte radi chyby? Ani ja nie.
+ Povoliť telemetriu a posielať hlásenia o chybe
+
+
+ Späť
+ Ďalej
+ Dokončiť
+
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
new file mode 100644
index 0000000..53c9871
--- /dev/null
+++ b/app/src/main/res/values-sl/strings.xml
@@ -0,0 +1,270 @@
+
+
+
+ Izhod
+ Zapri
+ Da
+ Ne
+ Dodaj
+ Prekliči
+ Shrani
+ Pomoč
+
+
+ Dobrodošli!
+ AdAway je brezplačen in odprtokodni program za zaviranje oglaševanja. Pridobi naslove oglaševalskih omrežij, da jih onemogoči v vaši napravi.\nŽelite izvedeti več? Spodaj preverite pomoč!
+ Prikaži več pomoči
+ Stanje posodobitev
+ Vse hosts datoteke danih virov so prenešene, združene z vašimi osebnimi seznami in nameščene kot ena hosts datoteka na vašem sistemu.
+ Omogoči zaviranje oglasov
+ Onemogoči zaviranje oglasov
+ Spletni strežnik
+ Izvajanje
+ Ustavljeno
+ Zaženite ali zaustavite spletni strežnik na lokalnem gostitelju, da odgovorite na zahteve onemogočenih imen gostiteljev.
+ Omogoči spletni strežnik
+ Onemogoči spletni strežnik
+ VPN
+ Izvajanje
+ Ustavljeno
+ Zaženite ali zaustavite VPN za filtriranje zahtev.
+ Omogoči VPN
+ Onemogoči VPN
+
+
+ Uredi vnos
+ Uporabi
+ Uredi
+ Izbriši
+
+
+ Uvažanje…
+ Varnostna kopija je bila uspešno uvožena iz vaše zunanje shrambe.
+ Uvoz varnostne kopije ni uspel. Je njegova oblika pravilna? Preverite \'logcat\' za več podrobnosti.
+ Izvažanje…
+ Varnostna kopija je bila uspešno izvožena v datoteko \'%s\' na vašo zunanjo shrambo.
+ Datoteke varnostne kopije \'%s\' ni bilo mogoče izvoziti.
+
+
+ Datoteka gostiteljev (hosts)
+ Datoteka gostiteljev je sistemska datoteka, ki preslika imena gostiteljev v naslove IP. Je datoteka z navadnim besedilom, katere Nastavitve upravlja AdAway. Tukaj je nekaj njegovih prvih vrstic:
+ Nalaganje vsebine datoteke gostiteljev…
+ Odpri datoteko gostiteljev
+
+
+ Preveri obstoj posodobitev
+ Preverjanje vira %s za posodobitev
+ Pridobivanje virov
+ Prenašanje vira %s
+ Branje vira %s
+ Razčlenjevanje vira %s
+ Sinhronizacija zbirke podatkov pravil
+ Vrnitev na privzeto datoteko gostiteljev
+ Privzeta datoteka gostiteljev je obnovljena
+ Ustvarjanje privzete hosts datoteke
+ Na voljo je posodobitev vira
+ Na voljo so posodobljene hosts datoteke
+ Ni najdene posodobitve vira
+ Ni omrežne povezave
+ Omrežna povezava ni na voljo
+ Nedosegljivi viri
+ Noben hosts vir ni dosegljiv!
+ Korenski dostop je zavrnjen
+ Dovolite korenski dostop iz vaše korenske aplikacije
+ Nekaj je šlo narobe
+ Preverite \'logcat\' za več podrobnosti
+ Omogočeno
+ Uporabljene so najnovejše hosts datoteke
+ Onemogočeno
+ Nameščena je privzeta datoteka gostiteljev
+ Uporabi najnovejše vire
+ Ustvarjanje nove datoteke gostiteljev
+ Kopiranje nove datoteke gostiteljev
+ Preverjanje kopije datoteke gostiteljev
+ Datoteka \'Hosts\' je bila uspešno posodobljena
+ Nastavitve VPN so bile uspešno posodobljene
+ Vaše nastavitve so se spremenile. Uporabiti jih morate.
+ Uporabi
+ Uporaba novih nastavitev…
+ Novih nastavitev ni bilo mogoče uporabiti.
+
+
+ Manjka simbolna povezava do cilja datoteke gostiteljev
+ Symlink vaše tarče /system/etc/hosts ne obstaja ali ni pravilen! AdAway ne bo deloval, če ne bo kazal na pravo datoteko.\n\nAli želite poizkusiti ustvariti symlink?
+ Symlink ne obstaja
+ Na particiji ni dovolj prostora!\nPoizkusite spremeniti pot hosts datoteke na /data/data/hosts v nastavitvah.
+ Ni dovolj prostora
+ Prenešene datoteke ni mogoče brati.
+ Privatna datoteka spodletela
+ Ponovno montiranje particije z read/write dovoljenjem je spodletelo!
+ Ponovno montiranje spodletelo
+ Datoteke gostiteljev ni bilo mogoče kopirati
+ Kopiranje hosts datoteke spodletelo!
+ Kopiranje spodletelo
+ Uporabljeni viri gostiteljev
+ Uporaba uspešna
+ Uporaba je bila uspešna.\nMorda bo treba znova zagnati Android, za uveljavitev sprememb.\n\nAli želite znova zagnati?\n(Če želite preprečiti izgubo podatkov, se prepričajte, da nobena aplikacija trenutno ne uporablja kartice SD!)
+ Simbolna povezava je bila ustvarjena uspešno.\nMorda bo treba znova zagnati Android, za uveljavitev sprememb.\n\nAli želite znova zagnati?\n(Za preprečitev izgube podatkov se prepričajte, da nobena aplikacija trenutno ne uporablja kartice SD!)
+ Symlink je bil uspešno ustvarjen
+ Android ni mogel ustvariti simbolne povezave.\nTo ne uspe predvsem zaradi \'funkcije\', imenovane S-ON na telefonih HTC!\n\nRešitev je, da telefon zaženete v obnovitveni način in tam ustvarite simbolno povezavo z \'ln -s / data/data/hosts /system/etc/hosts\'.\n\nČe to ne deluje, poiščite na spletu S-OFF in svoj telefon.
+ Ustvarjanje symlink-a je spodletelo
+ Prosimo, preberite pomoč za več informacij.
+ V vašem Androidu je nastavljen namestniški strežnik APN!\nAdAway ne bo zanesljivo deloval v mobilnih omrežjih, kot je 3G. Ta namestniški strežnik lahko deaktivirate tako, da odprete izbrano APN (v aplikaciji Nastavitve: Omrežje in internet -> Mobilno omrežje -> Napredno -> Imena dostopnih točk) in odstranite vrednost v polju namestniškega strežnika.
+ APN proxy nastavljen!
+ Omrežna povezava ni vzpostavljena.
+ Ni povezave
+ Prenašanje…
+ Uporabljanje…
+ Uporabljanje seznama blokiranih in dovoljenih virov
+ Združevanje hosts datotek
+ Izgradnja hosts datotek
+ Uporabljanje hosts datotek
+ Nove datoteke gostiteljev ni bilo mogoče uporabiti.
+ Uporaba hosts datotek na vašem sistemu je spodletela!\nPoizkusite spremeniti pot hosts datoteke na /data/data/hosts v nastavitvah.
+ Uporaba neuspešna
+ Preverite svojo aplikacijo za upravljanje korena, da zagotovite, da je odobren korenski dostop.
+ Povrnili ste se na privzeto datoteko gostiteljev.\nMorda bo treba znova zagnati Android za uveljavitev sprememb.\n\nAli želite znova zagnati?\n(Za preprečitev izgube podatkov se prepričajte, da nobena aplikacija trenutno ne uporablja kartice SD !)
+ Povrnitev uspešna
+ Datoteke gostiteljev ni mogoče povrniti
+ Povrnitev spodletela zaradi neznanega razloga.
+ Povrnitev neuspešna!
+ Noben od vaših uporabljenih hosts virov ni dosegljiv! Ali ste pravilno povezani na omrežje?
+ Prenos spodletel
+ Nove datoteke zasebnih gostiteljev ni bilo mogoče napisati
+ Privatne datoteke ni bilo mogoče ustvariti.
+ Privatne datoteke ni bilo mogoče ustvariti.
+ Omogočili ste brezsistemski način.\nMorda bo treba znova zagnati Android, za uveljavitev sprememb.\n\nAli želite znova zagnati?\n(Za preprečitev izgube podatkov se prepričajte, da nobena aplikacija trenutno ne uporablja kartice SD!)
+ Uspešno omogočeno
+ Onemogočili ste brezsistemski način.\nMorda bo treba znova zagnati Android za uveljavitev sprememb.\n\nAli želite znova zagnati?\n(Za preprečitev izgube podatkov, se prepričajte, da nobena aplikacija trenutno ne uporablja kartice SD!)
+ Uspešno onemogočeno
+ Zaviranja oglasov VPN ni bilo mogoče omogočiti.
+ Zaviiranja oglasov VPN ni bilo mogoče onemogočiti.
+ Omogočanje gostiteljskega modula Magisk
+ Omogočite funkcijo brezsistemskih gostiteljev v upravitelju Magisk. V nastavitvah omogočite možnost Brezsistemski gostitelji in znova zaženite napravo.
+ Onemogočanje gostiteljskega modula Magisk
+ Onemogočite funkcijo brezsistemskih gostiteljev v upravitelju Magisk. S seznama modulov odstranite Brezsistemske gostitelje in znova zaženite napravo.
+
+
+ Vnesi URL do hosts datoteke:
+ Neveljavno domensko ime!
+ Nepravilno oblikovano domensko ime
+ Neveljaven IP!
+ Nepravilno oblikovan IP
+ Nikoli znova ne zaženi in naslednjič ne pokaži tega vprašanja!
+ Nalaganje…
+
+
+ Osveži
+ Dodaj
+ Pomoč
+ Uvozi varnostno kopijo
+ Izvozi varnostno kopijo
+
+
+ S-ON/S-OFF
+ Pogosto postavljena vprašanja
+ Težave
+
+
+ Oglaševalski programi
+ Tukaj lahko najdete nameščeno oglaševalske programe, slabe aplikacije, ki jih AdAway ne more zavirati. Te aplikacije uporabljajo na primer obvestila Airpush, ki se prikažejo, tudi ko se aplikacija ne izvaja, ali celo spremenijo melodijo zvonjenja. Edini razpoložljivi protiukrep je odstranitev teh aplikacij s klikom na vnose seznama.
+ Pregled…
+ Oglaševalski programi niso bili najdeni!
+
+
+ Ad blocker
+ Nameščen ni noben urejevalec teksta
+ Nameščen ni noben urejevalec teksta. Namestite lahko aplikacijo Jota ali katerikoli drug urejevalnik teksta.\n\nAli želite namestiti Jota?
+ Noben raziskovalec ni nameščen
+ Noben raziskovalec ni nameščen. Namestite lahko aplikacijo OI File Manager ali katerikoli drug raziskovalec.\n\nAli želite namestiti OI File Manager?
+
+
+ Odlagališče TCP
+ Tcpdump je orodje za nadziranje DNS zahtev in njihovo shranjevanje v log datoteko. Zaženete jo lahko v ozadju, zaženete aplikacijo, ki prikazuje oglase, ter analizirate DNS zahteve preko log datoteke. Morebitne oglaševalne strežnike lahko potem dodate na vašo blacklist-o.
+ Onemogoči spremljanje
+ Omogoči spremljanje
+ Prikaži rezultate
+ Razvrsti domene
+ Počisti dnevnik
+ Dodaj vnos na seznam nedovoljenih
+ Dodaj vnos na seznam dovoljenih
+ Dodaj vnos na seznam preusmeritev
+
+ Uredi vrednost nastavitev besedila
+ Odpri meni
+ Zapri meni
+
+
+
+ Home
+ Hosts viri
+ Your lists
+ Odpri hosts datoteko
+ Log DNS requests
+ Scan for adware
+ Nastavitve
+ Pomoč
+
+
+
+
+ Zahteve DNS
+ Vaši seznami
+ Nastavitve
+
+
+ Nameščen pred %1$s
+ Posodobljen za %1$s
+ Potrebna posodobitev za %1$s
+ Zadnja posodobitev pred %1$s
+ Neznano stanje posodobitve
+ Onemogočeno
+ nekaj minut
+
+ %d minuto
+ %d minutama
+ %d minutami
+ %d minutami
+
+
+ %d uro
+ %d urama
+ %d urami
+ %d uro
+
+
+ %d dan
+ %d dneva
+ %d dnevi
+ %d dnevi
+
+
+ %d mesec
+ %d meseca
+ %d meseci
+ %d mesec
+
+
+
+ Gostitelj kopiran v odložišče
+
+
+ začet
+ aktiven
+ zaustavitev
+ počakajte na omrežje
+ ponovno povezovanje
+ napaka pri ponovni povezavi
+ začasno ustavljen
+ ustavljen
+ Zaviralec oglasov VPN %1$s
+ Premor
+ Nadaljuj
+
+
+ AdAway dovoljenja
+ Dovoli interakcijo z AdAway
+ Pošlji ukaze v AdAway
+ Dovoli pošiljanje ukazov v AdAway, kot je omogočanje ali onemogočanje sistemskega zaviranja oglasov
+
+
diff --git a/app/src/main/res/values-sl/strings_app.xml b/app/src/main/res/values-sl/strings_app.xml
new file mode 100644
index 0000000..294a7a4
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Odprtokodni zaviralec oglasov
+ Logotip AdAway
+
diff --git a/app/src/main/res/values-sl/strings_errors.xml b/app/src/main/res/values-sl/strings_errors.xml
new file mode 100644
index 0000000..71d48ef
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Ni internetne povezave
+ Ni mogoče vzpostaviti povezave z internetom. Preverite povezljivost vaše naprave.
+ Prenos vira gostiteljev ni uspel
+ Noben od vaših omogočenih virov gostiteljev ni dosegljiv. Preverite, ali ste pravilno povezani z internetom.
+
+ Zasebne datoteke ni bilo mogoče ustvariti
+ Ni mogoče ustvariti zasebne datoteke za izdelavo novega vira gostiteljev. Preverite prosti prostor na vaši napravi.
+ Ni dovolj prostora
+ Ni mogoče kopirati datoteke gostiteljev na sistemsko particijo. Preverite, ali je nesistemski modul Magisk omogočen, nato znova zaženite.
+ Namestitev nove datoteke gostiteljev ni uspela
+ Datoteke gostiteljev ni mogoče kopirati na /sistemsko particijo. Preverite, ali je nesistemski modul Magisk omogočen, nato znova zaženite.
+ Datoteke gostiteljev ni bilo mogoče povrniti
+ Ni mogoče obnoviti privzetih nastavitev datoteke gostiteljev.
+
+ Zaviranja oglasov VPN ni bilo mogoče omogočiti.
+ Preverite svoje nastavitve VPN, da dovolite zagon aplikacije VPN.
+ Zaviiranja oglasov VPN ni bilo mogoče onemogočiti.
+ Preverite nastavitve VPN, da ga ročno onemogočite.
+
diff --git a/app/src/main/res/values-sl/strings_home.xml b/app/src/main/res/values-sl/strings_home.xml
new file mode 100644
index 0000000..62a96ca
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Onemogočeno
+ Dovoljeno
+ Preusmerjeno
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+ %d up-to-date sources
+ %d posodobljenih virov
+
+
+ %d outdated source
+ %d outdated sources
+ %d outdated sources
+ %d zastarelih virov
+
+ Preveri posodobitve gostiteljev
+ Posodobi gostitelje
+
+
+ Prikaži dnevnik zahtev DNS
+
+
+ Prikaži pomoč\in namige
+
+
+ Odpri stran GitHub
+
+
+ Podpri projekt
+
+
+ Projekt GitHub
+ Nastavitve
+
+
+ Odpri predal za krmarjenje
+ Začasno ustavi/nadaljuj zaviranje oglasov
+ Posodobi onemogočene domene
+ Prikaži zahtevane domene
+
+
+ Prosimo, preberite pomoč za več informacij.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sl/strings_hosts.xml b/app/src/main/res/values-sl/strings_hosts.xml
new file mode 100644
index 0000000..debca6e
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts viri
+
+ Uporabniški seznam
+ Uradni gostitelji AdAway
+ Poenoteni gostitelji StevenBlack
+ Gostitelji seznama zaviranih Pete Lowe
+
+ ni na voljo
+ %s gostiteljev
+
+ Dodaj vir
+ Uredi vir
+ URL: (a https:// ali datoteka:// resource)
+ Izvorni URL gostiteljev
+
diff --git a/app/src/main/res/values-sl/strings_lists.xml b/app/src/main/res/values-sl/strings_lists.xml
new file mode 100644
index 0000000..081d44c
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Vaši seznami
+ Dodaj gostitelja
+
+ Onemogočeno
+ Dovoljeno
+ Preusmerjeno
+
+ Filtriraj gostitelje
+ Poišči ime gostitelja…
+ Preklopi vire
+
+ Dodaj gostitelja na seznam nedovoljenih
+ Dodaj gostitelja na seznam dovoljenih
+ Dodaj preusmeritev gostitelja
+ Uredi gostitelja na seznamu nedovoljenih
+ Uredi gostitelja na seznamu dovoljenih
+ Uredi preusmeritev
+ Ime gostitelja:
+ URL vira gostiteljev
+ (Dovoljena sta nadomestna znaka * in ?)
+ IP (IPv4 ali IPv6):
+
diff --git a/app/src/main/res/values-sl/strings_log.xml b/app/src/main/res/values-sl/strings_log.xml
new file mode 100644
index 0000000..96957ff
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Preklopi snemanje dnevnika
+ Pritisnite zapis, da začnete beležiti zahteve, brskate po spletu ali uporabljati aplikacije, nato se vrnite nazaj ali povlecite, da osvežite dnevnike.
+ \n\nBlokirane zahteve ne bodo zabeležene. Najprej onemogočite blokiranje oglasov, če jih želite tudi prijaviti.
+
+ Abecedno razvrščanje
+ Razvrsti domene najvišje ravni
+
+ Preusmeri domeno
+
diff --git a/app/src/main/res/values-sl/strings_notification.xml b/app/src/main/res/values-sl/strings_notification.xml
new file mode 100644
index 0000000..e7d904c
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Posodobitve
+ Obvestila o novih posodobitvah
+ Na voljo je posodobitev vira
+ Novejše datoteke gostiteljev so na voljo za prenos.
+ Na voljo je posodobitev aplikacije
+ Nova različica AdAway je na voljo za prenos.
+
+ VPN
+ Obvestila o delovanju VPN
+
diff --git a/app/src/main/res/values-sl/strings_prefs_backup_restore.xml b/app/src/main/res/values-sl/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..445d9aa
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Varnostno kopiraj in obnovi
+ Varnostno kopiraj
+ Varnostno kopirajte svoja pravila zaviranja na zunanjo shrambo
+ Obnovi
+ Obnovite svoja pravila zaviranja iz varnostne kopije
+
diff --git a/app/src/main/res/values-sl/strings_prefs_main.xml b/app/src/main/res/values-sl/strings_prefs_main.xml
new file mode 100644
index 0000000..1bbac50
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Nastavitve
+
+ Splošno
+ Temna tema
+
+ Svetla
+ Temna
+ Sistemska privzeta
+
+ Samodejne posodobitve
+
+ Zaviranje oglasov
+ Zaviralec oglasov na osnovi korenskega sistema
+ Zaviralec oglasov na osnovi VPN
+ Omogoči podporo za IPv6
+ Varnostno kopiraj/obnovi pravila zaviranja
+
+ Odpravi napake programa
+ Pošlji poročila o zrušitvah
+ Prijavi na Sentry (sentry.io)
+ Ni podprto v tej zgradbi
+ Podrobno beleženje
+ Za uporabo je potreben ponovni zagon aplikacije
+
diff --git a/app/src/main/res/values-sl/strings_prefs_root.xml b/app/src/main/res/values-sl/strings_prefs_root.xml
new file mode 100644
index 0000000..eb65daa
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Zaviralec oglasov na osnovi korenskega sistema
+
+ Namesti gostitelje
+ Odpri hosts datoteko
+ Uporabljena hosts datoteka
+ Pred uporabo te funkcije preberite pomoč
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Cilj po meri
+
+ Ciljno mesto po meri
+ Po uporabi skrij pogovorno okno za ponovni zagon
+
+ Preusmeritev
+ Določite, kam želite preusmeriti nemogočene gostitelje
+ Nastavite preusmeritev IPv4
+ Nastavite preusmeritev IPv6
+ Neveljavna preusmeritev
+
+ Lokalni spletni strežnik
+ Lokalni spletni strežnik posluša lokalne naslove IP, da odgovori na zahteve po onemogočenih imenih gostiteljev. Morda pomaga pri zamrznitvi aplikacije pri onemogočeni povezavi.
+ Omogoči spletni strežnik
+ Preizkusni spletni strežnik
+ Namesti samopodpisano potrdilo
+ Ročna namestitev potrdila
+ Od Androida 11 (R) naprej aplikacija ne more več samodejno namestiti overitelja potrdil (CA).\n\nPojdite na nastavitve \'Varnost\', \'Šifriranje in poverilnice\' in nato \'Namesti potrdilo\'. Od tam izberite \'Potrdilo CA\' in izberite novo izvoženo datoteko potrdila.
+ Odpri nastavitve \'Varnost\'
+ Preverjanje…
+ Ne izvaja se
+ Izvaja se, vendar potrdilo ni nameščeno
+ Izvaja se in potrdilo je nameščeno
+ Zamenjajte prazen oglasni prostor z ikono aplikacije
+
diff --git a/app/src/main/res/values-sl/strings_prefs_update.xml b/app/src/main/res/values-sl/strings_prefs_update.xml
new file mode 100644
index 0000000..a7d6cfa
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Posodobitve
+ Obvestila so onemogočena
+ Obvestila aplikacije ne bodo prikazana. Tapnite, da jih omogočite.
+
+ Posodobitve aplikacije
+ Preveri posodobitev ob zagonu
+ Občasno preveri obstoj posodobitev
+ Vključi izdaje beta
+
+ Posodobitve gostiteljev
+ Preveri obstoj posodobitev ob zagonu
+ Občasno preveri obstoj posodobitev
+ Sinhroniziraj ob posodobitvi
+ Sinhroniziraj samo v neomejenem omrežju
+
diff --git a/app/src/main/res/values-sl/strings_prefs_vpn.xml b/app/src/main/res/values-sl/strings_prefs_vpn.xml
new file mode 100644
index 0000000..11d6a98
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Zaviralec oglasov na osnovi VPN
+
+ Omogoči ob zagonu
+ Spremljaj povezavo
+ Občasno preveri stanje omrežja za ponovni zagon VPN ob prekinitvi povezave.
+
+ Izključene aplikacije
+ Nastavite, katere aplikacije ne smejo uporabljati VPN, da nobena povezava ne bo onemogočena.
+ Izključi sistemske aplikacije
+
+ Brez
+ Vse razen brskalnikov
+ Vse
+
+ Izključi uporabniške aplikacije
+
+
+ Izključene aplikacije
+ Izberi vse
+ Počisti izbor vseh
+ Ikona aplikacije
+
diff --git a/app/src/main/res/values-sl/strings_source_edit.xml b/app/src/main/res/values-sl/strings_source_edit.xml
new file mode 100644
index 0000000..fa37324
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Uredi vir
+ Dodaj vir
+
+ Oznaka
+ Zahtevana je oznaka
+ Vrsta
+ URL
+ Datoteka
+ Lokacija
+ https://
+ Zahtevana je lokacija
+ Pritisnite Datoteka, da izberete izvorno datoteko
+ Neveljavna lokacija
+ Oblika seznama
+ Onemogoči
+ Dovoli
+ Uporabi preusmerjene gostitelje
+ Dovolitev preusmerjenih gostiteljev lahko povzroči varnostne težave. Te nastavitve uporabljajte samo na zaupanja vrednem viru, saj lahko preusmeri del občutljivega prometa na kateri koli strežnik, ki ga želi.
+
diff --git a/app/src/main/res/values-sl/strings_support.xml b/app/src/main/res/values-sl/strings_support.xml
new file mode 100644
index 0000000..c65ff13
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Podpora
+ Postani pokrovitelj
+
diff --git a/app/src/main/res/values-sl/strings_update.xml b/app/src/main/res/values-sl/strings_update.xml
new file mode 100644
index 0000000..97cb016
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Posodobitev AdAway
+
+ Na voljo je posodobitev!
+
+
+ Ste na tekočem
+ Na voljo je nova posodobitev
+ Posodabljanje AdAway
+ Posodobi zdaj
+ %1$s/%2$s
+ Zadnje spremembe
+ Dnevnik sprememb
+ Podprite razvoj
+ Daruj
+ Pokrovitelj
+
+
+ Prenos najnovejše različice AdAway…
+
diff --git a/app/src/main/res/values-sl/strings_welcome.xml b/app/src/main/res/values-sl/strings_welcome.xml
new file mode 100644
index 0000000..c89178f
--- /dev/null
+++ b/app/src/main/res/values-sl/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Dobrodošli
+ Prvi korak čarovnika
+ Drugi korak čarovnika
+ Zadnji korak čarovnika
+
+
+ Dobrodošli v AdAway!
+ AdAway ponuja dva načina zaviranja oglasov. Izberite tistega, ki vam je všeč:
+
+ Logotip korena
+ Zaviranje oglasov\nna osnovi korena
+ Hitreje
+ Prijazen z baterijo
+ Zahtevan je korenski dostop
+
+ Logotip VPN
+ Zaviranje oglason\nna podlagi korena
+ Počasneje
+ Zaženi v ozadju
+ Združljivost
+
+ Potreben je root dostop
+ Dvojiške datoteke \'su\' ni bilo mogoče najti ali pa niste dovolili korenskega dovoljenja za AdAway.\n\nTo se lahko zgodi, če vaša naprava nima dostop do korena. Informacije o tem, kako povezati svojo napravo s korenom, najdete na wiki.lineageos.org ali drugih spletnih straneh za Android.
+
+ Pro
+ Con
+
+
+ Sinhronizacija je končana
+ Napaka med sinhronizacijo
+
+ Sinhronizacija
+ Sinhronizirano!
+ AdAway iz spletnih virov prenese oglasna omrežja, ki jih blokira. Kasneje jih lahko prilagodite v nastavitvah.
+ Ponovi sinhronizacijo
+ Sinhronizacija %1$s ni uspela: Želite poskusiti znova?
+ Pošilja lahko obvestila prikaza stanja in nadzora zaviranja oglasov ter za obveščanje o razpoložljivih posodobitvah aplikacije (nekaj na leto). Omogočite jih, če želite biti na tekočem.
+
+
+ Podpora
+ Podprite me!
+ AdAway je brezplačna in odprtokodna aplikacija, ki jo razvijam v prostem času. Če vam je všeč, vas prosim, da izkažete svojo podporo:
+ Darujte na PayPal
+ Ali imate radi programske napake? Jaz tudi ne.
+ Omogočite telemetrijo, da mi pošiljate poročila o zrušitvah
+
+
+ Nazaj
+ Naprej
+ Končaj
+
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-sq/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-sq/strings_app.xml b/app/src/main/res/values-sq/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-sq/strings_errors.xml b/app/src/main/res/values-sq/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sq/strings_home.xml b/app/src/main/res/values-sq/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sq/strings_hosts.xml b/app/src/main/res/values-sq/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-sq/strings_lists.xml b/app/src/main/res/values-sq/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-sq/strings_log.xml b/app/src/main/res/values-sq/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-sq/strings_notification.xml b/app/src/main/res/values-sq/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sq/strings_prefs_backup_restore.xml b/app/src/main/res/values-sq/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sq/strings_prefs_main.xml b/app/src/main/res/values-sq/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-sq/strings_prefs_root.xml b/app/src/main/res/values-sq/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-sq/strings_prefs_update.xml b/app/src/main/res/values-sq/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sq/strings_prefs_vpn.xml b/app/src/main/res/values-sq/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-sq/strings_support.xml b/app/src/main/res/values-sq/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sq/strings_update.xml b/app/src/main/res/values-sq/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sq/strings_welcome.xml b/app/src/main/res/values-sq/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-sq/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
new file mode 100644
index 0000000..980eb31
--- /dev/null
+++ b/app/src/main/res/values-sr/strings.xml
@@ -0,0 +1,110 @@
+
+
+
+ Izlaz
+ Zatvori
+ Da
+ Ne
+ Dodaj
+ Otkaži
+ Sačuvaj
+ Pomoć
+
+ Sve host-ove datoteke sa određenih izvora su preuzete, spojene sa vašom listom i instalirane kao datoteke jednog host-a na vašem sistemu.
+ Omogući Ad Blocking
+ Onemogući Ad Blocking
+ Omogući webserver
+ Onemogući webserver
+
+ Uredi ulazak
+ Primeni
+ Uredi
+ Ukloni
+
+
+ Uvoz…
+ Izvoz…
+ Kreiranje standardnog hosts fajla
+ Ažuriranje dostupno
+ Noviji host-ovi fajlovi dostupni
+ Nema internet konekcije
+ Nema dostupne internet konekcije
+ Nedostupni izvori
+ Ne mogu da pristupim ni jednom izvoru hosts fajlova!
+ Omogućeno
+ Noviji host-ovi fajlovi omogućeni
+ Onemogućeno
+ Primeni
+ Simbolički link od tvojeg fajla do /system/etc/hosts ne postoji ili nije dobar. AdAway neće raditi ako ne pokazuje na dobar fajl.\n\nDa li želiš da pokušaš da kreiraš simbolički link?
+ Nedostaje symlink.
+ Na particiji nema dovoljno mesta!\nProbaj da promeniš lokaciju hosts fajla u podešavanjima na /data/data/hosts.
+ Nema dovoljno memorije
+ Preuzeti fajl nije moguće pročitati.
+ Neuspešno kreiranje privatnog fajla
+ Remount particije za čitanje/pisanje nije uspelo!
+ Remount neuspesan
+ Neuspešno kopiranje host-ovih fajlova!
+ Kopiranje neuspešno
+ Primena uspešna
+ Kreiranje symlink-a uspesno
+ Kreiranje symlink-a bez uspesno
+ Molimo da pročitate Pomoć za više informacija.
+ APN proxy postavljen!
+ Konekcija sa internetom ne radi.
+ Nema konekcije
+ Preuzimanje…
+ Primenjivanje…
+ Primenjivanje Crne i Bele liste
+ Raščlanjivanje i spajanje host-ovih fajlova
+ Izgradnja host-ovih fajlova
+ Primenjivanje host-ovih fajlova
+ Primena hosts datoteke na vaš sistem nije uspela!\n Pokušajte promeniti ciljanu hosts datoteku u podešavanjima u /data/data/hosts.
+ Primena neuspešna
+ Vraćanje uspešno
+ Vraćanje neusšerno iz nepoznatih razloga.
+ Vraćanje neuspešno!
+ Nijedan od vaših omogućenih izvora hostova nije dostupan! Da li ste ispravno povezani na internet?
+ Preuzimanje neuspešno
+ Privatni falj ne može biti kreiran.
+ Neuspešno kreiranje privatnog fajla
+ Omogućavanje je uspelo.
+ Onemogućavanje je uspelo
+
+ Ulazni URL do host-ovih fajlova
+ Ovo nije važeći hostname!
+ Nije dobro formirano ime hosta
+ Ovo nije validan IP!
+ Nije dobro formiran IP
+ Učitavanje…
+
+
+ Osveži
+ Dodaj
+ Pomoć
+
+ S-ON/S-OFF
+ Često Postavljena Pitanja
+ Problemi
+
+
+ Ad Blocker
+ Nema instaliranog uređivača teksta
+ Nema instaliranog uređivača teksta za otvaranje hosts datoteke. Možete instalirati Jotu ili slični uređivač teksta.\n\n Želite li da instalirate Jotu?
+ Nije instaliran fajl menadžer
+ Nije moguće pronaći menađžer datoteka za otvaranje datoteka. Možete instalirati OI File Manager-a ili drugi menađžer datoteka.\n\n Želite li da instalirate OI File Manager?
+
+ Tcpdump je alatka za praćenje i čuvanje DNS zahteva u log fajlu. Možete ga pokrenuti u pozadini, pokretanje aplikacija koje pokazuju reklame, i posle toga analiziraju DNS zahtev korišćenjem log fajla. Mogući ad serveri mogu biti dodati u Crnu listu.
+
+
+ Home
+ Host-ovi resursi
+ Your lists
+ Otvori host-ove fajlove
+ Log DNS requests
+ Scan for adware
+ Podešavanja
+ Pomoć
+
+ Podešavanja
+
+
diff --git a/app/src/main/res/values-sr/strings_app.xml b/app/src/main/res/values-sr/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-sr/strings_errors.xml b/app/src/main/res/values-sr/strings_errors.xml
new file mode 100644
index 0000000..126ca8e
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ Nema internet konekcije
+ Nema dovoljno memorije
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sr/strings_home.xml b/app/src/main/res/values-sr/strings_home.xml
new file mode 100644
index 0000000..e22ce2f
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_home.xml
@@ -0,0 +1,9 @@
+
+
+
+ Podešavanja
+
+
+ Molimo da pročitate Pomoć za više informacija.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sr/strings_hosts.xml b/app/src/main/res/values-sr/strings_hosts.xml
new file mode 100644
index 0000000..eaa3076
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_hosts.xml
@@ -0,0 +1,6 @@
+
+
+ Host-ovi resursi
+
+ nije dostupno
+
diff --git a/app/src/main/res/values-sr/strings_lists.xml b/app/src/main/res/values-sr/strings_lists.xml
new file mode 100644
index 0000000..95895da
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_lists.xml
@@ -0,0 +1,6 @@
+
+
+ Your lists
+ Hostname:
+ IP (IPv4 or IPv6):
+
diff --git a/app/src/main/res/values-sr/strings_log.xml b/app/src/main/res/values-sr/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-sr/strings_notification.xml b/app/src/main/res/values-sr/strings_notification.xml
new file mode 100644
index 0000000..e4248c7
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_notification.xml
@@ -0,0 +1,4 @@
+
+
+ Ažuriranje dostupno
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sr/strings_prefs_backup_restore.xml b/app/src/main/res/values-sr/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sr/strings_prefs_main.xml b/app/src/main/res/values-sr/strings_prefs_main.xml
new file mode 100644
index 0000000..b9134df
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_prefs_main.xml
@@ -0,0 +1,6 @@
+
+
+ Podešavanja
+
+ Otklanjanje grešaka
+
diff --git a/app/src/main/res/values-sr/strings_prefs_root.xml b/app/src/main/res/values-sr/strings_prefs_root.xml
new file mode 100644
index 0000000..c655268
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_prefs_root.xml
@@ -0,0 +1,14 @@
+
+
+ Otvori host-ove fajlove
+ Odredišni hosts fajl
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Prilagođeno odredište
+
+
+ Prebacivanje
+ Omogući webserver
+
diff --git a/app/src/main/res/values-sr/strings_prefs_update.xml b/app/src/main/res/values-sr/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sr/strings_prefs_vpn.xml b/app/src/main/res/values-sr/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-sr/strings_support.xml b/app/src/main/res/values-sr/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sr/strings_update.xml b/app/src/main/res/values-sr/strings_update.xml
new file mode 100644
index 0000000..bb7def8
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ Ažuriranje dostupno
+
diff --git a/app/src/main/res/values-sr/strings_welcome.xml b/app/src/main/res/values-sr/strings_welcome.xml
new file mode 100644
index 0000000..e952508
--- /dev/null
+++ b/app/src/main/res/values-sr/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ Neophodan Root-ovan Android
+
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000..6138c3d
--- /dev/null
+++ b/app/src/main/res/values-sv/strings.xml
@@ -0,0 +1,262 @@
+
+
+
+ Avsluta
+ Stäng
+ Ja
+ Nej
+ Lägg till
+ Avbryt
+ Spara
+ Hjälp
+
+
+ Välkommen!
+ AdAway är gratis och öppen källkod gjord för att blockera annonser. Den laddar ner annonsnätverk och konfigurerar din enhet att blockera dem.\nVill du veta mer? Ta en titt på hjälpen nedan!
+ Visa mer hjälp
+ Uppdateringsstatus
+ Alla värdfiler från de förinställda källorna är hämtade, ihopslagna med dina egna listor och tillämpade som en värdfil på ditt system.
+ Aktivera annonsblockering
+ Inaktivera annonsblockering
+ Webbserver
+ Körs
+ Stoppad
+ Starta eller stoppa webbservern från att svara på förfrågningar till blockerade värdnamn.
+ Aktivera webbserver
+ Inaktivera webbserver
+ VPN
+ Körs
+ Stoppad
+ Starta eller stoppa VPN från att filtrera förfrågningar.
+ Aktivera VPN
+ Inaktivera VPN
+
+
+ Redigera post
+ Verkställ
+ Redigera
+ Ta bort
+
+
+ Importerar…
+ Säkerhetskopian importerades framgångsrikt från din externa lagring.
+ Det gick inte att importera säkerhetskopian. Är dess format rätt? Kolla logcat för mer detaljer.
+ Exporterar…
+ Säkerhetskopian exporterades framgångsrikt till filen \'%s\' i din externa lagring.
+ Exporteringen av den säkerhetskopierade filen \'%s\' misslyckades
+
+
+ Värdfilen
+ Värdfilen (HOSTS) är en systemfil som mappar om värdnamn till IP-adresser. Det är en vanlig textfil som AdAway kan hantera. Här är några rader från början av filen:
+ Laddar värdfilens innehåll…
+ Öppna värdfilen
+
+
+ Söker efter uppdateringar
+ Kontrollerar %s-källa för uppdatering
+ Tar emot källor
+ Ladda ner källa %s
+ Läser källan %s
+ Tolkar %s-källa
+ Synkroniserar regel-databas
+ Återställer standardvärdfilen
+ Standard värdfil återställd
+ Skapar standardvärdfil
+ Källuppdatering tillgänglig
+ Nyare värdfiler är tillgängliga
+ Hittade inga källuppdateringar
+ Ingen internetanslutning
+ Ingen internetanslutning tillgänglig
+ Otillgängliga källor
+ Inga värdkällor är nåbara!
+ Root-åtkomst nekad
+ Tillåt root-åtkomst från din root-app
+ Något gick fel
+ Titta i logcat för fler detaljer
+ Aktiverad
+ Nyaste värdfilerna aktiverade
+ Avaktiverad
+ Standard värdfil är installerad
+ Verkställ de senaste källorna
+ Skapar en ny värdfil
+ Kopierar en new värdfil
+ Kontrollerar värdfilskopia
+ Värdfilen uppdaterad
+ VPN-konfigurationen uppdaterad
+ Din konfiguration har ändrats. Den behöver nu verkställas.
+ Verkställ
+ Verkställer den nya konfigurationen…
+ Det gick inte att verkställa den nya konfigurationen.
+
+
+ Symlinken till värdfilsmålet saknas
+ Symlink från ditt mål till /system/etc/hosts existerar ej eller är inkorrekt! AdAway kommer inte fungera om den inte pekar på rätt fil.\n\nVill du försöka skapa en symlink?
+ Symlink saknas
+ Inte tillräckligt med utrymme på partitionen!\nFörsök ändra målvärdfil i inställningarna till /data/data/hosts.
+ Inte tillräckligt med utrymme
+ Hämtade filen kunde inte läsas.
+ Privat fil misslyckades
+ Ommontering av partitionen som läs/skriv misslyckades!
+ Ommontering misslyckades
+ Det gick inte att kopiera värdfilen
+ Kopiering av värdfil misslyckades!
+ Kopiering misslyckades
+ Verkställda värdkällor
+ Verkställd
+ Verkställning lyckades.\nDet kan bli nödvändigt att starta om enheten för att ändringarna ska träda i kraft.\n\nVill du starta om?\n(För att förhindra dataförlust, se till att ingen app använder SD-kortet för tillfället!)
+ En symbolisk länk har skapats.\nDet kan bli nödvändigt att starta om enheten för att ändringarna ska träda i kraft.\n\nVill du starta om?\n(För att förhindra dataförlust, se till att ingen app använder SD-kortet för tillfället!)
+ Symlink skapad utan problem
+ Symlink kunde ej skapas av Android.\nDetta fel beror oftast på en \'funktion\' som kallas S-ON på HTC-telefoner!\n\nEn lösning är att boota telefonen i återställningsläge och skapa en symlink därifrån med \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nOm detta inte fungerar, sök på internet efter S-OFF och din telefonmodell.
+ Skapande av symlink misslyckades
+ Läs Hjälp för mer information.
+ En APN-proxy är inställd på din Android!\nAdAway fungerar inte lika tillförlitligt på mobila nätverk som på 3G. Du kan inaktivera proxyn genom att gå till din valda APN (från appen Inställningar: Nätverk & Internet -> Mobilnätverk -> Avancerat -> Åtkomstpunktsnamn) och ta bort värdet i proxyfältet.
+ APN-proxy inställt!
+ Internetanslutningen fungerar ej.
+ Ingen anslutning
+ Hämtar…
+ Verkställer…
+ Verkställer Svartlista och Vitlista
+ Tolkar och slår ihop värdfiler
+ Bygger värdfil
+ Verkställer värdfil
+ Det gick inte att verkställa den nya värdfilen.
+ Verkställning av värdfil på systemet misslyckades!\nFörsök ändra målvärdfil i inställningarna till /data/data/hosts.
+ Verkställning misslyckades
+ Kontrollera din root-hanteringsapp för att säkerställa att root-åtkomst har beviljats.
+ Du har återgått till standard värdfil.\nDet kan vara nödvändigt att starta om Android för ändringarna ska träda i kraft.\n\nVill du starta om?\n(För att förhindra förlust av data, se till att SD-kortet inte används av en app!)
+ Återställd
+ Det går inte att återställa värdfilen
+ Återställningen misslyckades av okända skäl.
+ Återställning misslyckades!
+ Ingen av dina aktiva värdkällor kan nås! Är du ansluten till Internet?
+ Nerladdningen misslyckades
+ Det gick inte att skriva en ny privat värdfil
+ Det går inte att skapa en privat fil.
+ Skapande av privat fil misslyckades
+ Du har aktiverade systemlöst läge.\nDet kan bli nödvändigt att starta om enheten för att ändringarna ska träda i kraft. \n\nVill du starta om?\n(För att förhindra dataförlust se till att ingen app använder SD-kortet för tillfället!)
+ Aktivering lyckades
+ Du inaktiverade systemlöst läge.\nDet kan bli nödvändigt att starta om enheten för att ändringarna ska träda i kraft. \n\nVill du starta om?\n(För att förhindra dataförlust se till att ingen app använder SD-kortet för tillfället!)
+ Inaktiverad
+ Det gick inte att aktivera VPN-annonsblockeringen.
+ Det gick inte att inaktivera VPN-annonsblockeringen
+ Aktiverar värdfil Magisk-modul
+ Aktivera systemlöst läge i Magisk manager. I inställningarna, aktivera alternativet Systemless hosts och starta sedan om enheten.
+ Inaktiverar värdfil Magisk-modul
+ Inaktivera systemlöst läge i Magisk manager. I modullistan, avinstallera modulen Systemless hosts och starta sedan om enheten.
+
+
+ Importera URL till värdfil:
+ Detta är inget giltigt värdnamn!
+ Felaktigt utformat värdnamn
+ Detta är inte en korrekt IP-adress!
+ Felaktigt utformad IP-adress
+ Starta aldrig om och visa inte denna frågan igen!
+ Laddar…
+
+
+ Uppdatera
+ Lägg till
+ Hjälp
+ Importera säkerhetskopia
+ Exportera säkerhetskopia
+
+
+ S-ON/S-OFF
+ FAQ
+ Problem
+
+
+ Annonsappar
+ Här hittar du installerade annonsappar, stygga applikationer som inte kan blockeras med AdAway. Dessa appar använder till exempel Airpush-aviseringar som kan visa sig även om appen inte körs och den kan även ändra din ringsignal. Den enda tillgängliga lösningen är att avinstallera dessa appar genom att trycka i listan.
+ Söker…
+ Hittade inga annonsappar!
+
+
+ Annonsblockerare
+ Ingen textredigerare installerad
+ Ingen textredigerare kunde hittas för att öppna värdfilen. Du kan installera Jota eller andra textredigerare att hantera detta.\n\nVill du installera Jota nu?
+ Ingen filhanterare installerad
+ Ingen filhanterare kunde hittas för att öppna filer. Du kan installera OI File Manager eller andra filhanterare att hantera detta.\n\nVill du installera OI File Manager nu?
+
+
+ Tcpdump
+ Tcpdump är ett verktyg för att övervaka DNS-förfrågningar och spara dem i en loggfil. Du kan starta det i bakgrunden, köra program som visar annonser, och efteråt analysera DNS-förfrågningarna med hjälp av loggfilen. Möjlig annonsserver kan då läggas till på din svartlista.
+ Inaktivera övervakning
+ Aktivera övervakning
+ Visa resultatet
+ Sortera domänerna
+ Rensa loggen
+ Lägg till post till svartlistan
+ Lägg till post till vitlistan
+ Lägg till post till omdirigeringslista
+
+ Redigera textinställningsvärden
+ Öppna meny
+ Stäng meny
+
+
+
+ Hem
+ Värdkällor
+ Dina listor
+ Öppna värdfil
+ Logga DNS-förfrågningar
+ Sök efter adware
+ Inställningar
+ Hjälp
+
+
+
+
+ DNS-förfrågningar
+ Dina listor
+ Inställningar
+
+
+ Installerad för %1$s sedan
+ %1$s behöver inte uppdateras
+ %1$s behöver uppdateras
+ Senaste uppdateringen %1$s sedan
+ Okänd uppdaterigsstatus
+ Avaktiverad
+ några minuter
+
+ %d minut
+ %d minuter
+
+
+ %d timme
+ %d timmar
+
+
+ %d dag
+ %d dagar
+
+
+ %d månad
+ %d månader
+
+
+
+ Värden kopierades till klippbordet
+
+
+ startar
+ aktiv
+ stoppar
+ vänta på nätverket
+ återanslutning
+ återanslutningsfel
+ pausad
+ stoppad
+ Annonsblockerare VPN %1$s
+ Pausa
+ Tryck för att återuppta
+
+
+ Behörigheter för AdAway
+ Tillåt interaktion med AdAway
+ Aktivera och inaktivera systemets annonsblockering
+ Tillåt att skicka kommandon till AdAway exempelvis aktivering eller inaktivering av annonsblockering för hela systemet
+
+
diff --git a/app/src/main/res/values-sv/strings_app.xml b/app/src/main/res/values-sv/strings_app.xml
new file mode 100644
index 0000000..24a00fd
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Open Source annonsblockerare
+ AdAway-logotyp
+
diff --git a/app/src/main/res/values-sv/strings_errors.xml b/app/src/main/res/values-sv/strings_errors.xml
new file mode 100644
index 0000000..36fe31a
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Ingen internetanslutning
+ Det går inte att upprätta en anslutning till internet. Kontrollera anslutningen på din enhet.
+ Det gick inte att ladda ner värdkälla
+ Ingen av dina aktiverade värdkällor är åtkomliga. Kontrollera att du är ansluten till internet.
+
+ Det gick inte att skapa privat fil
+ Det gick inte att skapa en privat fil att bygga ett nytt värdkälla. Kontrollera att du ha tillgängligt med ledigt utrymme på din enhet.
+ Inte tillräckligt med utrymme
+ Det gick inte att kopiera värdfilen till systempartitionen. Kontrollera att den systemlösa modulen i Magisk är aktiverad och starta sedan om.
+ Det gick inte att installera den nya värdfilen
+ Det gick inte att kopiera värdfilen till partitionen /system. Kontrollera att den systemlösa modulen i Magisk är aktiverad och starta sedan om.
+ Det gick inte att återställa värdfilen
+ Det gick inte att återställa standard värdfilskonfiguration.
+
+ Det gick inte att aktivera VPN-annonsblockeringen.
+ Kontrollera dina VPN-inställningar och auktorisera applikationen VPN så att den startar.
+ Det gick inte att inaktivera VPN-annonsblockeringen
+ Kontrollera dina VPN-inställningar för att inaktivera det manuellt.
+
diff --git a/app/src/main/res/values-sv/strings_home.xml b/app/src/main/res/values-sv/strings_home.xml
new file mode 100644
index 0000000..9f2927c
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Blockerad
+ Tillåten
+ Omdirigerad
+
+
+
+ %d uppdaterad källa
+ %d uppdaterade källor
+
+
+ %d inaktuell källa
+ %d inaktuella källor
+
+ Check for hosts updates
+ Uppdatera värdar
+
+
+ Show DNS request log
+
+
+ Show help\nand tips
+
+
+ Öppna GitHub-sidan
+
+
+ Stöd projektet
+
+
+ GitHub project
+ Inställningar
+
+
+ Öppna navigeringsmapp
+ Pausa/återuppta annonsblockering
+ Uppdatera blockerade domäner
+ Visa begärda domäner
+
+
+ Läs Hjälp för mer information.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sv/strings_hosts.xml b/app/src/main/res/values-sv/strings_hosts.xml
new file mode 100644
index 0000000..3a25f9b
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Värdkällor
+
+ Användarlista
+ Oficiella AdAway-källor
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ ej tillgänglig
+ %s värdkällor
+
+ Lägg till källa
+ Redigera källa
+ URL: (använd https:// eller file://-resurs)
+ Värdkällans webbadress
+
diff --git a/app/src/main/res/values-sv/strings_lists.xml b/app/src/main/res/values-sv/strings_lists.xml
new file mode 100644
index 0000000..eec3eea
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Dina listor
+ Lägg till värd
+
+ Blockerad
+ Tillåten
+ Omdirigerad
+
+ Filtrera värdar
+ Sök värdnamn…
+ Växla källor
+
+ Lägg till värd till svartlistan
+ Lägg till värd till vitlistan
+ Lägg till värdomdirigering
+ Redigera svartlistad värd
+ Redigera vitlistad värd
+ Redigera omdirigering
+ Värdnamn:
+ Värdkällans webbadress
+ (Jokertecknen * och ? är tillåtna)
+ IP-adress (IPv4 eller IPv6):
+
diff --git a/app/src/main/res/values-sv/strings_log.xml b/app/src/main/res/values-sv/strings_log.xml
new file mode 100644
index 0000000..e665954
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Stänga av/sätt på logginspelning
+ Tryck på spela in för att börja logga förfrågningar, surfa på webben eller använd appar, gå sedan tillbaka eller svep för att uppdatera loggarna.
+ \n\nBlockerade förfrågningar kommer inte att loggas. Inaktivera annonsblockering först om du också vill logga dem.
+
+ Alfabetisk sortering
+ Toppleveldomän
+
+ Omdirigera domän
+
diff --git a/app/src/main/res/values-sv/strings_notification.xml b/app/src/main/res/values-sv/strings_notification.xml
new file mode 100644
index 0000000..0c23d35
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Uppdateringar
+ Nya uppdateringsaviseringar
+ Källuppdatering tillgänglig
+ Nyare värdfiler finns att ladda ner.
+ App-uppdatering tillgänglig
+ En ny version av AdAway finns att ladda ner.
+
+ VPN
+ VPN-aviseringar
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sv/strings_prefs_backup_restore.xml b/app/src/main/res/values-sv/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..f742488
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Säkerhetskopiera & återställa
+ Säkerhetskopiera
+ Säkerhetskopiera dina blockeringsregler till extern lagring
+ Återställ
+ Återställ dina blockeringsregler från säkerhetskopia
+
diff --git a/app/src/main/res/values-sv/strings_prefs_main.xml b/app/src/main/res/values-sv/strings_prefs_main.xml
new file mode 100644
index 0000000..9fe0c6e
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Inställningar
+
+ Allmänt
+ Mörk tema
+
+ Ljust
+ Mörkt
+ Systemstandard
+
+ Automatisk uppdatering
+
+ Annonsblockering
+ Root-baserad annonsblockering
+ VPN-baserad annonsblockering
+ Aktivera IPv6-stöd
+ Säkerhetskopiera / återställ blockregler
+
+ Felsökning
+ Skicka kraschrapport
+ Rapportera till Sentry (sentry.io)
+ Stöds inte i denna versionen
+ Utökad loggning
+ Appen måste startas om för att verkställas
+
diff --git a/app/src/main/res/values-sv/strings_prefs_root.xml b/app/src/main/res/values-sv/strings_prefs_root.xml
new file mode 100644
index 0000000..cff41f6
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Root-baserad annonsblockering
+
+ Värd installerad
+ Öppna värdfil
+ Målvärdfil
+ Läs hjälpen innan du använder denna funktionen
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Anpassat mål
+
+ Anpassad målplats
+ Dölj omstartsdialog efter verkställ
+
+ Omdirigering
+ Definiera var du ska omdirigera blockerade värdar
+ IPv4-omdirigering
+ IPv6-omdirigering
+ Ogiltig omdirigering
+
+ Lokal webbserver
+ Den lokala webbservern lyssnar på lokala IP-adresser till att svara på blockerade värdnamsförfrågningar. Det kan förhindra appfrysningar på blockerade anslutningar.
+ Aktivera webbserver
+ Testa webbservern
+ Installera självsignerat certifikat
+ Installera certifikat manuellt
+ Med start i Android 11 (R) kan appar inte längre automatiskt installera certifikat (CA). \n\Gå till Säkerhet under Inställningar, \"Kryptering & Certifikat\" och \"Installera ett certifikat\". Här väljer du \"CA-certifikat\" och väljer den certifikatfil som du nyss exporterade.
+ Öppna Säkerhetsinställningar
+ Kontrollerar…
+ Körs inte
+ Körs men utan installerat certifikat
+ Körs med installerat certifikat
+ Ersätt tomt annonsutrymme med en appikon
+
diff --git a/app/src/main/res/values-sv/strings_prefs_update.xml b/app/src/main/res/values-sv/strings_prefs_update.xml
new file mode 100644
index 0000000..5086a87
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Uppdateringar
+
+ Applikationsuppdateringar
+ Sök efter uppdatering vid uppstart
+ Sök regelbundet efter uppdateringar
+ Inkludera betautgåvor
+
+ Värduppdateringar
+ Sök efter uppdatering vid uppstart
+ Sök regelbundet efter uppdateringar
+ Synkronisera vid uppdatering
+ Synkronisera endast på nätverk med obegränsad data
+
diff --git a/app/src/main/res/values-sv/strings_prefs_vpn.xml b/app/src/main/res/values-sv/strings_prefs_vpn.xml
new file mode 100644
index 0000000..6bb09b7
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN-baserad annonsblockering
+
+ Aktivera vid uppstart
+ Övervaka anslutning
+ Kontrollera periodvis nätverkets tillstånd för att starta om VPN vid urkoppling.
+
+ Exkluderade applikationer
+ Konfigurera vilken applikation som inte ska använda VPN så ingen anslutning blockeras.
+ Exkludera systemapplikationer
+
+ Inga
+ All except browsers
+ Alla
+
+ Exkludera användarapplikationer
+
+
+ Exkluderade applications
+ Markera alla
+ Avmarkera alla
+ Applikationsikon
+
diff --git a/app/src/main/res/values-sv/strings_support.xml b/app/src/main/res/values-sv/strings_support.xml
new file mode 100644
index 0000000..49d1723
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Support
+ Bli en sponsor
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sv/strings_update.xml b/app/src/main/res/values-sv/strings_update.xml
new file mode 100644
index 0000000..ab54061
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Uppdatera AdAway
+
+ Uppdatering tillgänglig!
+
+
+ Allt är uppdaterat
+ Uppdatering tillgänglig
+ Uppdaterar AdAway
+ Uppdatera nu
+ %1$s / %2$s
+ Senaste ändringar:
+ Ändringslogg:
+ Stöd utvecklingen
+ Donera
+ Sponsor
+
+
+ Laddar ner den senaste AdAway-versionen…
+
diff --git a/app/src/main/res/values-sv/strings_welcome.xml b/app/src/main/res/values-sv/strings_welcome.xml
new file mode 100644
index 0000000..f079ba5
--- /dev/null
+++ b/app/src/main/res/values-sv/strings_welcome.xml
@@ -0,0 +1,52 @@
+
+
+ Välkommen
+ Guiden första steget
+ Guiden andra steget
+ Guiden sista steget
+
+
+ Välkommen till AdAway!
+ AdAway tillhandahåller två annonsblockeringsmetoder. Välj den du gillar:
+
+ Root-logo
+ Root-baserad\nannonsblockering
+ Snabbare
+ Batterivänlig
+ Root krävs
+
+ VPN-logo
+ VPN-baserad\nannonsblockering
+ Långsammare
+ Kör i bakgrunden
+ Kompatibilitet
+
+ Rootad Android krävs
+ Antingen så kunde binärfilen för su inte hittas eller så tillät du inte root-åtkomst för AdAway.\n\nDetta kan hända när din enhet inte är rootad. Du kan hitta mer information om hur du rootar din enhet på wiki.lineageos.org eller andra Android-webbplatser.
+
+ Pro
+ Con
+
+
+ Synkriniserad
+ Fel vid synkronisering
+
+ Synkroniserar
+ Synkroniserad!
+ AdAway laddar ner annonsnätverk att blockera från online-källor. Du kan anpassa dem senare i inställningarna.
+ Försök synkronisera igen
+ Det gick inte att synkronisera: %1$s Försöka igen?
+
+
+ Support
+ Stöd mig!
+ Detta är en app som är gratis och öppen källkod. Jag utvecklar den på min fritid. Så om du tycker om den, för du gärna visa ditt stöd:
+ Donera på PayPal
+ Gillar du fel? Inte jag heller.
+ Aktivera telemetri för att skicka mig kraschrapporter
+
+
+ Bakåt
+ Nästa
+ Avsluta
+
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
new file mode 100644
index 0000000..19d44b7
--- /dev/null
+++ b/app/src/main/res/values-ta/strings.xml
@@ -0,0 +1,45 @@
+
+
+
+ வெளியேறு
+ மூடு
+ ஆம்
+ இல்லை
+ சேர்
+ ரத்துசெய்
+ சேமி
+
+ வரவேற்கிறோம்
+ மேலும் உதவியைக் காட்டு
+ நிலையைப் புதுப்பி
+ விளம்பரத் தடுப்பை இயக்கு
+ விளம்பரத் தடுப்பை முடக்கு
+ வலை சேவையகம்
+ நிறுத்தப்பட்டது
+ வலை சேவையகத்தை இயக்கு
+ வலை சேவையகத்தை முடக்கு
+ நிறுத்தப்பட்டது
+ விண்ணப்பி
+ திருத்து
+ அழி
+
+
+ இறக்குமதி செய்கிறது…
+ விண்ணப்பி
+ மேலும் தகவலுக்கு உதவியைப் படிக்கவும்
+ சேர்
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+ உங்கள் பட்டியல்கள்
+ விருப்பத்தேர்வுகள்
+
+
diff --git a/app/src/main/res/values-ta/strings_app.xml b/app/src/main/res/values-ta/strings_app.xml
new file mode 100644
index 0000000..d9d078e
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ ஆட்அவே
+ திறந்த மூல விளம்பர-தடுப்பான்
+ ஆட்அவே சின்னம்
+
diff --git a/app/src/main/res/values-ta/strings_errors.xml b/app/src/main/res/values-ta/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ta/strings_home.xml b/app/src/main/res/values-ta/strings_home.xml
new file mode 100644
index 0000000..f7bed94
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_home.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ தடுக்கப்பட்ட
+ அனுமதிக்கப்பட்ட
+ வழிமாற்றப்பட்டது
+
+
+
+ %d புதுப்பித்த மூலம்
+ %d புதுப்பித்த மூலங்கள்
+
+
+ %d காலாவதியான மூலம்
+ %d காலாவதியான மூலங்கள்
+
+
+
+ உதவி காட்டு
+
+
+ கிட்ஹப் பக்கத்தைத் திற
+
+
+ திட்டத்தை ஆதரி
+
+
+ விருப்பத்தேர்வுகள்
+
+
+ வழிசெலுத்தல் அலமாரியைத் திற
+ விளம்பரத் தடுப்பை இடைநிறுத்து/மறுத்துவக்கு
+ தடுக்கப்பட்ட களங்களை புதுப்பி
+ கோரப்பட்ட களங்களைக் காண்பி
+
+
+ மேலும் தகவலுக்கு உதவியைப் படிக்கவும்
+
+
diff --git a/app/src/main/res/values-ta/strings_hosts.xml b/app/src/main/res/values-ta/strings_hosts.xml
new file mode 100644
index 0000000..e71ca5a
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_hosts.xml
@@ -0,0 +1,14 @@
+
+
+ ஹோஸ்டுகளின் மூலங்கள்
+
+ பயனர் பட்டியல்
+ ஆட்அவே அதிகார்வப்பூர்வ ஹோஸ்டுகள்
+
+ கிடைக்கவில்லை
+ %s ஹோஸ்டுகள்
+
+ மூலத்தைச் சேர்
+ மூலத்தைத் திருத்து
+ ஹோஸ்டுகளின் மூல URL
+
diff --git a/app/src/main/res/values-ta/strings_lists.xml b/app/src/main/res/values-ta/strings_lists.xml
new file mode 100644
index 0000000..d0d386b
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_lists.xml
@@ -0,0 +1,11 @@
+
+
+ உங்கள் பட்டியல்கள்
+
+ தடுக்கப்பட்டவை
+ அனுமதிக்கப்பட்ட
+ வழிமாற்றப்பட்டது
+ மூலங்களை இருநிலை மாற்று
+ வழிமாற்றங்களை திருத்து
+ ஹோஸ்டுகளின் மூல URL
+
diff --git a/app/src/main/res/values-ta/strings_log.xml b/app/src/main/res/values-ta/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-ta/strings_notification.xml b/app/src/main/res/values-ta/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ta/strings_prefs_backup_restore.xml b/app/src/main/res/values-ta/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..ed8d1c0
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ காப்புப்பிரதி & மீட்டமை
+ காப்புப்பிரதி
+ உங்கள் தடுப்பு விதிகளை வெளிப்புற சேமிப்பகத்துக்கு காப்புப்பிரதி எடுக்கவும்
+ மீட்டெடு
+ காப்புப்பிரதி கோப்பிலிருந்து உங்கள் தடுப்பு விதிகளை மீட்டெடு
+
diff --git a/app/src/main/res/values-ta/strings_prefs_main.xml b/app/src/main/res/values-ta/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-ta/strings_prefs_root.xml b/app/src/main/res/values-ta/strings_prefs_root.xml
new file mode 100644
index 0000000..9d72eff
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_prefs_root.xml
@@ -0,0 +1,11 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+ வலை சேவையகத்தை இயக்கு
+
diff --git a/app/src/main/res/values-ta/strings_prefs_update.xml b/app/src/main/res/values-ta/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ta/strings_prefs_vpn.xml b/app/src/main/res/values-ta/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-ta/strings_support.xml b/app/src/main/res/values-ta/strings_support.xml
new file mode 100644
index 0000000..4e2add1
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ ஆதரி
+ ஆதரவாளர் ஆகு
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ta/strings_update.xml b/app/src/main/res/values-ta/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ta/strings_welcome.xml b/app/src/main/res/values-ta/strings_welcome.xml
new file mode 100644
index 0000000..14d7c77
--- /dev/null
+++ b/app/src/main/res/values-ta/strings_welcome.xml
@@ -0,0 +1,5 @@
+
+
+
+ ஆதரி
+
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
new file mode 100644
index 0000000..6e41d48
--- /dev/null
+++ b/app/src/main/res/values-th/strings.xml
@@ -0,0 +1,213 @@
+
+
+
+ ออก
+ ปิด
+ ใช่
+ ไม่
+ เพิ่ม
+ ยกเลิก
+ บันทึก
+ ช่วยเหลือ
+
+
+ ยินดีต้อนรับค่ะ!
+ แสดงความช่วยเหลือเพิ่มเติม
+ อัพเดทสถานะ
+ ไฟล์โฮสต์ทั้งหมดจากแหล่งที่กำหนดไว้ถูกดาวน์โหลดและติดตั้งเป็นไฟล์โฮสต์บนระบบของคุณแล้ว
+ เปิดใช้งานบล็อคโฆษณา
+ ปิดใช้งานบล็อคโฆษณา
+ เว็บเซิร์ฟเวอร์
+ กำลังทำงาน
+ กำลังหยุด
+ เปิดใช้งานเว็บเซิร์ฟเวอร์
+ ปิดใช้งานเว็บเซิร์ฟเวอร์
+ VPN
+ กำลังทำงาน
+ กำลังหยุด
+ เปิดใช้งาน VPN
+ ปิดใช้งาน VPN
+
+
+ แก้ไขรายการ
+ นำไปใช้
+ แก้ไข
+ ลบ
+
+
+ กำลังนำเข้า…
+ กำลังส่งออก…
+
+ ไฟล์โฮสต์
+ กำลังโหลดเนื้อหาไฟล์โฮสต์…
+ เปิดไฟล์ hosts
+
+
+ กำลังตรวจสอบอัปเดตใหม่
+ กำลังตรวจสอบ %s จากแหล่งที่มาสำหรับการอัปเดต
+ กู้โฮสต์ไฟล์ต้นฉบับกลับคืนแล้ว
+ กำลังสร้างไฟล์โฮสต์มาตรฐาน
+ สามารถอัพเดตได้
+ สามารถอัพเดตไฟล์โฮสต์ได้
+ ไม่พบการอัปเดตแหล่งที่มา
+ ไม่มีการเชื่อมต่ออินเตอร์เน็ต
+ ไม่มีการเชื่อมต่ออินเตอร์เน็ต
+ ไม่สามารถใช้งานแหล่งที่มาได้
+ ไม่สามารถเข้าถึงแหล่งที่มาโฮสต์ได้
+ สิทธิ์ผู้ดูแลระบบถูกปฏิเสธ
+ อนุญาตสิทธิ์ผู้ดูแลระบบจากแอพผู้ดูแลระบบแล้ว
+ มีบางอย่างผิดปกติ
+ ตรวจสอบ logcat สำหรับรายละเอียดเพิ่มเติม
+ เปิดใช้งานแล้ว
+ เปิดใช้งานไฟล์โฮสต์แล้ว
+ ปิดใช้งาน
+ คืนค่าไฟล์โฮสต์เป็นค่าเริ่มต้นแล้ว
+ ใช้แหล่งข้อมูลล่าสุด
+ นำไปใช้
+ ใช้ตั้งค่าใหม่
+ ใช้ตั้งค่าใหม่ล้มเหลว
+
+ Symlink จากเป้าหมายของคุณไปยัง /system/etc/hosts ไม่พบหรือไม่ถูกต้อง AdAway จะไม่ทำงานหากไม่เลือกไปยังไฟล์ที่ถูกต้อง\n\nต้องการสร้างไฟล์ Symlink?
+ ไม่พบ Symlink
+ พื้นที่ไม่เพียงพอ\nลองเปลี่ยนไฟล์โฮสต์ในการตั้งค่าไปยัง /data/data/hosts
+ พื้นที่ไม่เพียงพอ
+ ไม่สามารถอ่านไฟล์ดาวน์โหลดได้
+ ไฟล์ส่วนตัวล้มเหลว
+ กำลังเม้าท์พาร์ติชั่นเป็น read/write ล้มเหลว!
+ เม้าท์ล้มเหลว
+ คัดลอกไฟล์โฮสต์ล้มเหลว
+ คัดลอกไฟล์โฮสต์ล้มเหลว
+ คัดลอกล้มเหลว
+ ใช้แหล่งที่มาของโฮสต์แล้ว
+ กำลังใช้งานเสร็จสิ้น
+ สร้าง Symlink เสร็จสิ้น
+ สร้าง Symlink ล้มเหลว
+ กรุณาอ่านช่วยเหลือสำหรับข้อมูลเพิ่มเติม
+ ตั้งพร็อกซี่ APN!
+ การเชื่อมต่ออินเตอร์เน็ตไม่สำเร็จ
+ ไม่มีการเชื่อมต่อ
+ กำลังดาวน์โหลด…
+ กำลังใช้งาน…
+ กำลังใช้รายการที่ถูกห้ามและรายการที่อนุญาต
+ กำลังแยกและรวมไฟล์โฮสต์
+ กำลังสร้างไฟล์โฮสต์
+ กำลังใช้งานไฟล์โฮสต์
+ นำไฟล์โฮสต์ใหม่ไปใช้ล้มเหลว
+ ใช้งานไฟล์โฮสต์ไปยังระบบล้มเหลว!\nลองเปลี่ยนไฟล์โฮสต์ในการตั้งค่าไปยัง /data/data/hosts
+ นำไปใช้ล้มเหลว
+ คืนค่าเสร็จสิ้น
+ ไม่สามารถคืนค่าได้
+ คืนค่าล้มเหลวไม่ทราบเหตุผล
+ คืนค่าล้มเหลว!
+ ไม่พบแหล่งที่มาโฮสต์ที่สามารถเข้าถึงได้! ต้องการเชื่อมต่ออินเตอร์เน็ต?
+ ดาวน์โหลดไฟล์ล้มเหลว
+ ไฟล์ส่วนตัวไม่สามารถสร้างได้
+ สร้างไฟล์ส่วนตัวล้มเหลว
+ การเปิดใช้งานเสร็จสมบูรณ์
+ การปิดใช้งานเสร็จสมบูรณ์
+ กำลังเปิดใช้งานไฟล์โฮสต์จากโมดูล Magisk
+ กำลังปิดใช้งานไฟล์โฮสต์จากโมดูล Magisk
+
+ ใส่ URL ไปยังไฟล์โฮสต์:
+ ชื่อโฮสต์ไม่ถูกต้อง!
+ รูปแบบชื่อโฮสต์ไม่ถูกต้อง
+ IP ไม่ถูกต้อง!
+ รูปแบบ IP ไม่ถูกต้อง
+ ไม่ต้องรีบูตและไม่แสดงคำถามนี้ครั้งหน้า
+ กำลังโหลด…
+
+
+ รีเฟรช
+ เพิ่ม
+ ช่วยเหลือ
+ นำเข้าข้อมูลสำรอง
+ ส่งออกข้อมูลสำรอง
+
+
+ S-ON/S-OFF
+ ถาม-ตอบ
+ ปัญหา
+
+
+ Adware
+ กำลังสแกน…
+ ไม่พบ Adware
+
+
+ บล็อคโฆษณา
+ ไม่ได้ติดตั้งตัวแก้ไขข้อความ
+ ไม่พบตัวแก้ไขข้อความเพื่อเปิดไฟล์โฮสต์ สามารถติดตั้ง Jota หรือตัวแก้ไขข้อความอื่นๆ\n\nต้องการติดตั้ง Jota?
+ ไม่ได้ติดตั้งตัวจัดการไฟล์
+ ไม่มีตัวจัดการไฟล์เพื่อเปิดไฟล์ คุณสามารถติดตั้งตัวจัดการไฟล์ OI หรือตัวจัดการไฟล์อื่นๆ\n\nต้องการติดตั้งตัวจัดการไฟล์ OI?
+
+
+ Tcpdump
+ Tcpdump เป็นเครื่องมือตรวจสอบคำขอ DNS และบันทึกการใช้งาน คุณสามารถเริ่มใช้งานในพื้นหลัง ใช้งานแอพลิเคชั่นที่แสดงโฆษณาและวิเคราะห์คำขอ DNS โดยใช้บันทึกการใช้งานโฆษณาสามารถเพิ่มไปยังบัญชีดำของคุณ
+ ปิดใช้งานการตรวจสอบ
+ เปิดใช้งานการตรวจสอบ
+ แสดงผลลัพธ์
+ จัดเรียงโดเมน
+ ล้างบันทึก
+ เพิ่มรายการลงในบัญชีดำ
+ เพิ่มรายการไปยังบัญชีขาว
+ เพิ่มรายการไปยังรายการเปลี่ยนเส้นทาง
+
+ แก้ไขค่ากำหนดของข้อความ
+ เปิดเมนู
+ ปิดเมนู
+
+
+
+ Home
+ แหล่งที่มาโฮสต์
+ รายการของคุณ
+ เปิดไฟล์โฮสต์
+ Log DNS requests
+ Scan for adware
+ การตั้งค่า
+ ช่วยเหลือ
+
+
+
+
+ คำขอ DNS
+ รายการของคุณ
+ การตั้งค่า
+
+
+ ติดตั้งเมื่อ %1$s ที่ผ่านมา
+ อัพเดทล่าสุดสำหรับ %1$s
+ ต้องการอัพเดทสำหรับ %1$s
+ ปรับปรุงครั้งล่าสุด %1$s ที่ผ่านมา
+ สถานะอัพเดทที่ไม่รู้จัก
+ ไม่กี่นาทีที่แล้ว
+
+ %d นาที
+
+
+ %d ชั่วโมง
+
+
+ %d วัน
+
+
+ %d เดือน
+
+
+
+ กำลังเริ่มต้น
+ กำลังทำงาน
+ กำลังหยุด
+ รอสัญญาณอินเตอร์เน็ต
+ กำลังเชื่อมต่ออีกครั้ง
+ เชื่อมต่อผิดพลาด
+ หยุดชั่วคราว
+ หยุด
+ Ad-blocker VPN %1$s
+ หยุด
+ แตะเพื่อดำเนินการต่อ
+
+
+ เปิดใช้งานหรือปิดใช้งานระบบบล็อคโฆษณา
+
+
diff --git a/app/src/main/res/values-th/strings_app.xml b/app/src/main/res/values-th/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-th/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-th/strings_errors.xml b/app/src/main/res/values-th/strings_errors.xml
new file mode 100644
index 0000000..fd901b6
--- /dev/null
+++ b/app/src/main/res/values-th/strings_errors.xml
@@ -0,0 +1,6 @@
+
+
+
+ ไม่มีการเชื่อมต่ออินเตอร์เน็ต
+ พื้นที่ไม่เพียงพอ
+
\ No newline at end of file
diff --git a/app/src/main/res/values-th/strings_home.xml b/app/src/main/res/values-th/strings_home.xml
new file mode 100644
index 0000000..497c671
--- /dev/null
+++ b/app/src/main/res/values-th/strings_home.xml
@@ -0,0 +1,9 @@
+
+
+
+ การตั้งค่า
+
+
+ กรุณาอ่านช่วยเหลือสำหรับข้อมูลเพิ่มเติม
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-th/strings_hosts.xml b/app/src/main/res/values-th/strings_hosts.xml
new file mode 100644
index 0000000..5408f42
--- /dev/null
+++ b/app/src/main/res/values-th/strings_hosts.xml
@@ -0,0 +1,11 @@
+
+
+ แหล่งที่มาโฮสต์
+
+ ไม่สามารถใช้งานได้
+
+ เพิ่มแหล่งที่มา
+ แก้ไขแหล่งข้อมูล
+ URL: (https:// หรือ file://)
+ URL แหล่งที่มาของโฮสต์
+
diff --git a/app/src/main/res/values-th/strings_lists.xml b/app/src/main/res/values-th/strings_lists.xml
new file mode 100644
index 0000000..0d35c9e
--- /dev/null
+++ b/app/src/main/res/values-th/strings_lists.xml
@@ -0,0 +1,13 @@
+
+
+ รายการของคุณ
+
+ เพิ่มโฮสต์ลงในบัญชีดำ
+ เพิ่มโฮสต์ไปยังบัญชีขาว
+ เพิ่มการเปลี่ยนเส้นทางของโฮสต์
+ แก้ไขการเปลี่ยนเส้นทาง
+ ชื่อโฮสต์:
+ URL แหล่งที่มาของโฮสต์
+ (อนุญาตให้ใช้อักขระ * และ ? แล้ว)
+ IP (IPv4 or IPv6):
+
diff --git a/app/src/main/res/values-th/strings_log.xml b/app/src/main/res/values-th/strings_log.xml
new file mode 100644
index 0000000..6c6c7bd
--- /dev/null
+++ b/app/src/main/res/values-th/strings_log.xml
@@ -0,0 +1,8 @@
+
+
+
+ จัดเรียงตามตัวอักษร
+ จัดเรียงโดเมนยอดนิยม
+
+ เปลี่ยนเส้นทางโดเมน
+
diff --git a/app/src/main/res/values-th/strings_notification.xml b/app/src/main/res/values-th/strings_notification.xml
new file mode 100644
index 0000000..892ace9
--- /dev/null
+++ b/app/src/main/res/values-th/strings_notification.xml
@@ -0,0 +1,8 @@
+
+
+
+ อัพเดท
+ สามารถอัพเดตได้
+
+ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-th/strings_prefs_backup_restore.xml b/app/src/main/res/values-th/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-th/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-th/strings_prefs_main.xml b/app/src/main/res/values-th/strings_prefs_main.xml
new file mode 100644
index 0000000..190ce7f
--- /dev/null
+++ b/app/src/main/res/values-th/strings_prefs_main.xml
@@ -0,0 +1,6 @@
+
+
+ การตั้งค่า
+
+ ดีบัค
+
diff --git a/app/src/main/res/values-th/strings_prefs_root.xml b/app/src/main/res/values-th/strings_prefs_root.xml
new file mode 100644
index 0000000..1cbb428
--- /dev/null
+++ b/app/src/main/res/values-th/strings_prefs_root.xml
@@ -0,0 +1,14 @@
+
+
+ เปิดไฟล์โฮสต์
+ ไฟล์โฮสต์
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ กำหนดเอง
+
+
+ Redirection
+ เปิดใช้งานเว็บเซิร์ฟเวอร์
+
diff --git a/app/src/main/res/values-th/strings_prefs_update.xml b/app/src/main/res/values-th/strings_prefs_update.xml
new file mode 100644
index 0000000..0847d56
--- /dev/null
+++ b/app/src/main/res/values-th/strings_prefs_update.xml
@@ -0,0 +1,4 @@
+
+
+ อัพเดท
+
diff --git a/app/src/main/res/values-th/strings_prefs_vpn.xml b/app/src/main/res/values-th/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-th/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-th/strings_support.xml b/app/src/main/res/values-th/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-th/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-th/strings_update.xml b/app/src/main/res/values-th/strings_update.xml
new file mode 100644
index 0000000..dee0bc2
--- /dev/null
+++ b/app/src/main/res/values-th/strings_update.xml
@@ -0,0 +1,4 @@
+
+
+ สามารถอัพเดตได้
+
diff --git a/app/src/main/res/values-th/strings_welcome.xml b/app/src/main/res/values-th/strings_welcome.xml
new file mode 100644
index 0000000..4c60c6b
--- /dev/null
+++ b/app/src/main/res/values-th/strings_welcome.xml
@@ -0,0 +1,4 @@
+
+
+ จำเป็นต้องรูท
+
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
new file mode 100644
index 0000000..9e45587
--- /dev/null
+++ b/app/src/main/res/values-tl/strings.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-tl/strings_app.xml b/app/src/main/res/values-tl/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-tl/strings_errors.xml b/app/src/main/res/values-tl/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tl/strings_home.xml b/app/src/main/res/values-tl/strings_home.xml
new file mode 100644
index 0000000..fea7956
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_home.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tl/strings_hosts.xml b/app/src/main/res/values-tl/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-tl/strings_lists.xml b/app/src/main/res/values-tl/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-tl/strings_log.xml b/app/src/main/res/values-tl/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-tl/strings_notification.xml b/app/src/main/res/values-tl/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tl/strings_prefs_backup_restore.xml b/app/src/main/res/values-tl/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-tl/strings_prefs_main.xml b/app/src/main/res/values-tl/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-tl/strings_prefs_root.xml b/app/src/main/res/values-tl/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-tl/strings_prefs_update.xml b/app/src/main/res/values-tl/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-tl/strings_prefs_vpn.xml b/app/src/main/res/values-tl/strings_prefs_vpn.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_prefs_vpn.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-tl/strings_support.xml b/app/src/main/res/values-tl/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tl/strings_update.xml b/app/src/main/res/values-tl/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-tl/strings_welcome.xml b/app/src/main/res/values-tl/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-tl/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
new file mode 100644
index 0000000..2141690
--- /dev/null
+++ b/app/src/main/res/values-tr/strings.xml
@@ -0,0 +1,262 @@
+
+
+
+ Çıkış
+ Kapat
+ Evet
+ Hayır
+ Ekle
+ İptal
+ Kaydet
+ Yardım
+
+
+ Hoşgeldiniz!
+ AdAway, reklamları engellemek için ücretsiz ve açık kaynaklı bir yazılım tasarımdır. Cihazınızda bunları engellemek için reklam ağı adresleri getirir.\nDaha fazlasını öğrenmek ister misiniz? Aşağıdaki yardımı kontrol edin!
+ Daha fazla yardım göster
+ Güncelleme durumu
+ Tüm kaynaklardaki host dosyaları indirildi, listenizdekilerle birleştirildi ve sisteminize tek bir host dosyası olarak yüklendi.
+ Reklam engellemeyi etkinleştir
+ Reklam engellemeyi devre dışı bırak
+ Web sunucusu
+ Çalışıyor
+ Durduruldu
+ Engellenen ana bilgisayar adlarına yönelik istekleri yanıtlamak için localhost\'ta web sunucusunu başlat veya durdur.
+ Web sunucusunu etkinleştir
+ Web sunucusunu devre dışı bırak
+ VPN
+ Çalışıyor
+ Durduruldu
+ İstekleri filtrelemek için VPN\'yi başlat veya durdur.
+ VPN\'yi etkinleştir
+ VPN\'yi devre dışı bırak
+
+
+ Girdiyi Düzenle
+ Uygula
+ Düzenle
+ Sil
+
+
+ İçe aktarılıyor…
+ Yedekleme, harici depolama alanınızdan başarıyla içe aktarıldı.
+ Yedekleme içe alınamadı. Dosya biçimi doğru mu? Daha fazla ayrıntı için logcat\'i kontrol edin.
+ Dışa aktarılıyor…
+ Yedekleme, harici depolama alanınızdaki \'%s\' dosyasına başarıyla aktarıldı.
+ Yedekleme dosyası dışa aktarılamadı \'%s\'.
+
+
+ Host dosyası
+ Sunucu dosyası, sunucu adlarını IP adreslerine eşleyen bir sistem dosyasıdır. Bu yapılandırmanın AdAway tarafından ele alındığı düz bir metin dosyasıdır. İşte ilk birkaç satırı:
+ Hosts dosyası içeriği yükleniyor…
+ Host dosyasını açın
+
+
+ Güncellemeler kontrol ediliyor
+ %s kaynağı güncelleme için denetleniyor
+ Kaynaklar alınıyor
+ %s kaynağı indiriliyor
+ %s kaynağı okunuyor
+ %s kaynağı ayrıştırılıyor
+ Kural veritabanı senkronize ediliyor
+ Varsayılan hosts dosyasına geri dönülüyor
+ Varsayılan hosts dosyası geri yüklendi
+ Varsayılan bir hosts dosyası yapılıyor
+ Güncelleme mevcut
+ Daha yeni host dosyaları mevcut
+ Kaynak güncellemesi bulunamadı
+ İnternet bağlantısı yok
+ İnternet bağlantısı yok
+ Kullanılamayan kaynaklar
+ Hiçbir host kaynağına ulaşılamadı.
+ Kök erişimi reddedildi
+ Kök yönetim uygulaması üstünden kök erişimine izin verin
+ Bir şeyler yanlış gitti
+ Daha fazla bilgi için logcat\'i kontrol edin
+ Etkin
+ Yeni host dosyaları etkin
+ Devre dışı
+ Varsayılan sunucu dosyası yüklendi
+ En son kaynakları uygula
+ Yeni bir hosts dosyası oluşturuluyor
+ Yeni bir hosts dosyası kopyalanıyor
+ Hosts dosya kopyası kontrol ediliyor
+ Hosts dosyası başarıyla güncellendi
+ VPN yapılandırması başarıyla güncellendi
+ Yapılandırmanız değişti. Uygulamanız gerekiyor.
+ Uygula
+ Yeni yapılandırma uygulanıyor…
+ Yeni yapılandırma uygulanamadı.
+
+
+ Hosts dosya hedefine yönelik sembolik bağlantı eksik
+ Hedefiniz ile /system/etc/hosts dosyası symlink ile bağlanmamış veya hatalı bağlanmış! Bu bağlanma olmadan AdAway çalışamaz.\n\nŞimdi bir symlink ayarlansın mı?
+ Symlink kayıp
+ Disk bölümünde yeterli boş alan yok!\nTercihlerden hedef hosts dosyası seçeneğini /data/data/hosts yapmayı deneyin.
+ Yeterli alan yok
+ İndirilen dosya okunamadı.
+ Özel dosya başarısız
+ Okuma/yazma bölümü tekrar bağlanması başarısız!
+ Remount başarısız oldu
+ Hosts dosyası kopyalanamadı
+ Host dosyası kopyalama başarısız!
+ Kopyalama başarısız
+ Hosts kaynakları uygulandı
+ Uygulama başarılı
+ Uygulama başarılı oldu.\nDeğişikliklerin etkili olması için Android\'i yeniden başlatmanız gerekebilir.\n\nYeniden başlatmak ister misiniz?\n(Veri kaybını önlemek için hiçbir uygulamanın SD kartı kullanmadığından emin olun!)
+ Symlink başarılı bir şekilde oluşturuldu.\nDeğişikliklerin etkili olması için Android\'i yeniden başlatmanız gerekebilir.\n\nYeniden başlatmak ister misiniz?\n(Veri kaybını önlemek için hiçbir uygulamanın SD kartı kullanmadığından emin olun!)
+ Symlink oluşturma başarılı
+ Symlink Android tarafından oluşturulamadı.\nBu HTC telefonlarında S-ON adlı bir \'özellik\' nedeniyle başarısız oluyor!\n\nBunun bir çözümü, telefonunuzu kurtarma moduna geçirmek ve orada \'ln -s /data/data/hosts /system/etc/hosts\'\' ile sembolik bağlantı oluşturmaktır.\n\nBu işe yaramazsa, internette cihazınız ve S-OFF ile ilgili araştırma yapınız.
+ Symlink oluşturma başarısız
+ Daha fazla bilgi için Yardım\'ı okuyunuz.
+ Androidinizde bir APN proxy\'si ayarlandı!\n3G gibi Mobil Ağlarda AdAway güvenilir bir şekilde çalışmaz.Seçtiğiniz APN\'ye giderek bu proxy\'yi devre dışı bırakabilirsiniz (Ayarlar uygulamasından: Ağ ve İnternet -> Mobil şebeke -> Gelişmiş -> Erişim Noktası İsimleri) ve proxy alanındaki değeri kaldırın.
+ APN Vekil Sunucu ayarlandı
+ İnternet bağlantısı çalışmıyor.
+ Bağlantı Yok
+ İndiriliyor…
+ Uygulanıyor…
+ Kara Liste ve Beyaz Liste uygulanıyor
+ Host dosyaları incelenip birleştiriliyor
+ Host dosyası oluşturuluyor
+ Host dosyası uygulanıyor
+ Yeni hosts dosyası uygulanamadı.
+ Host dosyasının sisteminize uygulanması başarısız oldu!\nTercihlerden hedef hosts dosyası seçeneğini /data/data/hosts yapmayı deneyin.
+ Uygulama başarısız
+ Kök erişiminin verildiğinden emin olmak için lütfen kök yönetim uygulamanızı kontrol edin.
+ Varsayılan host dosyasına geri döndünüz.\nDeğişikliklerin etkili olması için Android\'i yeniden başlatmanız gerekebilir.\n\nYeniden başlatmak ister misiniz??\n(Veri kaybını önlemek için hiçbir uygulamanın SD kartı kullanmadığından emin olun!)
+ Geri alma başarılı!
+ Hosts dosyası geri alınamıyor
+ Geri alma işlemi bilinmeyen nedenlerden dolayı başarısız oldu.
+ Geri alma başarısız!
+ Aktif ettiğiniz hiçbir host kaynağına ulaşılamıyor! İnternet\'e bağlı olduğunuza emin misiniz?
+ İndirme işlemi başarısız.
+ Yeni özel hosts dosyası yazılamadı
+ Özel dosya oluşturulamadı.
+ Özel dosya oluşturma başarısız oldu.
+ Sistemsiz modu etkinleştirdiniz.\nDeğişikliklerin etkili olması için Android\'i yeniden başlatmanız gerekebilir.\n\nYeniden başlatmak ister misiniz?\n(Veri kaybını önlemek için hiçbir uygulamanın SD kartı kullanmadığından emin olun!)
+ Etkinleştirme başarılı
+ Sistemsiz modu devre dışı bıraktınız.\nDeğişikliklerin etkili olması için Android\'i yeniden başlatmanız gerekebilir.\n\nYeniden başlatmak ister misiniz?\n(Veri kaybını önlemek için hiçbir uygulamanın SD kartı kullanmadığından emin olun!)
+ Başarıyla devre dışı bırakıldı
+ VPN reklam engelleyici etkinleştirilemedi.
+ VPN reklam engelleyici devre dışı bırakılamadı.
+ Hosts Magisk Modülü\'nü etkinleştiriliyor
+ Magisk yöneticisinden sistemsiz hosts özelliğini etkinleştirin. Magisk ayarlarından, sistemsiz hosts seçeneğini etkinleştirin ve ardından cihazınızı yeniden başlatın.
+ Hosts Magisk Modülü\'nü devre dışı bırakılıyor
+ Magisk yöneticisinden sistemsiz hosts özelliğini devre dışı bırakın. Modül listesinden, sistemsiz hosts modülünü kaldırın ve cihazınızı yeniden başlatın.
+
+
+ Host dosyasına URL gir:
+ Geçersiz host adı!
+ Hatalı host adı!
+ Bu geçerli bir IP değildir!
+ Uygunsuz biçimlendirilmiş IP
+ Asla yeniden başlatma ve bir daha ki sefere bu soruyu gösterme!
+ Yükleniyor…
+
+
+ Yenile
+ Ekle
+ Yardım
+ Yedeklemeyi içe aktar
+ Yedeklemeyi dışa aktar
+
+
+ S-ON/S-OFF
+ SSS
+ Sorunlar
+
+
+ Adware
+ AdAway tarafından engellenemeyen, adware yüklü kötü uygulamaları burada bulabilirsiniz. Bu uygulamalar, örneğin uygulama çalışmıyorken bile ortaya çıkan Airpush bildirimlerini kullanır ve hatta zil sesini değiştirir. Kullanılabilir tek önlem, listedeki öğeleri tıklatarak bu uygulamaları kaldırmaktır.
+ Taranıyor…
+ Adware bulunamadı!
+
+
+ Reklam engelleyici
+ Yüklü metin editörü yok
+ Hosts dosyasını açacak bir metin düzenleyici bulunamadı. Jota veya benzeri bir metin düzenleyici yüklemeniz gerekebilir.\n\nŞimdi Jota yüklemek ister misiniz?
+ Yüklü dosya yöneticisi yok
+ Dosyaları açacak bir dosya yöneticisi bulunamadı. OI File Manager veya benzeri bir dosya yöneticisi yüklemeniz gerekebilir.\n\nŞimdi OI File Manager yüklemek ister misiniz?
+
+
+ Tcpdump
+ Tcpdump, DNS isteklerini izleyip bir log dosyasına kaydeden bir araçtır. Aracı arkaplanda bırakıp reklam gösteren programı çalıştırdıktan sonra log dosyasından programın DNS isteklerini inceleyebilirsiniz. Böylece olası reklam sunucularını karalisteye ekleyebilirsiniz.
+ İzlemeyi devre dışı bırak
+ İzlemeyi etkinleştir
+ Sonuçları göster
+ Alanları sırala
+ Günlüğü temizle
+ Kara listeye giriş ekle
+ Beyaz listeye giriş ekle
+ Yönlendirme listesine giriş ekle
+
+ Metin tercih değerini düzenle
+ Menüyü aç
+ Menüyü kapat
+
+
+
+ Ana ekran
+ Host kaynakları
+ Listeleriniz
+ Host dosyasını aç
+ DNS istekleri günlüğü
+ Reklam yazılımı tara
+ Tercihler
+ Yardım
+
+
+
+
+ DNS istekleri
+ Listeleriniz
+ Tercihler
+
+
+ %1$s önce kuruldu
+ %1$s güncel
+ %1$s için gücelleme gerekiyor
+ Son güncelleme %1$s önce
+ Bilinmeyen güncelleme durumu
+ Devre dışı
+ birkaç dakika
+
+ %d dakika
+ %d dakika
+
+
+ %d saat
+ %d saat
+
+
+ %d gün
+ %d gün
+
+
+ %d ay
+ %d ay
+
+
+
+ Ana bilgisayar panoya kopyalandı
+
+
+ başlatılıyor
+ etkin
+ durduruluyor
+ ağ için bekleniyor
+ yeniden bağlanıyor
+ yeniden bağlanma hatası
+ duraklatıldı
+ durduruldu
+ Reklam engelleyici VPN %1$s
+ Duraklat
+ Devam et
+
+
+ AdAway izinleri
+ AdAway ile etkileşime izin ver
+ AdAway\'e komutlar gönder
+ AdAway\'e sistem çapı reklam engellemeyi kapatma ve açma komutları göndermek için izin ver
+
+
diff --git a/app/src/main/res/values-tr/strings_app.xml b/app/src/main/res/values-tr/strings_app.xml
new file mode 100644
index 0000000..80ab180
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Açık kaynaklı reklam engelleyici
+ AdAway logo
+
diff --git a/app/src/main/res/values-tr/strings_errors.xml b/app/src/main/res/values-tr/strings_errors.xml
new file mode 100644
index 0000000..8fed934
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ İnternet bağlantısı yok
+ İnternet bağlantısı kurulamıyor. Lütfen cihaz bağlantınızı kontrol edin.
+ Hosts kaynağı indirilemedi
+ Etkin hosts kaynaklarınızın hiçbirine ulaşılamıyor. Lütfen İnternet\'e düzgün şekilde bağlandığınızı kontrol edin.
+
+ Özel dosya oluşturulamadı
+ Yeni bir hosts kaynağı inşa etmek için özel dosya oluşturulamıyor. Lütfen cihazınızda kullanılabilir boş alanı kontrol edin.
+ Yeterli alan yok
+ Hosts dosyası sistem bölümünüze kopyalanamıyor. Lütfen Magisk sistemsiz modülünün etkin olup olmadığını kontrol edin ve yeniden başlatın.
+ Yeni hosts dosyası yüklenemedi
+ Hosts dosyası / sistem bölümüne kopyalanamıyor. Lütfen Magisk sistemsiz modülünün yeniden başlatmanın etkinleştirildiğini kontrol edin.
+ Hosts dosyası geri alınamadı
+ Varsayılan hosts dosya yapılandırması geri yüklenemedi.
+
+ VPN reklam engelleyici etkinleştirilemedi.
+ Uygulamaya VPN başlatma yetkisi vermek için VPN ayarlarınızı kontrol edin.
+ VPN reklam engelleyici devre dışı bırakılamadı.
+ El ile devre dışı bırakmak için lütfen VPN ayarlarınızı kontrol edin.
+
diff --git a/app/src/main/res/values-tr/strings_home.xml b/app/src/main/res/values-tr/strings_home.xml
new file mode 100644
index 0000000..941e677
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Engellenmiş
+ İzin verilmiş
+ Yönlendirilmiş
+
+
+
+ %d up-to-date source
+ %d kaynaklar güncel
+
+
+ %d outdated source
+ %d kaynaklar güncel değil
+
+ Hosts güncellemelerini kontrol et
+ Host\'u güncelle
+
+
+ DNS istek günlüğünü göster
+
+
+ Yardım\ipuçlarını göster
+
+
+ GitHub sayfasını aç
+
+
+ Projeyi destekle
+
+
+ GitHub projesi
+ Tercihler
+
+
+ Gezinme çekmecesini aç
+ Reklam engellemeyi duraklat/devam ettir
+ Engellenen alan adlarını güncelle
+ Alan adlarının isteklerini göster
+
+
+ Daha fazla bilgi için Yardım\'ı okuyunuz.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tr/strings_hosts.xml b/app/src/main/res/values-tr/strings_hosts.xml
new file mode 100644
index 0000000..20a852b
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Host kaynakları
+
+ Kullanıcı listesi
+ AdAway resmi hosts
+ StevenBlack Birleşik hosts
+ Pete Lowe engel listesi hosts
+
+ Uygun değil
+ %s hosts
+
+ Kaynak ekle
+ Kaynak düzenle
+ URL: (bir https:// veya file:// kaynak)
+ Hosts kaynak URL\'si
+
diff --git a/app/src/main/res/values-tr/strings_lists.xml b/app/src/main/res/values-tr/strings_lists.xml
new file mode 100644
index 0000000..6d2945f
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Listeleriniz
+ Engelli adres listesi ekle
+
+ Engellenmiş
+ İzin verilmiş
+ Yönlendirilmiş
+
+ Hosts filtresi
+ Ana bilgisayar adında ara…
+ Kaynakları aç/kapat
+
+ Kara listeye host ekle
+ Beyaz listeye host ekle
+ Host yönlendirmesi ekle
+ Kara listeye alınan sunucuyu düzenle
+ Beyaz listeye alınan sunucuyu düzenle
+ Yönlendirmeyi düzenle
+ Ana bilgisayar adı:
+ Hosts kaynak URL\'si
+ (Joker karakterler * ve ? izin verilir)
+ IP (IPv4 veya IPv6):
+
diff --git a/app/src/main/res/values-tr/strings_log.xml b/app/src/main/res/values-tr/strings_log.xml
new file mode 100644
index 0000000..a990818
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Günlük kaydını aç/kapat
+ İstekleri günlüğe kaydetmeye başlamak, Web\'de gezinmek veya uygulamaları kullanmak için kaydet\'e basın, ardından geri dönün veya günlükleri yenilemek için kaydırın.
+ \n\nEngellenen istekler günlüğe kaydedilmez. Onları da günlüğe kaydetmek istiyorsanız, önce reklam engellemeyi devre dışı bırakın.
+
+ Alfabetik sıralama
+ Üst düzey alan adı sıralaması
+
+ Alanadı yönlendir
+
diff --git a/app/src/main/res/values-tr/strings_notification.xml b/app/src/main/res/values-tr/strings_notification.xml
new file mode 100644
index 0000000..2f1fcae
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Güncellemeler
+ Yeni güncelleme bildirimleri
+ Güncelleme mevcut
+ İndirilebilecek yeni hosts dosyaları.
+ Uygulama güncellemesi mevcut
+ AdAway\'in yeni bir sürümü indirilebilir.
+
+ VPN
+ VPN çalışma bildirimleri
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tr/strings_prefs_backup_restore.xml b/app/src/main/res/values-tr/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..256b609
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Yedekle ve geri yükle
+ Yedekle
+ Engelleme kurallarını harici depolamaya yedekle
+ Geri yükle
+ Engelleme kurallarını yedekleme dosyasından geri yükle
+
diff --git a/app/src/main/res/values-tr/strings_prefs_main.xml b/app/src/main/res/values-tr/strings_prefs_main.xml
new file mode 100644
index 0000000..eac5f3f
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Tercihler
+
+ Genel
+ Karanlık temayı etkinleştir
+
+ Açık
+ Koyu
+ Sistem varsayılanı
+
+ Otomatik güncellemeler
+
+ Reklam engelle
+ Kök erişimi tabanlı reklam engelleyici
+ VPN tabanlı reklam engelleyici
+ IPv6 etkinleştir
+ Engelleme kurallarını yedekle/geri yükle
+
+ Hata ayıklama
+ Kilitlenme raporlarını etkinleştir
+ Uygulamanın Sentry\'ye (sentry.io) hata ve kilitlenme raporları göndermesine izin verin.
+ Bu derlemede desteklenmiyor
+ Ayrıntılı günlük kaydını etkinleştir
+ Ayarları etkinleştirmek için AdAway\'ı yeniden başlatın.
+
diff --git a/app/src/main/res/values-tr/strings_prefs_root.xml b/app/src/main/res/values-tr/strings_prefs_root.xml
new file mode 100644
index 0000000..14f7ff2
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Kök erişimi tabanlı reklam engelleyici
+
+ Hosts kurulumu
+ Host dosyasını aç
+ Hedef hosts dosyası
+ Bu özelliği kullanmadan önce Yardımı okuyun
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Özel hedef
+
+ Özel hedef konumu
+ Uyguladıktan sonra yeniden başlatma iletişim kutusunu gizle
+
+ Yönlendirme
+ Engellenen hosts\'u nereye yönlendireceğinizi tanımlayın
+ IPv4 yönlendirmesi
+ IPv6 yönlendirmesi
+ Geçersiz yönlendirme
+
+ Yerel web sunucu
+ Yerel web sunucusu, engellenen ana bilgisayar adı isteklerine yanıt vermek için yerel IP adreslerini dinler. Engellenen bağlantıda uygulamanın donmasına yardımcı olabilir.
+ Web sunucusunu etkinleştir
+ Web sunucusunu test et
+ Kendinden imzalı sertifika kur
+ Manuel sertifika kurulumu
+ Android 11 (R)\'den başlatılan uygulama artık otomatik olarak doğrulama sertifikası (CA) yükleyemez. Bunun için: \"Güvenlik\" ayarlarına gidin. \"Şifreleme & kimlikleri\"ni seçin daha sonra \"Bir sertifika yükle\"yi seçin. Oradan da, \"CA sertifikası\"nı seçin ve yeni dışa aktarılmış sertifika dosyanızı seçin.
+ \"Güvenlik\" ayarlarını açın
+ Kontrol ediliyor…
+ Çalışmıyor
+ Çalışıyor ancak sertifika kurulu değil
+ Çalışıyor ve sertifika kurulu
+ Boş reklam alanını uygulama simgesiyle değiştir
+
diff --git a/app/src/main/res/values-tr/strings_prefs_update.xml b/app/src/main/res/values-tr/strings_prefs_update.xml
new file mode 100644
index 0000000..f6b4113
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Güncellemeler
+ Bildirimler devre dışı bırakıldı
+ Uygulama bildirimleri gösterilmeyecek. Etkinleştirmek için dokunun.
+
+ Uygulama güncellemeleri
+ Başlangıçta güncellemeleri kontrol et
+ Güncellemeleri günlük denetle
+ Beta sürümleri de dahil
+
+ Hosts güncellemeleri
+ Başlangıçta güncellemeleri kontrol et
+ Güncellemeleri günlük denetle
+ Güncellemede eşitle
+ Yalnızca ölçülmemiş ağda eşitle
+
diff --git a/app/src/main/res/values-tr/strings_prefs_vpn.xml b/app/src/main/res/values-tr/strings_prefs_vpn.xml
new file mode 100644
index 0000000..db64204
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN tabanlı reklam engelleyici
+
+ Başlangıçta etkinleştir
+ Ekran bağlantısı
+ VPN bağlantısı bulunmadığı durumlarda düzenli olarak VPN bağlantısının tekrar sağlanabilmesi için bağlantıyı kontrol et
+
+ Hariç tutulan uygulamalar
+ Hangi uygulamaların VPN\'yi kullanmaması gerektiğini yapılandırın, böylece bağlantı engellenmez.
+ Sistem uygulamalarını hariç tut
+
+ Yok
+ Tarayıcılar hariç tümü
+ Tümü
+
+ Kullanıcı uygulamalarını hariç tut
+
+
+ Hariç tutulan uygulamalar
+ Tümünü seç
+ Tüm seçimleri kaldır
+ Uygulama simgesi
+
diff --git a/app/src/main/res/values-tr/strings_source_edit.xml b/app/src/main/res/values-tr/strings_source_edit.xml
new file mode 100644
index 0000000..8c24910
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Kaynak düzenle
+ Kaynak ekle
+
+ Etiket
+ Etiket gerekli
+ Tür
+ URL
+ Dosya
+ Konum
+ https://
+ Yer gerekli
+ Kaynak dosya seçmek için Dosya\'ya tıklayın
+ Geçersiz konum
+ Liste Formatı
+ Engelle
+ İzin ver
+ Yönlendirilmiş hosts\'u uygula
+ Yönlendirilmiş hosts\'a izin vermek güvenlik sorunu oluşturabilir. Yalnızca güvendiğiniz kaynaklar ile kullanınız. Aksi durumda hassas bilgileriniz farklı kaynaklara yönlendirilebilir.
+
diff --git a/app/src/main/res/values-tr/strings_support.xml b/app/src/main/res/values-tr/strings_support.xml
new file mode 100644
index 0000000..42aa69e
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Destek
+ Sponsor ol
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tr/strings_update.xml b/app/src/main/res/values-tr/strings_update.xml
new file mode 100644
index 0000000..c392c21
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway güncellemesi
+
+ Güncelleme mevcut!
+
+
+ Güncel
+ Güncelleme mevcut
+ AdAway güncelleştiriliyor
+ Şimdi güncelle
+ %1$s / %2$s
+ Son değişiklikler
+ Değişiklikler
+ Geliştirmeyi destekleyin
+ Bağışta bulunun
+ Sponsor
+
+
+ AdAway\'in en son sürümü indiriliyor…
+
diff --git a/app/src/main/res/values-tr/strings_welcome.xml b/app/src/main/res/values-tr/strings_welcome.xml
new file mode 100644
index 0000000..b47bfbd
--- /dev/null
+++ b/app/src/main/res/values-tr/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Hoşgeldiniz
+ Kurulumun ilk aşaması
+ Kurulumun ikinci aşaması
+ Kurulumun son aşaması
+
+
+ AdAway\'e hoş geldiniz!
+ AdAway iki reklam engelleme yöntemi sunar. Beğendiğiniz birini seçin:
+
+ Kök erişimi logosu
+ Kök erişimi tabanlı\nreklam engelleyici
+ Daha hızlı
+ Pil dostu
+ Kök erişimi gerekli
+
+ VPN logosu
+ VPN tabanlı\nreklam engelleyici
+ Daha yavaş
+ Arka planda çalıştır
+ Uyumluluk
+
+ Kök erişimli Android gerekli
+ Su binary dosyası bulunamadı veya AdAway için kök erişimi izni sağlanmadı.\n\nEğer cihazınızda kök erişimi sağlanmadıysa bu yaşanabilir. Ayrıntılı bilgi ve cihazınızda nasıl kök erişimi sağlanacağını öğrenmek için wiki.lineageos.org veya diğer Android web sitelerini ziyaret edebilirsiniz.
+
+ Pro
+ Con
+
+
+ Eşitleme tamamlandı
+ Eşitleme sırasında hata
+
+ Eşitleniyor
+ Eşitlendi!
+ AdAway, çevrimiçi kaynaklardan engellemek için reklam ağlarını indirir. Bunları daha sonra ayarlardan özelleştirebilirsiniz.
+ Eşitlemeyi tekrar dene
+ %1$ssenkronize edilemedi. Tekrar denensin mi?
+ Reklam bloğu durumunu ve kontrolünü görüntülemek ve mevcut uygulama güncellemesi hakkında bilgi vermek için (yılda birkaç kez) bildirimler gönderebilir. Güncel kalmak istiyorsanız bunları etkinleştirin.
+
+
+ Destek
+ Beni destekle!
+ AdAway, boş zamanlarımda geliştirdiğim ücretsiz ve açık kaynaklı bir uygulamadır. Beğendiyseniz, desteğinizi göstermekten çekinmeyin:
+ PayPal\'da bağış yapın
+ Hataları sever misin? Ben de sevmem.
+ Bana kilitlenme raporları göndermek için metriği etkinleştir
+
+
+ Geri
+ İleri
+ Tamamlandı
+
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
new file mode 100644
index 0000000..6750500
--- /dev/null
+++ b/app/src/main/res/values-uk/strings.xml
@@ -0,0 +1,270 @@
+
+
+
+ Вийти
+ Закрити
+ Так
+ Ні
+ Додати
+ Скасувати
+ Зберегти
+ Довідка
+
+
+ Вітаємо!
+ AdAway — це безкоштовний застосунок з відкритим вихідним кодом, створений для блокування реклами. Він збирає адреси з рекламної мережі і блокує їх на вашому пристрої.\nХочете дізнатися більше? Прочитайте довідку нижче.
+ Розширена довідка
+ Оновити статус
+ Всі файли хостів, що завантажуються з заданих джерел, об\'єднуються з вашими списками і встановлюються у вашій системі у вигляді одного файлу hosts.
+ Увімкнути блокування
+ Вимкнути блокування
+ Веб-сервер
+ Працює
+ Зупинено
+ Запустити або зупинити веб-сервер на локальній машині, який буде відповідати на запити до заблокованих хостів.
+ Увімкнути веб-сервер
+ Вимкнути веб-сервер
+ VPN
+ Запущено
+ Зупинено
+ Запустити чи зупинити VPN, який фільтруватиме запити.
+ Увімкнути VPN
+ Вимкнути VPN
+
+
+ Редагувати запис
+ Застосувати
+ Редагувати
+ Видалити
+
+
+ Імпортування…
+ Резервну копію успішно імпортовано із зовнішнього сховища.
+ Не вдалося імпортувати резервну копію. Можливо формат не вірний. Перевірте logcat для з\'ясування подробиць.
+ Експортування…
+ Резервну копію успішно експортовано в файл \'%s\' на зовнішнє сховище.
+ Не вдалося експортувати резервну копію в файл \'%s\'.
+
+
+ Файл hosts
+ Файл hosts — це системний файл, який містить співставлення імен хостів з IP-адресами. Це звичайний текстовий файл, вміст якого обробляє AdAway. Ось його перші рядки:
+ Завантаження вмісту файлу hosts…
+ Відкрити файл hosts
+
+
+ Перевірка оновлень
+ Перевірка джерела %s на наявність оновлень
+ Отримання джерел
+ Завантаження джерела %s
+ Читання джерела %s
+ Обробка джерела %s
+ Синхронізація бази даних з правилами
+ Отримання усталеного файлу hosts
+ Усталений файл hosts відновлено
+ Створення стандартного файлу hosts
+ Доступне оновлення
+ Доступні свіжі списки хостів
+ Не знайдено оновлень
+ Немає з\'єднання з Інтернет
+ Немає доступного підключення до інтернету
+ Недоступні джерела
+ Немає доступних джерел хостів!
+ Доступ суперкористувача відхилено
+ Надати права суперкористувача для вашого додатку суперкористувача
+ Щось пішло не так
+ Перегляньте logcat для подробиць
+ Увімкнено
+ Використовуються найновіші списки
+ Вимкнено
+ Встановлено стандартний файл hosts
+ Застосувати останні джерела
+ Створення нового файлу hosts
+ Копіювання нового файлу hosts
+ Перевірка копії файлу hosts
+ Файл hosts успішно оновлено
+ Налаштування VPN успішно оновлено
+ Налаштування змінено. Потрібно їх застосувати.
+ Застосувати
+ Застосування нових налаштувань…
+ Не вдалося застосувати нові налаштування.
+
+
+ Посилання на файл hosts відсутнє
+ Посилання на ваш /system/etc/hosts неправильне або не існує! AdAway не працюватиме, якщо не вказати правильний файл.\n\n Чи ви хочете спробувати створити посилання?
+ Посилання відсутнє
+ Не вистачає місця на розділі!\nСпробуйте змінити в налаштуваннях шлях до файлу hosts на /data/data/hosts.
+ Не достатньо місця
+ Завантажений файл неможливо прочитати.
+ Збій файлу
+ Не вдалося перемонтувати розділ для читання/запису!
+ Перемонтувати не вдалося
+ Не вдалося скопіювати файл hosts
+ Копіювання файлу hosts не вдалося!
+ Копіювання не вдалося
+ Застосовані джерела хостів
+ Успішно застосовано
+ Застосування пройшло успішно.\nНеобхідно перезавантажити пристрій, щоб зміни набули чинності.\n\nПерезавантажити зараз? \n(Щоб уникнути втрати інформації, переконайтеся, що ніякі програми в даний момент не використовують карту пам\'яті!)
+ Посилання створено успішно.\nНеобхідно перезавантажити пристрій, щоб зміни набули чинності.\n\nПерезавантажити зараз?\n (Щоб уникнути втрати інформації, переконайтеся, що ніякі програми в даний момент не використовують карту пам\'яті!)
+ Посилання створено успішно
+ Android не зміг створити посилання. \nМожливо, це через особливість S-ON на телефонах HTC! \n\nРішення полягає в завантаженні телефону в режимі відновлення і створення символічного посилання через \'\'ln -s /data/data/hosts /system/etc/hosts\'.\n\n Якщо це не спрацьовує, то необхідно шукати інформацію в інтернеті по S-OFF і вашому телефону.
+ Помилка створення посилання
+ Будь ласка, читайте Довідку для отримання додаткової інформації.
+ У налаштуваннях APN вказаний проксі сервер!\nAdAway не буде працювати в мобільних мережах, таких як 3G. Ви можете вимкнути цей проксі сервер в налаштуваннях використовуваної APN (в Android 4: Бездротові мережі -> Більше … -> Мобільна мережа -> Точки доступу APN) і вилучити значення у полі проксі.
+ У використовуваної точки доступу APN встановлений проксі!
+ Відсутнє підключення до мережі інтернет.
+ Немає з\'єднання
+ Завантаження…
+ Застосування…
+ Застосувати чорний і білий список
+ Аналіз і об\'єднання файлів зі списками хостів
+ Побудова файлу hosts
+ Застосування файлу hosts
+ Не вдалося застосувати новий файл hosts.
+ Не вдалося застосувати файл hosts на вашій системі!\n Спробуйте змінити в налаштуваннях шлях до файлу hosts на /data/data/hosts.
+ Не вдалося застосувати
+ Будь ласка, перевірте ваш застосунок, який керує правами суперкористувача, щоб переконатися, що права суперкористувача було надано.
+ Ви повернулися до усталеного файлу hosts.\nМожливо, знадобиться перезавантажити Android, щоб зміни набули чинності.\n\nХочете перезавантажити?\n(Щоб уникнути втрати даних, переконайтеся, що жоден застосунок не використовуює карту пам\'яті цієї миті!)
+ Успішно повернуто
+ Не вдалося відновити файл hosts
+ Відновлення не вдалося з невідомих причин.
+ Відновлення не вдалося!
+ Жодне з ваших активних джерел хостів недоступне! Ви правильно підключені до інтернету?
+ Завантаження не вдалося
+ Не вдалося записати новий приватний файл hosts
+ Особистий файл не може бути створений.
+ Не вдалося створити особистий файл
+ Ви увімкнули безсистемний режим.\nЩоб зміни набули чинності, необхідно перезавантажити Android.\n\nПерезавантажити зараз?\n(Щоб уникнути втрати даних, переконайтеся, що жоден застосунок не використовуює карту пам\'яті цієї миті!)
+ Успішно увімкнено
+ Ви вимкнули безсистемний режим.\nЩоб зміни набули чинності, необхідно перезавантажити Android.\n\nПерезавантажити зараз?\n(Щоб уникнути втрати даних, переконайтеся, що жоден застосунок не використовуює карту пам\'яті цієї миті!)
+ Успішно вимкнено
+ Не вдалося увімкнути блокування VPN.
+ Не вдалося вимкнути блокування VPN.
+ Вмикання модуля хостів Magisk
+ Увімкнути позасистемні хости в Magisk Manager. Для цього потрібно вибрати опцію Позасистемні хости і перезавантажити пристрій.
+ Вимикання модуля хостів Magisk
+ Вимкнути позасистемні хости в Magisk Manager. Для цього потрібно зі списку модулів видалити модуль Systemless Hosts і перезавантажити пристрій.
+
+
+ Вставте URL у файл hosts:
+ Це недопустима назва джерела!
+ Неправильно відформатована назва хоста
+ Це недопустима IP!
+ Неправильно відформатована IP-адреса
+ Ніколи не перезавантажувати і більше не показувати це питання!
+ Завантаження…
+
+
+ Оновити
+ Додати
+ Довідка
+ Імпортувати резервну копію
+ Експортувати резервну копію
+
+
+ S-ON/S-OFF
+ ЧаПи
+ Проблеми
+
+
+ Додатки з рекламою
+ Тут ви можете знайти встановлені додатки з рекламою, так звані Adware – погані додатки, які AdAway не може заблокувати. Вони використовують систему сповіщень Airpush, яка показує рекламу навіть тоді, коли застосунок не працює і навіть можуть змінити мелодію вашого дзвінка. Позбутися такої реклами можливо лише видаливши такі застосунки, натиснувши на них в цьому списку.
+ Сканування…
+ Додатків з рекламою не знайдено!
+
+
+ Блокувальник реклами
+ Не встановлено текстовий редактор
+ У системі не знайдено текстовий редактор для відкриття файлу hosts. Ви можете встановити редактор Jota або будь-який інший текстовий редактор, щоб це виправити.\n\nХочете встановити редактор Jota?
+ Не встановлено файловий менеджер
+ У системі не знайдено файловий менеджер. Ви можете встановити OI File Manager або будь-який інший файловий менеджер щоб це виправити.\n\nХочете встановити OI File Manager?
+
+
+ Tcpdump
+ Tcpdump — це інструмент для моніторингу запитів DNS і їх збереження в файлі журналу. Ви можете запустити його в фоновому режимі, далі запустити програму, яка показує рекламу на екрані, і проаналізувати збережені в журналі запити DNS. Хост, кваліфікований як джерело реклами, може бути внесений у чорний список.
+ Вимк. моніторинг
+ Увімк. моніторинг
+ Показати результати
+ Сортувати домени
+ Очистити журнал
+ Додати запис в Чорний список
+ Додати запис в Білий список
+ Додати запис в Список перенаправлень
+
+ Змінити значення текстової переваги
+ Відкрити меню
+ Закрити меню
+
+
+
+ Домашня
+ Джерела списків хостів
+ Ваші списки
+ Відкрити файл хостів
+ Журнал запритів DNS
+ Сканування Adware
+ Налаштування
+ Довідка
+
+
+
+
+ DNS запити
+ Ваші списки
+ Налаштування
+
+
+ Встановлено %1$s тому
+ Актуально %1$s
+ Потрібне оновлення %1$s
+ Останнє оновлення %1$s тому
+ Невідомий статус оновлення
+ Вимкнено
+ пару хвилин
+
+ %d хвилина
+ %d хвилини
+ %d хвилин
+ %d хвилин
+
+
+ %d година
+ %d години
+ %d годин
+ %d годин
+
+
+ %d день
+ %d дні
+ %d днів
+ %d днів
+
+
+ %d місяць
+ %d місяця
+ %d місяців
+ %d місяців
+
+
+
+ Хост скопійований до буферу обміну
+
+
+ запуск
+ активний
+ припинення роботи
+ очікування мережі
+ перез\'єднання
+ помилка перез\'єднання
+ пауза
+ зупинено
+ Ad-blocker VPN%1$s
+ Пауза
+ Відновити
+
+
+ Дозволи AdAway
+ Дозволити взаємодію з AdAway
+ Надіслати команди в AdAway
+ Дозволити надсилати команди AdAway, наприклад увімкнути або вимкнути загальносистемне блокування реклами
+
+
diff --git a/app/src/main/res/values-uk/strings_app.xml b/app/src/main/res/values-uk/strings_app.xml
new file mode 100644
index 0000000..add121f
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Блокувальник реклами з відкритим вихідним кодом
+ Логотип AdAway
+
diff --git a/app/src/main/res/values-uk/strings_errors.xml b/app/src/main/res/values-uk/strings_errors.xml
new file mode 100644
index 0000000..16e8b5f
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Немає з\'єднання з Інтернет
+ Не вдалося з\'єднатися з Інтернетом. Перевірте підключення на вашому пристої.
+ Не вдалося завантажити джерело хостів
+ Жоден з увімкнених джерел хостів недоступний. Перевірте, чи є з\'єднання з Інтернетом.
+
+ Не вдалося створити приватний файл
+ Не вдалося створити приватний файл, щоб сформувати джерело хостів. Перевірте, чи є вільне місце на вашому пристрої.
+ Не достатньо місця
+ Не вдалося скопіювати файл hosts на системний розділ. Перевірте в застосунку Magisk Manager, чи увімкнено модуль позасистемних хостів, і потім перезавантажте пристрій.
+ Не вдалося встановити файл hosts
+ Неможливо скопіювати файл hosts в розділ /system. Перевірте, чи ввімкнено systemless модуль Magisk, а потім перезавантажте.
+ Не вдалося відновити файл hosts
+ Не вдалося відновити усталену конфігурацію файла hosts.
+
+ Не вдалося увімкнути блокування VPN.
+ Щоб розпочати, авторизуйте застосунок для VPN в системних налаштуваннях VPN.
+ Не вдалося вимкнути блокування VPN.
+ В налаштуваннях VPN його можна вимкнути вручну.
+
diff --git a/app/src/main/res/values-uk/strings_home.xml b/app/src/main/res/values-uk/strings_home.xml
new file mode 100644
index 0000000..4424fb0
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_home.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Заблоковано
+ Дозволено
+ Перенаправлено
+
+
+
+ %d оновлене джерело
+ %d оновлених джерела
+ %d оновлених джерел
+ %d оновлених джерел
+
+
+ %d застаріле джерело
+ %d застарілих джерела
+ %d застарілих джерел
+ %d застарілих джерел
+
+ Перевірити оновлення хостів
+ Оновити хости
+
+
+ Показати журнал DNS запитів
+
+
+ Показати підказки
+
+
+ Відкрити сторінку GitHub
+
+
+ Підтримати проєкт
+
+
+ Проєкт на GitHub
+ Налаштування
+
+
+ Відкрити навігаційне меню
+ Зупинити/продовжити блокування реклами
+ Оновити заблоковані домени
+ Показати запитувані домени
+
+
+ Будь ласка, читайте Довідку для отримання додаткової інформації.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uk/strings_hosts.xml b/app/src/main/res/values-uk/strings_hosts.xml
new file mode 100644
index 0000000..666a14b
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Джерела списків хостів
+
+ Список користувача
+ Офіційні хости AdAway
+ Хости від StevenBlack
+ Хости від Pete Lowe
+
+ недоступно
+ %s хостів
+
+ Додати джерело
+ Редагувати джерело
+ URL: (ресурс https:// або file://)
+ URL джерела хостів
+
diff --git a/app/src/main/res/values-uk/strings_lists.xml b/app/src/main/res/values-uk/strings_lists.xml
new file mode 100644
index 0000000..72d0685
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Ваші списки
+ Додати хост
+
+ Заблоковано
+ Дозволено
+ Перенаправлено
+
+ Фільтрувати хости
+ Пошук ім\'я сервера…
+ Переключити джерела
+
+ Додати хост в Чорний список
+ Додати хост в Білий список
+ Додати перенаправлення хоста
+ Редагувати хост з Чорного списку
+ Редагувати хост з Білого списку
+ Редагувати перенаправлення
+ Ім\'я джерела:
+ URL джерела хостів
+ (Допускають символи підстановки * та ?)
+ IP (IPv4 або IPv6):
+
diff --git a/app/src/main/res/values-uk/strings_log.xml b/app/src/main/res/values-uk/strings_log.xml
new file mode 100644
index 0000000..8860fd9
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Перемкнути запис журналу
+ Натисніть «Запис», щоб почати реєструвати запити, переглядайте веб-сторінки або використовуйте програми, а потім поверніться назад або проведіть пальцем, щоб оновити журнали.
+ Заблоковані запити не будуть реєструватися. Спочатку вимкніть блокування реклами, якщо ви також хочете зареєструвати їх.
+
+ Сортування за алфавітом
+ Сортування за найвищим рівнем домену
+
+ Перенаправити домен
+
diff --git a/app/src/main/res/values-uk/strings_notification.xml b/app/src/main/res/values-uk/strings_notification.xml
new file mode 100644
index 0000000..64d3924
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Оновлення
+ Сповіщення про нові оновлення
+ Доступне оновлення
+ Нові файли hosts доступні для завантаження.
+ Оновлення додатку вже доступно
+ Нова версія AdAway доступна для завантаження.
+
+ VPN
+ Сповіщення про VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uk/strings_prefs_backup_restore.xml b/app/src/main/res/values-uk/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..0be675a
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Збереження і відновлення
+ Збереження
+ Збереження правил блокування на зовнішнє сховище
+ Відновлення
+ Відновити правила блокування зі збереженої копії
+
diff --git a/app/src/main/res/values-uk/strings_prefs_main.xml b/app/src/main/res/values-uk/strings_prefs_main.xml
new file mode 100644
index 0000000..0cf080d
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Налаштування
+
+ Загальні
+ Темна тема
+
+ Світла
+ Темна
+ Системна
+
+ Автоматичні оновлення
+
+ Блокування реклами
+ Блокувальник реклами з root-правами
+ Блокування на основі VPN
+ Увімкнути підтримку IPv6
+ Збереження / відновлення правил блокування
+
+ Режим налагодженя
+ Відправити звіт про збій
+ Звіт до Sentry (sentry,io)
+ Не підтримується цією збіркою
+ Детальне журналювання
+ Додаток потрібно оновити, щоб прийняти зміни
+
diff --git a/app/src/main/res/values-uk/strings_prefs_root.xml b/app/src/main/res/values-uk/strings_prefs_root.xml
new file mode 100644
index 0000000..84a6ca4
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Блокувальник реклами з root-правами
+
+ Встановлення хостів
+ Відкрити файл хостів
+ Шлях до файлу hosts
+ Прочитайте Поміч перед початком користування цією особливістю
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Користувацькі налаштування
+
+ Користувацьке розташування
+ Приховати діалог перезавантаження після застосування
+
+ Перенаправлення
+ Вибрати, куди направляти заблоковані хости
+ IPv4 перенаправлення
+ IPv6 перенаправлення
+ Невірне перенаправлення
+
+ Локальний вебсервер
+ Локальний вебсервер слухає локальні IP адреси і відповідає на запити від заблокованих хостів. Це може допомогти із зависанням застосунку, коли його з’єднання заблокували.
+ Увімкнути веб-сервер
+ Тестовий вебсервер
+ Встановити самопідписаний сертифікат
+ Ручне встановлення сертифікату
+ Починаючи з Android 11 (R), застосунки більше не можуть автоматично встановлювати сертифікати (CA).\n\nЩоб це зробити вручну, зайдіть в налаштування, розділ «Безпека» далі «Шифрування й облікові дані», потім «Установити сертифікат». У вікні, що з’явиться виберіть щойно створений файл сертифікату.
+ Відкрити налаштування «Безпека»
+ Перевірка…
+ Не запущено
+ Запущено, але сертифікат не встановлено
+ Запущено, сертифікат встановлено
+ Замінити порожнє місце від реклами іконкою застосунку
+
diff --git a/app/src/main/res/values-uk/strings_prefs_update.xml b/app/src/main/res/values-uk/strings_prefs_update.xml
new file mode 100644
index 0000000..41c2083
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_prefs_update.xml
@@ -0,0 +1,15 @@
+
+
+ Оновлення
+
+ Оновлення застосунку
+ Перевіряти оновлення під час запуску
+ Періодично перевіряти наявність оновлень
+ Шукати бета-релізи
+
+ Оновлення хостів
+ Перевіряти оновлення під час запуску
+ Періодично перевіряти наявність оновлень
+ Синхронізувати при оновленні
+ Синхронізувати лише коли W-iFi
+
diff --git a/app/src/main/res/values-uk/strings_prefs_vpn.xml b/app/src/main/res/values-uk/strings_prefs_vpn.xml
new file mode 100644
index 0000000..41fff03
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Блокування на основі VPN
+
+ Увімкнути під час запуску
+ Перевіряти з’єднання
+ Періодично перевіряти стан мережі, і за потреби перезавантажувати VPN при роз’єднанні.
+
+ Виключені застосунки
+ Налаштуйте, які застосунки не повинні використовувати VPN, щоб з’єднання не блокувалося.
+ Виключені системні застосунки
+
+ None
+ All except browsers
+ All
+
+ Вимкнені застосунки користувача
+
+
+ Виключені застосунки
+ Вибрати всі
+ Зняти виділення
+ Іконка застосунку
+
diff --git a/app/src/main/res/values-uk/strings_support.xml b/app/src/main/res/values-uk/strings_support.xml
new file mode 100644
index 0000000..3bbdb7d
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Підтримка
+ Стати спонсором
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uk/strings_update.xml b/app/src/main/res/values-uk/strings_update.xml
new file mode 100644
index 0000000..f678bc5
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Оновлення AdAway
+
+ Оновлення доступно!
+
+
+ Ви маєте останюю версію
+ Доступне оновлення
+ Оновлення AdAway
+ Оновити зараз
+ %1$s / %2$s
+ Останні зміни
+ Журанал змін
+ Підтримати розробку
+ Пожертвувати
+ Спонсор
+
+
+ Завантаження останньої версії AdAway…
+
diff --git a/app/src/main/res/values-uk/strings_welcome.xml b/app/src/main/res/values-uk/strings_welcome.xml
new file mode 100644
index 0000000..2dbef53
--- /dev/null
+++ b/app/src/main/res/values-uk/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Вітаємо
+ Перший крок
+ Другий крок
+ Останній крок
+
+
+ Вітаємо в AdAway!
+ AdAway надає два способи блокування реклами. Виберіть один:
+
+ Логотип рут
+ Блокування\nчерез рут
+ Швидший
+ Ощадливий до батареї
+ Потрібен рут
+
+ Логотип VPN
+ Блокування\nчерез VPN
+ Повільніший
+ Працює в фоні
+ Сумісність
+
+ Необхідні права суперкористувача (root)
+ Неможливо знайти бінарний файл su, або ви не надали AdAway рут права.\n\nЦе може трапитися, якщо ваш пристрій не рутовано. Ви можете дізнатися, як поставити рут права на ваш пристрій на wiki.lineageos.org або інших сайтах про Android.
+
+ Переваги
+ Недоліки
+
+
+ Синхронізовано
+ Помилка під час синхронізації
+
+ Синхронізація
+ Синхронізовано!
+ AdAway завантажує мережі оголошень, які потрібно блокувати. Ви можете змінити їх в налаштуваннях.
+ Повторити синхронізацію
+ Не вдалося синхронізувати:\n %1$s .\n Повторити?
+ Може надсилати сповіщення для відображення стану контролю та блокування реклами , а також сповіщати про доступні оновлення додатку (декілька разів на рік). Увімкніть, якщо хочете бути в курсі подій.
+
+
+ Підтримка
+ Підтримай мене!
+ AdAway — безкоштовний додаток з відкритим кодом, який я розробляю у вільний час. Якщо вам він до вподоби, ви можете підтримати мене:
+ Заплатити через PayPal
+ Любите помилки? Я теж ні.
+ Увімкнути збір даних про помилки
+
+
+ Назад
+ Вперед
+ Завершити
+
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
new file mode 100644
index 0000000..751634f
--- /dev/null
+++ b/app/src/main/res/values-ur/strings.xml
@@ -0,0 +1,30 @@
+
+
+
+ نکلیٔے
+ بند کریں
+ جی ہاں
+ نہیں
+ جمع کریں
+ منسوخ کریں
+ محفوظ کریں
+ مدد
+
+
+ خوش آمدید
+ AdAway اشتہارات کو بلاک کرنے کے لیے ایک مفت اور open source سافٹویٔر ہے۔ یہ آپ کے سسٹم پر اشتہارات کو بلاک کرنے کے لیے اشتہاری کمپنیوں کے ویب اڈریس (web address) اکٹھے کرتا ہے۔ مزید معلومات کے لیے نیچے دی گٔی مدد ملاحظہ کریں۔
+ مزید مدد دکھائیے
+ جمع کریں
+ مدد
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
diff --git a/app/src/main/res/values-ur/strings_app.xml b/app/src/main/res/values-ur/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-ur/strings_errors.xml b/app/src/main/res/values-ur/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ur/strings_home.xml b/app/src/main/res/values-ur/strings_home.xml
new file mode 100644
index 0000000..a530b93
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_home.xml
@@ -0,0 +1,6 @@
+
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ur/strings_hosts.xml b/app/src/main/res/values-ur/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-ur/strings_lists.xml b/app/src/main/res/values-ur/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-ur/strings_log.xml b/app/src/main/res/values-ur/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-ur/strings_notification.xml b/app/src/main/res/values-ur/strings_notification.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_notification.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ur/strings_prefs_backup_restore.xml b/app/src/main/res/values-ur/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ur/strings_prefs_main.xml b/app/src/main/res/values-ur/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-ur/strings_prefs_root.xml b/app/src/main/res/values-ur/strings_prefs_root.xml
new file mode 100644
index 0000000..0bb70c8
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_prefs_root.xml
@@ -0,0 +1,10 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+
diff --git a/app/src/main/res/values-ur/strings_prefs_update.xml b/app/src/main/res/values-ur/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ur/strings_prefs_vpn.xml b/app/src/main/res/values-ur/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-ur/strings_support.xml b/app/src/main/res/values-ur/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ur/strings_update.xml b/app/src/main/res/values-ur/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ur/strings_welcome.xml b/app/src/main/res/values-ur/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-ur/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml
new file mode 100644
index 0000000..3592fd3
--- /dev/null
+++ b/app/src/main/res/values-uz/strings.xml
@@ -0,0 +1,53 @@
+
+
+
+ Chiqish
+ Yopish
+ Ha
+ Yo\'q
+ Qo\'shish
+ Bekor qilish
+ Saqlash
+ Yordam
+
+
+ Xush kelibsiz!
+ AdAway - bu reklamani blokirovka qilish uchun bepul va ochiq kodli dasturiy ta\'minot dizayni. U bilgan reklama adreslari bilan sizning qurilmangizdagi reklamani bloklaydi. \nQo\'shimcha ma\'lumot bilmoqchimisiz? Quyidagi yordamni tekshiring.
+ Qo\'shimcha yordamni ko\'rish
+ Holatni yangilash
+ Hamma xost fayllar belgilangan manbadan yuklab olinib, sizning bor ro\'yxatingiz bilan birlashitrilib, sizning sistemangizda bitta xost fayl qilib o\'rnatildi.
+ Reklama blokirovkasini yoqish
+ Reklama blokirovkasini o\'chirish
+ Veb-server
+ Ishlamoqda
+ Toxtatilgan
+ Bloklangan xost nomlariga berilgan so\'rovlarga javob berish uchun veb-serverni ishga tushiring yoki to\'xtating.
+ Veb-serverni ishga tushirish
+ Veb-serverni ishdan to\'xtatish
+ VPN
+ Ishlamoqda
+ Toxtatilgan
+ So\'rovlarni filtrlash uchun VPN-ni ishga tushiring yoki to\'xtating.
+ VPN-ni ishga tushirish
+ VPN-ni ishdan toxtatish
+
+
+ Yozuvni tahrirlash
+ Qo\'shish
+ Yordam
+ TSS
+
+
+ Uy
+ Xostlar manbalari
+ Sizning ro\'yxatingiz
+ Xostlar faylini ochish
+ DNS-so\'rovlarni ro\'yxatdan o\'tkazish
+ Reklama dasturini qidirish
+ Sozlamalar
+ Yordam
+
+ Sizning ro\'yxatingiz
+ Sozlamalar
+
+
diff --git a/app/src/main/res/values-uz/strings_app.xml b/app/src/main/res/values-uz/strings_app.xml
new file mode 100644
index 0000000..d3a87c4
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_app.xml
@@ -0,0 +1,4 @@
+
+
+ AdAway
+
diff --git a/app/src/main/res/values-uz/strings_errors.xml b/app/src/main/res/values-uz/strings_errors.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_errors.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uz/strings_home.xml b/app/src/main/res/values-uz/strings_home.xml
new file mode 100644
index 0000000..a530b93
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_home.xml
@@ -0,0 +1,6 @@
+
+
+
+ Preferences
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uz/strings_hosts.xml b/app/src/main/res/values-uz/strings_hosts.xml
new file mode 100644
index 0000000..8d829ed
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_hosts.xml
@@ -0,0 +1,4 @@
+
+
+ Hosts sources
+
diff --git a/app/src/main/res/values-uz/strings_lists.xml b/app/src/main/res/values-uz/strings_lists.xml
new file mode 100644
index 0000000..8ba3dd4
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_lists.xml
@@ -0,0 +1,4 @@
+
+
+ Your lists
+
diff --git a/app/src/main/res/values-uz/strings_log.xml b/app/src/main/res/values-uz/strings_log.xml
new file mode 100644
index 0000000..95cd46d
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_log.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-uz/strings_notification.xml b/app/src/main/res/values-uz/strings_notification.xml
new file mode 100644
index 0000000..8210efb
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_notification.xml
@@ -0,0 +1,5 @@
+
+
+
+ VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uz/strings_prefs_backup_restore.xml b/app/src/main/res/values-uz/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_prefs_backup_restore.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-uz/strings_prefs_main.xml b/app/src/main/res/values-uz/strings_prefs_main.xml
new file mode 100644
index 0000000..b8c0bd5
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_prefs_main.xml
@@ -0,0 +1,4 @@
+
+
+ Preferences
+
diff --git a/app/src/main/res/values-uz/strings_prefs_root.xml b/app/src/main/res/values-uz/strings_prefs_root.xml
new file mode 100644
index 0000000..97b7497
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_prefs_root.xml
@@ -0,0 +1,11 @@
+
+
+ Open hosts file
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+ Veb-serverni ishga tushirish
+
diff --git a/app/src/main/res/values-uz/strings_prefs_update.xml b/app/src/main/res/values-uz/strings_prefs_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_prefs_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-uz/strings_prefs_vpn.xml b/app/src/main/res/values-uz/strings_prefs_vpn.xml
new file mode 100644
index 0000000..d1f0e22
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_prefs_vpn.xml
@@ -0,0 +1,8 @@
+
+
+
+ None
+ All except browsers
+ All
+
+
diff --git a/app/src/main/res/values-uz/strings_support.xml b/app/src/main/res/values-uz/strings_support.xml
new file mode 100644
index 0000000..efe0a1d
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_support.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uz/strings_update.xml b/app/src/main/res/values-uz/strings_update.xml
new file mode 100644
index 0000000..4a4cb75
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_update.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-uz/strings_welcome.xml b/app/src/main/res/values-uz/strings_welcome.xml
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/app/src/main/res/values-uz/strings_welcome.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
new file mode 100644
index 0000000..4bb6adf
--- /dev/null
+++ b/app/src/main/res/values-vi/strings.xml
@@ -0,0 +1,258 @@
+
+
+
+ Thoát
+ Đóng
+ Có
+ Không
+ Thêm
+ Huỷ bỏ
+ Lưu
+ Trợ giúp
+
+
+ Chào mừng!
+ AdAway là một phần mềm miễn phí và mã nguồn mở được thiết kế để chặn quảng cáo. Nó lấy địa chỉ các mạng quảng cáo để chặn chúng trên thiết bị của bạn.\nBạn có muốn biết thêm không? Hãy xem trợ giúp ở bên dưới!
+ Hiện thêm trợ giúp
+ Cập nhật tình trạng
+ Tất cả các tập tin miền từ nguồn xác định sẽ được tải về, ghép với danh sách của bạn và cài đặt thành một tập tin miền duy nhất trên hệ thống.
+ Bật chặn quảng cáo
+ Tắt chặn quảng cáo
+ Máy chủ web
+ Đang chạy
+ Đã dừng
+ Bắt đầu hoặc dừng máy chủ web trên localhost để trả lời những yêu cầu đến các tên miền bị chặn.
+ Bật webserver
+ Tắt webserver
+ VPN
+ Đang chạy
+ Đã dừng
+ Bắt đầu hoặc dừng VPN để lọc các yêu cầu.
+ Bật VPN
+ Tắt VPN
+
+
+ Chỉnh sửa mục
+ Áp dụng
+ Chỉnh sửa
+ Xoá
+
+
+ Đang nhập…
+ Đã nhập tệp sao lưu thành công từ bộ nhớ ngoài.
+ Lỗi nhập tệp sao lưu, nó có đúng dạng không? Xem logcat để biết thêm chi tiết
+ Đang xuất…
+ Bản sao lưu được xuất thành công ra tập tin \'%s\' trên bộ nhớ ngoài.
+ Xuất tập tin sao lưu \'%s\' thất bại.
+
+
+ Tệp hosts
+ Tệp hosts là mootk tệp hệ thống nằm trong /system/etc dùng để chỉ dẫn tên miền đến địa chỉ IP. Nó là một tệp txt được cấu hình bởi AdAway. Đây là một vài dòng
+ Đang tải tệp hosts trong máy
+ Mở tệp hosts
+
+
+ Đang kiểm tra cập nhật
+ Đang kiểm tra cập nhật từ nguồn %s
+ Đang lấy nguồn
+ Đang tải nguồn %s
+ Đang đọc nguồn %s
+ Đang hợp nhất nguồn %s
+ Đồng bộ cơ sở dữ liệu bộ lọc
+ Quay lại tập tin nguồn mặc định
+ Quay lại tập tin nguồn mặc định
+ Đang tạo tập tin miền chuẩn
+ Đã có bản cập nhật
+ Đã có tập tin miền mới
+ Không có cập nhật mới
+ Không có kết nối mạng
+ Không có sẵn kết nối mạng
+ Không có nguồn nào
+ Không kết nối được tới bất cứ nguồn nào!
+ Quyền truy cập root bị từ chối
+ Cho phép quyền root
+ Có gì đó không ổn
+ Kiểm tra logcat để biết thêm chi tiết
+ Đã bật
+ Đã dùng tập tin miền mới
+ Đã tắt
+ Tệp máy chủ mặc định được cài đặt
+ Áp dụng các nguồn mới nhất
+ Tạo tập tin máy chủ mới
+ Sao chép tập tin máy chủ mới
+ Kiểm tra bản sao tập tin máy chủ
+ Tập tin máy chủ được cập nhật thành công
+ Cấu hình VPN được cập nhật thành công
+ Thiết lập của bạn đã thay đổi. Bạn cần áp dụng nó.
+ Áp dụng
+ Đang áp dụng thiết lập mới…
+ Áp dụng thiết lập mới thất bại.
+
+
+ Thiếu liên kết đến mục tiêu tệp máy chủ
+ Liên kết biểu trưng từ mục tiêu đến /system/etc/hosts không tồn tại hoặc không đúng! AdAway sẽ không hoạt động nếu nó không được dẫn đến đúng tập tin.\n\nBạn có muốn thử tạo liên kết mới?
+ Thiếu liên kết biểu trưng
+ Không đủ dung lượng trên ổ đĩa!\nHãy thử đổi tập tin miền mục tiêu trong tuỳ chỉnh thành /data/data/hosts.
+ Không đủ dung lượng
+ Không đọc được tập tin đã tải về.
+ Tập tin riêng tư thất bại
+ Thất bại khi gắn phân vùng thành đọc/ghi!
+ Gắn thất bại
+ Sao chép tệp miền thất bại
+ Thất bại khi sao chép tập tin miền!
+ Sao chép thất bại
+ Đã áp dụng các nguồn tên miền
+ Áp dụng thành công
+ Áp dụng đã thành công. \nCó thể cần phải khởi động lại Android để các thay đổi có hiệu lực. \n\nBạn có muốn khởi động lại không?\n(Để tránh mất dữ liệu, hãy chắc chắn không có ứng dụng nào sử dụng thẻ SD vào lúc này!)
+ Liên kết biểu tượng đã được tạo thành công.\nCó thể cần phải khởi động lại Android để các thay đổi có hiệu lực.\n\nBạn có muốn khởi động lại không?\n(Để tránh mất dữ liệu, hãy chắc chắn không có ứng dụng nào sử dụng thẻ SD vào lúc này!)
+ Tạo liên kết biểu trưng thành công
+ Liên kết biểu tượng không thể được tạo bởi Android.\nViệc này thất bại phần lớn vì một \'tính năng\' gọi là S-ON trên các điện thoại HTC!\n\nMột giải pháp là khởi động điện thoại của bạn vào chế độ phục hồi và tạo liên kết biểu tượng ở đó bằng lệnh \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nNếu việc này không được thì hãy tìm kiếm S-OFF và điện thoại của bạn trên Internet.
+ Tạo liên kết biểu trưng thất bại
+ Hãy đọc Trợ giúp để biết thêm thông tin.
+ An APN proxy is set on your Android!\nAdAway will not work reliably when on Mobile Networks like 3G. You can deactivate that proxy by going to your selected APN (From the Settings app: Network & Internet -> Mobile network -> Advanced -> Access Point Names) and remove the value in the proxy field.
+ Đã tạo proxy APN!
+ Kết nối mạng không hoạt động.
+ Không có kết nối
+ Đang tải xuống…
+ Đang áp dụng…
+ Đang áp dụng Danh sách đen và Danh sách trắng
+ Đang xử lý và hợp nhất các tập tin miền
+ Đang tạo tập tin miền
+ Đang áp dụng tập tin miền
+ Không thể áp dụng file hosts mới.
+ Thất bại khi áp dụng tập tin miền vào hệ thống!\nHãy thử đổi tập tin miền mục tiêu trong cài đặt thành /data/data/hosts.
+ Áp dụng thất bại
+ Hãy kiểm tra ứng dụng quản lý root để chắc rằng quyền truy cập root đã được cấp phép.
+ Bạn đã quay về tập tin miền mặc định.\nCó thể cần phải khởi động lại Android để các thay đổi có hiệu lực.\n\nBạn có muốn khởi động lại không?\n(Để tránh mất dữ liệu, hãy chắc chắn không có ứng dụng nào sử dụng thẻ SD vào lúc này!)
+ Đổi lại thành công
+ Không thể quay lại tập tin miền ban đầu
+ Đổi lại bị thất bại mà không rõ nguyên nhân.
+ Đổi lại thất bại!
+ Không truy cập được bất kỳ nguồn tên miền đã kích hoạt nào! Bạn có đang kết nối mạng không?
+ Tải về thất bại
+ Viết tập tin miền riêng mới thất bại
+ Không thể tạo tập tin riêng.
+ Tạo tập tin riêng thất bại
+ Bạn đã bật chế độ không dùng hệ thống.\nCó thể cần phải khởi động lại Android để các thay đổi có hiệu lực.\n\nBạn có muốn khởi động lại không?\n(Để tránh mất dữ liệu, hãy chắc chắn không có ứng dụng nào sử dụng thẻ SD vào lúc này!)
+ Kích hoạt thành công
+ Bạn đã vô hiệu hoá chế độ systemless.\nCó thể sẽ cần thiết phải khởi động lại Android để sự thay đổi có hiệu quả. \n\nBạn có muốn khởi động lại?\n(Để tránh mất dữ liệu hãy chắc rằng không có ứng dụng nào đang sử dụng thẻ SD lúc này!)
+ Vô hiệu hóa thành công
+ Không thể khởi động trình chặn quảng cáo qua VPN.
+ Không thể tắt chặn quảng cáo qua VPN.
+ Kích hoạt module Magisk hosts
+ Kích hoạt tính năng systemless hosts của Magisk. Ở cài đặt, kích hoạt lựa chọn Systemless hostsrồi khởi động lại thiết bị của bạn.
+ Vô hiệu hoá module Magisk hosts
+ Vô hiệu hoá tính năng systemless hosts của Magisk. Ở danh sách module, gỡ cài đặt module Systemless hosts rồi khởi động lại thiết bị của bạn.
+
+
+ Nhập URL vào tập tin miền:
+ Tên miền không hợp lệ!
+ Định dạng tên miền không đúng
+ IP không hợp lệ!
+ Định dạng IP không đúng
+ Không bao giờ khởi động lại và đừng hiện câu hỏi này lần tiếp theo!
+ Đang tải…
+
+
+ Làm mới
+ Thêm
+ Trợ giúp
+ Nhập bản sao lưu
+ Xuất bản sao lưu
+
+
+ S-ON/S-OFF
+ Những câu hỏi thường gặp
+ Vấn đề
+
+
+ Adware
+ Ở đây bạn có thể tìm thấy ứng dụng quảng cáo, đó là những ứng dụng xấu không thể bị chặn bởi AdAway. Các ứng dụng này sử dụng, ví dụ là các thông báo Airpush hiện lên kể cả khi ứng dụng đó không chạy hoặc kể cả là thay đổi nhạc chuông của bạn. Biện pháp phản lại duy nhất có sẵn là gỡ cài đặt các ứng dụng đó bằng cách nhấn vào các mục trong danh sách.
+ Đang quét…
+ Không tìm thấy Adware!
+
+
+ Ứng dụng chặn quảng cáo
+ Chưa cài trình sửa văn bản
+ Không tìm thấy trình sửa văn bản để mở tập tin miền. Bạn có thể cài Jota hoặc các trình sửa văn bản khác.\n\nBạn có muốn cài Jota?
+ Không có trình quản lý tập tin nào được cài đặt
+ Không tìm thấy trình quản lý để mở tập tin. Bạn có thể cài OI File Manager hoặc các trình quản lý khác.\n\nBạn có muốn cài OI File Manager?
+
+
+ Tcpdump
+ Tcpdump là công cụ giám sát các yêu cầu DNS và lưu chúng vào tập tin nhật ký. Bạn có thể khởi động nó trong chế độ nền, chạy các ứng dụng có quảng cáo và sau đó phân tích yêu cầu DNS qua tập tin nhật ký. Máy chủ quảng cáo nhận được sẽ bị đưa vào danh sách đen.
+ Tắt giám sát
+ Bật giám sát
+ Hiện kết quả
+ Sắp xếp theo tên miền
+ Xoá log
+ Thêm mục vào danh sách đen
+ Thêm mục vào danh sách trắng
+ Thêm mục vào danh sách chuyển hướng
+
+ Chỉnh sửa giá trị cài đặt văn bản
+ Mở menu
+ Đóng menu
+
+
+
+ Home
+ Các nguồn miền
+ Your lists
+ Mở tập tin miền
+ Log DNS requests
+ Scan for adware
+ Tuỳ chỉnh
+ Trợ giúp
+
+
+
+
+ Các yêu cầu DNS
+ Danh sách của bạn
+ Tuỳ chỉnh
+
+
+ Đã cài đặt %1$s trước
+ Đã cập nhật %1$s trước
+ Cần được cập nhật %1$s
+ Cập nhật lần cuối %1$s trước
+ Trạng thái cập nhật không xác định
+ Đã tắt
+ vài phút
+
+ %d phút
+
+
+ %d giờ
+
+
+ %d ngày
+
+
+ %d tháng
+
+
+
+ Host đã được copy vào clipboard
+
+
+ đang bắt đầu
+ hoạt động
+ đang dừng
+ đang kết nối
+ đang kết nối lại
+ lỗi kết nối lại
+ đã tạm dừng
+ đã dừng lại
+ VPN chặn quảng cáo %1$s
+ Tạm dừng
+ Tiếp tục
+
+
+ Quyền truy cập của AdAway
+ Cho phép tương tác với AdAway
+ Gửi lệnh đến AdAway
+ Cho phép gửi các lệnh như bật hoặc tắt chặn quảng cáo toàn hệ thống đến AdAway
+
+
diff --git a/app/src/main/res/values-vi/strings_app.xml b/app/src/main/res/values-vi/strings_app.xml
new file mode 100644
index 0000000..1f6e9bc
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Trình chặn quảng cáo mã nguồn mở
+ Logo AdAway
+
diff --git a/app/src/main/res/values-vi/strings_errors.xml b/app/src/main/res/values-vi/strings_errors.xml
new file mode 100644
index 0000000..b277da4
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ Không có kết nối mạng
+ Không thể kết nối internet. Làm ơn kiểm tra cài đặt mạng.
+ Không thể tải xuống tập tin nguồn
+ Không thể tải xuống tập tin nguồn. Làm ơn kiểm tra cài đặt mạng.
+
+ Không thể tạo tập tin.
+ Không thể tạo tập tin mới. Làm ơn kiểm tra dung lượng còn trống trên thiết bị.
+ Không đủ dung lượng
+ Không thể sao chép tập tin vào phân vùng hệ thống.
+ Không thể cải đặt tập tin nguồn.
+ Không thể sao chép tập tin nguồn vào phân vùng hệ thông. Hãy bật chế độ systemless host của Magisk rồi khởi động lại
+ Không thể đảo ngược tập tin nguồn
+ Không thể khôi phục cài đặt tập tin nguồn mặc định
+
+ Không thể khởi động trình chặn quảng cáo qua VPN.
+ Làm ơn kiểm tra cài đặt VPN thiết bị.
+ Không thể tắt chặn quảng cáo qua VPN.
+ Làm ơn kiểm tra cài đặt VPN thiết bị.
+
diff --git a/app/src/main/res/values-vi/strings_home.xml b/app/src/main/res/values-vi/strings_home.xml
new file mode 100644
index 0000000..27810f1
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ Đã bị chặn
+ Đã cho phép
+ Đã chuyển hướng
+
+
+
+ %d số nguồn đã được cập nhật
+
+
+ %dsố nguồn chưa được cập nhật
+
+ Kiểm tra cập nhật tệp miền
+ Cập nhật file hosts
+
+
+ Hiện nhật ký yêu cầu DNS
+
+
+ Hiện các mẹo trợ giúp/nand
+
+
+ Mở GitHub
+
+
+ Ủng hộ dự án
+
+
+ Dự án GitHub
+ Tuỳ chỉnh
+
+
+ Mở thanh điều hướng
+ Tạm dừng/tiếp tục chặn quảng cáo
+ Cập nhật các tên miền đã chặn
+ Hiển thị các tên miền đã yêu cầu
+
+
+ Hãy đọc Trợ giúp để biết thêm thông tin.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-vi/strings_hosts.xml b/app/src/main/res/values-vi/strings_hosts.xml
new file mode 100644
index 0000000..6fa1d0d
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Các nguồn miền
+
+ Danh sách của người dùng
+ AdAway official hosts
+ AdAway official hosts
+ Pete Lowe blocklist hosts
+
+ không có sẵn
+ %s hosts
+
+ Thêm nguồn
+ Chỉnh sửa nguồn
+ URL: (có dạng https:// hoặc file://)
+ URL tập tin nguồn
+
diff --git a/app/src/main/res/values-vi/strings_lists.xml b/app/src/main/res/values-vi/strings_lists.xml
new file mode 100644
index 0000000..c9fc4d9
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Danh sách của bạn
+ Thêm nguồn
+
+ Đã bị chặn
+ Đã cho phép
+ Đã chuyển hướng
+
+ Lọc nguồn
+ Tìm tên nguồn
+ Bật/tắt nguồn
+
+ Thêm nguồn vào danh sách chặn
+ Thêm nguồn vào danh sách cho phép
+ Thêm nguồn vào danh sách chuyển hướng
+ Chỉnh sửa danh sách chặn
+ Chỉnh sửa danh sách cho phép
+ Chỉnh sửa danh sách chuyển hướng
+ Tên miền:
+ URL của tập tin nguồn
+ (Cho phép sử dụng các kí tự * và ?)
+ IP (IPv4 hoặc IPv6):
+
diff --git a/app/src/main/res/values-vi/strings_log.xml b/app/src/main/res/values-vi/strings_log.xml
new file mode 100644
index 0000000..8f7b4fe
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_log.xml
@@ -0,0 +1,12 @@
+
+
+ Chuyển đổi ghi nhật ký
+ Nhấn ghi để bắt đầu ghi yêu cầu, duyệt Web hoặc sử dụng ứng dụng, sau đó quay lại hoặc vuốt để làm mới nhật ký.
+
+ \n\nCác yêu cầu bị chặn sẽ không được ghi lại. Trước tiên hãy tắt tính năng chặn quảng cáo nếu bạn cũng muốn ghi chúng.
+
+ Sắp xếp theo thứ tự chữ cái
+ Sắp xếp miền cấp trên cùng
+
+ Chuyển hướng miền
+
diff --git a/app/src/main/res/values-vi/strings_notification.xml b/app/src/main/res/values-vi/strings_notification.xml
new file mode 100644
index 0000000..45d3cd9
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Cập nhật
+ Thông báo cập nhật mới
+ Đã có bản cập nhật
+ Có thể tải về tập tin nguồn mới
+ Ứng dụng có bản cập nhật mới
+ Phiên bản mới của AdAway đã sẵn sàng để tải xuống
+
+ VPN
+ Thông báo khi mở VPN
+
\ No newline at end of file
diff --git a/app/src/main/res/values-vi/strings_prefs_backup_restore.xml b/app/src/main/res/values-vi/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..bd9af4a
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Sao lưu và khôi phục
+ Sao lưu
+ Sao lưu cài đặt ra bộ nhớ ngoài
+ Khôi phục
+ Khôi phục cài đặt từ tập tin sao lưu
+
diff --git a/app/src/main/res/values-vi/strings_prefs_main.xml b/app/src/main/res/values-vi/strings_prefs_main.xml
new file mode 100644
index 0000000..c46b505
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Tuỳ chỉnh
+
+ Chung
+ Chế độ Đêm
+
+ Sáng
+ Tối
+ Mặc định hệ thống
+
+ Tự động cập nhật
+
+ Chặn quảng cáo
+ Chặn quảng cáo sử dụng quyền root
+ Chặn quảng cáo sử dụng VPN
+ Bật IPv6
+ Sao lưu / khôi phục cài đặt
+
+ Dò lỗi
+ Gửi báo cáo lỗi
+ Gửi báo cáo Sentry (sentry.io)
+ Không được hỗ trợ trên phiên bản này
+ Ghi nhật kí chi tiết
+ Bạn cần khởi động lại AdAway để tuỳ chỉnh được thực thi.
+
diff --git a/app/src/main/res/values-vi/strings_prefs_root.xml b/app/src/main/res/values-vi/strings_prefs_root.xml
new file mode 100644
index 0000000..0080aa0
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Chặn quảng cáo sử dụng quyền root
+
+ Cài đặt tập tin miền
+ Mở tập tin miền
+ Tập tin miền mục tiêu
+ Trước khi thay đổi cài đặt, hãy đọc Trợ giúp về tính năng này.
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Đích tự chọn
+
+ Đích tự chọn
+ Ẩn hộp thoại khởi động lại
+
+ Chuyển hướng
+ Tùy chọn điều hướng tập tin miền
+ Điều hướng IPv4
+ Điều hướng IPv6
+ Chuyển hướng không hợp lệ
+
+ Webserver cục bộ
+ Máy chủ web cục bộ sử dụng các địa chỉ IP để phản hồi các yêu cầu truy cập các tên miền đã bị chặn, giúp giải quyết việc treo ứng dụng do kết nối bị chặn.
+ Bật webserver
+ Thử nghiệm web server
+ Cài đặt chứng chỉ tự kí
+ Cài đặt thủ công chứng chỉ
+ Từ Android 11 (R) trở đi, ứng dụng sẽ không được phép tự cài đặt các chứng chỉ uỷ quyền (CA). \n\nVào cài đặt \"Bảo mật\", \"Mã hoá & chứng chỉ\" rồi \"Cài đặt chứng chỉ\". Chọn \"Chứng chỉ CA\" và lựa chọn file chứng chỉ mới được xuất.
+ Mở cài đặt \"Bảo mật\"
+ Đang kiểm tra…
+ Không hoạt động
+ Hoạt động nhưng chứng chỉ chưa được cài đặt
+ Đang hoạt động và đã cài đặt chứng chỉ
+ Đổi chỗ quảng cáo bằng icon ứng dụng
+
diff --git a/app/src/main/res/values-vi/strings_prefs_update.xml b/app/src/main/res/values-vi/strings_prefs_update.xml
new file mode 100644
index 0000000..1c9041d
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Cập nhật
+ Thông báo bị vô hiệu hóa
+ Thông báo ứng dụng sẽ không hiển thị. Nhấn để kích hoạt chúng.
+
+ Cập nhật ứng dụng
+ Kiểm tra cập nhật khi khởi động
+ Kiểm tra cập nhật mỗi ngày
+ Bao gồm các phiên bản beta
+
+ Cập nhật tập tin miền
+ Kiểm tra cập nhật khi khởi động
+ Kiểm tra cập nhật mỗi ngày
+ Đồng bộ khi cập nhật
+ Chỉ đồng bộ bằng wi-fi
+
diff --git a/app/src/main/res/values-vi/strings_prefs_vpn.xml b/app/src/main/res/values-vi/strings_prefs_vpn.xml
new file mode 100644
index 0000000..f13acf8
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ Chặn quảng cáo sử dụng VPN
+
+ Kích hoạt khi khởi động
+ Giám sát kết nối
+ Định kì kiểm tra tình trạng mạng để khởi động lại VPN khi mất kết nối.
+
+ Các ứng dụng không bị chặn
+ Tùy chỉnh các ứng dụng có thể sử dụng VPN
+ Không chặn các ứng dụng hệ thống
+
+ None
+ All except browsers
+ Tất cả
+
+ Các ứng dụng không bị chặn
+
+
+ Các ứng dụng không bị chặn
+ Chọn tất cả
+ Bỏ chọn tất cả
+ Biểu tượng ứng dụng
+
diff --git a/app/src/main/res/values-vi/strings_support.xml b/app/src/main/res/values-vi/strings_support.xml
new file mode 100644
index 0000000..7caf02c
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Ủng hộ
+ Trở thành một nhà tài trợ
+
\ No newline at end of file
diff --git a/app/src/main/res/values-vi/strings_update.xml b/app/src/main/res/values-vi/strings_update.xml
new file mode 100644
index 0000000..2bbbcd2
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ Cập nhật AdAway
+
+ Có cập nhật mới!
+
+
+ Đã cập nhật xong
+ Đã có bản cập nhật
+ Đang cập nhật AdAway
+ Cập nhật ngay
+ %1$s / %2$s
+ Các thay đổi mới:
+ Các thay đổi
+ Ủng hộ nhà phát triển
+ Quyên góp
+ Tài trợ
+
+
+ Đang tải xuống bản mới nhất của AdAway…
+
diff --git a/app/src/main/res/values-vi/strings_welcome.xml b/app/src/main/res/values-vi/strings_welcome.xml
new file mode 100644
index 0000000..57ceed9
--- /dev/null
+++ b/app/src/main/res/values-vi/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Chào mừng
+ Bước đầu wizard
+ Bước wizard thứ hai
+ Bước wizard cuối cùng
+
+
+ Chào mừng dến với AdAway!
+ AdAway cung cấp hai phương pháp chặn quảng cáo. Hãy chọn phương pháp phù hợp với bạn:
+
+ Logo root
+ Chặn quảng cáo sử dụng root
+ Nhanh hơn
+ Tiết kiệm pin
+ Thiết bị cần được root
+
+ Logo VPN
+ Chặn quảng cáo sử dụng VPN
+ Chậm hơn
+ Chạy nền
+ Tương thích
+
+ Yêu cầu thiết bị đã được root
+ Chuỗi nhị phân SU không được tìm thấy hoặc AdAway chưa được cấp quyền root. Lỗi này có thể xảy ra do thiết bị của bạn chưa được root. Thông tin về cách root thiết bị có thể xem trên wiki.lineageos.org hoặc các website tương tự.
+
+ Điểm cộng
+ Điểm trừ
+
+
+ Đã đồng bộ xong
+ Có lỗi xảy ra khi đồng bộ
+
+ Đang đồng bộ
+ Đã đồng bộ
+ AdAway tải xuống thông tin về các host quảng cáo để chặn chúng. Bạn có thể tùy chỉnh các host trong Cài đặt.
+ Thử đồng bộ lại
+ Đồng bộ thất bại: %1$sThử lại ngay?
+ Nó có thể gửi thông báo để hiển thị trạng thái và kiểm soát khối quảng cáo cũng như thông báo về bản cập nhật ứng dụng có sẵn (một vài bản cập nhật mỗi năm). Kích hoạt chúng nếu bạn muốn luôn cập nhật.
+
+
+ Hỗ trợ
+ Ủng hộ AdAway!
+ AdAway là ứng dụng mã nguồn mở hoàn toàn miễn phí. Nếu bạn muốn, hãy ủng hộ chúng tôi tại đây:
+ Ủng hộ qua PayPal
+ Có lỗi xảy ra?
+ Báo lỗi cho chúng tôi qua
+
+
+ Quay lại
+ Tiếp theo
+ Hoàn thành
+
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..b583bac
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,258 @@
+
+
+
+ 離開
+ 關閉
+ 是
+ 否
+ 加入
+ 取消
+ 儲存
+ 說明
+
+
+ 歡迎!
+ AdAway 是一個免費、開源的廣告阻擋工具,專為 Android 設計。它會自動擷取廣告網路的地址,然後在您的手機或平板上進行廣告阻擋。\n想進一步瞭解?請查閱下面的使用說明。
+ 顯示更多說明
+ 更新狀態
+ 這個應用程式會自動下載您所設定的所有 hosts 檔案,與您個人的過濾清單進行合併,並安裝為單一的 hosts 檔案。
+ 啟用廣告封鎖
+ 停用廣告封鎖
+ 網頁伺服器
+ 正在執行
+ 已停止
+ 您可以啟動或停用本機的網頁伺服器,以處理到被阻擋網站的請求。
+ 啟用網頁伺服器
+ 停用網頁伺服器
+ VPN
+ 正在執行
+ 已停止
+ 啟動或停止 VPN 來過濾請求。
+ 啟動 VPN
+ 停用 VPN
+
+
+ 編輯項目
+ 套用
+ 編輯
+ 刪除
+
+
+ 匯入中…
+ 成功從外接儲存裝置匯入了備份資料。
+ 備份匯入失敗。請確認備份檔案的格式,或查看 logcat 以瞭解更多詳情。
+ 匯出中…
+ 備份成功匯出到外部儲存空間的「%s」檔案。
+ 無法匯出備份檔案「%s」。
+
+
+ hosts 檔案
+ hosts 檔案是一個與系統相關的純文字檔案,主要用於將網站名稱對應到其 IP 位址。AdAway 會管理此檔案的設定。以下是此檔案的首幾行:
+ 正在載入 hosts 檔案內容…
+ 開啟 hosts 檔案
+
+
+ 檢查更新
+ 正在檢查 %s 來源的更新
+ 搜尋來源中
+ 下載來源 %s
+ 讀取來源%s
+ 正在分析來源%s
+ 正在同步規則資料庫
+ 恢復到預設 hosts 檔案
+ 已還原預設 hosts 檔案
+ 建立標準的 hosts 檔案
+ 有更新
+ 有更新的 hosts 檔案
+ 找不到來源更新
+ 沒有網路連線
+ 沒有可用的網路連線
+ 不可用的來源
+ 無法連接遠端 hosts 來源伺服器!
+ Root 權限被拒絕
+ 從 root 應用程式允許 root 權限
+ 發生一些錯誤
+ 檢視 logcat 以獲得更多詳細資料
+ 啟用
+ 已啟用最新的 hosts 檔案
+ 停用
+ 預設 hosts 檔案已安裝
+ 套用最新來源
+ 建立一個新的 hosts 檔案
+ 複製一個新的 hosts 檔案
+ 正在檢查 hosts 檔案副本
+ hosts 檔案已更新成功
+ VPN 配置更新成功
+ 您的配置已更改,你需要套用它。
+ 套用
+ 正在套用新配置……
+ 無法套用新配置。
+
+
+ hosts 檔案目標的符號連結遺失
+ 由您的目標位置到 `/system/etc/hosts` 的符號連結不存在或是錯誤!若非指向正確的檔案,AdAway 將無法正常運作。\n\n您是否嘗試建立新的符號連結?
+ 符號連結遺失
+ 分割區剩餘空間不足!\n請在偏好設定中將目標 hosts 檔案更改為 `/data/data/hosts`。
+ 空間不足
+ 無法讀取已下載的檔案。
+ 私人檔案失敗
+ 重新掛載分區為讀寫模式失敗!
+ 重新掛載失敗
+ 複製 hosts 檔案失敗
+ 複製 hosts 檔案失敗!
+ 複製失敗
+ 已套用 hosts 來源
+ 建立成功
+ 應用成功。\n可能需要重新啟動 Android 才能使變更生效。\n\n您是否要重新啟動手機?\n(為防止資料遺失,請確保目前沒有應用程式在使用 SD 卡!)
+ 符號連結成功建立。\n可能需要重新啟動 Android 才能使變更生效。\n\n您是否要重新啟動手機?\n(為防止資料遺失,請確保目前沒有應用程式在使用 SD 卡!)
+ 符號連結建立成功
+ Android 系統無法建立符號連結。\n這主要是因為 HTC 手機上一個名為 S-ON 的「功能」!\n\n解決方案是將手機重啟至復原模式,並用 `ln -s /data/data/hosts /system/etc/hosts` 命令建立符號連結。\n\n若仍然不行,請在網路上查找關於 S-OFF 及您的手機型號的資訊。
+ 符號連結建立失敗
+ 請閱讀說明以獲得更多訊息。
+ 您的 Android 設備設定了 APN 代理!\n在使用如 3G 之類的行動網路時,AdAway 將無法穩定運作。您可以透過設定中移除 APN 代理來停用它。(設定 -> 網路與網際網路 -> 行動網路 -> 進階 -> 存取點名稱,然後清除代理欄位的值)
+ 設定了 APN 代理伺服器!
+ 網際網路連線無法正常連線
+ 無法連線
+ 下載中…
+ 套用中…
+ 套用白名單和黑名單
+ 解析及合併 hosts 檔案
+ 建立 hosts 檔案
+ 合併 hosts 檔案
+ 無法套用新的 hosts 檔案。
+ 將 hosts 檔案應用到您的系統失敗了!\n請在偏好設定中將目標 hosts 檔案更改為 `/data/data/hosts`。
+ 建立失敗
+ 請確認您的 root 管理應用程式已授予 root 存取權限。
+ 您已恢復至預設的 hosts 檔案。\n可能需要重新啟動 Android 才能使變更生效。\n\n您是否要重新啟動手機?\n(為防止資料遺失,請確保目前沒有應用程式在使用 SD 卡!)
+ 還原成功
+ 無法還原 hosts 檔案
+ 因未知原因還原失敗。
+ 還原失敗!
+ 所有您啟用的 hosts 來源都無法連接!您是否已正確連接至網際網路?
+ 下載失敗
+ 無法寫入新的私人 hosts 檔案
+ 不能建立私人檔案。
+ 私人檔案建立失敗
+ 您已啟用 systemless 模式。\n可能需要重新啟動 Android 才能使變更生效。\n\n您是否要重新啟動手機?\n(為防止資料遺失,請確保目前沒有應用程式在使用 SD 卡!)
+ 啟用成功
+ 您停用了 systemless 模式。\n變更需要重新啟動才能生效。\n\n您要重新啟動嗎?\n(為了防止檔案遺失,請確保沒有程式正在使用 SD 卡)
+ 取消成功
+ 無法啟用 VPN 廣告阻擋。
+ 無法停用 VPN 廣告阻擋。
+ 啟用 Magisk hosts 模組
+ 在 Magisk Manager 中啟用 systemless hosts 功能。請在該軟體的設定中,啟用Systemless hosts選項並重啟您的裝置。
+ 停用 Magisk hosts 模組
+ 在 Magisk Manager 中停用 systemless hosts 功能。請在該軟體的模組清單中,移除Systemless hosts模組並重啟您的裝置。
+
+
+ 輸入 hosts 檔案的 URL:
+ 主機名稱無效!
+ 主機名稱格式錯誤
+ IP 位址無效!
+ IP 格式錯誤
+ 不要重新啟動並且不再顯示!
+ 讀取中 …
+
+
+ 重新整理
+ 加入
+ 說明
+ 匯入備份
+ 匯出備份
+
+
+ S-ON/S-OFF
+ 常見問題
+ 問題
+
+
+ 廣告軟體
+ 在此,您可以找到已安裝的廣告軟體和 AdAway 無法阻擋的不良應用程式。這些應用程式可能會使用像是 Airpush 的通知功能,即使應用程式沒有運行,也會彈出通知或更改您的鈴聲。唯一可行的對策是點選清單項目,移除這些不良應用程式。
+ 掃描中…
+ 沒有發現任何廣告軟體!
+
+
+ 廣告阻擋器
+ 沒有安裝文字編輯器
+ 找不到適合開啟 hosts 檔案的文字編輯器。您可以安裝 Jota 或其他文字編輯器來處理這個問題。\n\n您想要安裝 Jota 嗎?
+ 沒有安裝檔案管理器
+ 找不到適合開啟檔案的檔案管理器。您可以安裝 OI 檔案管理器或其他檔案管理工具來處理這個問題。\n\n您想要安裝 OI 檔案管理器嗎?
+
+
+ Tcpdump
+ Tcpdump 是一個用於監視 DNS 請求並將它們保存在記錄檔案中的工具。您可以在背景執行它,開啟顯示廣告的應用程式,之後使用記錄檔案來分析 DNS 請求。之後,您可以將可能的廣告伺服器新增到您的黑名單中。
+ 停用監視
+ 啟用監視
+ 顯示結果
+ 排序網域
+ 清除記錄
+ 加入項目至黑名單
+ 加入項目至白名單
+ 加入項目至重新導向清單
+
+ 編輯文字設定值
+ 開啟選單
+ 關閉選單
+
+
+
+ 主畫面
+ Hosts 來源
+ 你的清單
+ 開啟 hosts 檔案
+ 記錄 DNS 請求
+ 掃描廣告軟體
+ 設定
+ 說明
+
+
+
+
+ DNS 請求
+ 你的清單
+ 偏好設定
+
+
+ %1$s 前安裝
+ %1$s 是最新的
+ %1$s 需要更新
+ 上次更新 %1$s 前
+ 未知更新狀態
+ 停用
+ 幾分鐘
+
+ %d 分鐘
+
+
+ %d 小時
+
+
+ %d 天
+
+
+ %d 個月
+
+
+
+ 主機已複製到剪貼簿
+
+
+ 開始
+ 有效的
+ 停止
+ 等待網路
+ 重新連接
+ 重新連接錯誤
+ 已暫停
+ 已停止
+ 廣告攔截器 VPN %1$s
+ 暫停
+ 恢復
+
+
+ AdAway 權限
+ 允許與 AdAway 互動
+ 傳送指令到 AdAway
+ 允許向 AdAway 發送指令,如啟用或禁用系統級廣告攔截
+
+
diff --git a/app/src/main/res/values-zh-rTW/strings_app.xml b/app/src/main/res/values-zh-rTW/strings_app.xml
new file mode 100644
index 0000000..ef195d1
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ 開源的廣告阻擋器
+ AdAway logo
+
diff --git a/app/src/main/res/values-zh-rTW/strings_errors.xml b/app/src/main/res/values-zh-rTW/strings_errors.xml
new file mode 100644
index 0000000..6d0133c
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ 沒有網路連線
+ 無法建立網路連接。請檢查您的設備連線。
+ 無法下載 hosts 來源
+ 無法存取已啟用的 hosts 來源。請檢查您是否正確連線到網際網路。
+
+ 無法建立私人的檔案
+ 無法建立私人檔案以生成新的 hosts 來源。請檢查裝置上的可用空間。
+ 空間不足
+ 無法將 hosts 檔案複製到系統分割區。請檢查 Magisk 的 systemless 模組是否已啟用,然後重新啟動。
+ 無法安裝新的 hosts 檔案
+ 無法將 hosts 檔案複製到 /system 分割區。請確認 Magisk 的 systemless 模組是否已啟用,然後重新啟動。
+ 無法還原 hosts 檔案
+ 無法還原預設 hosts 檔案設定。
+
+ 無法啟用 VPN 廣告阻擋。
+ 請檢查您的 VPN 設定以授權應用程式 VPN 啟動。
+ 無法停用 VPN 廣告阻擋。
+ 請檢查您的 VPN 設定來手動停用它。
+
diff --git a/app/src/main/res/values-zh-rTW/strings_home.xml b/app/src/main/res/values-zh-rTW/strings_home.xml
new file mode 100644
index 0000000..a39ed81
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ 已阻擋
+ 已允許
+ 重新導向
+
+
+
+ %d 個最新來源
+
+
+ %d 個過時來源
+
+ 檢查 hosts 更新
+ 更新 hosts
+
+
+ 顯示 DNS 請求記錄
+
+
+ 顯示說明\n與提示
+
+
+ 打開 GitHub 頁面
+
+
+ 支持項目
+
+
+ GitHub 專案
+ 偏好設定
+
+
+ 打開導覽抽屜
+ 暫停 / 恢復廣告阻擋
+ 更新阻擋網域
+ 顯示要求的網域
+
+
+ 請閱讀說明以獲得更多訊息。
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rTW/strings_hosts.xml b/app/src/main/res/values-zh-rTW/strings_hosts.xml
new file mode 100644
index 0000000..621b4ba
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts 來源
+
+ 用戶自訂清單
+ AdAway官方hosts
+ StevenBlack的統一化hosts
+ Pete Lowe的阻擋hosts
+
+ 無法使用
+ %s 個主機
+
+ 加入來源
+ 編輯來源
+ 網址:(一個 https:// 或 file:// 資源)
+ Hosts 來源 URL
+
diff --git a/app/src/main/res/values-zh-rTW/strings_lists.xml b/app/src/main/res/values-zh-rTW/strings_lists.xml
new file mode 100644
index 0000000..dcc1a76
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ 你的清單
+ 加入主機
+
+ 已阻擋
+ 已允許
+ 重新導向
+
+ 過濾 hosts
+ 搜尋主機名……
+ 切換來源
+
+ 將主機加入至黑名單
+ 將主機至白名單
+ 加入主機重新導向
+ 編輯黑名單主機
+ 編輯白名單主機
+ 編輯重新導向
+ 主機名稱:
+ Hosts 來源 URL
+ (可使用萬用字元 * 和 ?)
+ IP 位址 (IPv4 或 IPv6):
+
diff --git a/app/src/main/res/values-zh-rTW/strings_log.xml b/app/src/main/res/values-zh-rTW/strings_log.xml
new file mode 100644
index 0000000..3c8b0b7
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ 切換記錄的記錄功能
+ 按下「記錄」以開始記錄請求,瀏覽網頁或使用應用程式,然後返回或滑動以更新紀錄。
+ \n\n被阻擋的請求將不會被記錄。如果您也想記錄它們,請先停用廣告阻擋功能。
+
+ 按字母順序排序
+ 按頂級網域排序
+
+ 重新導向網域
+
diff --git a/app/src/main/res/values-zh-rTW/strings_notification.xml b/app/src/main/res/values-zh-rTW/strings_notification.xml
new file mode 100644
index 0000000..56493e2
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ 更新
+ 新的更新通知
+ 有更新
+ 較新的 hosts 檔案可供下載。
+ 應用程式更新可用
+ 可以下載新版本的 AdAway。
+
+ VPN
+ VPN 執行通知
+
diff --git a/app/src/main/res/values-zh-rTW/strings_prefs_backup_restore.xml b/app/src/main/res/values-zh-rTW/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..0f4ff33
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ 備份和還原
+ 備份
+ 將阻擋規則備份到外部存儲
+ 還原
+ 從備份檔案還原阻擋規則
+
diff --git a/app/src/main/res/values-zh-rTW/strings_prefs_main.xml b/app/src/main/res/values-zh-rTW/strings_prefs_main.xml
new file mode 100644
index 0000000..b56697b
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ 設定
+
+ 一般
+ 深色主題
+
+ 淺色
+ 深色
+ 系統預設
+
+ 自動更新
+
+ 廣告阻擋
+ 基於 Root 的廣告阻擋器
+ 基於 VPN 的廣告阻擋器
+ 啟用 IPv6 支援
+ 備份 / 還原阻擋規則
+
+ 除錯
+ 傳送崩潰報告
+ 向 Sentry (sentry.io) 報告
+ 此版本不支援
+ 詳細的日誌
+ 需要重新啟動應用程式才能應用
+
diff --git a/app/src/main/res/values-zh-rTW/strings_prefs_root.xml b/app/src/main/res/values-zh-rTW/strings_prefs_root.xml
new file mode 100644
index 0000000..7132653
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ 基於 Root 的廣告阻擋器
+
+ Hosts 安裝
+ 開啟 hosts 檔案
+ 目標 hosts 檔案
+ 使用此功能前,請先閱讀「幫助」
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ 自訂目標
+
+ 自定義目標位置
+ 應用後隱藏重新啟動的對話框
+
+ 重新導向
+ 定義重新導向被阻止的 hosts 位置
+ IPv4 重新導向
+ IPv6 重新導向
+ 無效的重新導向
+
+ 本地網頁伺服器
+ 本機網頁伺服器會監聽本機 IP 位址,以回應被阻擋的主機名稱請求。這可能有助於解決應用程式在被阻擋的連線時出現的凍結問題。
+ 啟用網頁伺服器
+ 測試網頁伺服器
+ 安裝自簽憑證
+ 憑證手動安裝
+ 從 Android 11(R)版本開始,應用程式無法自動安裝憑證授權(CA)。\n\n請前往「安全性」設定,點選「加密與憑證」,然後選擇「安裝證書」。在那裡,選擇「CA 憑證」並選取新匯出的憑證檔案。
+ 開啟「安全性」設定
+ 檢查中……
+ 未執行
+ 正在執行,但未安裝憑證
+ 正在執行且已安裝憑證
+ 將空白的廣告區域替換為應用程式圖示
+
diff --git a/app/src/main/res/values-zh-rTW/strings_prefs_update.xml b/app/src/main/res/values-zh-rTW/strings_prefs_update.xml
new file mode 100644
index 0000000..84625d8
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ 更新
+ 通知已停用
+ 應用程式通知不會顯示。點擊啟用它們。
+
+ 應用程式更新
+ 啟動時檢查更新
+ 定期檢查更新
+ 包含 beta 版本
+
+ Hosts 更新
+ 啟動時檢查更新
+ 定期檢查更新
+ 同步更新
+ 僅在不限流量的網路上同步
+
diff --git a/app/src/main/res/values-zh-rTW/strings_prefs_vpn.xml b/app/src/main/res/values-zh-rTW/strings_prefs_vpn.xml
new file mode 100644
index 0000000..36f76b9
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ 基於 VPN 的廣告阻擋器
+
+ 開機時啟用
+ 監視連線狀態
+ 定期檢查網路狀態,並在斷線時重新啟動 VPN。
+
+ 排除的應用程式
+ 設定哪些應用程式不應使用 VPN,以避免阻擋任何連線。
+ 排除系統應用程式
+
+ 無
+ 排除瀏覽器之外的所有應用程式
+ 全部
+
+ 排除使用者應用程式
+
+
+ 已排除的應用程式
+ 全選
+ 全不選
+ 應用程式圖示
+
diff --git a/app/src/main/res/values-zh-rTW/strings_source_edit.xml b/app/src/main/res/values-zh-rTW/strings_source_edit.xml
new file mode 100644
index 0000000..09dda53
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ 編輯來源
+ 加入來源
+
+ 標籤
+ 需要標籤
+ 類型
+ URL
+ 檔案
+ 位置
+ https://
+ 需要位置
+ 點擊檔案以選擇來源檔案
+ 位置無效
+ 清單格式
+ 阻擋
+ 允許
+ 套用重新導向 hosts
+ 允許重新導向的主機可能會導致安全問題。僅在信任的來源上使用此設定,因為它可能會將一些敏感流量導向任何它想要的伺服器。
+
diff --git a/app/src/main/res/values-zh-rTW/strings_support.xml b/app/src/main/res/values-zh-rTW/strings_support.xml
new file mode 100644
index 0000000..cfe836d
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ 支持
+ 成為贊助者
+
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rTW/strings_update.xml b/app/src/main/res/values-zh-rTW/strings_update.xml
new file mode 100644
index 0000000..6c00d5a
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_update.xml
@@ -0,0 +1,21 @@
+
+
+ AdAway 更新
+
+ 更新可用!
+
+
+ 您已是最新的
+ 有更新
+ 正在更新 AdAway
+ 現在更新
+ %1$s / %2$s
+ 最近更改
+ 更新紀錄
+ 支援開發
+ 資助
+ 贊助者
+
+
+ 正在下載最新的 AdAway 版本…
+
diff --git a/app/src/main/res/values-zh-rTW/strings_welcome.xml b/app/src/main/res/values-zh-rTW/strings_welcome.xml
new file mode 100644
index 0000000..249d0e0
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ 歡迎
+ 精靈第一步
+ 精靈第二步
+ 精靈最後一步
+
+
+ 歡迎來到 AdAway!
+ AdAway 提供了兩種廣告阻擋方法,選擇一個您喜歡的:
+
+ Root logo
+ 基於 Root\n 廣告阻擋
+ 較快
+ 省電
+ 需要 Root
+
+ VPN logo
+ 基於 VPN\n 廣告阻擋
+ 較慢
+ 在背景運作
+ 相容性
+
+ 需要 root 權限
+ 找不到 su 二進位制檔案,或者您沒有允許 AdAway root 權限。\n\n 當您的裝置沒有 root 權限時,可能會發生這種情況。您可以在 wiki.lineageos.org 或其他 Android 網站上找到有關如何 root 裝置的資訊。
+
+ Pro
+ Con
+
+
+ 同步完成
+ 同步時出錯
+
+ 同步中
+ 已同步!
+ AdAway 可以從線上來源下載廣告網路,以進行阻擋。您可以在「設定」選項中,隨時調整這些阻擋清單。
+ 重新同步
+ 同步失敗:%1$s,現在重試?
+ AdAway 可以發送通知,用於顯示廣告阻擋狀態和控制,以及提醒您有可用的應用程式更新(每年僅數次)。如果您希望保持最新狀態,請啟用這些通知。
+
+
+ 支持
+ 支持我們!
+ AdAway 是一個我在閒暇時間開發的免費且開放原始碼的應用程式。如果您喜歡它,歡迎隨時表達您的支持:
+ 在 PayPal 上捐贈
+ 你喜歡臭蟲嗎?我也不喜歡。
+ 啟用自動傳送崩潰報告
+
+
+ 上一步
+ 下一步
+ 完成
+
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
new file mode 100644
index 0000000..b16d751
--- /dev/null
+++ b/app/src/main/res/values-zh/strings.xml
@@ -0,0 +1,259 @@
+
+
+
+ 退出
+ 关闭
+ 是
+ 否
+ 添加
+ 取消
+ 保存
+ 帮助
+
+
+ 欢迎!
+ AdAway 是一款免费、开源的广告拦截器,它能在线获取广告的域名,并通过系统的 hosts 文件本地屏蔽它们。\n想了解更多信息?请查看下面的帮助!
+ 显示更多帮助
+ 更新状态
+ 已从指定的 hosts 来源下载 hosts 文件,与自定义列表合并,并安装到了您的系统中。
+ 启用广告拦截
+ 禁用广告拦截
+ 网络服务器
+ 正在运行
+ 已停止
+ 在本地主机上启动或停止Web服务器,以回答对被阻止的主机名的请求。
+ 启用网络服务器
+ 禁用网络服务器
+ VPN
+ 运行中
+ 已停止
+ 启动或停止 VPN 以过滤请求。
+ 启用 VPN
+ 禁用 VPN
+
+
+ 编辑条目
+ 应用
+ 编辑
+ 删除
+
+
+ 正在导入…
+ 已成功从外置存储中导入备份。
+ 导入备份失败,请检查格式是否正确。查看日志文件以获取更多信息。
+ 正在导出…
+ 成功将备份导出到你的外部存储上的文件 \"%s\"
+ 备份文件 \"%s\" 导出失败
+
+
+ hosts 文件
+ hosts 文件是一个将主机名映射到 IP 地址的系统文件。它是一个纯文本文件,由 AdAway 处理、配置。这是它的前几行:
+ 正在加载 hosts 文件内容…
+ 打开 hosts 文件
+
+
+ 检查更新
+ 正在为来源 %s 检查更新
+ 正在检索来源
+ 正在下载来源 %s
+ 正在读取来源 %s
+ 正在处理来源 %s
+ 正在同步规则数据库
+ 正在恢复为默认 hosts 文件
+ 已恢复为默认 hosts 文件
+ 创建标准 hosts 文件
+ 有更新可用
+ 有新的 hosts 文件可用
+ 暂无更新
+ 没有网络连接
+ 没有可用的网络连接
+ 不可用的来源
+ 没有可访问的 hosts 源!
+ Root 权限被拒绝
+ 请从您的 root 权限管理器为 AdAway 授予 root 权限
+ 发生了一些错误
+ 检查 logcat 以获取更多详细信息
+ 已启用
+ 已启用最新的 hosts 文件
+ 已禁用
+ 已安装默认 hosts 文件
+ 更新来源
+ 正在创建新 hosts 文件
+ 正在复制新 hosts 文件
+ 正在检查 hosts 文件副本
+ 已成功更新 hosts 文件
+ 已成功更新 VPN 配置
+ 您的配置已更改。 您需要应用它。
+ 应用
+ 正在应用新配置…
+ 无法应用新配置。
+
+
+ 指向 hosts 文件目标的符号链接缺失
+ /system/etc/hosts 的符号链接不存在或者不正确!AdAway 将无法运行。\n\n是否尝试创建符号链接?
+ 符号链接丢失
+ 分区上没有足够的空间!
+请尝试将首选项中的目标 hosts 文件更改为 /data/data/hosts。
+ 没有足够的空间
+ 无法读取已下载的文件。
+ 文件权限获取失败
+ 挂载分区为读/写失败!
+ 挂载失败
+ 无法复制 hosts 文件
+ hosts 文件复制失败!
+ 复制失败
+ 已应用的 hosts 来源
+ 应用成功
+ 应用成功。\n可能需要重启 Android 系统才能使更改生效。\n\n是否重新启动?\n(为防止数据丢失,请确保目前没有任何应用程序正在使用SD卡!)
+ 符号链接创建成功。\n可能需要重启 Android 系统才能使更改生效。\n\n是否重新启动?\n(为防止数据丢失,请确保目前没有任何应用程序正在使用SD卡!)
+ 符号链接创建成功
+ Android 无法创建符号链接。\n失败的常见原因是 HTC 的 S-ON 的功能。\n\n一个解决方案是重启设备到恢复模式,并使用如下命令创建符号链接:\'ln -s /data/data/hosts /system/etc/hosts\'。\n\n如果这不起作用,请搜索如何将您的设备设成 S-OFF。\n\n译者注:这是 2015 年的事情了,现在基本已经没有 S-ON 了。
+ 符号链接创建失败
+ 请阅读帮助以获取更多信息。
+ 您的设备设置了 APN 代理!\n当在 3G 等移动网络上时,AdAway 将无法可靠地工作。您可以尝试禁用 APN 代理:进入您选择的 APN(设置 -> 网络和移动网络 -> 高级 -> 接入点名称),并删除“代理”字段中的值。
+ 已设置 APN 代理!
+ 网络连接缓慢。
+ 没有连接
+ 正在下载…
+ 正在应用…
+ 正在应用黑名单与白名单
+ 正在解析、合并 hosts 文件
+ 正在构建 hosts 文件
+ 正在应用 hosts 文件
+ 无法应用新 hosts 文件。
+ 将 hosts 文件应用至系统时失败!\n请尝试将首选项中的目标 hosts 文件更改为 /data/data/hosts。
+ 应用失败
+ 请检查您的 root 权限管理器,确保已授予 AdAway root 访问权限。
+ 已还原默认 hosts 文件。\n可能需要重启 Android 系统才能使更改生效。\n\n是否重新启动?\n(为防止数据丢失,请确保目前没有任何应用程序正在使用SD卡!)
+ 恢复成功
+ 无法还原 hosts 文件
+ 由于未知原因,恢复失败。
+ 恢复失败!
+ 已启用的 hosts 源均无法访问!您是否已连接到互联网?
+ 下载失败
+ 无法写入新的私人 hosts 文件
+ 无法创建私有文件。
+ 私有文件创建失败
+ systemless 模式已启用。\n可能需要重启 Android 系统才能使更改生效。\n\n是否重新启动?\n(为防止数据丢失,请确保目前没有任何应用程序正在使用SD卡!)
+ 启用成功
+ systemless 模式已禁用。\n可能需要重启 Android 系统才能使更改生效。\n\n是否重新启动?\n(为防止数据丢失,请确保目前没有任何应用程序正在使用SD卡!)
+ 禁用成功
+ 无法启用 VPN 广告拦截。
+ 无法禁用 VPN 广告拦截。
+ 启用 Magisk hosts 模块
+ 请从 Magisk Manager 中启用 systemless hosts 特性。从 Magisk Manager 设置中启用Systemless Hosts功能,并重启设备。
+ 禁用 Magisk hosts 模块
+ 请在 Magisk Manager 中禁用 systemless hosts 特性。从模块列表中卸载Systemless Hosts模块,并重启设备。
+
+
+ 输入 hosts 文件网址:
+ 主机名无效!
+ 主机名格式不正确
+ IP 地址无效!
+ IP 地址格式不正确
+ 从不重启,且不再显示此信息!
+ 正在加载…
+
+
+ 刷新
+ 添加
+ 帮助
+ 导入备份
+ 导出备份
+
+
+ S-ON/S-OFF
+ 常问问题
+ 其他问题
+
+
+ 广告软件
+ 在这里,你可以找到已安装的广告软件,AdAway 无法对其进行有效的广告屏蔽。比如说,这些应用程序可能会在没有运行的时候弹出 Airpush 通知,甚至改变通知铃声。唯一可行的对策是,通过点击下面的列表项,卸载这些应用程序。
+ 正在扫描…
+ 没有已知的广告软件!
+
+
+ 广告拦截器
+ 没有安装文本编辑器
+ 找不到文本编辑器,无法打开 hosts 文件。\n您可以安装 Jota 或其他文本编辑器来解决此问题。\n\n是否安装 Jota 文本编辑器?
+ 没有安装文件管理器
+ 找不到文件管理器,无法打开文件。\n您可以安装 OI 文件管理器或其他文件管理器来解决此问题。\n\n是否安装 OI 文件管理器?
+
+
+ Tcpdump
+ Tcpdump 是一种监控 DNS 请求并将其保存在日志文件中的工具。您可以先在后台启动它,再运行含有广告的应用,然后通过日志文件分析广告的 DNS 请求,最后将可能的广告服务器添加到您的自定义黑名单中。
+ 禁用监控
+ 启用监控
+ 显示结果
+ 排序域名
+ 清除日志
+ 添加条目到黑名单
+ 添加条目到白名单
+ 添加条目到重定向
+
+ 编辑文本首选项值
+ 打开菜单
+ 关闭菜单
+
+
+
+ 主页
+ Hosts 来源
+ 列表
+ 打开 hosts 文件
+ 记录 DNS 请求
+ 扫描广告软件
+ 首选项
+ 帮助
+
+
+
+
+ DNS 请求
+ 列表
+ 首选项
+
+
+ 最后更新于 %1$s前
+ 无需更新,最后更新于 %1$s前
+ 需要更新,最后更新于 %1$s前
+ 最后更新于 %1$s前
+ 更新状态未知
+ 已禁用
+ 几分钟
+
+ %d 分钟
+
+
+ %d 小时
+
+
+ %d 天
+
+
+ %d 个月
+
+
+
+ Hosts 已复制到剪贴板
+
+
+ 开始
+ 活跃
+ 停止
+ 等待网络
+ 重新连接
+ 重新连接错误
+ 已暂停
+ 已停止
+ VPN 广告拦截器 %1$s
+ 暂停
+ 恢复
+
+
+ AdAway 权限
+ 允许与 AdAway 交互
+ 向 AdAway 发送命令
+ 允许向 AdAway 发送命令,例如启用或禁用系统级广告拦截
+
+
diff --git a/app/src/main/res/values-zh/strings_app.xml b/app/src/main/res/values-zh/strings_app.xml
new file mode 100644
index 0000000..484d66e
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ 开源广告拦截器
+ AdAway 徽标
+
diff --git a/app/src/main/res/values-zh/strings_errors.xml b/app/src/main/res/values-zh/strings_errors.xml
new file mode 100644
index 0000000..0f1fb50
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ 没有网络连接
+ 无法建立与Internet的连接。 请检查您的设备连接。
+ 无法下载 hosts 来源
+ 您所有启用的hosts源均无法访问。 请检查您是否已正确连接到Internet。
+
+ 无法创建私人 hosts 文件
+ 无法创建私有文件以构建新的hosts源。 请检查设备上的可用空间。
+ 没有足够的空间
+ 无法将hosts文件复制到系统分区。 请检查Magisk systemless module已启用,然后重新启动。
+ 无法安装新的hosts文件
+ 无法将主机文件复制到/系统分区。请检查 Magisk sytemless 模块是否启用,然后重新启动。
+ 无法还原hosts文件
+ 无法还原默认hosts文件配置。
+
+ 无法启用VPN广告拦截。
+ 请检查您的VPN设置以授权启动应用程序VPN。
+ 无法禁用VPN广告拦截器。
+ 请检查您的VPN设置以手动将其禁用。
+
diff --git a/app/src/main/res/values-zh/strings_home.xml b/app/src/main/res/values-zh/strings_home.xml
new file mode 100644
index 0000000..ba9fbf8
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ 阻止
+ 允许
+ 重定向
+
+
+
+ %d 个已更新来源
+
+
+ %d 个需更新来源
+
+ 检查主机文件更新
+ 更新 hosts
+
+
+ 显示 DNS 请求记录
+
+
+ 显示帮助\n和提示
+
+
+ 打开 GitHub 页面
+
+
+ 支持本项目
+
+
+ Github 项目
+ 首选项
+
+
+ 打开导航抽屉
+ 暂停/恢复广告屏蔽
+ 更新被阻止的域名
+ 显示请求的域名
+
+
+ 请阅读帮助以获取更多信息。
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-zh/strings_hosts.xml b/app/src/main/res/values-zh/strings_hosts.xml
new file mode 100644
index 0000000..8de7b97
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ hosts 来源
+
+ 用户列表
+ AdAway 官方 hosts
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ 无法使用
+ %s hosts
+
+ 添加来源
+ 编辑来源
+ URL:(以 https:// 或 file:// 开头)
+ hosts 链接
+
diff --git a/app/src/main/res/values-zh/strings_lists.xml b/app/src/main/res/values-zh/strings_lists.xml
new file mode 100644
index 0000000..3cd69d5
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ 用户列表
+ 添加 host
+
+ 阻止
+ 允许
+ 重定向
+
+ 过滤 hosts
+ 搜索主机名…
+ 切换源
+
+ 将主机添加到黑名单
+ 将主机添加到白名单
+ 将主机添加到重定向
+ 编辑黑名单主机
+ 编辑白名单主机
+ 编辑重定向
+ 主机名:
+ hosts 链接
+ (允许使用通配符 * 和 ? )
+ IP 地址(IPv4 或 IPv6):
+
diff --git a/app/src/main/res/values-zh/strings_log.xml b/app/src/main/res/values-zh/strings_log.xml
new file mode 100644
index 0000000..0d3d0c1
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ 切换日志记录开启状态
+ 按下录制按钮以开始记录请求,浏览网页或使用应用程序,然后返回或滑动屏幕刷新日志。
+ \n\n被拦截的请求不会被记录。如果你也想记录它们,请先禁用广告拦截功能。
+
+ 按字母排序
+ 按顶级域名排序
+
+ 重定向域名
+
diff --git a/app/src/main/res/values-zh/strings_notification.xml b/app/src/main/res/values-zh/strings_notification.xml
new file mode 100644
index 0000000..daa434b
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ 更新
+ 更新通知
+ 有更新可用
+ 有新 hosts 文件可供下载。
+ 应用更新可用
+ AdAway 有新版本了。
+
+ VPN
+ VPN 运行通知
+
\ No newline at end of file
diff --git a/app/src/main/res/values-zh/strings_prefs_backup_restore.xml b/app/src/main/res/values-zh/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..10d678f
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ 备份与还原
+ 备份
+ 将屏蔽规则备份至外部存储
+ 还原
+ 从备份文件还原屏蔽规则
+
diff --git a/app/src/main/res/values-zh/strings_prefs_main.xml b/app/src/main/res/values-zh/strings_prefs_main.xml
new file mode 100644
index 0000000..d7284a5
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ 首选项
+
+ 常规
+ 深色主题
+
+ 浅色
+ 深色
+ 系统默认
+
+ 自动更新
+
+ 广告屏蔽
+ 基于 root 的广告拦截器
+ 基于 VPN 的广告拦截器
+ 启用 IPv6 支持
+ 备份/还原屏蔽规则
+
+ 调试
+ 启用崩溃报告
+ 允许本应用程序向 Sentry(sentry.io)发送错误与崩溃报告。
+ 此版本不支持
+ 启用详细日志
+ 具体的日志级别为 verbose,需重启 AdAway 才能使此设置生效。
+
diff --git a/app/src/main/res/values-zh/strings_prefs_root.xml b/app/src/main/res/values-zh/strings_prefs_root.xml
new file mode 100644
index 0000000..f1bf3a9
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ 基于Root的广告拦截器
+
+ hosts安装
+ 打开 hosts 文件
+ 目标 hosts 文件
+ 在更改此设置之前,请阅读有关此功能的帮助条目。
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ 自定义路径
+
+ 自定义 hosts 文件路径
+ 隐藏重启对话框
+
+ 重定向
+ 定义重定向被阻止hosts的位置
+ IPv4 重定向
+ IPv6 重定向
+ 无效的重定向
+
+ 本地网络服务器
+ 本地Web服务器侦听本地IP 地址,以回答被阻止的主机名请求。 它可能有助于阻止连接冻结的应用程序。
+ 启用网络服务器
+ 测试网络服务器
+ 安装自签名证书
+ 手动安装证书
+ 自Android 11 (R) 起,应用程序不能再自动安装证书颁发机构(CA)。\n\n进入“安全”设置,“加密&凭据”,接着“安装一个证书”。从那里,选择“CA 证书”并选择新导出的证书文件。
+ 打开\"安全\"设置
+ 正在检查…
+ 未运行
+ 正在运行,但未安装证书
+ 运行并安装证书
+ 用应用程序图标替换空白广告空间
+
diff --git a/app/src/main/res/values-zh/strings_prefs_update.xml b/app/src/main/res/values-zh/strings_prefs_update.xml
new file mode 100644
index 0000000..d197868
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ 更新
+ 通知被禁用
+ 不会显示应用通知。轻按启用它们。
+
+ 应用程序更新
+ 启动时检查更新
+ 每天检查更新
+ 包括测试版
+
+ hosts 更新
+ 启动时检查更新
+ 定时检查更新
+ 同步更新(Sync on update)
+ 仅在连接至不计费网络时同步
+
diff --git a/app/src/main/res/values-zh/strings_prefs_vpn.xml b/app/src/main/res/values-zh/strings_prefs_vpn.xml
new file mode 100644
index 0000000..9116d0f
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ 基于 VPN 的广告拦截器
+
+ 启动时启用
+ 监视连接
+ 定期检查网络状态以便在断开连接时重新启动 VPN。
+
+ 排除的应用
+ 配置哪些应用程序不应使用 VPN,以防止其连接被错误阻止。
+ 排除系统应用程序
+
+ 无
+ 除浏览器以外的所有应用
+ 所有应用
+
+ 排除用户应用程序
+
+
+ 排除的应用
+ 全选
+ 取消全选
+ 应用程序图标
+
diff --git a/app/src/main/res/values-zh/strings_source_edit.xml b/app/src/main/res/values-zh/strings_source_edit.xml
new file mode 100644
index 0000000..1f202e0
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ 编辑来源
+ 添加来源
+
+ 标签
+ 需要标签
+ 类型
+ URL
+ 文件
+ 位置
+ https://
+ 需要位置
+ 按下“文件”来选择源文件
+ 无效的位置
+ 列表格式
+ 拦截
+ 允许
+ 应用重定向 hosts
+ 允许重定向 hosts 可能导致安全问题。因其可能会将一些敏感流量重定向到任何它指定的服务器,请只对信任的源使用此设置。
+
diff --git a/app/src/main/res/values-zh/strings_support.xml b/app/src/main/res/values-zh/strings_support.xml
new file mode 100644
index 0000000..ac6d980
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ 支持
+ 成为一名赞助者
+
\ No newline at end of file
diff --git a/app/src/main/res/values-zh/strings_update.xml b/app/src/main/res/values-zh/strings_update.xml
new file mode 100644
index 0000000..9b0c48d
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_update.xml
@@ -0,0 +1,22 @@
+
+
+ AdAway 更新
+
+ 有更新可用!
+
+
+ 您已安装最新版本
+ 有更新可用
+ 正在更新AdAway
+ 立即更新
+ %1$s/%2$s
+ 完毕
+ 最近更改
+ 更新日志
+ 支持开发
+ 捐赠
+ 赞助者
+
+
+ 正在下载最新AdAway版本…
+
diff --git a/app/src/main/res/values-zh/strings_welcome.xml b/app/src/main/res/values-zh/strings_welcome.xml
new file mode 100644
index 0000000..ea95ff3
--- /dev/null
+++ b/app/src/main/res/values-zh/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ 欢迎
+ 向导第一步
+ 向导第二部
+ 向导最后一步
+
+
+ 欢迎使用 AdAway!
+ AdAway 提供两种广告屏蔽方法。选择您喜欢的:
+
+ Root logo
+ 基于Root 的广告屏蔽
+ 更快
+ 电池友好
+ 需要 root 权限
+
+ VPN logo
+ 基于 VPN 的广告屏蔽
+ 更慢
+ 后台运行
+ 兼容性强
+
+ 需要已获得 root 权限的 Android 设备
+ 找不到 su 二进制文件,或者您没有为 AdAway 授予 root 权限。\n\n如果您的设备未获得 root 权限,则可能会发生这种情况。 您可以在 wiki.lineageos.org 或其他 Android 网站上找到有关如何将设备 root 的信息。
+
+ 优点
+ 缺点
+
+
+ 同步完成
+ 同步出错
+
+ 正在同步
+ 已同步!
+ AdAway 会从在线来源下载广告网络的数据以便屏蔽。 您稍后可以在设置中自定义它们。
+ 重新同步
+ 同步失败:%1$s 立即重试吗?
+ 它可以发送通知展示广告拦截状态和控制,并提示可用的应用更新(每年几次)。如你想保持最新版本,请启用它们。
+
+
+ 支持
+ 支持我!
+ AdAway 是一款我利用业余时间开发的自由开源应用。如果你喜欢它,请随时表达你的支持:
+ 通过 PayPal 捐赠
+ 你喜欢 bug 吗?我也不喜欢。
+ 启用遥测,向我发送崩溃报告
+
+
+ 后退
+ 前进
+ 完成
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..93993b3
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,23 @@
+
+
+
+ #ef5350
+ #e53935
+ #000000
+
+ #B71C1C
+
+ #FF5252
+ #64FFDA
+ #536DFE
+
+ #78b71c1c
+ #f5f5f5
+ #3F000000
+
+ #FF424242
+ #388E3C
+ #B71C1C
+
+ #b71c1c
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..28b4e8a
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,10 @@
+
+
+ 8dp
+
+ 8dp
+ 16dp
+
+ 16dp
+ 16dp
+
diff --git a/app/src/main/res/values/preferences.xml b/app/src/main/res/values/preferences.xml
new file mode 100644
index 0000000..d19e132
--- /dev/null
+++ b/app/src/main/res/values/preferences.xml
@@ -0,0 +1,70 @@
+
+
+ darkThemeMode
+ MODE_NIGHT_YES
+
+ MODE_NIGHT_NO
+ MODE_NIGHT_YES
+ MODE_NIGHT_FOLLOW_SYSTEM
+
+ updateCheck
+ true
+ neverReboot
+ false
+ enableIpv6
+ false
+ updateCheckAppStartup
+ true
+ openNotificationPreferences
+ updateCheckAppDaily
+ true
+ includeBetaReleases
+ false
+ updateCheckHostsDaily
+ true
+ automaticUpdateDaily
+ true
+ updateOnlyOnWifi
+ false
+ redirectionIP
+ 127.0.0.1
+ redirectionIPv6
+ ::1
+ openHosts
+ writeToSystem
+ customTarget
+ /data/etc/hosts
+ webserverEnabled
+ true
+ webserverTest
+ webserverCertificate
+ webserverIcon
+ true
+ adBlockMethod
+ 0
+ rootAdBlockMethod
+ vpnAdBlockMethod
+ vpnPaused
+ 0
+ vpnOnBoot
+ true
+ vpnWatchdog
+ false
+ debugEnabled
+ false
+ enableTelemetry
+ false
+ displayTelemetryConsent
+ true
+ backup
+ restore
+ excludeSystemAppFromVpn
+ none
+
+ none
+ allExceptBrowsers
+ all
+
+ excludeUserAppFromVpn
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..dc42208
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,262 @@
+
+
+
+ Exit
+ Close
+ Yes
+ No
+ Add
+ Cancel
+ Save
+ Help
+
+
+ Welcome!
+ AdAway is a free and open-source software design to block advertising. It fetches advertising network addresses to block them on your device.\nWant to know more? Check the help below!
+ Show more help
+ Update status
+ All hosts files from the defined sources are downloaded, merged with your own lists and installed as one hosts file on your system.
+ Enable ad-blocking
+ Disable ad-blocking
+ Web server
+ Running
+ Stopped
+ Start or stop webserver on localhost to answer requests to blocked hostnames.
+ Enable web server
+ Disable web server
+ VPN
+ Running
+ Stopped
+ Start or stop VPN to filter requests.
+ Enable VPN
+ Disable VPN
+
+
+ Edit Entry
+ Apply
+ Edit
+ Delete
+
+
+ Importing…
+ Backup successfully imported from your external storage.
+ Failed to import backup. Is its format correct? Check logcat for more details.
+ Exporting…
+ Backup successfully exported to file \'%s\' on your external storage.
+ Failed to export backup file \'%s\'.
+
+
+ The hosts file
+ The hosts file is a system file that maps hostnames to IP addresses. It is a plain text file which configuration is handled by AdAway. Here are its few first lines:
+ Loading the hosts file content…
+ Open the hosts file
+
+
+ Checking for update
+ Checking %s source for update
+ Retrieving sources
+ Downloading source %s
+ Reading source %s
+ Parsing %s source
+ Syncing rule database
+ Reverting to default hosts file
+ Default hosts file restored
+ Creating standard hosts file
+ Source update available
+ Newer hosts files available
+ No source update found
+ No Internet connection
+ No Internet connection available
+ Unavailable sources
+ No hosts sources are reachable!
+ Root access denied
+ Allow root access from your root app
+ Something went wrong
+ Check the logcat for more details
+ Enabled
+ Newest hosts files enabled
+ Disabled
+ Default hosts file installed
+ Apply latest sources
+ Creating a new hosts file
+ Copying a new hosts file
+ Checking hosts file copy
+ Hosts file successfully updated
+ VPN configuration successfully updated
+ Your configuration changed. You need to apply it.
+ Apply
+ Applying new configuration…
+ Failed to apply new configuration.
+
+
+ The symlink to the hosts file target is missing
+ Symlink from your target to /system/etc/hosts is not existing or incorrect! AdAway will not work if it is not pointing to the right file.\n\nDo you want to try creating a symlink?
+ Symlink missing
+ Not enough space on the partition!\nTry changing the target hosts file in preferences to /data/data/hosts.
+ Not enough space
+ Downloaded file could not be read.
+ Private file fail
+ Remounting the partition as read/write failed!
+ Remount failed
+ Failed to copy hosts file
+ Copying of hosts file failed!
+ Copy failed
+ Applied hosts sources
+ Applying successful
+ Applying was successful.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Symlink was created successful.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Symlink creation successful
+ Symlink could not be created by Android.\nThis fails mostly due to a \'feature\' called S-ON on HTC phones!\n\nA solution is to boot your phone into recovery mode and create the symlink there with \'ln -s /data/data/hosts /system/etc/hosts\'.\n\nIf this does not work search the Internet for S-OFF and your phone.
+ Symlink creation failed
+ Please read Help for more information.
+ An APN proxy is set on your Android!\nAdAway will not work reliably when on Mobile Networks like 3G. You can deactivate that proxy by going to your selected APN (From the Settings app: Network & Internet -> Mobile network -> Advanced -> Access Point Names) and remove the value in the proxy field.
+ APN proxy set!
+ The connection to the Internet is not working.
+ No Connection
+ Downloading…
+ Applying…
+ Applying Blacklist and Whitelist
+ Parsing and merging hosts files
+ Building hosts file
+ Applying hosts file
+ Failed to apply new hosts file.
+ Applying the hosts file to your system failed!\nTry changing the target hosts file in preferences to /data/data/hosts.
+ Applying failed
+ Please check your root management app to ensure root access has been granted.
+ You reverted to the default hosts file.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Reverting successful
+ Unable to revert hosts file
+ Reverting failed due to unknown reasons.
+ Reverting failed!
+ None of your enabled hosts sources are reachable! Are you properly connected to the Internet?
+ Download failed
+ Failed to write new private hosts file
+ Private file can not be created.
+ Private file creation failed
+ You enabled systemless mode.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Enabling successful
+ You disabled systemless mode.\nIt may be necessary to reboot Android for the changes to take effect.\n\nDo you want to reboot?\n(To prevent data loss make sure no app uses the SD card at the moment!)
+ Disabling successful
+ Failed to enable VPN ad blocking.
+ Failed to disable VPN ad blocking.
+ Enabling hosts Magisk module
+ Enable systemless hosts feature from Magisk manager. From its settings, enable the Systemless hosts option then reboot your device.
+ Disabling hosts Magisk module
+ Disable systemless hosts feature from Magisk manager. From the module list, uninstall the Systemless hosts module then reboot your device.
+
+
+ Input URL to hosts file:
+ This is not a valid hostname!
+ Improperly formatted hostname
+ This is not a valid IP!
+ Improperly formatted IP
+ Never reboot and don\'t show this question next time!
+ Loading…
+
+
+ Refresh
+ Add
+ Help
+ Import backup
+ Export backup
+
+
+ S-ON/S-OFF
+ FAQ
+ Problems
+
+
+ Adware
+ Here you can find installed adware, bad applications which can\'t be blocked by AdAway. These apps use for example Airpush notifications that pop up even when the app is not running or even change your ringtone. The only available countermeasure is to uninstall those apps by clicking on the list items.
+ Scanning…
+ No Adware were found!
+
+
+ Ad blocker
+ No text editor installed
+ No text editor could be found to open the hosts file. You can install Jota or other text editors to handle this.\n\nDo you want to install Jota?
+ No file manager installed
+ No file manager could be found to open files. You can install OI File Manager or other file managers to handle this.\n\nDo you want to install OI File Manager?
+
+
+ Tcpdump
+ Tcpdump is a tool to monitor DNS requests and save them in a log file. You can start it in the background, run applications that display ads, and afterwards analyze the DNS requests using the log file. Possible ad server can then be added to your blacklist.
+ Disable monitoring
+ Enable monitoring
+ Show results
+ Sort domains
+ Clear log
+ Add entry to black list
+ Add entry to white list
+ Add entry to redirect list
+
+ Edit text preference value
+ Open menu
+ Close menu
+
+
+
+ Home
+ Hosts sources
+ Your lists
+ Open hosts file
+ Log DNS requests
+ Scan for adware
+ Preferences
+ Help
+
+
+
+
+ DNS requests
+ Your lists
+ Preferences
+
+
+ Installed %1$s ago
+ Up-to-date for %1$s
+ Need update for %1$s
+ Last update %1$s ago
+ Unknown update status
+ Disabled
+ few minutes
+
+ %d minute
+ %d minutes
+
+
+ %d hour
+ %d hours
+
+
+ %d day
+ %d days
+
+
+ %d month
+ %d months
+
+
+
+ Host copied to clipboard
+
+
+ starting
+ active
+ stopping
+ wait for network
+ reconnecting
+ reconnecting error
+ paused
+ stopped
+ Ad-blocker VPN %1$s
+ Pause
+ Resume
+
+
+ AdAway permissions
+ Allow to interact with AdAway
+ Send commands to AdAway
+ Allow to send commands to AdAway like enabling or disabling the system-wide ad-blocking
+
+
diff --git a/app/src/main/res/values/strings_app.xml b/app/src/main/res/values/strings_app.xml
new file mode 100644
index 0000000..af6a933
--- /dev/null
+++ b/app/src/main/res/values/strings_app.xml
@@ -0,0 +1,6 @@
+
+
+ AdAway
+ Open Source ad blocker
+ AdAway logo
+
diff --git a/app/src/main/res/values/strings_errors.xml b/app/src/main/res/values/strings_errors.xml
new file mode 100644
index 0000000..da703ab
--- /dev/null
+++ b/app/src/main/res/values/strings_errors.xml
@@ -0,0 +1,22 @@
+
+
+
+ No Internet connection
+ Unable to establish a connection to the Internet. Please check your device connectivity.
+ Failed to download hosts source
+ None of your enabled hosts sources are reachable. Please check you are properly connected to the Internet.
+
+ Failed to create private file
+ Unable to create a private file to build a new hosts source. Please check the free space available on your device.
+ Not enough space
+ Unable to copy hosts file to your system partition. Please check Magisk systemless module is enabled then reboot.
+ Failed to install new hosts file
+ Unable to copy hosts file to /system partition. Please check Magisk systemless module is enabled then reboot.
+ Failed to revert hosts file
+ Unable to restore default hosts file configuration.
+
+ Failed to enable VPN ad blocking.
+ Please check your VPN settings to authorize the application VPN to start.
+ Failed to disable VPN ad blocking.
+ Please check your VPN settings to disable it manually.
+
diff --git a/app/src/main/res/values/strings_home.xml b/app/src/main/res/values/strings_home.xml
new file mode 100644
index 0000000..d4feb49
--- /dev/null
+++ b/app/src/main/res/values/strings_home.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ Blocked
+ Allowed
+ Redirected
+
+
+
+ %d up-to-date source
+ %d up-to-date sources
+
+
+ %d outdated source
+ %d outdated sources
+
+ Check for hosts updates
+ Update hosts
+
+
+ Show DNS request log
+
+
+ Show help\nand tips
+
+
+ Open GitHub page
+
+
+ Support the project
+
+
+ GitHub project
+ Preferences
+
+
+ Open navigation drawer
+ Pause/resume ad blocking
+ Update blocked domains
+ Show requested domains
+
+
+ Please read Help for more information.
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings_hosts.xml b/app/src/main/res/values/strings_hosts.xml
new file mode 100644
index 0000000..9708f7a
--- /dev/null
+++ b/app/src/main/res/values/strings_hosts.xml
@@ -0,0 +1,17 @@
+
+
+ Hosts sources
+
+ User list
+ AdAway official hosts
+ StevenBlack Unified hosts
+ Pete Lowe blocklist hosts
+
+ not available
+ %s hosts
+
+ Add source
+ Edit source
+ URL: (a https:// or file:// resource)
+ The hosts source URL
+
diff --git a/app/src/main/res/values/strings_lists.xml b/app/src/main/res/values/strings_lists.xml
new file mode 100644
index 0000000..d87d9e4
--- /dev/null
+++ b/app/src/main/res/values/strings_lists.xml
@@ -0,0 +1,24 @@
+
+
+ Your lists
+ Add host
+
+ Blocked
+ Allowed
+ Redirected
+
+ Filter hosts
+ Search hostname…
+ Toggle sources
+
+ Add host to blacklist
+ Add host to whitelist
+ Add host redirect
+ Edit blacklisted host
+ Edit whitelisted host
+ Edit redirect
+ Hostname:
+ The hosts source URL
+ (Wildcard characters * and ? are allowed)
+ IP (IPv4 or IPv6):
+
diff --git a/app/src/main/res/values/strings_log.xml b/app/src/main/res/values/strings_log.xml
new file mode 100644
index 0000000..8e33945
--- /dev/null
+++ b/app/src/main/res/values/strings_log.xml
@@ -0,0 +1,11 @@
+
+
+ Toggle log recording
+ Press record to start logging requests, browse the Web or use apps, then go back or swipe to refresh the logs.
+ \n\nBlocked requests will not be logged. Disable ad-blocking first if you want to log them too.
+
+ Alphabetical sort
+ Top level domain sort
+
+ Redirect domain
+
diff --git a/app/src/main/res/values/strings_notification.xml b/app/src/main/res/values/strings_notification.xml
new file mode 100644
index 0000000..46c6770
--- /dev/null
+++ b/app/src/main/res/values/strings_notification.xml
@@ -0,0 +1,13 @@
+
+
+
+ Updates
+ New update notifications
+ Source update available
+ Newer hosts files available for download.
+ App update available
+ A new version of AdAway is available for download.
+
+ VPN
+ VPN running notifications
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings_prefs_backup_restore.xml b/app/src/main/res/values/strings_prefs_backup_restore.xml
new file mode 100644
index 0000000..910b88b
--- /dev/null
+++ b/app/src/main/res/values/strings_prefs_backup_restore.xml
@@ -0,0 +1,8 @@
+
+
+ Backup & restore
+ Backup
+ Backup to external storage your block rules
+ Restore
+ Restore your block rules from backup file
+
diff --git a/app/src/main/res/values/strings_prefs_main.xml b/app/src/main/res/values/strings_prefs_main.xml
new file mode 100644
index 0000000..ac8940e
--- /dev/null
+++ b/app/src/main/res/values/strings_prefs_main.xml
@@ -0,0 +1,26 @@
+
+
+ Preferences
+
+ General
+ Dark theme
+
+ Light
+ Dark
+ System default
+
+ Automatic updates
+
+ Ad blocking
+ Root based ad blocker
+ VPN based ad blocker
+ Enable IPv6 support
+ Backup / restore block rules
+
+ Debug
+ Send crash reports
+ Report to Sentry (sentry.io)
+ Not supported on this build
+ Verbose logging
+ App restart is needed to apply
+
diff --git a/app/src/main/res/values/strings_prefs_root.xml b/app/src/main/res/values/strings_prefs_root.xml
new file mode 100644
index 0000000..0f3ceaa
--- /dev/null
+++ b/app/src/main/res/values/strings_prefs_root.xml
@@ -0,0 +1,37 @@
+
+
+ Root based ad blocker
+
+ Hosts install
+ Open hosts file
+ Target hosts file
+ Read Help before using this feature
+
+ /system/etc/hosts
+ /data/hosts
+ /data/data/hosts
+ Custom target
+
+ Custom target location
+ Hide reboot dialog after apply
+
+ Redirection
+ Define where to redirect blocked hosts
+ Configure IPv4 redirection
+ Configure IPv6 redirection
+ Invalid redirection
+
+ Local web server
+ The local web server listens on local IP addresses to answer to blocked hostname requests. It may help with app freezing on blocked connection.
+ Enable web server
+ Test web server
+ Install self-signed certificate
+ Certificate manual install
+ Starting from Android 11 (R), application can no more automatically install certificate authority (CA).\n\nGo to \"Security\" settings, \"Encryption & credentials\" then \"Install a certificate\". From there, choose \"CA certificate\" and select the newly exported certificate file.
+ Open "Security" settings
+ Checking…
+ Not running
+ Running but certificate not installed
+ Running and certificate installed
+ Replace blank ad space by app icon
+
diff --git a/app/src/main/res/values/strings_prefs_update.xml b/app/src/main/res/values/strings_prefs_update.xml
new file mode 100644
index 0000000..b8150f3
--- /dev/null
+++ b/app/src/main/res/values/strings_prefs_update.xml
@@ -0,0 +1,17 @@
+
+
+ Updates
+ Notifications are disabled
+ Application notifications won\'t show. Tap to enable them.
+
+ Application updates
+ Check for update at startup
+ Periodically check for update
+ Include beta releases
+
+ Hosts updates
+ Check for update at startup
+ Periodically check for update
+ Sync on update
+ Sync on unmetered network only
+
diff --git a/app/src/main/res/values/strings_prefs_vpn.xml b/app/src/main/res/values/strings_prefs_vpn.xml
new file mode 100644
index 0000000..43102a4
--- /dev/null
+++ b/app/src/main/res/values/strings_prefs_vpn.xml
@@ -0,0 +1,24 @@
+
+
+ VPN based ad blocker
+
+ Enable at startup
+ Monitor connection
+ Periodically check the network state to restart VPN on disconnection.
+
+ Excluded applications
+ Configure which applications should not use the VPN so no connections will be blocked.
+ Exclude system applications
+
+ None
+ All except browsers
+ All
+
+ Exclude user applications
+
+
+ Excluded applications
+ Select all
+ Deselect all
+ Application icon
+
diff --git a/app/src/main/res/values/strings_source_edit.xml b/app/src/main/res/values/strings_source_edit.xml
new file mode 100644
index 0000000..9ea94be
--- /dev/null
+++ b/app/src/main/res/values/strings_source_edit.xml
@@ -0,0 +1,21 @@
+
+
+ Edit source
+ Add source
+
+ Label
+ Label required
+ Type
+ URL
+ File
+ Location
+ https://
+ Location required
+ Press File to select source file
+ Invalid location
+ List format
+ Block
+ Allow
+ Apply redirected hosts
+ Allowing redirected hosts may cause security issues. Only use this settings on a trusted source as it could redirect some sensitive traffic to whatever server it wants.
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings_static.xml b/app/src/main/res/values/strings_static.xml
new file mode 100644
index 0000000..dc2e060
--- /dev/null
+++ b/app/src/main/res/values/strings_static.xml
@@ -0,0 +1,5 @@
+
+
+ https://wiki.lineageos.org/
+ https://
+
diff --git a/app/src/main/res/values/strings_support.xml b/app/src/main/res/values/strings_support.xml
new file mode 100644
index 0000000..308ebf9
--- /dev/null
+++ b/app/src/main/res/values/strings_support.xml
@@ -0,0 +1,5 @@
+
+
+ Support
+ Become a sponsor
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings_update.xml b/app/src/main/res/values/strings_update.xml
new file mode 100644
index 0000000..34b0984
--- /dev/null
+++ b/app/src/main/res/values/strings_update.xml
@@ -0,0 +1,22 @@
+
+
+ AdAway update
+
+ Update available!
+
+
+ You are up-to-date
+ Update available
+ Updating AdAway
+ Update now
+ %1$s / %2$s
+ Complete
+ Last changes
+ Changelog
+ Support development
+ Donate
+ Sponsor
+
+
+ Downloading latest AdAway version…
+
diff --git a/app/src/main/res/values/strings_welcome.xml b/app/src/main/res/values/strings_welcome.xml
new file mode 100644
index 0000000..350f616
--- /dev/null
+++ b/app/src/main/res/values/strings_welcome.xml
@@ -0,0 +1,53 @@
+
+
+ Welcome
+ Wizard first step
+ Wizard second step
+ Wizard last step
+
+
+ Welcome to AdAway!
+ AdAway provides two ad blocking methods. Pick the one you like:
+
+ Root logo
+ Root based\nad blocking
+ Faster
+ Battery friendly
+ Root required
+
+ VPN logo
+ VPN based\nad blocking
+ Slower
+ Run in background
+ Compatibility
+
+ Rooted Android required
+ Either the su binary could not be found or you did not allow root permission for AdAway.\n\nThis can happen when your device is not rooted. You can find information about how to root your device on wiki.lineageos.org or other Android websites.
+
+ Pro
+ Con
+
+
+ Sync done
+ Error during sync
+
+ Syncing
+ Synced!
+ AdAway downloads ad networks to block from online sources. You can customize them later in the settings.
+ Retry sync
+ Failed to sync: %1$s Retry now?
+ It can send notifications to display ad block status and control, and to notify about available app update (a few per year). Enable them if you want to stay up-to-date.
+
+
+ Support
+ Support me!
+ AdAway is a free and open-source app that I develop on my free time. If you enjoy it, feel free to show your support:
+ Donate on PayPal
+ Do you like bugs? Me neither.
+ Enable telemetry to send me crash reports
+
+
+ Back
+ Next
+ Finish
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..72b5d99
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/list_searchable.xml b/app/src/main/res/xml/list_searchable.xml
new file mode 100644
index 0000000..c42d246
--- /dev/null
+++ b/app/src/main/res/xml/list_searchable.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..8177e15
--- /dev/null
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,9 @@
+
+
+
+ localhost
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences_backup_restore.xml b/app/src/main/res/xml/preferences_backup_restore.xml
new file mode 100644
index 0000000..6807c82
--- /dev/null
+++ b/app/src/main/res/xml/preferences_backup_restore.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml
new file mode 100644
index 0000000..5c71b4b
--- /dev/null
+++ b/app/src/main/res/xml/preferences_main.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences_root.xml b/app/src/main/res/xml/preferences_root.xml
new file mode 100644
index 0000000..ad57d29
--- /dev/null
+++ b/app/src/main/res/xml/preferences_root.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences_update.xml b/app/src/main/res/xml/preferences_update.xml
new file mode 100644
index 0000000..b341dff
--- /dev/null
+++ b/app/src/main/res/xml/preferences_update.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences_vpn.xml b/app/src/main/res/xml/preferences_vpn.xml
new file mode 100644
index 0000000..f3f82c0
--- /dev/null
+++ b/app/src/main/res/xml/preferences_vpn.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/res/xml/shortcuts.xml
new file mode 100644
index 0000000..6812875
--- /dev/null
+++ b/app/src/main/res/xml/shortcuts.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/org/adaway/model/git/GitHostsSourceTest.java b/app/src/test/java/org/adaway/model/git/GitHostsSourceTest.java
new file mode 100644
index 0000000..319445f
--- /dev/null
+++ b/app/src/test/java/org/adaway/model/git/GitHostsSourceTest.java
@@ -0,0 +1,86 @@
+package org.adaway.model.git;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.net.MalformedURLException;
+import java.time.ZonedDateTime;
+import java.util.Arrays;
+import java.util.Collection;
+
+/**
+ * This class tests the git hosted source behavior.
+ *
+ * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com)
+ */
+@RunWith(Parameterized.class)
+public class GitHostsSourceTest {
+
+ private static final String GITHUB_HOST = "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts";
+ private static final String GIST_HOST = "https://gist.githubusercontent.com/PerfectSlayer/a552900539d10271542063d67424b467/raw/56aabad791fbd085f4b9c5051a1dfa76b9a9d748/hosts";
+ private static final String GITLAB_HOST = "https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt";
+
+ @Parameterized.Parameters
+ public static Collection