├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── android.yml ├── .gitignore ├── Android.mk ├── Changelog.md ├── LICENSE ├── README.md ├── app ├── build.gradle ├── lint.xml ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── rules.json │ └── xposed_init │ ├── ic_launcher-web.png │ ├── ic_launcher_donate-web.png │ ├── java │ ├── com │ │ ├── stericson │ │ │ ├── rootshell │ │ │ │ ├── NativeJavaClass.java │ │ │ │ ├── RootShell.java │ │ │ │ ├── SanityCheckRootShell.java │ │ │ │ ├── containers │ │ │ │ │ └── RootClass.java │ │ │ │ ├── exceptions │ │ │ │ │ └── RootDeniedException.java │ │ │ │ └── execution │ │ │ │ │ ├── Command.java │ │ │ │ │ ├── JavaCommand.java │ │ │ │ │ └── Shell.java │ │ │ └── roottools │ │ │ │ ├── Constants.java │ │ │ │ ├── RootTools.java │ │ │ │ ├── SanityCheckRootTools.java │ │ │ │ ├── containers │ │ │ │ ├── Mount.java │ │ │ │ ├── Permissions.java │ │ │ │ └── Symlink.java │ │ │ │ └── internal │ │ │ │ ├── Installer.java │ │ │ │ ├── InternalVariables.java │ │ │ │ ├── Remounter.java │ │ │ │ ├── RootToolsInternalMethods.java │ │ │ │ └── Runner.java │ │ └── twofortyfouram │ │ │ └── locale │ │ │ ├── BreadCrumber.java │ │ │ ├── Constants.java │ │ │ ├── Intent.java │ │ │ └── PackageUtilities.java │ ├── dev │ │ └── ukanth │ │ │ └── ufirewall │ │ │ ├── Api.java │ │ │ ├── InterfaceDetails.java │ │ │ ├── InterfaceTracker.java │ │ │ ├── MainActivity.java │ │ │ ├── activity │ │ │ ├── AppDetailActivity.java │ │ │ ├── BaseActivity.java │ │ │ ├── CustomRulesActivity.java │ │ │ ├── CustomScriptActivity.java │ │ │ ├── DataDumpActivity.java │ │ │ ├── HelpActivity.java │ │ │ ├── LogActivity.java │ │ │ ├── LogDetailActivity.java │ │ │ ├── OldLogActivity.java │ │ │ ├── ProfileActivity.java │ │ │ ├── RulesActivity.java │ │ │ └── StartActivity.java │ │ │ ├── admin │ │ │ └── AdminDeviceReceiver.java │ │ │ ├── broadcast │ │ │ ├── ConnectivityChangeReceiver.java │ │ │ ├── OnBootReceiver.java │ │ │ └── PackageBroadcast.java │ │ │ ├── customrules │ │ │ ├── CustomRule.java │ │ │ └── CustomRuleDatabase.java │ │ │ ├── events │ │ │ ├── LogChangeEvent.java │ │ │ ├── LogEvent.java │ │ │ ├── RulesEvent.java │ │ │ ├── RxCommandEvent.java │ │ │ └── RxEvent.java │ │ │ ├── log │ │ │ ├── Log.java │ │ │ ├── LogData.java │ │ │ ├── LogDatabase.java │ │ │ ├── LogDetailRecyclerViewAdapter.java │ │ │ ├── LogInfo.java │ │ │ ├── LogPreference.java │ │ │ ├── LogPreferenceDB.java │ │ │ ├── LogRecyclerViewAdapter.java │ │ │ ├── LogRxEvent.java │ │ │ ├── RecyclerItemClickListener.java │ │ │ └── ShellCommand.java │ │ │ ├── plugin │ │ │ ├── BundleScrubber.java │ │ │ ├── FireReceiver.java │ │ │ ├── LocaleEdit.java │ │ │ └── PluginBundleManager.java │ │ │ ├── preferences │ │ │ ├── CustomBinaryPreferenceFragment.java │ │ │ ├── DefaultConnectionPref.java │ │ │ ├── DefaultConnectionPrefDB.java │ │ │ ├── ExpPreferenceFragment.java │ │ │ ├── LanguagePreferenceFragment.java │ │ │ ├── LogPreferenceFragment.java │ │ │ ├── MultiProfilePreferenceFragment.java │ │ │ ├── PreferencesActivity.java │ │ │ ├── RulesPreferenceFragment.java │ │ │ ├── SecPreferenceFragment.java │ │ │ ├── ShareContract.java │ │ │ ├── SharePreference.java │ │ │ ├── SharePreferenceProvider.java │ │ │ ├── ShareProfilePreference.java │ │ │ ├── ShareUtils.java │ │ │ ├── ThemePreferenceFragment.java │ │ │ ├── UIPreferenceFragment.java │ │ │ └── WidgetPreferenceFragment.java │ │ │ ├── profiles │ │ │ ├── ProfileAdapter.java │ │ │ ├── ProfileData.java │ │ │ ├── ProfileHelper.java │ │ │ └── ProfilesDatabase.java │ │ │ ├── service │ │ │ ├── FirewallService.java │ │ │ ├── LogService.java │ │ │ ├── RootCommand.java │ │ │ ├── RootShellService.java │ │ │ ├── RootShellService2.java │ │ │ ├── RulesApplyService.java │ │ │ └── ToggleTileService.java │ │ │ ├── ui │ │ │ └── about │ │ │ │ ├── AboutFragment.java │ │ │ │ ├── FAQFragment.java │ │ │ │ └── ViewPagerAdapter.java │ │ │ ├── util │ │ │ ├── AppIconHelperV26.java │ │ │ ├── AppListArrayAdapter.java │ │ │ ├── BiometricUtil.java │ │ │ ├── CustomRuleOld.java │ │ │ ├── DateComparator.java │ │ │ ├── FileDialog.java │ │ │ ├── FingerprintUtil.java │ │ │ ├── G.java │ │ │ ├── HtmlTagHandler.java │ │ │ ├── ImportApi.java │ │ │ ├── JsonHelper.java │ │ │ ├── LocaleManager.java │ │ │ ├── LogNetUtil.java │ │ │ ├── PackageComparator.java │ │ │ ├── Rule.java │ │ │ ├── SecurityUtil.java │ │ │ ├── SlidingTabLayout.java │ │ │ ├── SlidingTabStrip.java │ │ │ └── XPreferenceProvider.java │ │ │ ├── widget │ │ │ ├── RadialMenuWidget.java │ │ │ ├── StatusWidget.java │ │ │ ├── ToggleWidget.java │ │ │ ├── ToggleWidgetActivity.java │ │ │ ├── ToggleWidgetOld.java │ │ │ └── ToggleWidgetOldActivity.java │ │ │ └── xposed │ │ │ └── XposedInit.java │ └── net │ │ └── margaritov │ │ └── preference │ │ └── colorpicker │ │ ├── AlphaPatternDrawable.java │ │ ├── ColorPickerDialog.java │ │ ├── ColorPickerPanelView.java │ │ ├── ColorPickerPreference.java │ │ └── ColorPickerView.java │ └── res │ ├── convert.properties │ ├── convert.sh │ ├── drawable-hdpi-v11 │ ├── active.png │ ├── error.png │ └── question.png │ ├── drawable-hdpi │ ├── ic_apply.png │ ├── ic_launcher.png │ ├── ic_launcher_free.png │ ├── notification.png │ ├── notification_error.png │ ├── notification_quest.png │ ├── notification_warn.png │ ├── twofortyfouram_locale_ic_menu_dontsave.png │ ├── twofortyfouram_locale_ic_menu_help.png │ └── twofortyfouram_locale_ic_menu_save.png │ ├── drawable-mdpi-v11 │ ├── active.png │ ├── error.png │ └── question.png │ ├── drawable-mdpi │ ├── ic_apply.png │ ├── ic_launcher.png │ ├── ic_launcher_free.png │ ├── notification.png │ ├── notification_error.png │ ├── notification_quest.png │ └── notification_warn.png │ ├── drawable-v21 │ └── ic_android_white_24dp.xml │ ├── drawable-xhdpi-v11 │ ├── active.png │ ├── error.png │ └── question.png │ ├── drawable-xhdpi │ ├── ic_apply.png │ ├── ic_launcher.png │ ├── ic_launcher_free.png │ ├── notification.png │ ├── notification_error.png │ ├── notification_quest.png │ └── notification_warn.png │ ├── drawable-xxhdpi-v11 │ ├── active.png │ ├── error.png │ └── question.png │ ├── drawable-xxhdpi │ ├── ic_apply.png │ ├── ic_launcher.png │ ├── ic_launcher_free.png │ ├── notification.png │ ├── notification_error.png │ ├── notification_quest.png │ └── notification_warn.png │ ├── drawable-xxxhdpi │ └── ic_apply.png │ ├── drawable │ ├── ic_action.xml │ ├── ic_action_fingerprint.xml │ ├── ic_allow.xml │ ├── ic_android_white_24dp.xml │ ├── ic_apply_menu.xml │ ├── ic_apply_notification.xml │ ├── ic_block_black_24dp.xml │ ├── ic_bluetooth.xml │ ├── ic_clean.xml │ ├── ic_clearlog.xml │ ├── ic_clone.xml │ ├── ic_copy.xml │ ├── ic_custom_rules.xml │ ├── ic_deny.xml │ ├── ic_exit.xml │ ├── ic_export.xml │ ├── ic_flow.xml │ ├── ic_help.xml │ ├── ic_import.xml │ ├── ic_invert.xml │ ├── ic_lan.xml │ ├── ic_legend.xml │ ├── ic_log.xml │ ├── ic_mail.xml │ ├── ic_menu_binary.xml │ ├── ic_menu_exp.xml │ ├── ic_menu_pref.xml │ ├── ic_menu_profile.xml │ ├── ic_menu_save.xml │ ├── ic_menu_secure.xml │ ├── ic_menu_translate.xml │ ├── ic_menu_widget.xml │ ├── ic_mobiledata.xml │ ├── ic_preference.xml │ ├── ic_refresh.xml │ ├── ic_roam.xml │ ├── ic_rules.xml │ ├── ic_script.xml │ ├── ic_search.xml │ ├── ic_settings.xml │ ├── ic_sort.xml │ ├── ic_tether.xml │ ├── ic_theme.xml │ ├── ic_tor.xml │ ├── ic_unknown.xml │ ├── ic_vpn.xml │ ├── ic_wifi.xml │ ├── list_divider.xml │ ├── plus.xml │ ├── preview_new.png │ ├── preview_old.png │ ├── preview_toggle.png │ ├── question_widget.png │ ├── toast.xml │ ├── twofortyfouram_locale_ic_menu_dontsave.xml │ ├── twofortyfouram_locale_ic_menu_help.xml │ ├── twofortyfouram_locale_ic_menu_save.xml │ ├── widget_bg.xml │ ├── widget_bg_focus.png │ ├── widget_bg_pressed.png │ ├── widget_circle_enable.xml │ ├── widget_off.png │ ├── widget_on.png │ ├── zoomin.xml │ └── zoomout.xml │ ├── layout-land │ └── dialog_color_picker.xml │ ├── layout │ ├── activity_custom_rules.xml │ ├── activity_prefs.xml │ ├── app_detail.xml │ ├── apply_view.xml │ ├── custom_toast.xml │ ├── customscript.xml │ ├── dialog_color_picker.xml │ ├── file_row.xml │ ├── fingerprint.xml │ ├── help_about.xml │ ├── help_about_content.xml │ ├── help_faq_content.xml │ ├── legend.xml │ ├── log_recycle_item.xml │ ├── log_view.xml │ ├── logdetail_recycle_item.xml │ ├── logdetail_view.xml │ ├── main.xml │ ├── main_list.xml │ ├── main_list_old.xml │ ├── main_old.xml │ ├── onoff_widget.xml │ ├── profile_adddialog.xml │ ├── profile_layout.xml │ ├── profile_main.xml │ ├── rules.xml │ ├── searchbar.xml │ ├── tasker_profile.xml │ ├── toggle_widget_layout.xml │ ├── toggle_widget_old_layout.xml │ ├── toggle_widget_old_view.xml │ └── toggle_widget_view.xml │ ├── menu │ ├── menu_bar.xml │ └── twofortyfouram_locale_help_save_dontsave.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ ├── ic_launcher_donate.xml │ ├── ic_launcher_donate_round.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_donate.png │ ├── ic_launcher_donate_round.png │ ├── ic_launcher_foreground.png │ ├── ic_launcher_foreground_donate.png │ ├── ic_launcher_round.png │ ├── round_launcher.png │ └── round_launcher_free.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_donate.png │ ├── ic_launcher_donate_round.png │ ├── ic_launcher_foreground.png │ ├── ic_launcher_foreground_donate.png │ ├── ic_launcher_round.png │ ├── round_launcher.png │ └── round_launcher_free.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_donate.png │ ├── ic_launcher_donate_round.png │ ├── ic_launcher_foreground.png │ ├── ic_launcher_foreground_donate.png │ ├── ic_launcher_round.png │ ├── round_launcher.png │ └── round_launcher_free.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_donate.png │ ├── ic_launcher_donate_round.png │ ├── ic_launcher_foreground.png │ ├── ic_launcher_foreground_donate.png │ ├── ic_launcher_round.png │ ├── round_launcher.png │ └── round_launcher_free.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_donate.png │ ├── ic_launcher_donate_round.png │ ├── ic_launcher_foreground.png │ ├── ic_launcher_foreground_donate.png │ ├── ic_launcher_round.png │ ├── round_launcher.png │ └── round_launcher_free.png │ ├── raw │ ├── about.html │ ├── afwallstart │ ├── busybox_arm │ ├── busybox_mips │ ├── busybox_x86 │ ├── faq.html │ ├── ip6tables_arm │ ├── ip6tables_mips │ ├── ip6tables_x86 │ ├── iptables_arm │ ├── iptables_mips │ ├── iptables_x86 │ ├── nflog_arm │ ├── nflog_arm64 │ ├── nflog_mips │ └── nflog_x86 │ ├── values-af │ └── strings.xml │ ├── values-ar │ └── strings.xml │ ├── values-ast-rES │ └── strings.xml │ ├── values-az │ └── strings.xml │ ├── values-bg │ └── strings.xml │ ├── values-bi │ └── strings.xml │ ├── values-bn │ └── strings.xml │ ├── values-bs │ └── strings.xml │ ├── values-ca │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-da │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-el │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-eu │ └── strings.xml │ ├── values-fa │ └── strings.xml │ ├── values-fi │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-he │ └── strings.xml │ ├── values-hi │ └── strings.xml │ ├── values-hr │ └── strings.xml │ ├── values-hu │ └── strings.xml │ ├── values-in │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-kn │ └── strings.xml │ ├── values-ko │ └── strings.xml │ ├── values-ku │ └── strings.xml │ ├── values-ky │ └── strings.xml │ ├── values-ml-rIN │ └── strings.xml │ ├── values-ms │ └── strings.xml │ ├── values-nb │ └── strings.xml │ ├── values-nl │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-pt │ └── strings.xml │ ├── values-ro │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-si │ └── strings.xml │ ├── values-sk │ └── strings.xml │ ├── values-sl │ └── strings.xml │ ├── values-sr-rCS │ └── strings.xml │ ├── values-sr │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-ta │ └── strings.xml │ ├── values-th │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-uk │ └── strings.xml │ ├── values-ur-rPK │ └── strings.xml │ ├── values-v26 │ └── bools.xml │ ├── values-vi │ └── strings.xml │ ├── values-w820dp │ ├── dimens.xml │ └── strings.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ ├── values-zh │ └── strings.xml │ ├── values │ ├── arrays.xml │ ├── attrs.xml │ ├── bools.xml │ ├── colors.xml │ ├── dimens.xml │ ├── ic_launcher_background.xml │ ├── ic_launcher_background_donate.xml │ ├── id.xml │ ├── module_scopes.xml │ ├── strings.xml │ ├── strings_platform-en.xml │ └── styles.xml │ └── xml │ ├── device_admin.xml │ ├── experimental_preferences.xml │ ├── language_preferences.xml │ ├── log_preferences.xml │ ├── onoff_widget.xml │ ├── preferences_headers.xml │ ├── profiles_preferences.xml │ ├── rules_preferences.xml │ ├── security_preferences.xml │ ├── shortcuts.xml │ ├── theme_preference.xml │ ├── toggle_widget.xml │ ├── toggle_widget_old.xml │ ├── ui_custom_preferences.xml │ ├── ui_preferences.xml │ └── widget_preferences.xml ├── build.gradle ├── external ├── .gitignore ├── Android.mk ├── Makefile ├── dist │ ├── busybox-1.21.1.tar.bz2 │ ├── busybox-1.26.2.tar.bz2 │ ├── busybox-config │ ├── busybox-config_womount │ ├── busybox-defconfig │ ├── busybox-patches │ │ ├── 000-customMakefile.patch │ │ ├── 000-gcc-version.patch │ │ ├── 001-mconf+lkc.patch │ │ ├── 002-checklist.patch │ │ ├── 003-a-mount-umount-fsck-df.patch │ │ ├── 003-b-platform-mntent_r.patch │ │ ├── 004-telnet-telnetd.patch │ │ ├── 005-rfkill.patch │ │ ├── 006-eject.patch │ │ ├── 007-ifconfig_slip.patch │ │ ├── 008-ifenslave.patch │ │ ├── 009-watchdog.patch │ │ ├── 010-ubiX.patch │ │ ├── 011-ifplugd.patch │ │ ├── 012-a-ether_ntoa-udhcpd.patch │ │ ├── 012-b-arping.patch │ │ ├── 012-c-ether-wake.patch │ │ ├── 013-loadfont-setfont-conspy.patch │ │ ├── 014-nandwrite-nanddump.patch │ │ ├── 015-zcip.patch │ │ ├── 016-a-swaponoff-syscalls.patch │ │ ├── 016-b-swapon-swapoff.patch │ │ ├── 017-a-shmget-msgget-semget-syscalls.patch │ │ ├── 017-b-msgctl-shmctl-syscalls.patch │ │ ├── 017-c-semctl-syscall.patch │ │ ├── 017-d-ipcs-ipcrm.patch │ │ ├── 017-e-semop-shmdt-syscalls.patch │ │ ├── 017-f-syslogd-logread.patch │ │ ├── 018-blkdiscard.patch │ │ ├── 019-fsck.minix-mkfs.minix.patch │ │ ├── 01_missing_interface_x86_patch.patch │ │ ├── 020-microcom.patch │ │ ├── 021-ipneigh-iproute-iprule.patch │ │ ├── 022-ipv6.patch │ │ ├── 024-hush.patch │ │ ├── 025-readahead.patch │ │ ├── 026-modinfo-modprobe-without-utsrel.patch │ │ ├── 027-depmod-parameter.patch │ │ ├── 050-dietlibc_resolver-nslookup.patch │ │ └── 051-ash-history.patch │ ├── iptables-1.4.20.tar.bz2 │ ├── iptables-patches │ │ ├── 0001-iptables-correctly-reference-generated-file.patch │ │ ├── 0002-android-libiptc-Fix-socklen_t-type-mismatch-on-Andro.patch │ │ ├── 0003-android-Don-t-include-conflicting-headers.patch │ │ ├── 0004-android-build-Blacklist-TCPOPTSTRIP-on-systems-that-.patch │ │ ├── 0005-Modify-iptables-to-talk-to-xt_IDLETIMER-version-1.patch │ │ ├── 0006-ignore-SIGPIPES.patch │ │ ├── 0007-android-Import-latest-libxt_quota2-code-from-AOSP-4..patch │ │ ├── 0008-android-Work-around-broken-Bionic-getaddrinfo.patch │ │ └── 0009-ip6tables-Use-consistent-exit-code-for-EAGAIN.patch │ └── old-pathches │ │ └── busybox-022-ipv6.patch ├── nflog │ ├── Android.mk │ ├── attr.c │ ├── callback.c │ ├── config.h │ ├── internal.h │ ├── libmnl │ │ └── libmnl.h │ ├── linux │ │ ├── netfilter │ │ │ └── nfnetlink_log.h │ │ └── netlink.h │ ├── nflog.c │ ├── nlmsg.c │ └── socket.c └── run_pie │ ├── Android.mk │ └── run_pie.c ├── gradle.properties ├── gradle ├── gradle.iml ├── local.properties └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── jni └── Application.mk ├── playstore ├── feature.png ├── playstore.png ├── promo-graphic.png └── screenshots │ ├── Main_2.0.png │ └── Settings_2.0.png ├── scripts ├── convert.properties ├── convert.sh ├── make ├── makeclean └── reverse.sh └── settings.gradle /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[ISSUE]" 5 | labels: Review 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **Firewall Logs** 14 | Please get the log from Menu -> Show Rules -> (menu) Export to storage and attach it here 15 | 16 | **Smartphone (please complete the following information):** 17 | - Device: [e.g. Samsung] 18 | - Android OS: [e.g. LOS 15.1 ] 19 | 20 | **Additional context** 21 | Add any other context about the problem here. 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[FEATURE]" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | branches: [ beta ] 6 | pull_request: 7 | branches: [ beta ] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | - name: set up JDK 18 | uses: actions/setup-java@v1 19 | with: 20 | java-version: 17 21 | - name: Build with Gradle 22 | run: ./gradlew build 23 | - name: Upload build artifacts 24 | uses: actions/upload-artifact@v4 25 | with: 26 | name: build-artifacts 27 | path: | 28 | app/build/outputs/apk/ 29 | app/build/outputs/bundle/ 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | .DS_Store 6 | 7 | # Files for the dex VM 8 | *.dex 9 | 10 | # Java class files 11 | *.class 12 | 13 | # Auto generated files 14 | bin/ 15 | gen/ 16 | out/ 17 | build/ 18 | build.xml 19 | 20 | # Gradle wrapper 21 | gradlew 22 | gradlew.bat 23 | gradle-wrapper.jar 24 | gradle-wrapper.properties 25 | 26 | # Gradle 27 | .gradle/ 28 | gradle/ 29 | 30 | # Log Files 31 | *.log 32 | 33 | # Local configuration file (sdk path, etc) 34 | local.properties 35 | 36 | # Eclipse project files 37 | .classpath 38 | .project 39 | proguard/ 40 | 41 | # Editor swap/save files 42 | *~ 43 | *.swp 44 | 45 | # native binaries 46 | libs/ 47 | obj/ 48 | 49 | # IDE related 50 | .idea/ 51 | *.iml 52 | app/*.iml 53 | .settings/ 54 | 55 | # Proguard 56 | proguard-project.txt 57 | copy.sh 58 | make 59 | makeclean 60 | -------------------------------------------------------------------------------- /Android.mk: -------------------------------------------------------------------------------- 1 | #/** 2 | # * Contains shared programming interfaces. 3 | # * All iptables "communication" is handled by this class. 4 | # * 5 | # * Copyright (C) 2007-2008 The Android Open Source Project 6 | # * Copyright (C) 2009-2011 Rodrigo Zechin Rosauro 7 | # * Copyright (C) 2011-2012 Umakanthan Chandran 8 | # * 9 | # * This program is free software: you can redistribute it and/or modify 10 | # * it under the terms of the GNU General Public License as published by 11 | # * the Free Software Foundation, either version 3 of the License, or 12 | # * (at your option) any later version. 13 | # * 14 | # * This program is distributed in the hope that it will be useful, 15 | # * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # * GNU General Public License for more details. 18 | # * 19 | # * You should have received a copy of the GNU General Public License 20 | # * along with this program. If not, see . 21 | # * 22 | # * @author Rodrigo Zechin Rosauro, Umakanthan Chandran 23 | # * @version 1.1 24 | # */ 25 | 26 | LOCAL_PATH:= $(call my-dir) 27 | include $(CLEAR_VARS) 28 | 29 | LOCAL_MODULE_TAGS := optional 30 | 31 | LOCAL_SRC_FILES := $(call all-java-files-under, src) 32 | 33 | LOCAL_PACKAGE_NAME := afwall 34 | LOCAL_CERTIFICATE := platform 35 | 36 | # Builds against the public SDK 37 | # LOCAL_SDK_VERSION := current 38 | 39 | include $(BUILD_PACKAGE) 40 | 41 | # This finds and builds the test apk as well, so a single make does both. 42 | include $(call all-makefiles-under,$(LOCAL_PATH)) -------------------------------------------------------------------------------- /app/lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -keepattributes 2 | -keep class org.ocpsoft.prettytime.i18n.** 3 | -keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; } 4 | -dontpreverify 5 | -dontoptimize 6 | -dontobfuscate 7 | -keep class dev.ukanth.ufirewall.** { *; } 8 | -optimizations !code/allocation/variable 9 | -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/assets/xposed_init -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher_donate-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/ic_launcher_donate-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/stericson/rootshell/NativeJavaClass.java: -------------------------------------------------------------------------------- 1 | package com.stericson.rootshell; 2 | 3 | import com.stericson.rootshell.containers.RootClass; 4 | 5 | import java.io.BufferedWriter; 6 | import java.io.File; 7 | import java.io.FileWriter; 8 | import java.io.IOException; 9 | 10 | @RootClass.Candidate 11 | public class NativeJavaClass 12 | { 13 | 14 | public NativeJavaClass(RootClass.RootArgs args) 15 | { 16 | System.out.println("NativeJavaClass says: oh hi there."); 17 | String p = "/data/data/com.android.browser/cache"; 18 | File f = new File(p); 19 | String[] fl = f.list(); 20 | if (fl != null) 21 | { 22 | System.out.println("Look at all the stuff in your browser's cache:"); 23 | for (String af : fl) 24 | { 25 | System.out.println("-" + af); 26 | } 27 | System.out.println("Leaving my mark for posterity..."); 28 | File f2 = new File(p + "/rootshell_was_here"); 29 | try 30 | { 31 | FileWriter filewriter = new FileWriter(f2); 32 | BufferedWriter out = new BufferedWriter(filewriter); 33 | out.write("This is just a file created using RootShell's Sanity check tools..\n"); 34 | out.close(); 35 | System.out.println("Done!"); 36 | } 37 | catch (IOException e) 38 | { 39 | System.out.println("...and I failed miserably."); 40 | e.printStackTrace(); 41 | } 42 | 43 | } 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/stericson/rootshell/exceptions/RootDeniedException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the RootShell Project: https://github.com/Stericson/RootShell 3 | * 4 | * Copyright (c) 2014 Stephen Erickson, Chris Ravenscroft 5 | * 6 | * This code is dual-licensed under the terms of the Apache License Version 2.0 and 7 | * the terms of the General Public License (GPL) Version 2. 8 | * You may use this code according to either of these licenses as is most appropriate 9 | * for your project on a case-by-case basis. 10 | * 11 | * The terms of each license can be found in the root directory of this project's repository as well as at: 12 | * 13 | * * http://www.apache.org/licenses/LICENSE-2.0 14 | * * http://www.gnu.org/licenses/gpl-2.0.txt 15 | * 16 | * Unless required by applicable law or agreed to in writing, software 17 | * distributed under these Licenses is distributed on an "AS IS" BASIS, 18 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 | * See each License for the specific language governing permissions and 20 | * limitations under that License. 21 | */ 22 | 23 | package com.stericson.rootshell.exceptions; 24 | 25 | public class RootDeniedException extends Exception { 26 | 27 | private static final long serialVersionUID = -8713947214162841310L; 28 | 29 | public RootDeniedException(String error) { 30 | super(error); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/stericson/rootshell/execution/JavaCommand.java: -------------------------------------------------------------------------------- 1 | package com.stericson.rootshell.execution; 2 | 3 | import android.content.Context; 4 | 5 | public class JavaCommand extends Command 6 | { 7 | /** 8 | * Constructor for executing Java commands rather than binaries 9 | * 10 | * @param context needed to execute java command. 11 | */ 12 | public JavaCommand(int id, Context context, String... command) { 13 | super(id, command); 14 | this.context = context; 15 | this.javaCommand = true; 16 | } 17 | 18 | /** 19 | * Constructor for executing Java commands rather than binaries 20 | * 21 | * @param context needed to execute java command. 22 | */ 23 | public JavaCommand(int id, boolean handlerEnabled, Context context, String... command) { 24 | super(id, handlerEnabled, command); 25 | this.context = context; 26 | this.javaCommand = true; 27 | } 28 | 29 | /** 30 | * Constructor for executing Java commands rather than binaries 31 | * 32 | * @param context needed to execute java command. 33 | */ 34 | public JavaCommand(int id, int timeout, Context context, String... command) { 35 | super(id, timeout, command); 36 | this.context = context; 37 | this.javaCommand = true; 38 | } 39 | 40 | 41 | @Override 42 | public void commandOutput(int id, String line) 43 | { 44 | super.commandOutput(id, line); 45 | } 46 | 47 | @Override 48 | public void commandTerminated(int id, String reason) 49 | { 50 | // pass 51 | } 52 | 53 | @Override 54 | public void commandCompleted(int id, int exitCode) 55 | { 56 | // pass 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/stericson/roottools/Constants.java: -------------------------------------------------------------------------------- 1 | package com.stericson.roottools; 2 | 3 | public class Constants 4 | { 5 | public static final String TAG = "RootTools v4.4"; 6 | public static final int FPS = 1; 7 | public static final int BBA = 3; 8 | public static final int BBV = 4; 9 | public static final int GI = 5; 10 | public static final int GS = 6; 11 | public static final int GSYM = 7; 12 | public static final int GET_MOUNTS = 8; 13 | public static final int GET_SYMLINKS = 9; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/stericson/roottools/containers/Symlink.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the RootTools Project: http://code.google.com/p/RootTools/ 3 | * 4 | * Copyright (c) 2012 Stephen Erickson, Chris Ravenscroft, Dominik Schuermann, Adam Shanks 5 | * 6 | * This code is dual-licensed under the terms of the Apache License Version 2.0 and 7 | * the terms of the General Public License (GPL) Version 2. 8 | * You may use this code according to either of these licenses as is most appropriate 9 | * for your project on a case-by-case basis. 10 | * 11 | * The terms of each license can be found in the root directory of this project's repository as well as at: 12 | * 13 | * * http://www.apache.org/licenses/LICENSE-2.0 14 | * * http://www.gnu.org/licenses/gpl-2.0.txt 15 | * 16 | * Unless required by applicable law or agreed to in writing, software 17 | * distributed under these Licenses is distributed on an "AS IS" BASIS, 18 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 | * See each License for the specific language governing permissions and 20 | * limitations under that License. 21 | */ 22 | 23 | package com.stericson.roottools.containers; 24 | 25 | import java.io.File; 26 | 27 | public class Symlink 28 | { 29 | protected final File file; 30 | protected final File symlinkPath; 31 | 32 | public Symlink(File file, File path) 33 | { 34 | this.file = file; 35 | symlinkPath = path; 36 | } 37 | 38 | public File getFile() 39 | { 40 | return this.file; 41 | } 42 | 43 | public File getSymlinkPath() 44 | { 45 | return symlinkPath; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/twofortyfouram/locale/Constants.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 two forty four a.m. LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in 5 | * compliance with the License. You may obtain a copy of the License at 6 | * 7 | * 8 | * Unless required by applicable law or agreed to in writing, software distributed under the License is 9 | * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | * See the License for the specific language governing permissions and limitations under the License. 11 | */ 12 | 13 | package com.twofortyfouram.locale; 14 | 15 | /** 16 | * Utility class containing constants for the Locale Developer Platform. 17 | */ 18 | /* 19 | * This class is NOT part of the public API. 20 | */ 21 | /* package */final class Constants 22 | { 23 | /** 24 | * Private constructor prevents instantiation 25 | * 26 | * @throws UnsupportedOperationException because this class cannot be instantiated. 27 | */ 28 | private Constants() 29 | { 30 | throw new UnsupportedOperationException("This class is non-instantiable"); //$NON-NLS-1$ 31 | } 32 | 33 | /** 34 | * Log tag for logcat messages generated by the Locale Developer Platform 35 | */ 36 | /* 37 | * This is NOT a public API. Third party apps should NOT use this log tag for their own log messages. 38 | */ 39 | /* package */static final String LOG_TAG = "LocaleApiLibrary"; //$NON-NLS-1$ 40 | 41 | /** 42 | * String package name for Locale. 43 | */ 44 | /* 45 | * This is NOT a public API. Third parties should NOT rely on this being the only package name for Locale. 46 | */ 47 | /* package */static final String LOCALE_PACKAGE = "com.twofortyfouram.locale"; //$NON-NLS-1$ 48 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/activity/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.activity; 2 | 3 | import android.content.Context; 4 | import android.content.ContextWrapper; 5 | import android.content.res.Configuration; 6 | import android.content.res.Resources; 7 | import android.os.Build; 8 | import android.os.LocaleList; 9 | 10 | import androidx.appcompat.app.AppCompatActivity; 11 | 12 | import java.util.Locale; 13 | 14 | public class BaseActivity extends AppCompatActivity { 15 | 16 | @Override 17 | protected void attachBaseContext(Context newBase) { 18 | super.attachBaseContext(newBase); 19 | } 20 | 21 | public static ContextWrapper wrap(Context context, Locale newLocale) { 22 | 23 | Resources res = context.getResources(); 24 | Configuration configuration = res.getConfiguration(); 25 | 26 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 27 | configuration.setLocale(newLocale); 28 | 29 | LocaleList localeList = new LocaleList(newLocale); 30 | LocaleList.setDefault(localeList); 31 | configuration.setLocales(localeList); 32 | 33 | context = context.createConfigurationContext(configuration); 34 | 35 | } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 36 | configuration.setLocale(newLocale); 37 | context = context.createConfigurationContext(configuration); 38 | } else { 39 | configuration.locale = newLocale; 40 | res.updateConfiguration(configuration, res.getDisplayMetrics()); 41 | } 42 | 43 | return new ContextWrapper(context); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/activity/StartActivity.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.activity; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | 6 | import dev.ukanth.ufirewall.MainActivity; 7 | 8 | public class StartActivity extends BaseActivity { 9 | 10 | /* 11 | * This activity only existed, so the user can toggle between 12 | * classic and material icon. 13 | */ 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | Intent intent = new Intent(this, MainActivity.class); 19 | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 20 | if (getIntent().getExtras() != null) { 21 | intent.putExtras(getIntent().getExtras()); 22 | } 23 | startActivity(intent); 24 | finish(); 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/admin/AdminDeviceReceiver.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.admin; 2 | 3 | import android.app.admin.DeviceAdminReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.widget.Toast; 7 | 8 | import dev.ukanth.ufirewall.R; 9 | import dev.ukanth.ufirewall.log.Log; 10 | import dev.ukanth.ufirewall.util.G; 11 | 12 | 13 | /** 14 | * This is the component that is responsible for actual device administration. 15 | * It becomes the receiver when a policy is applied. It is important that we 16 | * subclass DeviceAdminReceiver class here and to implement its only required 17 | * method onEnabled(). 18 | */ 19 | public class AdminDeviceReceiver extends DeviceAdminReceiver { 20 | static final String TAG = "AdminDeviceReceiver"; 21 | 22 | @Override 23 | public void onEnabled(Context context, Intent intent) { 24 | super.onEnabled(context, intent); 25 | G.enableAdmin(true); 26 | Toast.makeText(context, R.string.device_admin_enabled ,Toast.LENGTH_LONG).show(); 27 | Log.d(TAG, "onEnabled"); 28 | } 29 | 30 | @Override 31 | public void onDisabled(Context context, Intent intent) { 32 | super.onDisabled(context, intent); 33 | G.enableAdmin(false); 34 | Toast.makeText(context, R.string.device_admin_disabled,Toast.LENGTH_LONG).show(); 35 | Log.d(TAG, "onDisabled"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/customrules/CustomRule.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.customrules; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Column; 4 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 5 | import com.raizlabs.android.dbflow.annotation.Table; 6 | import com.raizlabs.android.dbflow.structure.BaseModel; 7 | 8 | /** 9 | * Created by ukanth on 24/9/17. 10 | */ 11 | 12 | @Table(database = CustomRuleDatabase.class) 13 | public class CustomRule extends BaseModel { 14 | 15 | @Column 16 | @PrimaryKey(autoincrement = true) 17 | long id; 18 | 19 | public long getId() { 20 | return id; 21 | } 22 | 23 | @Column 24 | private String name; 25 | 26 | @Column 27 | private String rule; 28 | 29 | @Column 30 | private long timestamp; 31 | 32 | @Column 33 | private boolean active; 34 | 35 | public CustomRule() { 36 | } 37 | 38 | public CustomRule(String name, String rule) { 39 | this.name = name; 40 | this.rule = rule; 41 | this.timestamp = System.currentTimeMillis(); 42 | } 43 | 44 | public String getName() { 45 | return name; 46 | } 47 | 48 | public void setName(String name) { 49 | this.name = name; 50 | } 51 | 52 | public String getRule() { 53 | return rule; 54 | } 55 | 56 | public void setRule(String rule) { 57 | this.rule = rule; 58 | } 59 | 60 | public long getTimestamp() { 61 | return timestamp; 62 | } 63 | 64 | public void setTimestamp(long timestamp) { 65 | this.timestamp = timestamp; 66 | } 67 | 68 | public boolean isActive() { 69 | return active; 70 | } 71 | 72 | public void setActive(boolean active) { 73 | this.active = active; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/customrules/CustomRuleDatabase.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.customrules; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Database; 4 | 5 | /** 6 | * Created by ukanth on 24/9/17. 7 | */ 8 | 9 | @Database(name = CustomRuleDatabase.NAME, version = CustomRuleDatabase.VERSION) 10 | public class CustomRuleDatabase { 11 | public static final String NAME = "rules"; 12 | public static final int VERSION = 1; 13 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/events/LogChangeEvent.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.events; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by ukanth on 21/8/16. 7 | */ 8 | 9 | public class LogChangeEvent { 10 | public final Context ctx; 11 | public final String message; 12 | 13 | public LogChangeEvent(String message, Context ctx) { 14 | this.message = message; 15 | this.ctx = ctx; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/events/LogEvent.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.events; 2 | 3 | import android.content.Context; 4 | 5 | import dev.ukanth.ufirewall.log.LogInfo; 6 | 7 | /** 8 | * Created by ukanth on 21/8/16. 9 | */ 10 | 11 | public class LogEvent { 12 | public final LogInfo logInfo; 13 | public final Context ctx; 14 | 15 | public LogEvent(LogInfo logInfo, Context ctx) { 16 | this.logInfo = logInfo; 17 | this.ctx = ctx; 18 | } 19 | 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/events/RulesEvent.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.events; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by ukanth on 21/8/16. 7 | */ 8 | 9 | public class RulesEvent { 10 | public final Context ctx; 11 | public final String message; 12 | 13 | public RulesEvent(String message,Context ctx) { 14 | this.message = message; 15 | this.ctx = ctx; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/events/RxCommandEvent.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.events; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import io.reactivex.rxjava3.disposables.Disposable; 6 | import io.reactivex.rxjava3.functions.Consumer; 7 | import io.reactivex.rxjava3.subjects.PublishSubject; 8 | 9 | /** 10 | * Created by ukanth on 25/9/17. 11 | */ 12 | 13 | public class RxCommandEvent { 14 | private static final PublishSubject sSubject = PublishSubject.create(); 15 | 16 | private RxCommandEvent() { 17 | // hidden constructor 18 | } 19 | 20 | public static Disposable subscribe(@NonNull Consumer action) { 21 | return sSubject.subscribe(action); 22 | } 23 | 24 | public static void publish(@NonNull Object message) { 25 | sSubject.onNext(message); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/events/RxEvent.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.events; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import dev.ukanth.ufirewall.log.Log; 6 | import io.reactivex.rxjava3.disposables.Disposable; 7 | import io.reactivex.rxjava3.functions.Consumer; 8 | import io.reactivex.rxjava3.subjects.PublishSubject; 9 | 10 | /** 11 | * Created by ukanth on 25/9/17. 12 | */ 13 | 14 | public class RxEvent { 15 | private final PublishSubject sSubject = PublishSubject.create(); 16 | 17 | public RxEvent() { 18 | // hidden constructor 19 | } 20 | 21 | public Disposable subscribe(@NonNull Consumer action) { 22 | return sSubject.subscribe(action, throwable -> { 23 | Log.i("AFWall", throwable.getLocalizedMessage()); 24 | }); 25 | } 26 | 27 | public void publish(@NonNull Object message) { 28 | sSubject.onNext(message); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/log/LogDatabase.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.log; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Database; 4 | import com.raizlabs.android.dbflow.annotation.Migration; 5 | import com.raizlabs.android.dbflow.sql.SQLiteType; 6 | import com.raizlabs.android.dbflow.sql.migration.AlterTableMigration; 7 | 8 | /** 9 | * Created by ukanth on 17/1/16. 10 | */ 11 | 12 | @Database(name = LogDatabase.NAME, version = LogDatabase.VERSION) 13 | public class LogDatabase { 14 | 15 | public static final String NAME = "Logs"; 16 | 17 | public static final int VERSION = 2; 18 | 19 | @Migration(version = 2, database = LogDatabase.class) 20 | public static class Migration2 extends AlterTableMigration { 21 | 22 | 23 | public Migration2(Class table) { 24 | super(table); 25 | } 26 | 27 | @Override 28 | public void onPreMigrate() { 29 | addColumn(SQLiteType.TEXT, "hostname"); 30 | addColumn(SQLiteType.INTEGER, "type"); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/log/LogPreference.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.log; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Column; 4 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 5 | import com.raizlabs.android.dbflow.annotation.Table; 6 | import com.raizlabs.android.dbflow.structure.BaseModel; 7 | 8 | /** 9 | * Created by ukanth on 17/1/16. 10 | */ 11 | 12 | @Table(database = LogPreferenceDB.class) 13 | public class LogPreference extends BaseModel { 14 | @Column 15 | @PrimaryKey 16 | private int uid; 17 | 18 | @Column 19 | private String appName; 20 | 21 | @Column 22 | private long skipInterval; 23 | 24 | @Column 25 | private boolean skip; 26 | 27 | @Column 28 | private long timestamp; 29 | 30 | public boolean isDisable() { 31 | return disable; 32 | } 33 | 34 | public void setDisable(boolean disable) { 35 | this.disable = disable; 36 | } 37 | 38 | @Column 39 | private boolean disable; 40 | 41 | 42 | public long getSkipInterval() { 43 | return skipInterval; 44 | } 45 | 46 | public void setSkipInterval(long skipInterval) { 47 | this.skipInterval = skipInterval; 48 | } 49 | 50 | public boolean isSkip() { 51 | return skip; 52 | } 53 | 54 | public void setSkip(boolean skip) { 55 | this.skip = skip; 56 | } 57 | 58 | 59 | public int getUid() { 60 | return uid; 61 | } 62 | 63 | public void setUid(int uid) { 64 | this.uid = uid; 65 | } 66 | 67 | public String getAppName() { 68 | return appName; 69 | } 70 | 71 | public void setAppName(String appName) { 72 | this.appName = appName; 73 | } 74 | 75 | public long getTimestamp() { 76 | return timestamp; 77 | } 78 | 79 | public void setTimestamp(long timestamp) { 80 | this.timestamp = timestamp; 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/log/LogPreferenceDB.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.log; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Database; 4 | 5 | /** 6 | * Created by ukanth on 17/1/16. 7 | */ 8 | 9 | @Database(name = LogPreferenceDB.NAME, version = LogPreferenceDB.VERSION) 10 | public class LogPreferenceDB { 11 | 12 | public static final String NAME = "LogPreference"; 13 | 14 | public static final int VERSION = 1; 15 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/log/LogRxEvent.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.log; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import dev.ukanth.ufirewall.events.LogEvent; 6 | import io.reactivex.rxjava3.disposables.Disposable; 7 | import io.reactivex.rxjava3.functions.Consumer; 8 | import io.reactivex.rxjava3.subjects.PublishSubject; 9 | 10 | /** 11 | * Created by ukanth on 25/9/17. 12 | */ 13 | 14 | public class LogRxEvent { 15 | private static final PublishSubject sSubject = PublishSubject.create(); 16 | 17 | private LogRxEvent() { 18 | // hidden constructor 19 | } 20 | 21 | public static Disposable subscribe(@NonNull Consumer action) { 22 | return sSubject.subscribe(action); 23 | } 24 | 25 | public static void publish(@NonNull LogEvent message) { 26 | sSubject.onNext(message); 27 | } 28 | 29 | public static PublishSubject getSubject() { 30 | return sSubject; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/log/RecyclerItemClickListener.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.log; 2 | 3 | /** 4 | * Created by ukanth on 10/8/16. 5 | */ 6 | public interface RecyclerItemClickListener { 7 | void onItemClick(LogData logData); 8 | } 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/preferences/CustomBinaryPreferenceFragment.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.preferences; 2 | 3 | import android.os.Bundle; 4 | import android.preference.PreferenceFragment; 5 | 6 | import dev.ukanth.ufirewall.R; 7 | 8 | public class CustomBinaryPreferenceFragment extends PreferenceFragment { 9 | @Override 10 | public void onCreate(Bundle savedInstanceState) { 11 | super.onCreate(savedInstanceState); 12 | // Load the preferences from an XML resource 13 | addPreferencesFromResource(R.xml.ui_custom_preferences); 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/preferences/DefaultConnectionPref.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.preferences; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Column; 4 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 5 | import com.raizlabs.android.dbflow.annotation.Table; 6 | import com.raizlabs.android.dbflow.structure.BaseModel; 7 | 8 | /** 9 | * Created by ukanth on 17/1/16. 10 | */ 11 | 12 | @Table(database = DefaultConnectionPrefDB.class) 13 | public class DefaultConnectionPref extends BaseModel { 14 | @Column 15 | @PrimaryKey 16 | private int uid; 17 | 18 | public int getUid() { 19 | return uid; 20 | } 21 | 22 | public void setUid(int uid) { 23 | this.uid = uid; 24 | } 25 | 26 | public String getConnectionType() { 27 | return connectionType; 28 | } 29 | 30 | public void setConnectionType(String connectionType) { 31 | this.connectionType = connectionType; 32 | } 33 | 34 | public boolean isState() { 35 | return state; 36 | } 37 | 38 | public void setState(boolean state) { 39 | this.state = state; 40 | } 41 | 42 | @Column 43 | private String connectionType; 44 | 45 | @Column 46 | private boolean state; 47 | 48 | public int getModeType() { 49 | return modeType; 50 | } 51 | 52 | public void setModeType(int modeType) { 53 | this.modeType = modeType; 54 | } 55 | 56 | @Column 57 | private int modeType; 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/preferences/DefaultConnectionPrefDB.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.preferences; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Database; 4 | /** 5 | * Created by ukanth on 17/1/16. 6 | */ 7 | 8 | @Database(name = DefaultConnectionPrefDB.NAME, version = DefaultConnectionPrefDB.VERSION) 9 | public class DefaultConnectionPrefDB { 10 | 11 | public static final String NAME = "DefaultConnectionPref"; 12 | 13 | public static final int VERSION = 1; 14 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/preferences/ShareContract.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.preferences; 2 | 3 | /** 4 | * Created by ukanth on 19/7/16. 5 | */ 6 | public class ShareContract { 7 | 8 | public static final String COLUMN_KEY = "key"; 9 | public static final String COLUMN_TYPE = "type"; 10 | public static final String COLUMN_VALUE = "value"; 11 | 12 | public static final int TYPE_NULL = 0; 13 | public static final int TYPE_STRING = 1; 14 | public static final int TYPE_STRING_SET = 2; 15 | public static final int TYPE_INT = 3; 16 | public static final int TYPE_LONG = 4; 17 | public static final int TYPE_FLOAT = 5; 18 | public static final int TYPE_BOOLEAN = 6; 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/preferences/ShareProfilePreference.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.preferences; 2 | 3 | import dev.ukanth.ufirewall.Api; 4 | import dev.ukanth.ufirewall.BuildConfig; 5 | 6 | /** 7 | * Created by ukanth on 19/7/16. 8 | */ 9 | public class ShareProfilePreference extends SharePreferenceProvider { 10 | public ShareProfilePreference() { 11 | super(new String[] {BuildConfig.APPLICATION_ID + "_preferences", Api.PREFS_NAME}); 12 | } 13 | 14 | //make sure only read access 15 | @Override 16 | protected boolean checkAccess(String prefName, String prefKey, boolean write) { 17 | // Only allow read access 18 | return !write; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/preferences/WidgetPreferenceFragment.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.preferences; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.preference.EditTextPreference; 6 | import android.preference.PreferenceFragment; 7 | import android.text.InputType; 8 | import android.util.DisplayMetrics; 9 | import android.view.WindowManager; 10 | import android.widget.EditText; 11 | 12 | import dev.ukanth.ufirewall.R; 13 | 14 | public class WidgetPreferenceFragment extends PreferenceFragment { 15 | 16 | @Override 17 | public void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | 20 | try { 21 | // Load the preferences from an XML resource 22 | addPreferencesFromResource(R.xml.widget_preferences); 23 | 24 | EditTextPreference editX = (EditTextPreference) findPreference("widgetX"); 25 | EditTextPreference editY = (EditTextPreference) findPreference("widgetY"); 26 | 27 | EditText prefEditTextX = editX.getEditText(); 28 | prefEditTextX.setInputType(InputType.TYPE_CLASS_TEXT); 29 | 30 | EditText prefEditTextY = editY.getEditText(); 31 | prefEditTextY.setInputType(InputType.TYPE_CLASS_TEXT); 32 | 33 | if (editX != null && (editX.getText() == null || editX.getText().equals("")) && editY != null && (editY.getText() == null || editY.getText().equals(""))) { 34 | DisplayMetrics dm = new DisplayMetrics(); 35 | Context hostActivity = getActivity(); 36 | if (hostActivity != null) { 37 | WindowManager wm = (WindowManager) hostActivity.getSystemService(Context.WINDOW_SERVICE); 38 | wm.getDefaultDisplay().getMetrics(dm); 39 | editX.setText(dm.widthPixels + ""); 40 | editY.setText(dm.heightPixels + ""); 41 | } 42 | } 43 | } catch(ClassCastException e) { 44 | 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/profiles/ProfileData.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.profiles; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Column; 4 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 5 | import com.raizlabs.android.dbflow.annotation.Table; 6 | import com.raizlabs.android.dbflow.structure.BaseModel; 7 | 8 | /** 9 | * Created by ukanth on 17/1/16. 10 | */ 11 | 12 | @Table(database = ProfilesDatabase.class) 13 | public class ProfileData extends BaseModel implements Cloneable{ 14 | 15 | @Column 16 | @PrimaryKey(autoincrement = true) 17 | long id; 18 | 19 | public long getId() { 20 | return id; 21 | } 22 | 23 | public void removeId(){ 24 | id = -1; 25 | } 26 | 27 | @Column 28 | private String name; 29 | 30 | @Column 31 | private String identifier; 32 | 33 | @Column 34 | private String attibutes; 35 | 36 | @Column 37 | private String parentProfile; 38 | 39 | public ProfileData() { 40 | } 41 | 42 | public ProfileData(String name, String identifier) { 43 | this.name = name; 44 | this.identifier = identifier; 45 | } 46 | 47 | public String getName() { 48 | return name; 49 | } 50 | 51 | public void setName(String name) { 52 | this.name = name; 53 | } 54 | 55 | public String getIdentifier() { 56 | return identifier; 57 | } 58 | 59 | public void setIdentifier(String identifier) { 60 | this.identifier = identifier; 61 | } 62 | 63 | public String getAttibutes() { 64 | return attibutes; 65 | } 66 | 67 | public void setAttibutes(String attibutes) { 68 | this.attibutes = attibutes; 69 | } 70 | 71 | public String getParentProfile() { 72 | return parentProfile; 73 | } 74 | 75 | public void setParentProfile(String parentProfile) { 76 | this.parentProfile = parentProfile; 77 | } 78 | 79 | public ProfileData clone() throws CloneNotSupportedException { 80 | return (ProfileData) super.clone(); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/profiles/ProfilesDatabase.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.profiles; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Database; 4 | 5 | /** 6 | * Created by ukanth . 7 | */ 8 | 9 | @Database(name = ProfilesDatabase.NAME, version = ProfilesDatabase.VERSION) 10 | public class ProfilesDatabase { 11 | 12 | public static final String NAME = "profiles"; 13 | 14 | public static final int VERSION = 1; 15 | } -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/service/RulesApplyService.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.service; 2 | 3 | import android.app.IntentService; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import dev.ukanth.ufirewall.Api; 8 | import dev.ukanth.ufirewall.InterfaceTracker; 9 | import dev.ukanth.ufirewall.log.Log; 10 | import dev.ukanth.ufirewall.util.G; 11 | 12 | /** 13 | * Created by ukanth on 14/11/16. 14 | */ 15 | 16 | public class RulesApplyService extends IntentService { 17 | 18 | public RulesApplyService() { 19 | super(RulesApplyService.class.getName()); 20 | } 21 | 22 | @Override 23 | protected void onHandleIntent(Intent intent) { 24 | 25 | Context context = RulesApplyService.this; 26 | if(Api.isEnabled(context)) { 27 | if(G.activeRules()) { 28 | Log.d(Api.TAG, "Applying rules on connectivity change"); 29 | InterfaceTracker.applyRulesOnChange(context, InterfaceTracker.CONNECTIVITY_CHANGE); 30 | } 31 | final Intent logIntent = new Intent(context, LogService.class); 32 | if (G.enableLogService()) { 33 | context.stopService(logIntent); 34 | context.startService(logIntent); 35 | } else { 36 | context.stopService(logIntent); 37 | //Api.cleanupUid(); 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/ui/about/FAQFragment.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.ui.about; 2 | 3 | import android.os.Bundle; 4 | import android.util.Log; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.webkit.WebView; 9 | import android.widget.TextView; 10 | 11 | import androidx.fragment.app.Fragment; 12 | 13 | import java.io.IOException; 14 | 15 | import dev.ukanth.ufirewall.Api; 16 | import dev.ukanth.ufirewall.R; 17 | 18 | 19 | public class FAQFragment extends Fragment { 20 | private static final String TAG = "FAQFragment"; 21 | 22 | @Override 23 | public View onCreateView(LayoutInflater inflater, ViewGroup group, 24 | Bundle saved) { 25 | return inflater.inflate(R.layout.help_faq_content, group, false); 26 | } 27 | 28 | @Override 29 | public void onActivityCreated(Bundle savedInstanceState) { 30 | super.onActivityCreated(savedInstanceState); 31 | 32 | TextView text = getActivity().findViewById(R.id.faq_afwall_title); 33 | text.setText(R.string.faq); 34 | 35 | WebView creditsWebView = getActivity().findViewById(R.id.faq_webview); 36 | try { 37 | String data = Api.loadData(getActivity().getBaseContext(), "faq"); 38 | creditsWebView.loadDataWithBaseURL(null, data, "text/html","UTF-8",null); 39 | } catch (IOException ioe) { 40 | Log.e(TAG, "Error reading changelog file!", ioe); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/ui/about/ViewPagerAdapter.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.ui.about; 2 | 3 | import androidx.fragment.app.Fragment; 4 | import androidx.fragment.app.FragmentManager; 5 | import androidx.fragment.app.FragmentStatePagerAdapter; 6 | 7 | /** 8 | * Created by ukanth on 2/5/15. 9 | */ 10 | public class ViewPagerAdapter extends FragmentStatePagerAdapter { 11 | 12 | CharSequence[] pageTitles; 13 | int noOfTabs; 14 | 15 | 16 | // Build a Constructor and assign the passed Values to appropriate values in the class 17 | public ViewPagerAdapter(FragmentManager fm, CharSequence[] mTitles, int mNumbOfTabsumb) { 18 | super(fm); 19 | this.pageTitles = mTitles; 20 | this.noOfTabs = mNumbOfTabsumb; 21 | 22 | } 23 | @Override 24 | public Fragment getItem(int position) { 25 | if(position == 0) { 26 | return new AboutFragment(); 27 | } else { 28 | return new FAQFragment(); 29 | } 30 | } 31 | 32 | @Override 33 | public CharSequence getPageTitle(int position) { 34 | return pageTitles[position]; 35 | } 36 | 37 | @Override 38 | public int getCount() { 39 | return noOfTabs; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/util/DateComparator.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.util; 2 | 3 | import java.util.Comparator; 4 | 5 | import dev.ukanth.ufirewall.log.LogData; 6 | 7 | /** 8 | * Created by ukanth on 27/7/16. 9 | */ 10 | public class DateComparator implements Comparator{ 11 | 12 | @Override 13 | public int compare(LogData o1, LogData o2) { 14 | Long o1_date = o1.getTimestamp(); 15 | Long o2_date = o2.getTimestamp(); 16 | return (o1_date > o2_date) ? -1: (o1_date < o2_date) ? 0 : 1; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/util/LocaleManager.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.util; 2 | 3 | import android.content.Context; 4 | import android.content.res.Configuration; 5 | import android.content.res.Resources; 6 | import android.os.Build; 7 | 8 | import java.util.Locale; 9 | 10 | public class LocaleManager { 11 | 12 | 13 | public static Context setLocale(Context c) { 14 | return updateResources(c, G.locale()); 15 | } 16 | 17 | public static Context setNewLocale(Context c, String language) { 18 | return updateResources(c, language); 19 | } 20 | 21 | private static Context updateResources(Context context, String language) { 22 | Locale locale = new Locale(language); 23 | Locale.setDefault(locale); 24 | 25 | Resources res = context.getResources(); 26 | Configuration config = new Configuration(res.getConfiguration()); 27 | if (Build.VERSION.SDK_INT >= 17) { 28 | config.setLocale(locale); 29 | context = context.createConfigurationContext(config); 30 | } else { 31 | config.locale = locale; 32 | res.updateConfiguration(config, res.getDisplayMetrics()); 33 | } 34 | return context; 35 | } 36 | 37 | public static Locale getLocale(Resources res) { 38 | Configuration config = res.getConfiguration(); 39 | return Build.VERSION.SDK_INT >= 24 ? config.getLocales().get(0) : config.locale; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/util/PackageComparator.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.util; 2 | 3 | import java.util.Comparator; 4 | 5 | import dev.ukanth.ufirewall.Api; 6 | 7 | /** 8 | * Created by ukanth on 11/8/15. 9 | */ 10 | public class PackageComparator implements Comparator { 11 | 12 | @Override 13 | public int compare(Api.PackageInfoData o1, Api.PackageInfoData o2) { 14 | if (o1.firstseen != o2.firstseen) { 15 | return (o1.firstseen ? -1 : 1); 16 | } 17 | boolean o1_selected = o1.selected_3g || o1.selected_wifi || o1.selected_roam || 18 | o1.selected_vpn || o1.selected_tether || o1.selected_lan || o1.selected_tor; 19 | boolean o2_selected = o2.selected_3g || o2.selected_wifi || o2.selected_roam || 20 | o2.selected_vpn || o2.selected_tether || o2.selected_lan || o2.selected_tor; 21 | 22 | if (o1_selected == o2_selected) { 23 | switch (G.sortBy()) { 24 | case "s0": 25 | return String.CASE_INSENSITIVE_ORDER.compare(o1.names.get(0), o2.names.get(0)); 26 | case "s1": 27 | return (o1.installTime > o2.installTime) ? -1: (o1.installTime < o2.installTime) ? 1 : 0; 28 | case "s2": 29 | return (o2.uid > o1.uid) ? -1: (o2.uid < o1.uid) ? 0 : 1; 30 | } 31 | } 32 | if (o1_selected) 33 | return -1; 34 | return 1; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/util/Rule.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.util; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by ukanth on 22/11/16. 7 | */ 8 | 9 | public class Rule { 10 | 11 | String name; 12 | String desc; 13 | List ipv4On; 14 | List ipv4Off; 15 | List ipv6On; 16 | List ipv6Off; 17 | 18 | public List getIpv4On() { 19 | return ipv4On; 20 | } 21 | 22 | public void setIpv4On(List ipv4On) { 23 | this.ipv4On = ipv4On; 24 | } 25 | 26 | public List getIpv4Off() { 27 | return ipv4Off; 28 | } 29 | 30 | public void setIpv4Off(List ipv4Off) { 31 | this.ipv4Off = ipv4Off; 32 | } 33 | 34 | public List getIpv6On() { 35 | return ipv6On; 36 | } 37 | 38 | public void setIpv6On(List ipv6On) { 39 | this.ipv6On = ipv6On; 40 | } 41 | 42 | public List getIpv6Off() { 43 | return ipv6Off; 44 | } 45 | 46 | public void setIpv6Off(List ipv6Off) { 47 | this.ipv6Off = ipv6Off; 48 | } 49 | 50 | public String getName() { 51 | return name; 52 | } 53 | 54 | public void setName(String name) { 55 | this.name = name; 56 | } 57 | 58 | public String getDesc() { 59 | return desc; 60 | } 61 | 62 | public void setDesc(String desc) { 63 | this.desc = desc; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/dev/ukanth/ufirewall/util/XPreferenceProvider.java: -------------------------------------------------------------------------------- 1 | package dev.ukanth.ufirewall.util; 2 | 3 | /*import com.crossbowffs.remotepreferences.RemotePreferenceProvider; 4 | 5 | import dev.ukanth.ufirewall.Api; 6 | import dev.ukanth.ufirewall.BuildConfig; 7 | 8 | public class XPreferenceProvider extends RemotePreferenceProvider { 9 | public XPreferenceProvider() { 10 | super(BuildConfig.APPLICATION_ID, new String[] {Api.PREFS_NAME, BuildConfig.APPLICATION_ID+ "_preferences"}); 11 | } 12 | }*/ -------------------------------------------------------------------------------- /app/src/main/res/convert.properties: -------------------------------------------------------------------------------- 1 | ast=values-ast-rES 2 | ar=values-ar 3 | az=values-az 4 | he=values-he 5 | bg=values-bg 6 | bn=values-bn 7 | bs=values-bs 8 | ca=values-ca 9 | cs=values-cs 10 | da=values-da 11 | de=values-de 12 | el=values-el 13 | es-ES=values-es 14 | eu=values-eu 15 | fa=values-fa 16 | fi=values-fi 17 | fr=values-fr 18 | hi=values-hi 19 | hr=values-hr 20 | hu=values-hu 21 | id=values-in 22 | it=values-it 23 | ja=values-ja 24 | kn=values-kn 25 | ko=values-ko 26 | ml-IN=values-ml-rIN 27 | ms=values-ms 28 | nb=values-nb 29 | nl=values-nl 30 | pl=values-pl 31 | pt-BR=values-pt-rBR 32 | pt-PT=values-pt 33 | ro=values-ro 34 | ru=values-ru 35 | sl=values-sl 36 | sr=values-sr 37 | sk=values-sk 38 | sr-CS=values-sr-rCS 39 | sv-SE=values-sv 40 | ta=values-ta 41 | th=values-th 42 | tr=values-tr 43 | uk=values-uk 44 | ur-PK=values-ur-rPK 45 | vi=values-vi 46 | zh-TW=values-zh-rTW 47 | zh-CN=values-zh-rCN 48 | -------------------------------------------------------------------------------- /app/src/main/res/convert.sh: -------------------------------------------------------------------------------- 1 | # Convert exported crowdin files to android format 2 | for d in */ ; do 3 | while read line 4 | do 5 | key=`echo "$line" | cut -d'=' -f1` 6 | value=`echo "$line" | cut -d'=' -f2` 7 | if [ $key"/" == $d ] 8 | then 9 | mv $d $value 10 | fi 11 | done < convert.properties 12 | done 13 | #delete Playstore.txt files 14 | find . -name "Playstore.txt" -print0 | xargs -0 rm -rf 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi-v11/active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi-v11/active.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi-v11/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi-v11/error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi-v11/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi-v11/question.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_apply.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/ic_apply.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_launcher_free.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/ic_launcher_free.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/notification_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/notification_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/notification_quest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/notification_quest.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/notification_warn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/notification_warn.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/twofortyfouram_locale_ic_menu_dontsave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/twofortyfouram_locale_ic_menu_dontsave.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/twofortyfouram_locale_ic_menu_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/twofortyfouram_locale_ic_menu_help.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/twofortyfouram_locale_ic_menu_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-hdpi/twofortyfouram_locale_ic_menu_save.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi-v11/active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi-v11/active.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi-v11/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi-v11/error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi-v11/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi-v11/question.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_apply.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi/ic_apply.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_launcher_free.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi/ic_launcher_free.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi/notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/notification_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi/notification_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/notification_quest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi/notification_quest.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/notification_warn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-mdpi/notification_warn.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_android_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi-v11/active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi-v11/active.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi-v11/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi-v11/error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi-v11/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi-v11/question.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_apply.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi/ic_apply.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher_free.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi/ic_launcher_free.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi/notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/notification_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi/notification_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/notification_quest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi/notification_quest.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/notification_warn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xhdpi/notification_warn.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi-v11/active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi-v11/active.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi-v11/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi-v11/error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi-v11/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi-v11/question.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_apply.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi/ic_apply.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_launcher_free.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi/ic_launcher_free.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi/notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/notification_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi/notification_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/notification_quest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi/notification_quest.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/notification_warn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxhdpi/notification_warn.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_apply.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable-xxxhdpi/ic_apply.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_action.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_allow.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_android_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apply_menu.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apply_notification.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_block_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bluetooth.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clean.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clearlog.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clone.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_custom_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_deny.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_exit.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_export.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flow.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_import.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_invert.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lan.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_legend.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_log.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mail.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_binary.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_exp.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_pref.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_profile.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_save.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_secure.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_translate.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_widget.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mobiledata.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_preference.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_refresh.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_roam.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rules.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_script.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sort.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tor.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_unknown.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_vpn.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wifi.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/list_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/plus.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/preview_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/preview_new.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/preview_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/preview_old.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/preview_toggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/preview_toggle.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/question_widget.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/question_widget.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/toast.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/twofortyfouram_locale_ic_menu_dontsave.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/twofortyfouram_locale_ic_menu_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/twofortyfouram_locale_ic_menu_save.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_bg_focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/widget_bg_focus.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_bg_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/widget_bg_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_circle_enable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/widget_off.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukanth/afwall/7781903380d125a8fbfd9c7ec51b093350ebe532/app/src/main/res/drawable/widget_on.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/zoomin.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/zoomout.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_custom_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_prefs.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/apply_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 17 | 18 | 19 | 24 | 25 | 26 | 27 | 33 | 34 | 39 | 40 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_toast.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 22 | 23 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/file_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 23 | 24 | 28 | 29 | 35 | 36 | 37 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/help_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 16 | 17 | 23 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/help_about_content.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 18 | 19 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/help_faq_content.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 18 | 19 | 24 | 25 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/log_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 17 | 18 | 25 | 26 | 30 | 31 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/logdetail_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 17 | 18 | 25 | 26 | 30 | 31 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/onoff_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/profile_adddialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 16 | 17 | 18 |