From 19f96483f2f6df17d5dc5142f99a27e6fdbefab2 Mon Sep 17 00:00:00 2001 From: msmannan00 Date: Wed, 11 Nov 2020 17:11:13 +0500 Subject: [PATCH] Bug Fixes --- .idea/gradle.xml | 8 + .idea/inspectionProfiles/Project_Default.xml | 14 + app/build.gradle | 12 +- app/src/main/AndroidManifest.xml | 62 +- app/src/main/assets/genesis/sample.html | 11 + .../appManager/activityContextManager.java | 50 +- .../bookmarkManager/bookmarkAdapter.java | 281 +- .../bookmarkManager/bookmarkAdapterView.java | 1 - .../bookmarkManager/bookmarkController.java | 3 +- .../bookmarkManager/bookmarkEnums.java | 2 +- .../bookmarkViewController.java | 35 +- .../bridgeManager/bridgeController.java | 54 +- .../appManager/bridgeManager/bridgeEnums.java | 7 +- .../appManager/bridgeManager/bridgeModel.java | 69 + .../bridgeManager/bridgeViewController.java | 50 +- .../historyManager/historyAdapter.java | 50 +- .../historyManager/historyAdapterView.java | 17 +- .../historyManager/historyController.java | 19 +- .../historyManager/historyViewController.java | 33 +- .../appManager/homeManager/geckoClients.java | 76 +- .../appManager/homeManager/geckoSession.java | 251 +- .../homeManager/homeController.java | 159 +- .../appManager/homeManager/homeModel.java | 28 +- .../homeManager/homeViewController.java | 44 +- .../languageViewController.java | 11 +- .../orbotLogManager/orbotLogController.java | 111 + .../orbotLogManager/orbotLogEnums.java | 12 + .../orbotLogManager/orbotLogModel.java | 30 + .../orbotLogViewController.java | 64 + .../orbotManager/orbotController.java | 36 +- .../appManager/orbotManager/orbotEnums.java | 6 +- .../appManager/orbotManager/orbotModel.java | 49 + .../orbotManager/orbotViewController.java | 50 +- .../settingAccessibilityController.java | 29 +- .../settingAccessibilityEnums.java | 14 + .../settingAccessibilityModel.java | 21 +- .../settingAccessibilityViewController.java | 85 +- .../settingAdvanceController.java | 132 + .../advanceManager/settingAdvanceEnums.java | 14 + .../advanceManager/settingAdvanceModel.java | 71 + .../settingAdvanceViewController.java | 125 + .../clearManager/settingClearController.java | 167 + .../clearManager/settingClearEnums.java | 13 + .../clearManager/settingClearModel.java | 20 + .../settingClearViewController.java | 74 + .../settingGeneralController.java | 170 + .../generalManager/settingGeneralEnums.java | 14 + .../generalManager/settingGeneralModel.java | 52 + .../settingGeneralViewController.java | 140 + .../settingNotificationController.java | 11 +- .../settingNotificationEnums.java | 14 + .../settingNotificationModel.java | 15 +- .../settingNotificationViewController.java | 17 +- .../settingPrivacyController.java | 138 + .../privacyManager/settingPrivacyEnums.java | 14 + .../privacyManager/settingPrivacyModel.java | 87 + .../settingPrivacyViewController.java | 148 + .../settingSearchController.java | 24 +- .../settingSearchEnums.java | 14 + .../settingSearchModel.java | 26 +- .../settingSearchViewController.java | 100 +- .../settingHomePage/settingController.java | 218 +- .../settingHomePage/settingHomeEnums.java | 12 + .../settingHomePage/settingModel.java | 116 - .../settingViewController.java | 148 +- .../appManager/tabManager/tabAdapter.java | 145 +- .../appManager/tabManager/tabController.java | 194 +- .../appManager/tabManager/tabEnums.java | 12 + .../appManager/tabManager/tabModel.java | 11 +- .../appManager/tabManager/tabRowModel.java | 13 + .../tabManager/tabViewController.java | 84 +- .../constants/constants.java | 11 +- .../genesissearchengine/constants/enums.java | 12 +- .../genesissearchengine/constants/keys.java | 11 + .../genesissearchengine/constants/status.java | 34 +- .../constants/strings.java | 1 + .../dataManager/bookmarkDataModel.java | 35 +- .../dataManager/dataController.java | 87 +- .../dataManager/dataEnums.java | 8 + .../dataManager/historyDataModel.java | 8 +- ...ataModel.java => suggestionDataModel.java} | 441 +- .../dataManager/tabDataModel.java | 108 + .../helperManager/autoFillService.java | 25 + .../helperManager/helperMethod.java | 44 +- .../pluginManager/adManager.java | 14 +- .../pluginManager/admanager.java | 91 - .../pluginManager/analyticManager.java | 8 +- .../pluginManager/analyticmanager.java | 57 - .../pluginManager/messageManager.java | 47 +- .../pluginManager/orbotManager.java | 33 +- .../pluginManager/pluginController.java | 7 +- app/src/main/res/anim/fade_in.xml | 11 +- app/src/main/res/anim/fade_out.xml | 7 + .../xml/ax_bottom_rounded_corner_left.xml | 2 +- .../xml/ax_bottom_rounded_corner_right.xml | 2 +- .../xml/ax_ripple_default_round_bottom.xml | 13 + .../xml/ax_ripple_default_round_left.xml | 6 +- .../xml/ax_ripple_default_round_right.xml | 8 +- .../generic/xml/gx_generic_input.xml | 4 +- .../generic/xml/gx_generic_input_square.xml | 23 + .../generic/xml/gx_generic_tab_button.xml | 14 +- .../custom-xml/generic/xml/gx_ripple_blue.xml | 2 +- .../generic/xml/gx_ripple_default_round.xml | 2 +- .../custom-xml/generic/xml/gx_ripple_gray.xml | 2 +- .../generic/xml/gx_rounded_corner_alert.xml | 4 +- .../custom-xml/generic/xml/gx_side_item.xml | 2 +- .../generic/xml/gx_side_item_bottom.xml | 2 +- .../generic/xml/gx_side_item_popup.xml | 20 +- .../generic/xml/gx_side_item_top.xml | 4 +- .../custom-xml/generic/xml/gx_side_menu.xml | 20 +- .../res/custom-xml/history/xml/hx_border.xml | 4 +- .../history/xml/hx_circle_favicon.xml | 2 +- .../custom-xml/history/xml/hx_menu_popup.xml | 14 +- .../history/xml/hx_menu_popup_container.xml | 24 +- .../custom-xml/home/xml/hox_menu_button.xml | 2 +- .../home/xml/hox_rounded_corner.xml | 4 +- .../home/xml/hox_rounded_corner_container.xml | 11 + .../hox_rounded_corner_container_bottom.xml | 15 + .../home/xml/hox_rounded_corner_splash.xml | 21 + ...hox_rounded_corner_suggestion_settings.xml | 6 +- .../custom-xml/images/xml/ic_baseline_add.xml | 10 + .../images/xml/ic_baseline_bookmark.xml | 10 + .../custom-xml/images/xml/ic_baseline_bug.xml | 10 + .../images/xml/ic_baseline_cross.xml | 10 + .../images/xml/ic_baseline_delete.xml | 10 + .../images/xml/ic_secondary_gradinet.xml | 4 +- .../xml/olx_rounded_corner_warning.xml | 21 + .../custom-xml/setting/xml/sx_border_left.xml | 10 + .../setting/xml/sx_button_round.xml | 21 + .../xml/sx_font_change_round_background.xml | 15 + .../setting/xml/sx_seekbar_trail.xml | 8 + .../tab/xml/tx_border_round_geckoview.xml | 7 + .../main/res/drawable-hdpi/empty_bookmark.png | Bin 80271 -> 70991 bytes .../main/res/drawable-hdpi/empty_history.png | Bin 63080 -> 80073 bytes .../main/res/drawable-hdpi/genesis_logo.png | Bin 0 -> 25989 bytes .../drawable/ic_baseline_accessibility.xml | 10 + .../main/res/drawable/ic_baseline_advance.xml | 13 + .../main/res/drawable/ic_baseline_browser.xml | 10 + .../main/res/drawable/ic_baseline_clear.xml | 10 + .../main/res/drawable/ic_baseline_home.xml | 10 + .../drawable/ic_baseline_notifications.xml | 10 + .../main/res/drawable/ic_baseline_privacy.xml | 10 + .../main/res/drawable/ic_baseline_search.xml | 10 + .../layouts/alert/layout/popup_abi_error.xml | 14 +- .../alert/layout/popup_bridge_mail.xml | 189 +- .../alert/layout/popup_clear_bookmark.xml | 12 +- .../alert/layout/popup_clear_history.xml | 16 +- .../alert/layout/popup_create_bookmark.xml | 19 +- .../alert/layout/popup_data_cleared.xml | 89 + .../alert/layout/popup_download_file.xml | 10 +- .../alert/layout/popup_download_full.xml | 78 +- .../alert/layout/popup_file_longpress.xml | 40 +- .../alert/layout/popup_not_supported.xml | 10 +- .../alert/layout/popup_rate_failure.xml | 16 +- .../layouts/alert/layout/popup_rate_us.xml | 14 +- .../layouts/alert/layout/popup_report_url.xml | 16 +- .../layout/popup_reported_successfully.xml | 12 +- .../layout/popup_starting_orbot_info.xml | 8 +- .../alert/layout/popup_url_longpress.xml | 42 +- .../layouts/alert/layout/popup_welcome.xml | 56 +- .../layouts/bookmark/layout/bookmark_view.xml | 34 +- .../bridge/layout/bridge_settings_view.xml | 59 +- .../layouts/history/layout/history_view.xml | 35 +- .../layouts/language/layout/language_view.xml | 55 +- .../orbot/layout/orbot_settings_view.xml | 51 +- .../orbotLog/layout/orbot_log_view.xml | 117 + .../res/layouts/other/layout/home_view.xml | 192 +- .../layout/multidataset_service_list_item.xml | 38 + .../res/layouts/other/layout/popup_menu.xml | 339 +- .../layouts/other/layout/settings_view.xml | 428 - .../res/layouts/other/layout/tab_view.xml | 11 - .../res/layouts/setting/layout/setting.xml | 932 +- .../layout/setting_accessibility_view.xml | 151 +- .../setting/layout/setting_advance_view.xml | 446 + .../setting/layout/setting_clear_view.xml | 654 + .../setting/layout/setting_general_view.xml | 524 + .../layout/setting_notification_view.xml | 44 +- .../setting/layout/setting_privacy_view.xml | 506 + .../setting/layout/setting_search_view.xml | 184 +- .../listviews/layout/recyclerview__menu.xml | 7 +- .../layout/recyclerview__row_menu.xml | 8 +- .../listviews/layout/recyclerview_row.xml | 8 +- .../shared/listviews/layout/tabview_row.xml | 124 + .../main/res/layouts/tab/layout/tab_menu.xml | 65 + .../main/res/layouts/tab/layout/tab_view.xml | 124 + app/src/main/res/values-night/arrays.xml | 12033 ++++++++++++++++ app/src/main/res/values-night/attrs.xml | 14 + app/src/main/res/values-night/colors.xml | 97 + app/src/main/res/values-night/dimens.xml | 3 + .../values-night/ic_launcher_background.xml | 4 + app/src/main/res/values-night/integers.xml | 4 + app/src/main/res/values-night/pdnsd.xml | 33 + app/src/main/res/values-night/strings.xml | 343 + app/src/main/res/values-night/styles.xml | 93 + app/src/main/res/values/colors.xml | 58 +- app/src/main/res/values/strings.xml | 105 +- app/src/main/res/values/styles.xml | 11 + chromiumTabs/.gitignore | 1 + chromiumTabs/build.gradle | 27 + chromiumTabs/gradle.properties | 3 + chromiumTabs/src/main/AndroidManifest.xml | 16 + .../android/tabswitcher/AbstractState.java | 71 + .../tabswitcher/AddTabButtonListener.java | 38 + .../mrapp/android/tabswitcher/Animation.java | 162 + .../android/tabswitcher/DragGesture.java | 199 + .../de/mrapp/android/tabswitcher/Layout.java | 39 + .../android/tabswitcher/LayoutPolicy.java | 83 + .../android/tabswitcher/PeekAnimation.java | 141 + .../android/tabswitcher/PullDownGesture.java | 59 + .../android/tabswitcher/RevealAnimation.java | 139 + .../StatefulTabSwitcherDecorator.java | 293 + .../android/tabswitcher/SwipeAnimation.java | 182 + .../android/tabswitcher/SwipeGesture.java | 109 + .../de/mrapp/android/tabswitcher/Tab.java | 863 ++ .../android/tabswitcher/TabCloseListener.java | 40 + .../tabswitcher/TabPreviewListener.java | 41 + .../android/tabswitcher/TabSwitcher.java | 2054 +++ .../tabswitcher/TabSwitcherDecorator.java | 283 + .../tabswitcher/TabSwitcherListener.java | 114 + .../drawable/TabSwitcherDrawable.java | 209 + .../AbstractDragGestureEventHandler.java | 64 + .../gesture/AbstractTouchEventHandler.java | 358 + .../DragGestureEventHandlerFactory.java | 82 + .../gesture/PullDownGestureEventHandler.java | 139 + .../gesture/SwipeGestureEventHandler.java | 254 + .../gesture/TouchEventDispatcher.java | 341 + .../iterator/AbstractItemIterator.java | 235 + .../iterator/ArrayItemIterator.java | 173 + .../tabswitcher/iterator/ItemIterator.java | 135 + .../layout/AbstractArithmetics.java | 78 + .../layout/AbstractDragTabsEventHandler.java | 768 + .../layout/AbstractTabRecyclerAdapter.java | 820 ++ .../layout/AbstractTabSwitcherLayout.java | 1690 +++ .../layout/AbstractTabViewHolder.java | 58 + .../tabswitcher/layout/Arithmetics.java | 301 + .../layout/ContentRecyclerAdapter.java | 244 + .../tabswitcher/layout/TabSwitcherLayout.java | 71 + .../layout/phone/PhoneArithmetics.java | 446 + .../phone/PhoneDragTabsEventHandler.java | 288 + .../layout/phone/PhoneTabRecyclerAdapter.java | 448 + .../layout/phone/PhoneTabSwitcherLayout.java | 3494 +++++ .../layout/phone/PhoneTabViewHolder.java | 52 + .../layout/phone/PreviewDataBinder.java | 151 + .../layout/tablet/TabletArithmetics.java | 232 + .../TabletContentRecyclerAdapterWrapper.java | 363 + .../tablet/TabletDragTabsEventHandler.java | 179 + .../tablet/TabletTabRecyclerAdapter.java | 220 + .../tablet/TabletTabSwitcherLayout.java | 1381 ++ .../layout/tablet/TabletTabViewHolder.java | 28 + .../tabswitcher/model/AbstractItem.java | 133 + .../android/tabswitcher/model/AddTabItem.java | 96 + .../tabswitcher/model/ItemComparator.java | 89 + .../android/tabswitcher/model/Model.java | 1351 ++ .../android/tabswitcher/model/Restorable.java | 47 + .../android/tabswitcher/model/State.java | 49 + .../android/tabswitcher/model/TabItem.java | 199 + .../tabswitcher/model/TabSwitcherModel.java | 1859 +++ .../tabswitcher/model/TabSwitcherStyle.java | 476 + .../mrapp/android/tabswitcher/model/Tag.java | 129 + .../android/tabswitcher/util/ThemeHelper.java | 327 + .../tabswitcher/view/TabSwitcherButton.java | 159 + .../res/color/tablet_add_tab_button_dark.xml | 21 + .../res/color/tablet_add_tab_button_light.xml | 21 + .../res/color/tablet_tab_background_dark.xml | 21 + .../res/color/tablet_tab_background_light.xml | 21 + .../drawable-hdpi/phone_tab_background.9.png | Bin 0 -> 2409 bytes .../res/drawable-hdpi/phone_tab_border.9.png | Bin 0 -> 465 bytes .../phone_tab_close_button_icon_dark.png | Bin 0 -> 266 bytes .../phone_tab_close_button_icon_light.png | Bin 0 -> 395 bytes .../tab_switcher_drawable_background.png | Bin 0 -> 496 bytes .../drawable-hdpi/tablet_add_tab_button.9.png | Bin 0 -> 508 bytes .../drawable-hdpi/tablet_tab_background.9.png | Bin 0 -> 1055 bytes .../tablet_tab_background_selected.9.png | Bin 0 -> 1049 bytes .../tablet_tab_close_button_icon_dark.png | Bin 0 -> 404 bytes .../tablet_tab_close_button_icon_light.png | Bin 0 -> 440 bytes .../drawable-mdpi/phone_tab_background.9.png | Bin 0 -> 1055 bytes .../res/drawable-mdpi/phone_tab_border.9.png | Bin 0 -> 315 bytes .../phone_tab_close_button_icon_dark.png | Bin 0 -> 226 bytes .../phone_tab_close_button_icon_light.png | Bin 0 -> 292 bytes .../tab_switcher_drawable_background.png | Bin 0 -> 351 bytes .../drawable-mdpi/tablet_add_tab_button.9.png | Bin 0 -> 366 bytes .../drawable-mdpi/tablet_tab_background.9.png | Bin 0 -> 739 bytes .../tablet_tab_background_selected.9.png | Bin 0 -> 738 bytes .../tablet_tab_close_button_icon_dark.png | Bin 0 -> 280 bytes .../tablet_tab_close_button_icon_light.png | Bin 0 -> 341 bytes .../drawable-xhdpi/phone_tab_background.9.png | Bin 0 -> 3516 bytes .../res/drawable-xhdpi/phone_tab_border.9.png | Bin 0 -> 651 bytes .../phone_tab_close_button_icon_dark.png | Bin 0 -> 348 bytes .../phone_tab_close_button_icon_light.png | Bin 0 -> 467 bytes .../tab_switcher_drawable_background.png | Bin 0 -> 585 bytes .../tablet_add_tab_button.9.png | Bin 0 -> 672 bytes .../tablet_tab_background.9.png | Bin 0 -> 1834 bytes .../tablet_tab_background_selected.9.png | Bin 0 -> 1823 bytes .../tablet_tab_close_button_icon_dark.png | Bin 0 -> 533 bytes .../tablet_tab_close_button_icon_light.png | Bin 0 -> 542 bytes .../phone_tab_background.9.png | Bin 0 -> 5969 bytes .../drawable-xxhdpi/phone_tab_border.9.png | Bin 0 -> 966 bytes .../phone_tab_close_button_icon_dark.png | Bin 0 -> 442 bytes .../phone_tab_close_button_icon_light.png | Bin 0 -> 597 bytes .../tab_switcher_drawable_background.png | Bin 0 -> 853 bytes .../tablet_add_tab_button.9.png | Bin 0 -> 991 bytes .../tablet_tab_background.9.png | Bin 0 -> 2259 bytes .../tablet_tab_background_selected.9.png | Bin 0 -> 2280 bytes .../tablet_tab_close_button_icon_dark.png | Bin 0 -> 695 bytes .../tablet_tab_close_button_icon_light.png | Bin 0 -> 652 bytes .../phone_tab_background.9.png | Bin 0 -> 8467 bytes .../drawable-xxxhdpi/phone_tab_border.9.png | Bin 0 -> 1352 bytes .../phone_tab_close_button_icon_dark.png | Bin 0 -> 575 bytes .../phone_tab_close_button_icon_light.png | Bin 0 -> 763 bytes .../tab_switcher_drawable_background.png | Bin 0 -> 1246 bytes .../tablet_add_tab_button.9.png | Bin 0 -> 1318 bytes .../tablet_tab_background.9.png | Bin 0 -> 4223 bytes .../tablet_tab_background_selected.9.png | Bin 0 -> 4277 bytes .../tablet_tab_close_button_icon_dark.png | Bin 0 -> 881 bytes .../tablet_tab_close_button_icon_light.png | Bin 0 -> 832 bytes .../src/main/res/layout-land/phone_tab.xml | 97 + .../src/main/res/layout/phone_tab.xml | 97 + .../src/main/res/layout/phone_toolbar.xml | 25 + .../res/layout/tab_switcher_menu_item.xml | 19 + .../main/res/layout/tablet_add_tab_button.xml | 19 + .../src/main/res/layout/tablet_layout.xml | 67 + .../src/main/res/layout/tablet_tab.xml | 75 + .../src/main/res/values-v21/styles.xml | 22 + chromiumTabs/src/main/res/values/attrs.xml | 77 + chromiumTabs/src/main/res/values/colors.xml | 43 + chromiumTabs/src/main/res/values/dimens.xml | 58 + chromiumTabs/src/main/res/values/ids.xml | 28 + chromiumTabs/src/main/res/values/integers.xml | 44 + chromiumTabs/src/main/res/values/styles.xml | 87 + chromiumTabs/variables.gradle | 41 + orbotservice/build.gradle | 2 +- .../android/service/OrbotService.java | 18 +- .../android/service/util/Prefs.java | 2 +- .../service/wrapper/orbotLocalConstants.java | 16 +- settings.gradle | 8 + 335 files changed, 44837 insertions(+), 3799 deletions(-) create mode 100644 app/src/main/assets/genesis/sample.html create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogViewController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceViewController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearViewController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralViewController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyViewController.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingHomeEnums.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java rename app/src/main/java/com/darkweb/genesissearchengine/dataManager/{dataModel.java => suggestionDataModel.java} (70%) mode change 100755 => 100644 create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java create mode 100644 app/src/main/java/com/darkweb/genesissearchengine/helperManager/autoFillService.java delete mode 100755 app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java delete mode 100755 app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticmanager.java create mode 100644 app/src/main/res/anim/fade_out.xml create mode 100644 app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_bottom.xml create mode 100644 app/src/main/res/custom-xml/generic/xml/gx_generic_input_square.xml create mode 100644 app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container.xml create mode 100644 app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container_bottom.xml create mode 100644 app/src/main/res/custom-xml/home/xml/hox_rounded_corner_splash.xml create mode 100644 app/src/main/res/custom-xml/images/xml/ic_baseline_add.xml create mode 100644 app/src/main/res/custom-xml/images/xml/ic_baseline_bookmark.xml create mode 100644 app/src/main/res/custom-xml/images/xml/ic_baseline_bug.xml create mode 100644 app/src/main/res/custom-xml/images/xml/ic_baseline_cross.xml create mode 100644 app/src/main/res/custom-xml/images/xml/ic_baseline_delete.xml create mode 100644 app/src/main/res/custom-xml/orbot_log/xml/olx_rounded_corner_warning.xml create mode 100644 app/src/main/res/custom-xml/setting/xml/sx_border_left.xml create mode 100644 app/src/main/res/custom-xml/setting/xml/sx_button_round.xml create mode 100644 app/src/main/res/custom-xml/setting/xml/sx_font_change_round_background.xml create mode 100644 app/src/main/res/custom-xml/setting/xml/sx_seekbar_trail.xml create mode 100644 app/src/main/res/custom-xml/tab/xml/tx_border_round_geckoview.xml create mode 100644 app/src/main/res/drawable-hdpi/genesis_logo.png create mode 100644 app/src/main/res/drawable/ic_baseline_accessibility.xml create mode 100644 app/src/main/res/drawable/ic_baseline_advance.xml create mode 100644 app/src/main/res/drawable/ic_baseline_browser.xml create mode 100644 app/src/main/res/drawable/ic_baseline_clear.xml create mode 100644 app/src/main/res/drawable/ic_baseline_home.xml create mode 100644 app/src/main/res/drawable/ic_baseline_notifications.xml create mode 100644 app/src/main/res/drawable/ic_baseline_privacy.xml create mode 100644 app/src/main/res/drawable/ic_baseline_search.xml create mode 100644 app/src/main/res/layouts/alert/layout/popup_data_cleared.xml create mode 100644 app/src/main/res/layouts/orbotLog/layout/orbot_log_view.xml create mode 100644 app/src/main/res/layouts/other/layout/multidataset_service_list_item.xml delete mode 100644 app/src/main/res/layouts/other/layout/settings_view.xml delete mode 100644 app/src/main/res/layouts/other/layout/tab_view.xml create mode 100644 app/src/main/res/layouts/setting/layout/setting_advance_view.xml create mode 100644 app/src/main/res/layouts/setting/layout/setting_clear_view.xml create mode 100644 app/src/main/res/layouts/setting/layout/setting_general_view.xml create mode 100644 app/src/main/res/layouts/setting/layout/setting_privacy_view.xml create mode 100644 app/src/main/res/layouts/shared/listviews/layout/tabview_row.xml create mode 100644 app/src/main/res/layouts/tab/layout/tab_menu.xml create mode 100644 app/src/main/res/layouts/tab/layout/tab_view.xml create mode 100644 app/src/main/res/values-night/arrays.xml create mode 100644 app/src/main/res/values-night/attrs.xml create mode 100644 app/src/main/res/values-night/colors.xml create mode 100644 app/src/main/res/values-night/dimens.xml create mode 100644 app/src/main/res/values-night/ic_launcher_background.xml create mode 100644 app/src/main/res/values-night/integers.xml create mode 100644 app/src/main/res/values-night/pdnsd.xml create mode 100644 app/src/main/res/values-night/strings.xml create mode 100644 app/src/main/res/values-night/styles.xml create mode 100644 chromiumTabs/.gitignore create mode 100644 chromiumTabs/build.gradle create mode 100644 chromiumTabs/gradle.properties create mode 100644 chromiumTabs/src/main/AndroidManifest.xml create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/AbstractState.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/AddTabButtonListener.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/Animation.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/DragGesture.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/Layout.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/LayoutPolicy.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/PeekAnimation.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/PullDownGesture.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/RevealAnimation.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/StatefulTabSwitcherDecorator.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/SwipeAnimation.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/SwipeGesture.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/Tab.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/TabCloseListener.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/TabPreviewListener.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/TabSwitcher.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/TabSwitcherDecorator.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/TabSwitcherListener.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/drawable/TabSwitcherDrawable.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/gesture/AbstractDragGestureEventHandler.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/gesture/AbstractTouchEventHandler.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/gesture/DragGestureEventHandlerFactory.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/gesture/PullDownGestureEventHandler.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/gesture/SwipeGestureEventHandler.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/gesture/TouchEventDispatcher.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/iterator/AbstractItemIterator.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/iterator/ArrayItemIterator.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/iterator/ItemIterator.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/AbstractArithmetics.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/AbstractDragTabsEventHandler.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/AbstractTabRecyclerAdapter.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/AbstractTabSwitcherLayout.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/AbstractTabViewHolder.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/Arithmetics.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/ContentRecyclerAdapter.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/TabSwitcherLayout.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneArithmetics.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneDragTabsEventHandler.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneTabRecyclerAdapter.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneTabSwitcherLayout.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneTabViewHolder.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PreviewDataBinder.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/tablet/TabletArithmetics.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/tablet/TabletContentRecyclerAdapterWrapper.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/tablet/TabletDragTabsEventHandler.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/tablet/TabletTabRecyclerAdapter.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/tablet/TabletTabSwitcherLayout.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/layout/tablet/TabletTabViewHolder.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/AbstractItem.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/AddTabItem.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/ItemComparator.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/Model.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/Restorable.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/State.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/TabItem.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/TabSwitcherModel.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/TabSwitcherStyle.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/model/Tag.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/util/ThemeHelper.java create mode 100644 chromiumTabs/src/main/java/de/mrapp/android/tabswitcher/view/TabSwitcherButton.java create mode 100644 chromiumTabs/src/main/res/color/tablet_add_tab_button_dark.xml create mode 100644 chromiumTabs/src/main/res/color/tablet_add_tab_button_light.xml create mode 100644 chromiumTabs/src/main/res/color/tablet_tab_background_dark.xml create mode 100644 chromiumTabs/src/main/res/color/tablet_tab_background_light.xml create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/phone_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/phone_tab_border.9.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/phone_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/phone_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/tab_switcher_drawable_background.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/tablet_add_tab_button.9.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/tablet_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/tablet_tab_background_selected.9.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/tablet_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-hdpi/tablet_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/phone_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/phone_tab_border.9.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/phone_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/phone_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/tab_switcher_drawable_background.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/tablet_add_tab_button.9.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/tablet_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/tablet_tab_background_selected.9.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/tablet_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-mdpi/tablet_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/phone_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/phone_tab_border.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/phone_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/phone_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/tab_switcher_drawable_background.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/tablet_add_tab_button.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/tablet_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/tablet_tab_background_selected.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/tablet_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-xhdpi/tablet_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/phone_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/phone_tab_border.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/phone_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/phone_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/tab_switcher_drawable_background.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/tablet_add_tab_button.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/tablet_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/tablet_tab_background_selected.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/tablet_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-xxhdpi/tablet_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/phone_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/phone_tab_border.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/phone_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/phone_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/tab_switcher_drawable_background.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/tablet_add_tab_button.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/tablet_tab_background.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/tablet_tab_background_selected.9.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/tablet_tab_close_button_icon_dark.png create mode 100644 chromiumTabs/src/main/res/drawable-xxxhdpi/tablet_tab_close_button_icon_light.png create mode 100644 chromiumTabs/src/main/res/layout-land/phone_tab.xml create mode 100644 chromiumTabs/src/main/res/layout/phone_tab.xml create mode 100644 chromiumTabs/src/main/res/layout/phone_toolbar.xml create mode 100644 chromiumTabs/src/main/res/layout/tab_switcher_menu_item.xml create mode 100644 chromiumTabs/src/main/res/layout/tablet_add_tab_button.xml create mode 100644 chromiumTabs/src/main/res/layout/tablet_layout.xml create mode 100644 chromiumTabs/src/main/res/layout/tablet_tab.xml create mode 100644 chromiumTabs/src/main/res/values-v21/styles.xml create mode 100644 chromiumTabs/src/main/res/values/attrs.xml create mode 100644 chromiumTabs/src/main/res/values/colors.xml create mode 100644 chromiumTabs/src/main/res/values/dimens.xml create mode 100644 chromiumTabs/src/main/res/values/ids.xml create mode 100644 chromiumTabs/src/main/res/values/integers.xml create mode 100644 chromiumTabs/src/main/res/values/styles.xml create mode 100644 chromiumTabs/variables.gradle diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 4dc05829..8ea9459a 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -11,7 +11,15 @@ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index a850ce8f..e6a117f0 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,8 +1,21 @@ \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 44c0c02f..0cb47f43 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,11 +21,12 @@ repositories { android { compileSdkVersion project.ext.compileSdkVersion + ndkVersion "21.3.6528147" defaultConfig { applicationId project.ext.applicationId minSdkVersion project.ext.minSdkVersion - // targetSdkVersion project.ext.targetSdkVersion + targetSdkVersion project.ext.targetSdkVersion versionCode project.ext.versionCode versionName project.ext.versionName } @@ -74,8 +75,10 @@ android { res.srcDirs = [ 'src/main/res/layouts/history', + 'src/main/res/layouts/tab', 'src/main/res/layouts/language', 'src/main/res/layouts/orbot', + 'src/main/res/layouts/orbotLog', 'src/main/res/layouts/setting', 'src/main/res/layouts/bridge', 'src/main/res/layouts/alert', @@ -84,6 +87,7 @@ android { 'src/main/res/layouts/shared/listviews', 'src/main/res/layouts/other', 'src/main/res/custom-xml/alert', + 'src/main/res/custom-xml/tab', 'src/main/res/custom-xml/images', 'src/main/res/custom-xml/bookmark', 'src/main/res/custom-xml/generic', @@ -91,6 +95,7 @@ android { 'src/main/res/custom-xml/home', 'src/main/res/custom-xml/landing', 'src/main/res/custom-xml/orbot', + 'src/main/res/custom-xml/orbot_log', 'src/main/res/custom-xml/setting', 'src/main/res/layouts', 'src/main/res/images', @@ -124,6 +129,7 @@ dependencies { implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.legacy:legacy-preference-v14:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.cardview:cardview:1.0.0' // Testing-only dependencies androidTestImplementation('androidx.test.espresso:espresso-core:3.3.0') { @@ -149,7 +155,7 @@ dependencies { implementation 'com.crowdfire.cfalertdialog:cfalertdialog:1.1.0' /*Ads Manager*/ - implementation 'com.google.android.gms:play-services-ads:19.4.0' + implementation 'com.google.android.gms:play-services-ads:19.5.0' /*Crashlytics*/ @@ -163,9 +169,11 @@ dependencies { implementation project(path: ':orbotservice') implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.github.apl-devs:appintro:v4.2.2' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6' /*Helper Libraries*/ implementation 'com.chauthai.overscroll:overscroll-bouncy:0.1.1' + androidTestImplementation "junit:junit:4.13.1" } apply plugin: 'com.android.application' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0261dddd..1696b865 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,58 +28,89 @@ + + + + + + + + + + @@ -151,6 +182,15 @@ android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-5074525529134731~2926711128" /> + + + + + + + + +A Simple HTML Document + + + +

This is a very simple HTML document

+

It only has two paragraphs

+ + \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/activityContextManager.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/activityContextManager.java index 5359c07a..f01da953 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/activityContextManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/activityContextManager.java @@ -3,6 +3,8 @@ package com.darkweb.genesissearchengine.appManager; import com.darkweb.genesissearchengine.appManager.bookmarkManager.bookmarkController; import com.darkweb.genesissearchengine.appManager.historyManager.historyController; import com.darkweb.genesissearchengine.appManager.homeManager.homeController; +import com.darkweb.genesissearchengine.appManager.orbotLogManager.orbotLogController; +import com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage.settingController; import com.darkweb.genesissearchengine.appManager.tabManager.tabController; public class activityContextManager @@ -16,11 +18,13 @@ public class activityContextManager } /*Private Contexts*/ - private historyController history_controller; - private bookmarkController bookmark_controller; - private homeController home_controller; - private tabController tab_controller; - private android.app.Activity sCurrentActivity = null; + private historyController pHistoryController; + private bookmarkController pBookmarkController; + private homeController pHomeController; + private tabController pTabController; + private android.app.Activity pCurrentActivity = null; + private settingController pSettingController; + private orbotLogController pOrbotLogController; /*Initialization*/ @@ -30,37 +34,51 @@ public class activityContextManager /*List ContextGetterSetters*/ public historyController getHistoryController(){ - return history_controller; + return pHistoryController; } public void setHistoryController(historyController history_controller){ - this.history_controller = history_controller; + this.pHistoryController = history_controller; } public bookmarkController getBookmarkController(){ - return bookmark_controller; + return pBookmarkController; } public void setBookmarkController(bookmarkController bookmark_controller){ - this.bookmark_controller = bookmark_controller; + this.pBookmarkController = bookmark_controller; } public homeController getHomeController(){ - return home_controller; + return pHomeController; } public void setHomeController(homeController home_controller){ - this.home_controller = home_controller; + this.pHomeController = home_controller; } public tabController getTabController(){ - return tab_controller; + return pTabController; } public void setTabController(tabController tab_controller){ - this.tab_controller = tab_controller; + this.pTabController = tab_controller; } - public void setCurrentActivity(android.app.Activity sCurrentActivity){ - this.sCurrentActivity = sCurrentActivity; + public orbotLogController getOrbotLogController(){ + return pOrbotLogController; + } + public void setOrbotLogController(orbotLogController pOrbotLogController){ + this.pOrbotLogController = pOrbotLogController; + } + + public settingController getSettingController(){ + return pSettingController; + } + public void setSettingController(settingController pSettingController){ + this.pSettingController = pSettingController; + } + + public void setCurrentActivity(android.app.Activity pCurrentActivity){ + this.pCurrentActivity = pCurrentActivity; } public android.app.Activity setCurrentActivity(){ - return sCurrentActivity; + return pCurrentActivity; } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java index 0281b813..8553886b 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bookmarkManager/bookmarkAdapter.java @@ -14,7 +14,6 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.RecyclerView; -import com.darkweb.genesissearchengine.appManager.historyManager.bookmarkEnums; import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.eventObserver; @@ -28,6 +27,7 @@ import java.util.Date; import java.util.List; import static android.content.Context.LAYOUT_INFLATER_SERVICE; +import static com.darkweb.genesissearchengine.constants.constants.HISTORY_LOAD_MORE; public class bookmarkAdapter extends RecyclerView.Adapter { @@ -41,7 +41,6 @@ public class bookmarkAdapter extends RecyclerView.Adapter mLongSelectedDate = new ArrayList<>(); private ArrayList mLongSelectedIndex = new ArrayList<>(); private ArrayList mLongSelectedID = new ArrayList<>(); - private ArrayList mLongPressedViewHolders = new ArrayList<>(); private AppCompatActivity mContext; private bookmarkAdapterView mHistroyAdapterView; @@ -70,15 +69,14 @@ public class bookmarkAdapter extends RecyclerView.Adapter { - mCurrentList.add(new bookmarkRowModel(null, "loading",-2)); + mCurrentList.add(new bookmarkRowModel(HISTORY_LOAD_MORE,null,-2)); notifyItemInserted(mCurrentList.size()); }); } private void onLoadingClear(){ - for(int mCounter = 0; mCounter< mCurrentList.size(); mCounter++){ - if(mCurrentList.get(mCounter).getHeader().equals("loading")){ + if(mCurrentList.get(mCounter).getHeader().equals(HISTORY_LOAD_MORE)){ int finalM_counter = mCounter; mContext.runOnUiThread(() -> { mCurrentList.remove(finalM_counter); @@ -121,7 +119,7 @@ public class bookmarkAdapter extends RecyclerView.Adapter getLongSelectedURL(){ + private ArrayList getLongSelectedleURL(){ return mLongSelectedIndex; } public void onDeleteSelected(){ for(int m_counter = 0; m_counter< mLongSelectedIndex.size(); m_counter++){ for(int m_counter_inner = 0; m_counter_inner< mCurrentList.size(); m_counter_inner++){ - if(mCurrentList.get(m_counter_inner).getDate() == mLongSelectedDate.get(m_counter) && mLongSelectedIndex.get(m_counter).equals(mCurrentList.get(m_counter_inner).getDescription())){ + if(mCurrentList.get(m_counter_inner).getDate() == mLongSelectedDate.get(m_counter) && mLongSelectedIndex.get(m_counter).equals("https://"+ mCurrentList.get(m_counter_inner).getDescription())){ mEvent.invokeObserver(Collections.singletonList(mRealIndex.get(m_counter_inner)),enums.etype.url_clear); mEvent.invokeObserver(Collections.singletonList(mLongSelectedID.get(m_counter)),enums.etype.url_clear_at); invokeFilter(false); mEvent.invokeObserver(Collections.singletonList(m_counter_inner),enums.etype.is_empty); boolean mDateVerify = false; - initializeModelWithDate(false); - if(mCurrentList.size()>0 && mCurrentList.get(m_counter_inner-1).getHeader()==null && (mCurrentList.size()>m_counter_inner+1 && mCurrentList.get(m_counter_inner+1).getHeader()==null || mCurrentList.size()==m_counter_inner+1)){ + if(mCurrentList.size()>0 && mCurrentList.get(m_counter_inner-1).getDescription()==null && (mCurrentList.size()>m_counter_inner+1 && mCurrentList.get(m_counter_inner+1).getDescription()==null || mCurrentList.size()==m_counter_inner+1)){ mDateVerify = true; } @@ -197,18 +194,10 @@ public class bookmarkAdapter extends RecyclerView.Adapter { + pItemView.setOnTouchListener((v, event) -> { - if (mRecyclerPositionX1!=0 && Math.abs(event.getX() - mRecyclerPositionX1) > 400 && !mLongPressedMenuActive) { - v.setPressed(false); - pItemView.clearFocus(); - handler.removeCallbacks(mLongPressed); - pItemView.setOnTouchListener(null); - pItemView.clearFocus(); - if(mPassedList.size()<=1){ - mPassedList.clear(); - initializeModelWithDate(false); - notifyItemRemoved(0); - notifyItemRangeChanged(0, 1); - mEvent.invokeObserver(Collections.singletonList(0),enums.etype.is_empty); - }else { - bookmarkAdapter.this.onClose(pPosition); - } - return true; - } + if (mRecyclerPositionX1!=0 && Math.abs(event.getX() - mRecyclerPositionX1) > 400 && !mLongPressedMenuActive) { + v.setPressed(false); + pItemView.clearFocus(); + handler.removeCallbacks(mLongPressed); + pItemView.setOnTouchListener(null); + pItemView.clearFocus(); + if(mPassedList.size()<=1){ + mPassedList.clear(); + initializeModelWithDate(false); + notifyItemRemoved(0); + notifyItemRangeChanged(0, 1); + mEvent.invokeObserver(Collections.singletonList(0),enums.etype.is_empty); + }else { + initializeModelWithDate(false); + bookmarkAdapter.this.onClose(pPosition); + } + return true; + } - mPointerPosition = event.getX(); - if (event.getAction() == MotionEvent.ACTION_UP) { - mRecyclerPositionX2 = event.getX(); - float deltaX = mRecyclerPositionX2 - mRecyclerPositionX1; + mPointerPosition = event.getX(); + if (event.getAction() == MotionEvent.ACTION_UP) { + mRecyclerPositionX2 = event.getX(); + float deltaX = mRecyclerPositionX2 - mRecyclerPositionX1; - if (mLongSelectedIndex.size() > 0) { - if (Math.abs(deltaX) <= 20 && !mLongPressedMenuActive) { - if (mLongSelectedIndex.contains(pUrl) && mLongSelectedID.contains(pId)) { - handler.removeCallbacks(mLongPressed); - bookmarkAdapter.this.onClearHighlight(pItem, pItemView, pUrl, pMenuItem, pLogoImage, false, pId, pDate); - } else{ - handler.removeCallbacks(mLongPressed); - bookmarkAdapter.this.onSelectView(pItem, pItemView, pUrl, pMenuItem, pLogoImage, false, pId, pDate); - } - } - return false; - } + Log.i("FCK2","FCK2 : " + mLongSelectedIndex.size()); + if (mLongSelectedIndex.size() > 0) { + if (Math.abs(deltaX) <= 20 && !mLongPressedMenuActive) { + if (mLongSelectedIndex.contains(pUrl) && mLongSelectedID.contains(pId)) { + handler.removeCallbacks(mLongPressed); + bookmarkAdapter.this.onClearHighlight(pItemView, pUrl, pMenuItem, pLogoImage, false, pId, pDate); + } else{ + handler.removeCallbacks(mLongPressed); + bookmarkAdapter.this.onSelectView(pItemView, pUrl, pMenuItem, pLogoImage, false, pId, pDate); + } + } + return false; + } - if (Math.abs(deltaX) > 100) { - v.setPressed(false); - handler.removeCallbacks(mLongPressed); - bookmarkAdapter.this.onClose(pPosition); - } else { - v.setPressed(false); - handler.removeCallbacks(mLongPressed); - mEvent.invokeObserver(Collections.singletonList(pUrl), enums.etype.url_triggered); - } + if (Math.abs(deltaX) > 100) { + v.setPressed(false); + handler.removeCallbacks(mLongPressed); + bookmarkAdapter.this.onClose(pPosition); + } else { + v.setPressed(false); + handler.removeCallbacks(mLongPressed); + mEvent.invokeObserver(Collections.singletonList(pUrl), enums.etype.url_triggered); + } - return true; + return true; - } else if (event.getAction() == MotionEvent.ACTION_DOWN) { - mDisableCallable = false; - mLongPressedMenuActive = false; - v.setPressed(true); - mRecyclerPositionX1 = event.getX(); - Log.i("1WOW : ","WOW : " + event.getX() + " -- " + mRecyclerPositionX1); - handler.postDelayed(mLongPressed, ViewConfiguration.getLongPressTimeout()); - return true; - } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { - handler.removeCallbacks(mLongPressed); - mDisableCallable = true; - if (!mLongSelectedIndex.contains(pUrl) || !mLongSelectedID.contains(pId)) { - v.setPressed(false); - } - handler.removeCallbacks(mLongPressed); + } else if (event.getAction() == MotionEvent.ACTION_DOWN) { + mDisableCallable = false; + mLongPressedMenuActive = false; + v.setPressed(true); + mRecyclerPositionX1 = event.getX(); + Log.i("1WOW : ","WOW : " + event.getX() + " -- " + mRecyclerPositionX1); + handler.postDelayed(mLongPressed, ViewConfiguration.getLongPressTimeout()); + return true; + } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { + handler.removeCallbacks(mLongPressed); + mDisableCallable = true; + if (!mLongSelectedIndex.contains(pUrl) || !mLongSelectedID.contains(pId)) { + v.setPressed(false); + } + handler.removeCallbacks(mLongPressed); - return true; - } - return false; - }); + return true; + } + return false; + }); } void onOpenMenu(View pView, String pUrl, int pPosition, String pTitle){ @@ -417,61 +407,62 @@ public class bookmarkAdapter extends RecyclerView.Adapter onOpenMenu(v, pUrl, pPosition, pTitle)); - onSwipe(pItem, pItemView, pPosition, pUrl,pMenuItem, pLogoImage, pId, pDate); + onSwipe(pItemView, pPosition, pUrl,pMenuItem, pLogoImage, pId, pDate); } private void onClose(int pIndex){ - mEvent.invokeObserver(Collections.singletonList(mRealIndex.get(pIndex)),enums.etype.url_clear); - mEvent.invokeObserver(Collections.singletonList(mRealID.get(pIndex)),enums.etype.url_clear_at); - invokeFilter(false); - mEvent.invokeObserver(Collections.singletonList(mRealID.get(pIndex)),enums.etype.is_empty); - boolean mDateVerify = false; - if(mPassedList.size()>0){ - if(mCurrentList.size()>0 && mCurrentList.get(pIndex-1).getHeader()==null && (mCurrentList.size()>pIndex+1 && mCurrentList.get(pIndex+1).getHeader()==null || mCurrentList.size()==pIndex+1)){ - mDateVerify = true; - } - }else { - mCurrentList.clear(); - notifyDataSetChanged(); - return; + mEvent.invokeObserver(Collections.singletonList(mRealIndex.get(pIndex)),enums.etype.url_clear); + mEvent.invokeObserver(Collections.singletonList(mRealID.get(pIndex)),enums.etype.url_clear_at); + invokeFilter(false); + mEvent.invokeObserver(Collections.singletonList(mRealID.get(pIndex)),enums.etype.is_empty); + boolean mDateVerify = false; + if(mPassedList.size()>0){ + if(mCurrentList.size()>0 && mCurrentList.get(pIndex-1).getDescription()==null && (mCurrentList.size()>pIndex+1 && mCurrentList.get(pIndex+1).getDescription()==null || mCurrentList.size()==pIndex+1)){ + mDateVerify = true; } - int size = mCurrentList.size(); + }else { + mCurrentList.clear(); + notifyDataSetChanged(); + return; + } + int size = mCurrentList.size(); - if(mDateVerify){ - notifyItemRemoved(pIndex-1); - mCurrentList.remove(pIndex-1); - notifyItemRemoved(pIndex-1); - mCurrentList.remove(pIndex-1); - notifyItemRangeChanged(pIndex-1, mCurrentList.size()); - }else { - notifyItemRemoved(pIndex); - mCurrentList.remove(pIndex); - notifyItemRangeChanged(pIndex, mCurrentList.size()); - } + if(mDateVerify){ + notifyItemRemoved(pIndex-1); + mCurrentList.remove(pIndex-1); + notifyItemRemoved(pIndex-1); + mCurrentList.remove(pIndex-1); + notifyItemRangeChanged(pIndex-1, mCurrentList.size()); + }else { + notifyItemRemoved(pIndex); + mCurrentList.remove(pIndex); + notifyItemRangeChanged(pIndex, mCurrentList.size()); + } - if(size>1){ - new Thread(){ - public void run(){ - try - { - sleep(500); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } + if(size>1){ + new Thread(){ + public void run(){ + try + { + sleep(500); } - }.start(); - } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + }.start(); + } } /*View Holder Extensions*/ @@ -504,18 +495,20 @@ public class bookmarkAdapter extends RecyclerView.Adapter0){ - mRowMenu.setVisibility(View.GONE); + mRowMenu.setVisibility(View.INVISIBLE); + mRowMenu.setClickable(false); }else { mRowMenu.setVisibility(View.VISIBLE); + mRowMenu.setClickable(true); } - if(mLongSelectedIndex.contains(model.getDescription()) && mLongSelectedID.contains(model.getID())){ + if(mLongSelectedIndex.contains("https://" + model.getDescription()) && mLongSelectedID.contains(model.getID())){ mPopupWindow = (PopupWindow) mHistroyAdapterView.onTrigger(bookmarkEnums.eBookmarkViewAdapterCommands.M_SELECT_VIEW, Arrays.asList(mRowContainer, mRowMenu, mLogoImage, true, false)); }else if(mLogoImage.getAlpha()>0){ mPopupWindow = (PopupWindow) mHistroyAdapterView.onTrigger(bookmarkEnums.eBookmarkViewAdapterCommands.M_CLEAR_HIGHLIGHT, Arrays.asList(mRowContainer, mRowMenu, mLogoImage, true, false)); @@ -562,7 +557,7 @@ public class bookmarkAdapter extends RecyclerView.Adapter0; @@ -582,7 +577,7 @@ public class bookmarkAdapter extends RecyclerView.Adapter0){ - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.blue)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_setting_heading)); mEmptyListNotification.animate().setDuration(pDuration).alpha(0f); mClearButton.setText(strings.BOOKMARK_CLEAR_BOOKMARK); mClearButton.setClickable(true); } else { - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.holo_dark_gray_alpha)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); mEmptyListNotification.animate().setDuration(pDuration).alpha(1f); mClearButton.animate().setDuration(pDuration).alpha(0.4f); @@ -82,10 +85,13 @@ class bookmarkViewController mMenuButton.animate().setDuration(pDuration).alpha(0f); mClearButton.setEnabled(false); - mClearButton.setClickable(false); mSearchButton.setClickable(false); mMenuButton.setClickable(false); + mSearchInput.setVisibility(View.GONE); + mClearButton.setAlpha(0f); + mClearButton.animate().setDuration(300).alpha(1); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); mClearButton.setText(strings.BOOKMARK_NO_BOOKMARK_FOUND); mClearButton.setClickable(false); } @@ -95,14 +101,15 @@ class bookmarkViewController if(mPopupWindow !=null && mPopupWindow.isShowing()){ mPopupWindow.dismiss(); } + onSelectionMenu(true); } private void onSelectionMenu(boolean pStatus){ if(!pStatus){ mClearButton.setClickable(false); mClearButton.animate().cancel(); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.holo_dark_gray_alpha)); - mClearButton.animate().setDuration(150).alpha(0.4f); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); + mClearButton.animate().setDuration(200).alpha(0.4f); mMenuButton.setVisibility(View.VISIBLE); mSearchButton.setVisibility(View.GONE); if (mSearchInput.getVisibility() == View.VISIBLE){ @@ -111,9 +118,9 @@ class bookmarkViewController }else { if (mSearchInput.getVisibility() != View.VISIBLE) { mClearButton.setClickable(true); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.blue)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_setting_heading)); mClearButton.animate().cancel(); - mClearButton.animate().setDuration(150).alpha(1); + mClearButton.animate().setDuration(200).alpha(1); } mMenuButton.setVisibility(View.GONE); mSearchButton.setVisibility(View.VISIBLE); @@ -123,7 +130,6 @@ class bookmarkViewController } private void updateList(){ - int index = Objects.requireNonNull(mRecycleView.getAdapter()).getItemCount()-1; mRecycleView.getAdapter().notifyDataSetChanged(); } @@ -138,6 +144,7 @@ class bookmarkViewController updateIfListEmpty(mRecycleView.getAdapter().getItemCount(),300); mSearchInput.clearFocus(); mSearchInput.setText(strings.GENERIC_EMPTY_STR); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); } private boolean onHideSearch() { @@ -151,7 +158,7 @@ class bookmarkViewController mSearchInput.setText(strings.GENERIC_EMPTY_STR); mSearchInput.setClickable(false); mClearButton.setClickable(true); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.blue)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_setting_heading)); mClearButton.animate().cancel(); mClearButton.animate().setDuration(150).alpha(1f); return false; @@ -163,7 +170,7 @@ class bookmarkViewController mSearchInput.setClickable(true); mClearButton.setClickable(false); mSearchInput.requestFocus(); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.holo_dark_gray_alpha)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); mClearButton.animate().cancel(); mClearButton.animate().setDuration(150).alpha(0.4f); InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java index 6f93aca1..f16ba3ea 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeController.java @@ -1,33 +1,42 @@ package com.darkweb.genesissearchengine.appManager.bridgeManager; +import android.content.Context; +import android.graphics.Rect; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; +import android.view.MotionEvent; import android.view.View; +import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.RadioButton; import androidx.appcompat.app.AppCompatActivity; import com.darkweb.genesissearchengine.appManager.activityContextManager; +import com.darkweb.genesissearchengine.appManager.historyManager.historyAdapter; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; -import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.dataManager.dataController; import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.darkweb.genesissearchengine.pluginManager.pluginController; import com.example.myapplication.R; import java.util.Arrays; import java.util.Collections; +import java.util.List; +import java.util.Objects; public class bridgeController extends AppCompatActivity { /*Private Variables*/ - + private bridgeModel mBridgeModel; private bridgeViewController mBridgeViewController; + private RadioButton mBridgeObfs; private RadioButton mBridgeChina; private RadioButton mBridgeCustom; @@ -63,11 +72,18 @@ public class bridgeController extends AppCompatActivity { mCustomBridgeBlocker = findViewById(R.id.pCustomBridgeBlocker); mBridgeViewController.initialization(mCustomPort, mBridgeButton,this, mBridgeObfs, mBridgeChina, mBridgeCustom, mCustomBridgeBlocker); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.S_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,0)); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,0)); + mBridgeModel = new bridgeModel(new bridgeController.bridgeModelCallback(), this); } private void initializeLocalEventHandlers() { + mCustomPort.setOnFocusChangeListener((v, hasFocus) -> { + if (!hasFocus) { + helperMethod.hideKeyboard(this); + } + }); + mCustomPort.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) @@ -86,6 +102,18 @@ public class bridgeController extends AppCompatActivity { }); } + /* LISTENERS */ + + public class bridgeModelCallback implements eventObserver.eventListener{ + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + /* LOCAL OVERRIDES */ + @Override protected void onPause() { @@ -109,30 +137,28 @@ public class bridgeController extends AppCompatActivity { finish(); } + /*Helper Method*/ + public void onClose(View view){ finish(); } - /*Helper Method*/ - public void requestBridges(View view){ + mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_REQUEST_BRIDGE, null); pluginController.getInstance().MessageManagerHandler(this, Collections.singletonList(constants.CONST_BACKEND_GOOGLE_URL), enums.etype.on_bridge_mail); } public void onCustomChecked(View view){ - status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_CUSTOM; - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.S_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); + mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_CUSTOM_BRIDGE, null); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); } public void onMeekChecked(View view){ - status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_OBFS4; - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.S_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); + mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_MEEK_BRIDGE, null); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); } public void onObfsChecked(View view){ - status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_MEEK; - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); - mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.S_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); + mBridgeModel.onTrigger(bridgeEnums.eBridgeModelCommands.M_OBFS_CHECK, null); + mBridgeViewController.onTrigger(bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS, Arrays.asList(status.sBridgeCustomBridge,250)); } } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeEnums.java index 4354ba33..8f87cab6 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeEnums.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeEnums.java @@ -4,6 +4,11 @@ public class bridgeEnums { /*Settings Manager*/ public enum eBridgeViewCommands { - S_INIT_VIEWS + M_INIT_VIEWS } + + public enum eBridgeModelCommands { + M_REQUEST_BRIDGE, M_CUSTOM_BRIDGE, M_MEEK_BRIDGE, M_OBFS_CHECK + } + } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java new file mode 100644 index 00000000..bf3902df --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeModel.java @@ -0,0 +1,69 @@ +package com.darkweb.genesissearchengine.appManager.bridgeManager; + +import androidx.appcompat.app.AppCompatActivity; + +import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.constants.strings; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.pluginManager.pluginController; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +class bridgeModel +{ + /*Variable Declaration*/ + + private eventObserver.eventListener mEvent; + private AppCompatActivity mContext; + + /*Initializations*/ + + bridgeModel(eventObserver.eventListener mEvent, AppCompatActivity pContext){ + this.mEvent = mEvent; + mContext = pContext; + } + + /*Helper Methods*/ + + public void requestBridges(){ + pluginController.getInstance().MessageManagerHandler(mContext, Collections.singletonList(constants.CONST_BACKEND_GOOGLE_URL), enums.etype.on_bridge_mail); + } + + public void onCustomChecked(){ + status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_CUSTOM; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); + + } + public void onMeekChecked(){ + status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_MEEK; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); + } + public void onObfsChecked(){ + status.sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_OBFS4; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,status.sBridgeCustomBridge)); + } + + public void onTrigger(bridgeEnums.eBridgeModelCommands pCommands, List pData){ + if(pCommands == bridgeEnums.eBridgeModelCommands.M_REQUEST_BRIDGE){ + requestBridges(); + } + else if(pCommands == bridgeEnums.eBridgeModelCommands.M_CUSTOM_BRIDGE){ + onCustomChecked(); + } + else if(pCommands == bridgeEnums.eBridgeModelCommands.M_MEEK_BRIDGE){ + onMeekChecked(); + } + else if(pCommands == bridgeEnums.eBridgeModelCommands.M_OBFS_CHECK){ + onObfsChecked(); + } + } + + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java index b524c3bd..1c193d9e 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/bridgeManager/bridgeViewController.java @@ -15,7 +15,10 @@ import android.widget.RadioButton; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; + +import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.example.myapplication.R; @@ -56,8 +59,10 @@ class bridgeViewController window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } @@ -70,17 +75,17 @@ class bridgeViewController } private void resetRadioButtons(int p_duration){ - animateColor(mBridgeObfs, mBridgeObfs.getCurrentTextColor(), mContext.getResources().getColor(R.color.float_white), "textColor", p_duration); - animateColor(mBridgeCustom, mBridgeCustom.getCurrentTextColor(), mContext.getResources().getColor(R.color.float_white), "textColor", p_duration); - animateColor(mBridgeChina, mBridgeChina.getCurrentTextColor(), mContext.getResources().getColor(R.color.float_white), "textColor", p_duration); + animateColor(mBridgeObfs, mBridgeObfs.getCurrentTextColor(), mContext.getResources().getColor(R.color.holo_dark_gray), "textColor", p_duration); + animateColor(mBridgeCustom, mBridgeCustom.getCurrentTextColor(), mContext.getResources().getColor(R.color.holo_dark_gray), "textColor", p_duration); + animateColor(mBridgeChina, mBridgeChina.getCurrentTextColor(), mContext.getResources().getColor(R.color.holo_dark_gray), "textColor", p_duration); - mBridgeObfs.setHighlightColor(mContext.getResources().getColor(R.color.float_white)); - mBridgeCustom.setHighlightColor(mContext.getResources().getColor(R.color.float_white)); - mBridgeChina.setHighlightColor(mContext.getResources().getColor(R.color.float_white)); + mBridgeObfs.setHighlightColor(mContext.getResources().getColor(R.color.holo_dark_gray)); + mBridgeCustom.setHighlightColor(mContext.getResources().getColor(R.color.holo_dark_gray)); + mBridgeChina.setHighlightColor(mContext.getResources().getColor(R.color.holo_dark_gray)); - mBridgeObfs.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.float_white))); - mBridgeCustom.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.float_white))); - mBridgeChina.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.float_white))); + mBridgeObfs.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.holo_dark_gray))); + mBridgeCustom.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.holo_dark_gray))); + mBridgeChina.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.holo_dark_gray))); helperMethod.hideKeyboard(mContext); mCustomPort.clearFocus(); @@ -93,22 +98,21 @@ class bridgeViewController resetRadioButtons(p_duration); switch (p_bridge) { case strings.BRIDGE_CUSTOM_BRIDGE_OBFS4: - - animateColor(mBridgeChina, mBridgeChina.getCurrentTextColor(), mContext.getResources().getColor(R.color.black), "textColor", p_duration); - mBridgeChina.setHighlightColor(Color.BLACK); - mBridgeChina.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.cursor_blue))); - mBridgeChina.setChecked(true); - break; - case strings.BRIDGE_CUSTOM_BRIDGE_MEEK: - animateColor(mBridgeObfs, mBridgeObfs.getCurrentTextColor(), mContext.getResources().getColor(R.color.black), "textColor", p_duration); + animateColor(mBridgeObfs, mBridgeObfs.getCurrentTextColor(), mContext.getResources().getColor(R.color.c_text_v1), "textColor", p_duration); mBridgeObfs.setHighlightColor(Color.BLACK); - mBridgeObfs.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.cursor_blue))); + mBridgeObfs.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); mBridgeObfs.setChecked(true); break; + case strings.BRIDGE_CUSTOM_BRIDGE_MEEK: + animateColor(mBridgeChina, mBridgeChina.getCurrentTextColor(), mContext.getResources().getColor(R.color.c_text_v1), "textColor", p_duration); + mBridgeChina.setHighlightColor(Color.BLACK); + mBridgeChina.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mBridgeChina.setChecked(true); + break; case strings.BRIDGE_CUSTOM_BRIDGE_CUSTOM: - animateColor(mBridgeCustom, mBridgeCustom.getCurrentTextColor(), mContext.getResources().getColor(R.color.black), "textColor", p_duration); + animateColor(mBridgeCustom, mBridgeCustom.getCurrentTextColor(), mContext.getResources().getColor(R.color.c_text_v1), "textColor", p_duration); mBridgeCustom.setHighlightColor(Color.BLACK); - mBridgeCustom.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.cursor_blue))); + mBridgeCustom.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); mBridgeCustom.setChecked(true); mCustomPort.animate().setDuration(p_duration).alpha(1f); @@ -119,7 +123,7 @@ class bridgeViewController } public void onTrigger(bridgeEnums.eBridgeViewCommands p_commands, List p_data){ - if(p_commands == bridgeEnums.eBridgeViewCommands.S_INIT_VIEWS){ + if(p_commands == bridgeEnums.eBridgeViewCommands.M_INIT_VIEWS){ initViews((String) p_data.get(0), (int)p_data.get(1)); } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java index 4fcd6261..b728112d 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapter.java @@ -27,6 +27,7 @@ import java.util.Date; import java.util.List; import static android.content.Context.LAYOUT_INFLATER_SERVICE; +import static com.darkweb.genesissearchengine.constants.constants.HISTORY_LOAD_MORE; public class historyAdapter extends RecyclerView.Adapter { @@ -40,7 +41,6 @@ public class historyAdapter extends RecyclerView.Adapter mLongSelectedDate = new ArrayList<>(); private ArrayList mLongSelectedIndex = new ArrayList<>(); private ArrayList mLongSelectedID = new ArrayList<>(); - private ArrayList mLongPressedViewHolders = new ArrayList<>(); private AppCompatActivity mContext; private historyAdapterView mHistroyAdapterView; @@ -69,15 +69,14 @@ public class historyAdapter extends RecyclerView.Adapter { - mCurrentList.add(new historyRowModel("loading",null,-2)); + mCurrentList.add(new historyRowModel(HISTORY_LOAD_MORE,null,-2)); notifyItemInserted(mCurrentList.size()); }); } private void onLoadingClear(){ - for(int mCounter = 0; mCounter< mCurrentList.size(); mCounter++){ - if(mCurrentList.get(mCounter).getHeader().equals("loading")){ + if(mCurrentList.get(mCounter).getHeader().equals(HISTORY_LOAD_MORE)){ int finalM_counter = mCounter; mContext.runOnUiThread(() -> { mCurrentList.remove(finalM_counter); @@ -195,18 +194,10 @@ public class historyAdapter extends RecyclerView.Adapter onOpenMenu(v, pUrl, pPosition, pTitle)); - onSwipe(pItem, pItemView, pPosition, pUrl,pMenuItem, pLogoImage, pId, pDate); + onSwipe(pItemView, pPosition, pUrl,pMenuItem, pLogoImage, pId, pDate); } private void onClose(int pIndex){ @@ -509,7 +498,8 @@ public class historyAdapter extends RecyclerView.Adapter0){ - mRowMenu.setVisibility(View.GONE); + mRowMenu.setVisibility(View.INVISIBLE); + mRowMenu.setClickable(false); }else { mRowMenu.setVisibility(View.VISIBLE); + mRowMenu.setClickable(true); } if(mLongSelectedIndex.contains("https://" + model.getDescription()) && mLongSelectedID.contains(model.getID())){ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapterView.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapterView.java index 29b0d327..cab91953 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapterView.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyAdapterView.java @@ -40,7 +40,7 @@ public class historyAdapterView pView.getLocationOnScreen(location); int y = location[1]; int height = helperMethod.getScreenHeight(mContext); - int m_offset_height = 0; + int m_offset_height; if(y + helperMethod.pxFromDp(300) >height){ m_offset_height = helperMethod.pxFromDp(203); } @@ -59,15 +59,16 @@ public class historyAdapterView private void clearLongSelectedURL(ImageButton pPopupMenu, ImageView pLogoImage, View mItemView){ mItemView.setPressed(false); - pPopupMenu.setVisibility(View.VISIBLE); - pPopupMenu.animate().setDuration(150).alpha(1); + pPopupMenu.setVisibility(View.GONE); + pPopupMenu.animate().setDuration(150).alpha(0); pPopupMenu.setClickable(true); - pLogoImage.setAlpha(1f); + pLogoImage.setAlpha(0f); pLogoImage.animate().cancel(); + pLogoImage.setVisibility(View.GONE); pLogoImage.animate().setDuration(150).alpha(0).withEndAction(() -> pLogoImage.setVisibility(View.GONE)); } - public void onSelectView(View pItemView, View pMenuItem, ImageView pLogoImage, boolean pIsForced, boolean pVibrate){ + public void onSelectView(View pItemView, ImageView pLogoImage, boolean pIsForced, boolean pVibrate){ pItemView.setPressed(false); int speed = 150; if(pIsForced){ @@ -83,7 +84,7 @@ public class historyAdapterView pLogoImage.animate().setDuration(speed).alpha(1); } - public void onClearHighlight( View pItemView, View pMenuItem, ImageView pLogoImage, boolean pIsForced) + public void onClearHighlight(View pItemView, ImageView pLogoImage, boolean pIsForced) { try { if(pLogoImage.getAlpha()>0){ @@ -109,10 +110,10 @@ public class historyAdapterView clearLongSelectedURL((ImageButton)pData.get(0), (ImageView)pData.get(1), (View)pData.get(2)); } if(pCommands == historyEnums.eHistoryViewAdapterCommands.M_SELECT_VIEW){ - onSelectView((View)pData.get(0), (View)pData.get(1), (ImageView)pData.get(2), (Boolean) pData.get(3), (Boolean) pData.get(4)); + onSelectView((View)pData.get(0), (ImageView)pData.get(2), (Boolean) pData.get(3), (Boolean) pData.get(4)); } if(pCommands == historyEnums.eHistoryViewAdapterCommands.M_CLEAR_HIGHLIGHT){ - onClearHighlight((View)pData.get(0), (View)pData.get(1), (ImageView)pData.get(2), (Boolean) pData.get(3)); + onClearHighlight((View)pData.get(0), (ImageView)pData.get(2), (Boolean) pData.get(3)); } return null; } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyController.java index 7cdf5fc4..3fd501eb 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyController.java @@ -35,8 +35,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Objects; - import static com.darkweb.genesissearchengine.appManager.historyManager.historyEnums.eHistoryViewCommands.M_VERTIFY_SELECTION_MENU; public class historyController extends AppCompatActivity @@ -59,7 +57,6 @@ public class historyController extends AppCompatActivity private historyViewController mHistoryViewController; private boolean isUpdatingRecyclerView = false; - private boolean mIsScrollingUp; /*Initializations*/ @@ -152,8 +149,8 @@ public class historyController extends AppCompatActivity if (!hasFocus) { mSearchInput.clearFocus(); }else { - ((historyAdapter) Objects.requireNonNull(mRecycleView.getAdapter())).setFilter(mSearchInput.getText().toString()); - ((historyAdapter) mRecycleView.getAdapter()).invokeFilter(true); + mHistoryAdapter.setFilter(mSearchInput.getText().toString()); + mHistoryAdapter.invokeFilter(true); } }); @@ -172,8 +169,8 @@ public class historyController extends AppCompatActivity @Override public void afterTextChanged(Editable editable) { - ((historyAdapter) Objects.requireNonNull(mRecycleView.getAdapter())).setFilter(mSearchInput.getText().toString()); - ((historyAdapter) mRecycleView.getAdapter()).invokeFilter(true); + mHistoryAdapter.setFilter(mSearchInput.getText().toString()); + mHistoryAdapter.invokeFilter(true); } }); } @@ -240,7 +237,7 @@ public class historyController extends AppCompatActivity } public void onHideSearch(View view) { - ((historyAdapter) mRecycleView.getAdapter()).onUpdateSearchStatus((boolean) mHistoryViewController.onTrigger(historyEnums.eHistoryViewCommands.M_HIDE_SEARCH, null)); + mHistoryAdapter.onUpdateSearchStatus((boolean) mHistoryViewController.onTrigger(historyEnums.eHistoryViewCommands.M_HIDE_SEARCH, null)); } public void onLongPressMenu(View view) { @@ -279,7 +276,7 @@ public class historyController extends AppCompatActivity public void onclearData(){ mHistoryModel.clearList(); - ((historyAdapter) Objects.requireNonNull(mRecycleView.getAdapter())).invokeFilter(true ); + mHistoryAdapter.invokeFilter(true ); mHistoryViewController.onTrigger(historyEnums.eHistoryViewCommands.M_CLEAR_LIST, null); databaseController.getInstance().execSQL(sql.SQL_CLEAR_HISTORY,null); } @@ -295,9 +292,7 @@ public class historyController extends AppCompatActivity dataController.getInstance().invokeHistory(dataEnums.eHistoryCommands.M_LOAD_MORE_HISTORY ,null); try { sleep(500); - activityContextManager.getInstance().getHistoryController().runOnUiThread(() -> { - mHistoryAdapter.onTrigger(historyEnums.eHistoryAdapterCommands.M_LOADING_CLEAR, null); - }); + activityContextManager.getInstance().getHistoryController().runOnUiThread(() -> mHistoryAdapter.onTrigger(historyEnums.eHistoryAdapterCommands.M_LOADING_CLEAR, null)); sleep(1000); isUpdatingRecyclerView = false; } catch (InterruptedException e) { diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyViewController.java index 26779fff..c0b9d7c9 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/historyManager/historyViewController.java @@ -12,6 +12,7 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.PopupWindow; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; import com.darkweb.genesissearchengine.constants.strings; @@ -24,14 +25,12 @@ class historyViewController { /*Private Variables*/ private AppCompatActivity mContext; - private ImageView mEmptyListNotification; private EditText mSearchInput; private RecyclerView mRecycleView; private Button mClearButton; private ImageButton mMenuButton; private ImageButton mSearchButton; - private PopupWindow mPopupWindow = null; /*Initializations*/ @@ -55,24 +54,26 @@ class historyViewController window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { - window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + window.setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } private void updateIfListEmpty(int pSize,int pDuration){ if(pSize>0){ - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.blue)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_setting_heading)); mEmptyListNotification.animate().setDuration(pDuration).alpha(0f); mClearButton.setText(strings.HISTORY_CLEAR_HISTORY); mClearButton.setClickable(true); } else { - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.holo_dark_gray_alpha)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); mEmptyListNotification.animate().setDuration(pDuration).alpha(1f); mClearButton.animate().setDuration(pDuration).alpha(0.4f); @@ -82,7 +83,10 @@ class historyViewController mClearButton.setEnabled(false); mSearchButton.setClickable(false); mMenuButton.setClickable(false); + mSearchInput.setVisibility(View.GONE); + mClearButton.animate().setDuration(300).alpha(1); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); mClearButton.setText(strings.HISTORY_NO_HISTORY_FOUND); mClearButton.setClickable(false); } @@ -92,14 +96,15 @@ class historyViewController if(mPopupWindow !=null && mPopupWindow.isShowing()){ mPopupWindow.dismiss(); } + onSelectionMenu(true); } private void onSelectionMenu(boolean pStatus){ if(!pStatus){ mClearButton.setClickable(false); mClearButton.animate().cancel(); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.holo_dark_gray_alpha)); - mClearButton.animate().setDuration(150).alpha(0.4f); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); + mClearButton.animate().setDuration(200).alpha(0.4f); mMenuButton.setVisibility(View.VISIBLE); mSearchButton.setVisibility(View.GONE); if (mSearchInput.getVisibility() == View.VISIBLE){ @@ -108,9 +113,9 @@ class historyViewController }else { if (mSearchInput.getVisibility() != View.VISIBLE) { mClearButton.setClickable(true); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.blue)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_setting_heading)); mClearButton.animate().cancel(); - mClearButton.animate().setDuration(150).alpha(1); + mClearButton.animate().setDuration(200).alpha(1); } mMenuButton.setVisibility(View.GONE); mSearchButton.setVisibility(View.VISIBLE); @@ -120,7 +125,6 @@ class historyViewController } private void updateList(){ - int index = Objects.requireNonNull(mRecycleView.getAdapter()).getItemCount()-1; mRecycleView.getAdapter().notifyDataSetChanged(); } @@ -135,6 +139,7 @@ class historyViewController updateIfListEmpty(mRecycleView.getAdapter().getItemCount(),300); mSearchInput.clearFocus(); mSearchInput.setText(strings.GENERIC_EMPTY_STR); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); } private boolean onHideSearch() { @@ -148,7 +153,7 @@ class historyViewController mSearchInput.setText(strings.GENERIC_EMPTY_STR); mSearchInput.setClickable(false); mClearButton.setClickable(true); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.blue)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_setting_heading)); mClearButton.animate().cancel(); mClearButton.animate().setDuration(150).alpha(1f); return false; @@ -160,7 +165,7 @@ class historyViewController mSearchInput.setClickable(true); mClearButton.setClickable(false); mSearchInput.requestFocus(); - mClearButton.setTextColor(mContext.getApplication().getResources().getColor(R.color.holo_dark_gray_alpha)); + mClearButton.setTextColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); mClearButton.animate().cancel(); mClearButton.animate().setDuration(150).alpha(0.4f); InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoClients.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoClients.java index 5c14e120..6841615f 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoClients.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoClients.java @@ -2,17 +2,24 @@ package com.darkweb.genesissearchengine.appManager.homeManager; import android.content.Intent; import android.net.Uri; -import android.util.Log; import androidx.appcompat.app.AppCompatActivity; import com.darkweb.genesissearchengine.constants.*; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import java.io.File; +import java.net.URI; import java.util.List; import static com.darkweb.genesissearchengine.constants.enums.etype.on_handle_external_intent; import static org.mozilla.geckoview.GeckoSessionSettings.USER_AGENT_MODE_MOBILE; -import static org.mozilla.geckoview.StorageController.ClearFlags.ALL; +import static org.mozilla.geckoview.StorageController.ClearFlags.AUTH_SESSIONS; +import static org.mozilla.geckoview.StorageController.ClearFlags.COOKIES; +import static org.mozilla.geckoview.StorageController.ClearFlags.DOM_STORAGES; +import static org.mozilla.geckoview.StorageController.ClearFlags.IMAGE_CACHE; +import static org.mozilla.geckoview.StorageController.ClearFlags.NETWORK_CACHE; +import static org.mozilla.geckoview.StorageController.ClearFlags.PERMISSIONS; +import static org.mozilla.geckoview.StorageController.ClearFlags.SITE_DATA; +import static org.mozilla.geckoview.StorageController.ClearFlags.SITE_SETTINGS; import org.mozilla.geckoview.ContentBlocking; import org.mozilla.geckoview.GeckoRuntime; @@ -29,6 +36,7 @@ class geckoClients private int mSessionID=0; private int mGlobalSessionCounter=0; + private eventObserver.eventListener event; private AppCompatActivity context; @@ -38,19 +46,18 @@ class geckoClients this.event = event; mGlobalSessionCounter+=1; mSessionID = mGlobalSessionCounter; - runtimeSettings(context); + initRuntimeSettings(context); if(!isForced && geckoView.getSession()!=null && geckoView.getSession().isOpen()){ mSession = (geckoSession) geckoView.getSession(); } else { geckoView.releaseSession(); - Log.i("GCHECKS:","GCHECKS:"+mGlobalSessionCounter); - mSession = new geckoSession(new geckoViewClientCallback(),mGlobalSessionCounter,context); + mSession = new geckoSession(new geckoViewClientCallback(),mGlobalSessionCounter,context, geckoView); mSession.open(mRuntime); - mSession.getSettings().setUseTrackingProtection(true); + mSession.getSettings().setUseTrackingProtection(status.sStatusDoNotTrack); mSession.getSettings().setFullAccessibilityTree(true); - mSession.getSettings().setUserAgentMode(USER_AGENT_MODE_MOBILE ); + mSession.getSettings().setUserAgentMode(USER_AGENT_MODE_MOBILE); mSession.getSettings().setAllowJavascript(status.sSettingJavaStatus); geckoView.releaseSession(); geckoView.setSession(mSession); @@ -67,13 +74,21 @@ class geckoClients return mSession.getUserAgentMode(); } - private void runtimeSettings(AppCompatActivity context){ + public void initRuntimeSettings(AppCompatActivity context){ if(mRuntime==null){ mRuntime = GeckoRuntime.getDefault(context); + mRuntime.getSettings().setAboutConfigEnabled(true); + mRuntime.getSettings().setWebFontsEnabled(status.sShowWebFonts); + mRuntime.getSettings().setRemoteDebuggingEnabled(false); mRuntime.getSettings().getContentBlocking().setCookieBehavior(getCookiesBehaviour()); + mRuntime.getSettings().getContentBlocking().setSafeBrowsing(ContentBlocking.SafeBrowsing.DEFAULT); mRuntime.getSettings().setAutomaticFontSizeAdjustment(status.sSettingFontAdjustable); - mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.AD); - mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.FINGERPRINTING); + if(status.sSettingTrackingProtection){ + mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.AD); + mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.FINGERPRINTING); + }else { + mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.STRICT); + } } } @@ -81,12 +96,25 @@ class geckoClients return status.sSettingCookieStatus; } - void updateCookies(){ - mRuntime.getSettings().getContentBlocking().setCookieBehavior(status.sSettingCookieStatus); - onReload(); - } + void updateSetting(){ + mRuntime.getSettings().setRemoteDebuggingEnabled(false); + mRuntime.getSettings().setWebFontsEnabled(status.sShowWebFonts); + mRuntime.getSettings().getContentBlocking().setCookieBehavior(getCookiesBehaviour()); + mRuntime.getSettings().setAutomaticFontSizeAdjustment(status.sSettingFontAdjustable); + mRuntime.getSettings().getContentBlocking().setSafeBrowsing(ContentBlocking.SafeBrowsing.DEFAULT); + if(status.sSettingTrackingProtection){ + mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.AD); + mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.FINGERPRINTING); + }else { + mRuntime.getSettings().getContentBlocking().setAntiTracking(ContentBlocking.AntiTracking.STRICT); + } - void onClose(){ + + mSession.getSettings().setUseTrackingProtection(status.sStatusDoNotTrack); + mSession.getSettings().setFullAccessibilityTree(true); + mSession.getSettings().setUserAgentMode(USER_AGENT_MODE_MOBILE ); + mSession.getSettings().setAllowJavascript(status.sSettingJavaStatus); + onReload(); } void initSession(geckoSession mSession){ @@ -118,8 +146,24 @@ class geckoClients mSession.loadUri(url); } + void onClearSiteData(){ + mRuntime.getStorageController().clearData(SITE_SETTINGS); + mRuntime.getStorageController().clearData(SITE_DATA); + } + void onClearSession(){ - mRuntime.getStorageController().clearData(ALL); + mRuntime.getStorageController().clearData(AUTH_SESSIONS); + mRuntime.getStorageController().clearData(PERMISSIONS); + } + + void onClearCache(){ + mRuntime.getStorageController().clearData(NETWORK_CACHE); + mRuntime.getStorageController().clearData(IMAGE_CACHE); + mRuntime.getStorageController().clearData(DOM_STORAGES); + } + + void onClearCookies(){ + mRuntime.getStorageController().clearData(COOKIES); } void onBackPressed(boolean isFinishAllowed){ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoSession.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoSession.java index 95ebf88d..88001423 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoSession.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/geckoSession.java @@ -1,6 +1,5 @@ package com.darkweb.genesissearchengine.appManager.homeManager; -import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; @@ -9,6 +8,9 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.graphics.Matrix; +import android.graphics.Rect; +import android.graphics.RectF; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; @@ -16,8 +18,9 @@ import android.os.Environment; import android.os.Handler; import android.util.Base64; import android.util.Log; +import android.view.autofill.AutofillManager; +import android.view.autofill.AutofillValue; import android.widget.Toast; -import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; @@ -25,17 +28,19 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.NotificationCompat; import androidx.core.content.FileProvider; import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.JavaScriptInterface; import com.darkweb.genesissearchengine.helperManager.downloadFileService; import com.darkweb.genesissearchengine.helperManager.errorHandler; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.example.myapplication.R; -import org.mozilla.gecko.GeckoSystemStateListener; -import org.mozilla.gecko.GeckoThread; +import org.mozilla.gecko.util.ThreadUtils; import org.mozilla.geckoview.AllowOrDeny; +import org.mozilla.geckoview.Autofill; import org.mozilla.geckoview.GeckoResult; import org.mozilla.geckoview.GeckoSession; +import org.mozilla.geckoview.GeckoView; import org.mozilla.geckoview.WebRequestError; import java.io.File; import java.io.FileOutputStream; @@ -43,7 +48,7 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import java.util.List; - +import java.util.Objects; import static org.mozilla.geckoview.GeckoSessionSettings.USER_AGENT_MODE_DESKTOP; import static org.mozilla.geckoview.GeckoSessionSettings.USER_AGENT_MODE_MOBILE; @@ -67,15 +72,19 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio private GeckoSession.HistoryDelegate.HistoryList mHistoryList = null; private int rateCount=0; private int m_current_url_id = -1; + private GeckoView mGeckoView; - geckoSession(eventObserver.eventListener event,int mSessionID,AppCompatActivity mContext){ + geckoSession(eventObserver.eventListener event,int mSessionID,AppCompatActivity mContext, GeckoView pGeckoView){ + this.mGeckoView = pGeckoView; this.mContext = mContext; this.mSessionID = mSessionID; setProgressDelegate(this); setHistoryDelegate(this); setNavigationDelegate(this); setContentDelegate(this); + setAutoFillDelegate(); + setPermissionDelegate(this); mDownloadManager = new geckoDownloadManager(); setPromptDelegate(new geckoPromptView(mContext)); this.event = event; @@ -84,7 +93,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio void onFileUploadRequest(int resultCode, Intent data){ geckoPromptView mPromptDelegate = (geckoPromptView)getPromptDelegate(); - mPromptDelegate.onFileCallbackResult(resultCode,data); + Objects.requireNonNull(mPromptDelegate).onFileCallbackResult(resultCode,data); } void initURL(String url){ @@ -93,7 +102,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio mCurrentTitle = mCurrentURL; event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle), enums.etype.on_update_suggestion); - if(!url.equals("about:blank")) + if(!url.equals("about:blank") && !url.equals("about:config")) { mProgress = 5; event.invokeObserver(Arrays.asList(5, mSessionID), enums.etype.progress_update); @@ -101,6 +110,69 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio m_current_url_id = -1; } + /*Autofill Delegate*/ + + public void setAutoFillDelegate(){ + this.setAutofillDelegate(new AndroidAutofillDelegate()); + } + + private class AndroidAutofillDelegate implements Autofill.Delegate { + + private Rect displayRectForId(@NonNull final GeckoSession session, + @NonNull final Autofill.Node node) { + final Matrix matrix = new Matrix(); + final RectF rectF = new RectF(node.getDimensions()); + session.getPageToScreenMatrix(matrix); + matrix.mapRect(rectF); + + final Rect screenRect = new Rect(); + rectF.roundOut(screenRect); + return screenRect; + } + + @Override + public void onAutofill(@NonNull final GeckoSession session, + final int notification, + final Autofill.Node node) { + ThreadUtils.assertOnUiThread(); + if (Build.VERSION.SDK_INT < 26) { + return; + } + + final AutofillManager manager = + mContext.getSystemService(AutofillManager.class); + if (manager == null) { + return; + } + + switch (notification) { + case Autofill.Notify.SESSION_STARTED: + case Autofill.Notify.SESSION_CANCELED: + manager.cancel(); + break; + case Autofill.Notify.SESSION_COMMITTED: + manager.commit(); + break; + case Autofill.Notify.NODE_FOCUSED: + manager.notifyViewEntered( + mGeckoView, node.getId(), + displayRectForId(session, node)); + break; + case Autofill.Notify.NODE_BLURRED: + manager.notifyViewExited(mGeckoView, node.getId()); + break; + case Autofill.Notify.NODE_UPDATED: + manager.notifyValueChanged( + mGeckoView, + node.getId(), + AutofillValue.forText(node.getValue())); + break; + case Autofill.Notify.NODE_ADDED: + case Autofill.Notify.NODE_REMOVED: + break; + } + } + } /*Progress Delegate*/ @Override @@ -116,12 +188,6 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio } - @AnyThread - public void shutdown() { - GeckoSystemStateListener.getInstance().shutdown(); - GeckoThread.forceQuit(); - } - @UiThread public void onPageStop(@NonNull GeckoSession var1, boolean var2) { @@ -159,13 +225,13 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio /*Navigation Delegate*/ public void onLocationChange(@NonNull GeckoSession var1, @Nullable String var2) { - String newUrl = var2.split("#")[0]; + String newUrl = Objects.requireNonNull(var2).split("#")[0]; if(!mCurrentTitle.equals("loading")){ m_current_url_id = (int)event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID,mCurrentTitle, m_current_url_id), enums.etype.on_update_history); } mCurrentURL = newUrl; - if (var2 != null && !var2.equals("about:blank")) + if (!var2.equals("about:blank")) { event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID), enums.etype.start_proxy); event.invokeObserver(Arrays.asList(mCurrentURL,mSessionID), enums.etype.search_update); @@ -260,6 +326,21 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio } } + /*Permission Delegate*/ + + @Override + public void onContentPermissionRequest(final GeckoSession session, final String uri, + final int type, final Callback callback) { + if (PERMISSION_AUTOPLAY_AUDIBLE == type || PERMISSION_AUTOPLAY_INAUDIBLE == type) { + if (!status.sAutoPlay) { + callback.reject(); + } else { + callback.grant(); + } + }else { + callback.reject(); + } + } /*Download Manager*/ void downloadRequestedFile() @@ -280,70 +361,6 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio } } - public boolean downloadBlobFile(String url){ - - try{ - File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); - - String filetype = ""; - String filename = ""; - - filetype = url.substring(url.indexOf("/") + 1, url.indexOf(";")); - filename = System.currentTimeMillis() + "." + filetype; - - File file = new File(path, filename); - try { - if(!path.exists()) - path.mkdirs(); - if(!file.exists()) - file.createNewFile(); - - String base64EncodedString = url.substring(url.indexOf(",") + 1); - byte[] decodedBytes = Base64.decode(base64EncodedString, Base64.DEFAULT); - OutputStream os = new FileOutputStream(file); - os.write(decodedBytes); - os.close(); - - //Tell the media scanner about the new file so that it is immediately available to the user. - MediaScannerConnection.scanFile(mContext, - new String[]{file.toString()}, null, - new MediaScannerConnection.OnScanCompletedListener() { - public void onScanCompleted(String path, Uri uri) { - Log.i("ExternalStorage", "Scanned " + path + ":"); - Log.i("ExternalStorage", "-> uri=" + uri); - } - }); - - //Set notification after download complete and add "click to view" action to that - String mimetype = url.substring(url.indexOf(":") + 1, url.indexOf("/")); - Intent intent = new Intent(); - intent.setAction(android.content.Intent.ACTION_VIEW); - intent.setDataAndType(Uri.fromFile(file), (mimetype + "/*")); - PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent, 0); - - Notification notification = new NotificationCompat.Builder(mContext) - .setSmallIcon(R.xml.ic_download) - .setContentTitle(filename) - .setContentIntent(pIntent) - .build(); - - notification.flags |= Notification.FLAG_AUTO_CANCEL; - int notificationId = 85851; - NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(notificationId, notification); - } catch (IOException e) { - e.printStackTrace(); - } - - return true; - } - catch (Exception ignored){ - - } - - return true; - } - private boolean createAndSaveFileFromBase64Url(String url) { if(!url.startsWith("data") && !url.startsWith("blob")){ @@ -361,8 +378,8 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio try{ File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); - String filetype = ""; - String filename = ""; + String filetype; + String filename; if(url.startsWith("blob")){ loadUri(JavaScriptInterface.getBase64StringFromBlobUrl(url)); @@ -397,49 +414,30 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio //Set notification after download complete and add "click to view" action to that String mimetype = url.substring(url.indexOf(":") + 1, url.indexOf("/")); Intent intent = new Intent(); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - intent.setAction(android.content.Intent.ACTION_VIEW); - intent.setDataAndType(Uri.fromFile(file), (mimetype + "/*")); - } else { - intent.setAction(android.content.Intent.ACTION_VIEW); - Uri uri_temp = FileProvider.getUriForFile(mContext,mContext.getString(R.string.GENERAL_FILE_PROVIDER_AUTHORITY), file); - intent.setDataAndType(uri_temp, (mimetype + "/*")); + intent.setAction(android.content.Intent.ACTION_VIEW); + Uri uri_temp = FileProvider.getUriForFile(mContext,mContext.getString(R.string.GENERAL_FILE_PROVIDER_AUTHORITY), file); + intent.setDataAndType(uri_temp, (mimetype + "/*")); - List resInfoList = mContext.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); - for (ResolveInfo resolveInfo : resInfoList) { - String packageName = resolveInfo.activityInfo.packageName; - mUriPermission = uri_temp; - mContext.grantUriPermission(packageName, uri_temp, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); - } + List resInfoList = mContext.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + for (ResolveInfo resolveInfo : resInfoList) { + String packageName = resolveInfo.activityInfo.packageName; + mUriPermission = uri_temp; + mContext.grantUriPermission(packageName, uri_temp, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent, 0); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - Notification notification = new NotificationCompat.Builder(mContext) - .setSmallIcon(R.xml.ic_download) - .setContentTitle(filename) - .setContentIntent(pIntent) - .build(); + String channel_id = createNotificationChannel(mContext); + assert channel_id != null; + NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, channel_id) + .setSmallIcon(R.xml.ic_download) + .setContentTitle(filename) + .setContentIntent(pIntent); - notification.flags |= Notification.FLAG_AUTO_CANCEL; - int notificationId = 85851; - NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(notificationId, notification); - } else { - - String channel_id = createNotificationChannel(mContext); - NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, channel_id) - .setSmallIcon(R.xml.ic_download) - .setContentTitle(filename) - .setContentIntent(pIntent); - - notificationBuilder.setAutoCancel(true); - - int notificationId = 85851; - NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(notificationId, notificationBuilder.build()); - } + notificationBuilder.setAutoCancel(true); + int notificationId = 85851; + NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(notificationId, notificationBuilder.build()); } catch (IOException e) { e.printStackTrace(); @@ -461,10 +459,9 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio CharSequence channelName = "Application_name"; String channelDescription = "Application_name Alert"; int channelImportance = NotificationManager.IMPORTANCE_DEFAULT; - boolean channelEnableVibrate = true; NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, channelImportance); notificationChannel.setDescription(channelDescription); - notificationChannel.enableVibration(channelEnableVibrate); + notificationChannel.enableVibration(true); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); assert notificationManager != null; notificationManager.createNotificationChannel(notificationChannel); @@ -536,11 +533,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio if(mHistoryList!=null && index>=0 && index - { - goBack(); - }, 100); + new Handler().postDelayed(this::goBack, 100); } } else { @@ -558,11 +551,7 @@ public class geckoSession extends GeckoSession implements GeckoSession.Permissio { event.invokeObserver(Arrays.asList(mHistoryList.get(index), mSessionID), enums.etype.start_proxy); - - new Handler().postDelayed(() -> - { - goForward(); - }, 100); + new Handler().postDelayed(this::goForward, 100); } }else { goForward(); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController.java index f5ac594f..166c8946 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeController.java @@ -23,14 +23,18 @@ import android.webkit.URLUtil; import android.widget.*; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.constraintlayout.widget.ConstraintLayout; import com.darkweb.genesissearchengine.appManager.activityContextManager; import com.darkweb.genesissearchengine.appManager.bookmarkManager.bookmarkController; import com.darkweb.genesissearchengine.appManager.databaseManager.databaseController; import com.darkweb.genesissearchengine.appManager.historyManager.historyController; +import com.darkweb.genesissearchengine.appManager.historyManager.historyRowModel; import com.darkweb.genesissearchengine.appManager.landingManager.landingController; import com.darkweb.genesissearchengine.appManager.languageManager.languageController; +import com.darkweb.genesissearchengine.appManager.orbotLogManager.orbotLogController; +import com.darkweb.genesissearchengine.appManager.orbotManager.orbotController; import com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage.settingController; import com.darkweb.genesissearchengine.appManager.tabManager.tabController; import com.darkweb.genesissearchengine.appManager.tabManager.tabRowModel; @@ -40,7 +44,6 @@ import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.dataManager.dataController; -import com.darkweb.genesissearchengine.appManager.orbotManager.orbotController; import com.darkweb.genesissearchengine.dataManager.dataEnums; import com.darkweb.genesissearchengine.helperManager.KeyboardUtils; import com.darkweb.genesissearchengine.helperManager.eventObserver; @@ -57,6 +60,7 @@ import org.torproject.android.service.wrapper.orbotLocalConstants; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -82,9 +86,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba private ImageView mLoadingIcon; private TextView mLoadingText; private AdView mBannerAds = null; - private ImageView mEngineLogo; private ImageButton mGatewaySplash; - private ImageButton mSwitchEngineBack; private LinearLayout mTopBar; private ImageView mBackSplash; private Button mConnectButton; @@ -94,17 +96,21 @@ public class homeController extends AppCompatActivity implements ComponentCallba private boolean mPageClosed = false; private boolean isKeyboardOpened = false; private boolean isSuggestionChanged = false; + private boolean isTabMenuOpened = false; /*-------------------------------------------------------INITIALIZATION-------------------------------------------------------*/ @Override protected void onCreate(Bundle savedInstanceState) { + pluginController.getInstance().preInitialize(this); databaseController.getInstance().initialize(this); dataController.getInstance().initialize(this); + onChangeTheme(); status.initStatus(); pluginController.getInstance().onCreate(this); + onInitTheme(); super.onCreate(savedInstanceState); setContentView(R.layout.home_view); @@ -123,6 +129,29 @@ public class homeController extends AppCompatActivity implements ComponentCallba initLocalLanguage(); } + public void onInitTheme(){ + + if(status.sTheme == enums.Theme.THEME_DARK){ + if(AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_YES){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } + }else if(status.sTheme == enums.Theme.THEME_LIGHT){ + if(AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_NO){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } + }else { + if((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_NO){ + if(AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_NO){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } + }else { + if(AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_YES){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } + } + } + } + private void initLocalLanguage() { String lang = Resources.getSystem().getConfiguration().locale.getLanguage(); @@ -167,7 +196,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba public void initializeConnections() { - mGeckoView = findViewById(R.id.webLoader); + mGeckoView = findViewById(R.id.pWebView); mProgressBar = findViewById(R.id.progressBar); mSplashScreen = findViewById(R.id.splashScreen); @@ -186,9 +215,13 @@ public class homeController extends AppCompatActivity implements ComponentCallba mGeckoView.setSaveFromParentEnabled(false); mGeckoClient = new geckoClients(); - boolean is_engine_switched = (boolean) dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_ENGINE_SWITCHED,false)); + mHomeViewController.initialization(new homeViewCallback(),this,mNewTab, mWebViewContainer, mLoadingText, mProgressBar, mSearchbar, mSplashScreen, mLoadingIcon, mBannerAds,(ArrayList)dataController.getInstance().invokeSuggestion(dataEnums.eSuggestionCommands.M_GET_SUGGESTION, null), mGatewaySplash, mTopBar, mGeckoView, mBackSplash, mConnectButton); + } - mHomeViewController.initialization(new homeViewCallback(),this,mNewTab, mWebViewContainer, mLoadingText, mProgressBar, mSearchbar, mSplashScreen, mLoadingIcon, mBannerAds,dataController.getInstance().getSuggestions(), mGatewaySplash, mTopBar, mGeckoView, mBackSplash,is_engine_switched, mConnectButton, mSwitchEngineBack); + public void onChangeTheme(){ + if(!status.sSettingIsAppStarted){ + status.sDefaultNightMode = (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; + } } public void initPreFixes() { @@ -212,18 +245,18 @@ public class homeController extends AppCompatActivity implements ComponentCallba mGeckoClient.initialize(mGeckoView, new geckoViewCallback(), this,isForced); //mGeckoClient.loadURL("about:blank"); onSaveCurrentTab(mGeckoClient.getSession(),false); - mHomeViewController.initTab(dataController.getInstance().getTotalTabs()); + mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null)); } public void initTab(boolean isKeyboardOpened){ onNewTab(isKeyboardOpened, false); - mHomeViewController.initTab(dataController.getInstance().getTotalTabs()); + mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null)); } @Override protected void attachBaseContext(Context base) { Prefs.setContext(base); - orbotLocalConstants.sHomeContext = new WeakReference<>(base); + orbotLocalConstants.mHomeContext = new WeakReference<>(base); super.attachBaseContext(LocaleHelper.onAttach(base, Prefs.getDefaultLocale())); } @@ -242,14 +275,10 @@ public class homeController extends AppCompatActivity implements ComponentCallba } } - public void onUpdateJavascript(){ - mGeckoView.clearFocus(); - mGeckoClient.updateJavascript(); - } - public void onUpdateCookies(){ - mGeckoView.clearFocus(); - mGeckoClient.updateCookies(); + public void initRuntimeSettings() + { + mGeckoClient.updateSetting(); } public void onLoadURL(String url){ @@ -257,9 +286,13 @@ public class homeController extends AppCompatActivity implements ComponentCallba mGeckoClient.loadURL(url.replace("genesis.onion","boogle.store")); } + public GeckoView getmGeckoView(){ + return mGeckoView; + } + public void onLoadTab(geckoSession mTempSession,boolean isSessionClosed){ if(!isSessionClosed){ - dataController.getInstance().moveTabToTop(mTempSession); + dataController.getInstance().invokeTab(dataEnums.eTabCommands.MOVE_TAB_TO_TOP, Collections.singletonList(mTempSession)); } mGeckoView.releaseSession(); @@ -365,7 +398,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba } if(isSuggestionChanged){ isSuggestionChanged = false; - mHomeViewController.initializeSuggestionView(dataController.getInstance().getSuggestions()); + mHomeViewController.initializeSuggestionView((ArrayList)dataController.getInstance().invokeSuggestion(dataEnums.eSuggestionCommands.M_GET_SUGGESTION, null)); } }else { mHomeViewController.onUpdateSearchBar(mGeckoClient.getSession().getCurrentURL(),true); @@ -401,7 +434,14 @@ public class homeController extends AppCompatActivity implements ComponentCallba public void onNewTab(boolean isKeyboardOpenedTemp, boolean isKeyboardOpened){ initializeGeckoView(true); - onLoadURL("about:blank"); + if(status.sOpenURLInNewTab){ + onLoadURL(helperMethod.getDomainName(status.sSettingSearchStatus)); + mHomeViewController. onUpdateSearchBar(helperMethod.getDomainName(status.sSettingSearchStatus),false); + }else { + mGeckoView.releaseSession(); + onLoadURL("about:blank"); + mHomeViewController. onUpdateSearchBar(strings.HOME_BLANK_PAGE,false); + } mHomeViewController.progressBarReset(); mHomeViewController.onNewTab(isKeyboardOpened,isKeyboardOpenedTemp); mHomeViewController.onSessionChanged(); @@ -409,7 +449,9 @@ public class homeController extends AppCompatActivity implements ComponentCallba public void onOpenTabViewBoundary(View view){ mNewTab.setPressed(true); + isTabMenuOpened = true; helperMethod.openActivity(tabController.class, constants.CONST_LIST_HISTORY, homeController.this,true); + overridePendingTransition(R.anim.popup_anim_in, R.anim.popup_anim_out); } public void onNotificationInvoked(String message,enums.etype e_type){ @@ -451,6 +493,19 @@ public class homeController extends AppCompatActivity implements ComponentCallba mGeckoClient.onClearSession(); } + public void onClearSiteData(){ + mGeckoClient.onClearSiteData(); + } + + public void onClearCache(){ + mGeckoClient.onClearCache(); + } + + public void onClearCookies(){ + mGeckoClient.onClearCookies(); + } + + @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -493,9 +548,23 @@ public class homeController extends AppCompatActivity implements ComponentCallba if (mGeckoClient!=null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && mGeckoClient.getUriPermission()!=null) { this.revokeUriPermission(mGeckoClient.getUriPermission(), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } + if(status.sSettingIsAppStarted){ + onStartApplication(null); + } super.onResume(); } + public void onAcquireDisplay(){ + isTabMenuOpened = false; + tabRowModel model = (tabRowModel)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_CURRENT_TAB, null); + if(model==null){ + onLoadTab(model.getSession(),true); + }else { + mGeckoView.releaseSession(); + mGeckoView.setSession(model.getSession()); + } + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode==1){ @@ -514,7 +583,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba public void onSuggestionUpdate(){ if(!mSearchbar.isFocused()){ - mHomeViewController.initializeSuggestionView(dataController.getInstance().getSuggestions()); + mHomeViewController.initializeSuggestionView((ArrayList)dataController.getInstance().invokeSuggestion(dataEnums.eSuggestionCommands.M_GET_SUGGESTION, null)); }else { isSuggestionChanged = true; } @@ -560,37 +629,42 @@ public class homeController extends AppCompatActivity implements ComponentCallba } public void onSaveCurrentTab(geckoSession session,boolean isHardCopy){ - dataController.getInstance().addTab(session,isHardCopy); + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_ADD_TAB, Arrays.asList(session,isHardCopy)); } public boolean onCloseCurrentTab(geckoSession session){ - dataController.getInstance().closeTab(session); - tabRowModel model = dataController.getInstance().getCurrentTab(); + dataController.getInstance().invokeTab(dataEnums.eTabCommands.CLOSE_TAB, Collections.singletonList(session)); + tabRowModel model = (tabRowModel)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_CURRENT_TAB, null); session.stop(); session.close(); initTabCount(); if(model!=null){ - onLoadTab(model.getSession(),true); + if(activityContextManager.getInstance().getTabController()==null || activityContextManager.getInstance().getTabController()!=null && (activityContextManager.getInstance().getTabController().isDestroyed())){ + onLoadTab(model.getSession(),true); + } return true; } else { - return false; + if(activityContextManager.getInstance().getTabController()==null || activityContextManager.getInstance().getTabController()!=null && (activityContextManager.getInstance().getTabController().isDestroyed())){ + return false; + }else { + return true; + } } } public void initTabCount(){ - mHomeViewController.initTab(dataController.getInstance().getTotalTabs()); + mHomeViewController.initTab((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null)); } public void releaseSession(){ mGeckoView.releaseSession(); } - public void loadExistingTab() - { - tabRowModel model = dataController.getInstance().getCurrentTab(); + public void loadExistingTab(){ + tabRowModel model = (tabRowModel)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_CURRENT_TAB, null); if (model != null) { onLoadTab(model.getSession(), true); @@ -615,7 +689,11 @@ public class homeController extends AppCompatActivity implements ComponentCallba } else { mSearchbar.clearFocus(); - if (menuId == R.id.menu9) { + if (menuId == R.id.menu12) { + helperMethod.hideKeyboard(this); + helperMethod.openActivity(orbotLogController.class, constants.CONST_LIST_HISTORY, homeController.this,true); + } + else if (menuId == R.id.menu9) { helperMethod.hideKeyboard(this); helperMethod.openActivity(tabController.class, constants.CONST_LIST_HISTORY, homeController.this,true); } @@ -672,7 +750,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba } if (menuId == R.id.menu23) { helperMethod.hideKeyboard(this); - mGeckoClient.onBackPressed(false); + pluginController.getInstance().MessageManagerHandler(homeController.this, Collections.singletonList(mGeckoClient.getSession().getCurrentURL()),enums.etype.bookmark); } if (menuId == R.id.menu24) { helperMethod.hideKeyboard(this); @@ -691,6 +769,10 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.closeMenu(); } + public void onOrbotLog(View view) { + helperMethod.openActivity(orbotLogController.class, constants.CONST_LIST_HISTORY, homeController.this,true); + } + public class homeViewCallback implements eventObserver.eventListener{ @Override @@ -746,7 +828,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.onUpdateSearchBar(dataToStr(data.get(0),mGeckoClient.getSession().getCurrentURL()),false); } else if(e_type.equals(enums.etype.back_list_empty)){ - if(dataController.getInstance().getTotalTabs()>1){ + if((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null)>1){ if(!onCloseCurrentTab(mGeckoClient.getSession())){ onNewTab(true,false); } @@ -758,10 +840,13 @@ public class homeController extends AppCompatActivity implements ComponentCallba pluginController.getInstance().setProxy(dataToStr(data.get(0))); } else if(e_type.equals(enums.etype.on_update_history)){ + if(activityContextManager.getInstance().getTabController()!=null && !activityContextManager.getInstance().getTabController().isDestroyed() && !activityContextManager.getInstance().getTabController().isFinishing()){ + activityContextManager.getInstance().getTabController().onTabRowChanged((int)data.get(1)); + } return dataController.getInstance().invokeHistory(dataEnums.eHistoryCommands.M_ADD_HISTORY ,data); } else if(e_type.equals(enums.etype.on_update_suggestion)){ - dataController.getInstance().addSuggesion(data.get(0).toString(),data.get(2).toString()); + dataController.getInstance().invokeSuggestion(dataEnums.eSuggestionCommands.M_ADD_SUGGESTION, Arrays.asList(data.get(0).toString(),data.get(2).toString())); } else if(e_type.equals(enums.etype.on_page_loaded)){ pluginController.getInstance().logEvent(strings.EVENT_PAGE_OPENED_SUCCESS); @@ -779,10 +864,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba handler.postDelayed(runnable, 1300); }else { final Handler handler = new Handler(); - Runnable runnable = () -> - { - pluginController.getInstance().initializeBannerAds(); - }; + Runnable runnable = () -> pluginController.getInstance().initializeBannerAds(); handler.postDelayed(runnable, 2000); } } @@ -810,7 +892,6 @@ public class homeController extends AppCompatActivity implements ComponentCallba mHomeViewController.onFullScreenUpdate(status); } else if(e_type.equals(enums.etype.on_update_favicon)){ - boolean status = (Boolean)data.get(0); dataController.getInstance().invokeImageCache(dataEnums.eImageCacheCommands.M_SET_IMAGE ,data); } else if(e_type.equals(enums.etype.on_long_press_with_link)){ @@ -834,7 +915,7 @@ public class homeController extends AppCompatActivity implements ComponentCallba helperMethod.openPlayStore(dataToStr(data.get(0)).split("__")[1],homeController.this); } else if(e_type.equals(enums.etype.on_update_suggestion_url)){ - dataController.getInstance().updateSuggestionURL(dataToStr(data.get(0)),dataToStr(data.get(2))); + dataController.getInstance().invokeSuggestion(dataEnums.eSuggestionCommands.M_UPDATE_SUGGESTION, Arrays.asList(dataToStr(data.get(0)),dataToStr(data.get(2)))); } return null; } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeModel.java index 2c1de034..4e48f70b 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeModel.java @@ -16,22 +16,26 @@ class homeModel } String urlComplete(String url){ - try - { - String updateUrl = helperMethod.completeURL(url); - URL host = new URL(updateUrl); - boolean isUrlValid = Patterns.WEB_URL.matcher(updateUrl).matches(); - if(isUrlValid && host.getHost().replace("www.","").contains(".")) + if(url.equals("about:config")){ + return url; + }else { + try { - return null; + String updateUrl = helperMethod.completeURL(url); + URL host = new URL(updateUrl); + boolean isUrlValid = Patterns.WEB_URL.matcher(updateUrl).matches(); + if(isUrlValid && host.getHost().replace("www.","").contains(".")) + { + return null; + } } - } - catch (Exception ex){ - ex.printStackTrace(); - } + catch (Exception ex){ + ex.printStackTrace(); + } - return constants.CONST_BACKEND_GOOGLE_URL.replace("$s",url.replaceAll(" ","+")); + return constants.CONST_BACKEND_GOOGLE_URL.replace("$s",url.replaceAll(" ","+")); + } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeViewController.java index f1d7cfb0..63fb0f7c 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/homeManager/homeViewController.java @@ -27,6 +27,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.*; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; import com.daimajia.androidanimations.library.Techniques; @@ -42,7 +43,6 @@ import com.google.android.gms.ads.AdSize; import com.google.android.gms.ads.AdView; import org.mozilla.geckoview.GeckoView; import org.torproject.android.service.wrapper.orbotLocalConstants; -//import org.torproject.android.service.wrapper.orbotLocalConstants; import java.util.ArrayList; import java.util.Collections; import java.util.Objects; @@ -66,7 +66,6 @@ class homeViewController private TextView mLoadingText; private AdView mBannerAds = null; private Handler mUpdateUIHandler = null; - private ImageButton mSwitchEngineBack; private ImageButton mGatewaySplash; private LinearLayout mTopBar; private GeckoView mGeckoView; @@ -76,12 +75,10 @@ class homeViewController private PopupWindow popupWindow = null; /*Local Variables*/ - private ValueAnimator mEngineAnimator = null; private Callable mLogs = null; private boolean isLandscape = false; - private boolean disableSplash = false; - void initialization(eventObserver.eventListener event, AppCompatActivity context, Button mNewTab, FrameLayout webviewContainer, TextView loadingText, com.darkweb.genesissearchengine.widget.AnimatedProgressBar progressBar, AutoCompleteTextView searchbar, ConstraintLayout splashScreen, ImageView loading, AdView banner_ads, ArrayList suggestions, ImageButton gateway_splash, LinearLayout top_bar, GeckoView gecko_view, ImageView backsplash, boolean is_triggered, Button connect_button, ImageButton switch_engine_back){ + void initialization(eventObserver.eventListener event, AppCompatActivity context, Button mNewTab, FrameLayout webviewContainer, TextView loadingText, com.darkweb.genesissearchengine.widget.AnimatedProgressBar progressBar, AutoCompleteTextView searchbar, ConstraintLayout splashScreen, ImageView loading, AdView banner_ads, ArrayList suggestions, ImageButton gateway_splash, LinearLayout top_bar, GeckoView gecko_view, ImageView backsplash, Button connect_button){ this.mContext = context; this.mProgressBar = progressBar; this.mSearchbar = searchbar; @@ -96,7 +93,6 @@ class homeViewController this.mGeckoView = gecko_view; this.mBackSplash = backsplash; this.mConnectButton = connect_button; - //this.mSwitchEngineBack = switch_engine_back; this.mNewTab = mNewTab; this.popupWindow = null; @@ -111,7 +107,7 @@ class homeViewController } void initTab(int count){ - mNewTab.setText(count+strings.GENERIC_EMPTY_STR); + mNewTab.setText((count+strings.GENERIC_EMPTY_STR)); YoYo.with(Techniques.FlipInX) .duration(450) @@ -127,16 +123,22 @@ class homeViewController window.setStatusBarColor(mContext.getResources().getColor(R.color.landing_ease_blue)); } else{ + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { - window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + window.setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); } else { - initStatusBarColor(); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } } + @RequiresApi(api = Build.VERSION_CODES.M) private void initStatusBarColor() { animatedColor oneToTwo = new animatedColor(ContextCompat.getColor(mContext, R.color.landing_ease_blue), ContextCompat.getColor(mContext, R.color.landing_ease_blue_light_1)); @@ -237,7 +239,7 @@ class homeViewController mConnectButton.setClickable(false); mGatewaySplash.setClickable(false); - mConnectButton.animate().setDuration(300).alpha(0f).withEndAction((() -> initSplashLoading())); + mConnectButton.animate().setDuration(300).alpha(0f).withEndAction((this::initSplashLoading)); mGatewaySplash.animate().setDuration(300).alpha(0f); } @@ -262,7 +264,7 @@ class homeViewController new Thread(){ public void run(){ AppCompatActivity temp_context = mContext; - while (!orbotLocalConstants.sIsTorInitialized || !orbotLocalConstants.sNetworkState){ + while (!orbotLocalConstants.mIsTorInitialized || !orbotLocalConstants.mNetworkState){ try { sleep(1000); @@ -298,8 +300,7 @@ class homeViewController mTopBar.setAlpha(1); if(mSplashScreen.getAlpha()>=1) { - disableSplash = true; - mSplashScreen.animate().setDuration(300).setStartDelay(500).alpha(0).withEndAction((() -> triggerPostUI())); + mSplashScreen.animate().setDuration(300).setStartDelay(500).alpha(0).withEndAction((this::triggerPostUI)); initPostUI(false); } } @@ -326,9 +327,7 @@ class homeViewController final View popupView = layoutInflater.inflate(R.layout.popup_menu, null); - int height = 0; - - height = helperMethod.getScreenHeight(mContext)*90 /100; + int height = helperMethod.getScreenHeight(mContext)*90 /100; popupWindow = new PopupWindow( popupView, @@ -346,16 +345,15 @@ class homeViewController } popupWindow.showAtLocation(parent, Gravity.TOP|Gravity.END,0,0); + if(!status.sCharacterEncoding){ + popupView.findViewById(R.id.menu30).setVisibility(View.GONE); + } + ImageButton back = popupView.findViewById(R.id.menu22); - ImageButton forward = popupView.findViewById(R.id.menu23); ImageButton close = popupView.findViewById(R.id.menu20); CheckBox desktop = popupView.findViewById(R.id.menu27); desktop.setChecked(userAgent==USER_AGENT_MODE_DESKTOP); - if(!canGoForward){ - forward.setColorFilter(Color.argb(255, 191, 191, 191)); - forward.setEnabled(false); - } if(!canGoBack){ back.setEnabled(false); back.setColorFilter(Color.argb(255, 191, 191, 191)); @@ -444,7 +442,6 @@ class homeViewController handlerLocalUrl = url; if(searchBarUpdateHandler.hasMessages(100)){ - delay=0; return; } @@ -478,7 +475,7 @@ class homeViewController if(url.length()<=300){ url = removeEndingSlash(url); - mSearchbar.setText(helperMethod.urlDesigner(url)); + mSearchbar.setText(helperMethod.urlDesigner(url, mContext)); mSearchbar.selectAll(); if(isTextSelected){ @@ -502,7 +499,6 @@ class homeViewController } void onNewTab(boolean keyboard,boolean isKeyboardOpen){ - onUpdateSearchBar(strings.HOME_BLANK_PAGE,false); if(keyboard){ if(!isKeyboardOpen){ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/languageManager/languageViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/languageManager/languageViewController.java index 00fe50bf..14f5d06f 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/languageManager/languageViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/languageManager/languageViewController.java @@ -5,6 +5,10 @@ import android.view.View; import android.view.Window; import android.view.WindowManager; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.content.ContextCompat; + +import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.example.myapplication.R; @@ -23,12 +27,15 @@ class languageViewController if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = mContext.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); } else { - mContext.getWindow().setStatusBarColor(mContext.getColor(R.color.white)); - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogController.java new file mode 100644 index 00000000..468c5a79 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogController.java @@ -0,0 +1,111 @@ +package com.darkweb.genesissearchengine.appManager.orbotLogManager; + +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import com.darkweb.genesissearchengine.appManager.activityContextManager; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.pluginManager.pluginController; +import com.example.myapplication.R; +import org.torproject.android.service.wrapper.orbotLocalConstants; +import java.util.Collections; +import java.util.List; + +public class orbotLogController extends AppCompatActivity { + + /* PRIVATE VARIABLES */ + private orbotLogModel mOrbotModel; + private orbotLogViewController mOrbotViewController; + + private TextView mLogs; + private int mLogCounter=0; + private boolean mActivityClosed = false; + + /* INITIALIZATIONS */ + + @Override + protected void onCreate(Bundle savedInstanceState) { + pluginController.getInstance().onCreate(this); + super.onCreate(savedInstanceState); + setContentView(R.layout.orbot_log_view); + + viewsInitializations(); + onUpdateLogs(); + } + + public void viewsInitializations() { + mLogs = findViewById(R.id.pLogs); + + activityContextManager.getInstance().setOrbotLogController(this); + mOrbotViewController = new orbotLogViewController(this, mLogs); + mOrbotModel = new orbotLogModel(new orbotModelCallback()); + } + + /* LISTENERS */ + + public void onUpdateLogs(){ + new Thread(){ + public void run(){ + while (true){ + try { + if(mActivityClosed){ + break; + } + if(orbotLocalConstants.mTorLogsHistory.size()>mLogCounter){ + sleep(0); + }else { + sleep(400); + } + + if(orbotLocalConstants.mTorLogsHistory.size()>0){ + runOnUiThread(() -> { + if(orbotLocalConstants.mTorLogsHistory.size()>mLogCounter){ + mOrbotViewController.onTrigger(orbotLogEnums.eOrbotLogViewCommands.M_UPDATE_LOGS, Collections.singletonList(orbotLocalConstants.mTorLogsHistory.get(mLogCounter))); + mLogCounter+=1; + } + }); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + }.start(); + } + + public class orbotModelCallback implements eventObserver.eventListener{ + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + /* LOCAL OVERRIDES */ + + @Override + public void onResume() + { + activityContextManager.getInstance().setCurrentActivity(this); + super.onResume(); + } + + @Override + public void onPause() + { + super.onPause(); + } + + @Override + public void onBackPressed() { + finish(); + mActivityClosed = true; + } + + public void onClose(View view){ + finish(); + mActivityClosed = true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogEnums.java new file mode 100644 index 00000000..9396d95a --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogEnums.java @@ -0,0 +1,12 @@ +package com.darkweb.genesissearchengine.appManager.orbotLogManager; + +public class orbotLogEnums +{ + /*Settings Manager*/ + public enum eOrbotLogViewCommands { + M_UPDATE_LOGS + } + + public enum eOrbotLogModelCommands { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogModel.java new file mode 100644 index 00000000..61e16565 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogModel.java @@ -0,0 +1,30 @@ +package com.darkweb.genesissearchengine.appManager.orbotLogManager; + +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.pluginManager.pluginController; +import java.util.Arrays; +import java.util.List; + +class orbotLogModel +{ + /*Variable Declaration*/ + + private eventObserver.eventListener mEvent; + + /*Initializations*/ + + orbotLogModel(eventObserver.eventListener mEvent){ + this.mEvent = mEvent; + } + + /*Helper Methods*/ + + public void onTrigger(orbotLogEnums.eOrbotLogModelCommands pCommands, List pData){ + } + + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogViewController.java new file mode 100644 index 00000000..7ed562ba --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotLogManager/orbotLogViewController.java @@ -0,0 +1,64 @@ +package com.darkweb.genesissearchengine.appManager.orbotLogManager; + +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.content.ContextCompat; + +import com.darkweb.genesissearchengine.helperManager.helperMethod; +import com.example.myapplication.R; +import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.List; + +class orbotLogViewController +{ + /*Private Variables*/ + + private AppCompatActivity mContext; + private TextView mLogs; + + /*Initializations*/ + + orbotLogViewController(AppCompatActivity pContext, TextView pLogs) + { + this.mContext = pContext; + this.mLogs = pLogs; + + initPostUI(); + } + + private void initPostUI(){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = mContext.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + } + else { + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); + } + } + } + + + private void onUpdateLogs(String pLogs){ + mLogs.append("\n\n~ " + (pLogs)); + } + + public void onTrigger(orbotLogEnums.eOrbotLogViewCommands pCommands, List pData){ + if(pCommands.equals(orbotLogEnums.eOrbotLogViewCommands.M_UPDATE_LOGS)){ + onUpdateLogs((String) pData.get(0)); + } + + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotController.java index 93640a10..07f8946e 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotController.java @@ -7,25 +7,25 @@ import androidx.appcompat.app.AppCompatActivity; import com.darkweb.genesissearchengine.appManager.activityContextManager; import com.darkweb.genesissearchengine.appManager.bridgeManager.bridgeController; import com.darkweb.genesissearchengine.constants.constants; -import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.status; -import com.darkweb.genesissearchengine.dataManager.dataController; -import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.darkweb.genesissearchengine.pluginManager.pluginController; import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; - import java.util.Arrays; import java.util.Collections; +import java.util.List; public class orbotController extends AppCompatActivity { /* PRIVATE VARIABLES */ + private com.darkweb.genesissearchengine.appManager.orbotManager.orbotModel mOrbotModel; + private com.darkweb.genesissearchengine.appManager.orbotManager.orbotViewController mOrbotViewController; private SwitchMaterial mBridgeSwitch; private SwitchMaterial mVpnSwitch; - private orbotViewController mOrbotViewController; private LinearLayout mCustomizableBridgeMenu; /* INITIALIZATIONS */ @@ -44,18 +44,24 @@ public class orbotController extends AppCompatActivity { mVpnSwitch = findViewById(R.id.pVpnSwitch); mCustomizableBridgeMenu = findViewById(R.id.pCustomizableBridgeMenu); - mOrbotViewController = new orbotViewController(mBridgeSwitch, mVpnSwitch, this, mCustomizableBridgeMenu); - mOrbotViewController.onTrigger(orbotEnums.eOrbotViewCommands.S_INIT_UI, Arrays.asList(status.sBridgeVPNStatus,status.sBridgeStatus)); + mOrbotViewController = new com.darkweb.genesissearchengine.appManager.orbotManager.orbotViewController(mBridgeSwitch, mVpnSwitch, this, mCustomizableBridgeMenu); + mOrbotViewController.onTrigger(orbotEnums.eOrbotViewCommands.M_INIT_UI, Arrays.asList(status.sBridgeVPNStatus,status.sBridgeStatus)); + mOrbotModel = new com.darkweb.genesissearchengine.appManager.orbotManager.orbotModel(new orbotModelCallback()); } /* LISTENERS */ + public class orbotModelCallback implements eventObserver.eventListener{ + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } public void onBridgeSwitch(View view){ - status.sBridgeStatus = !mBridgeSwitch.isChecked(); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.BRIDGE_BRIDGE_ENABLES,status.sBridgeStatus)); - pluginController.getInstance().updateBridges(status.sBridgeStatus); - mOrbotViewController.onTrigger(orbotEnums.eOrbotViewCommands.S_UPDATE_BRIDGE_SETTINGS_VIEWS, Collections.singletonList(status.sBridgeStatus)); + mOrbotModel.onTrigger(orbotEnums.eOrbotModelCommands.M_BRIDGE_SWITCH,Collections.singletonList(!mBridgeSwitch.isChecked())); + mOrbotViewController.onTrigger(orbotEnums.eOrbotViewCommands.M_UPDATE_BRIDGE_SETTINGS_VIEWS, Collections.singletonList(status.sBridgeStatus)); } public void openBridgeSettings(View view){ @@ -63,10 +69,8 @@ public class orbotController extends AppCompatActivity { } public void onVPNSwitch(View view){ - status.sBridgeVPNStatus = !mVpnSwitch.isChecked(); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.BRIDGE_VPN_ENABLED,status.sBridgeVPNStatus)); - mOrbotViewController.updateVPN(status.sBridgeVPNStatus); - pluginController.getInstance().updateVPN(status.sBridgeVPNStatus); + mOrbotModel.onTrigger(orbotEnums.eOrbotModelCommands.M_VPN_SWITCH,Collections.singletonList(!mVpnSwitch.isChecked())); + mOrbotViewController.onTrigger(orbotEnums.eOrbotViewCommands.M_UPDATE_VPN,Collections.singletonList(status.sBridgeVPNStatus)); } /* LOCAL OVERRIDES */ @@ -75,7 +79,7 @@ public class orbotController extends AppCompatActivity { public void onResume() { activityContextManager.getInstance().setCurrentActivity(this); - mOrbotViewController.onTrigger(orbotEnums.eOrbotViewCommands.S_INIT_POST_UI,null); + mOrbotViewController.onTrigger(orbotEnums.eOrbotViewCommands.M_INIT_POST_UI,null); super.onResume(); } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotEnums.java index 49d981ea..fecf8a8b 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotEnums.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotEnums.java @@ -4,6 +4,10 @@ public class orbotEnums { /*Settings Manager*/ public enum eOrbotViewCommands { - S_UPDATE_BRIDGE_SETTINGS_VIEWS, S_INIT_POST_UI, S_INIT_UI + M_UPDATE_BRIDGE_SETTINGS_VIEWS, M_INIT_POST_UI, M_INIT_UI, M_UPDATE_VPN, M_UPDATE_BRIDGES + } + + public enum eOrbotModelCommands { + M_BRIDGE_SWITCH, M_VPN_SWITCH } } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotModel.java new file mode 100644 index 00000000..a0b08c85 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotModel.java @@ -0,0 +1,49 @@ +package com.darkweb.genesissearchengine.appManager.orbotManager; + +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.pluginManager.pluginController; +import java.util.Arrays; +import java.util.List; + +class orbotModel +{ + /*Variable Declaration*/ + + private eventObserver.eventListener mEvent; + + /*Initializations*/ + + orbotModel(eventObserver.eventListener mEvent){ + this.mEvent = mEvent; + } + + /*Helper Methods*/ + + public void onBridgeSwitch(boolean pStatus){ + status.sBridgeStatus = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.BRIDGE_BRIDGE_ENABLES,status.sBridgeStatus)); + pluginController.getInstance().updateBridges(status.sBridgeStatus); + } + + public void onVPNSwitch(boolean pStatus){ + status.sBridgeVPNStatus = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.BRIDGE_VPN_ENABLED,status.sBridgeVPNStatus)); + pluginController.getInstance().updateVPN(status.sBridgeVPNStatus); + } + + + public void onTrigger(com.darkweb.genesissearchengine.appManager.orbotManager.orbotEnums.eOrbotModelCommands pCommands, List pData){ + if(pCommands == com.darkweb.genesissearchengine.appManager.orbotManager.orbotEnums.eOrbotModelCommands.M_BRIDGE_SWITCH){ + onBridgeSwitch((boolean) pData.get(0)); + } + else if(pCommands == com.darkweb.genesissearchengine.appManager.orbotManager.orbotEnums.eOrbotModelCommands.M_VPN_SWITCH){ + onVPNSwitch((boolean) pData.get(0)); + } + } + + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotViewController.java index 2fdc40eb..86bdc0c9 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/orbotManager/orbotViewController.java @@ -6,7 +6,9 @@ import android.view.Window; import android.view.WindowManager; import android.widget.LinearLayout; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; + import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; import java.util.List; @@ -41,34 +43,36 @@ class orbotViewController window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } - private void bridgeSettingsStatus(boolean p_status){ - updateBridgeViews(p_status, true); + private void bridgeSettingsStatus(boolean pStatus){ + updateBridgeViews(pStatus, true); } - public void updateVPN(boolean p_status){ - mVpnSwitch.setChecked(p_status); + private void updateVPN(boolean pStatus){ + mVpnSwitch.setChecked(pStatus); } - public void updateBridgeViews(boolean p_status,boolean p_is_invoked){ - mBridgeSwitch.setChecked(p_status); - if(p_status){ + private void updateBridgeViews(boolean pStatus,boolean pIsInvoked){ + mBridgeSwitch.setChecked(pStatus); + if(pStatus){ mCustomizableBridgeMenu.setClickable(true); mCustomizableBridgeMenu.setAlpha(0); mCustomizableBridgeMenu.setVisibility(View.VISIBLE); - if(p_is_invoked){ + if(pIsInvoked){ mCustomizableBridgeMenu.animate().alpha(1); }else { mCustomizableBridgeMenu.setAlpha(1); } }else { mCustomizableBridgeMenu.setClickable(false); - if(p_is_invoked){ + if(pIsInvoked){ mCustomizableBridgeMenu.animate().alpha(0).withEndAction(() -> mCustomizableBridgeMenu.setVisibility(View.GONE)); }else { mCustomizableBridgeMenu.setAlpha(0); @@ -77,20 +81,26 @@ class orbotViewController } } - private void initViews(boolean p_vpn_status, boolean p_gateway_status){ - updateBridgeViews(p_gateway_status, false); - updateVPN(p_vpn_status); + private void initViews(boolean pVPNStatus, boolean pGatewayStatus){ + updateBridgeViews(pGatewayStatus, false); + updateVPN(pVPNStatus); } - public void onTrigger(orbotEnums.eOrbotViewCommands p_commands, List p_data){ - if(p_commands == orbotEnums.eOrbotViewCommands.S_UPDATE_BRIDGE_SETTINGS_VIEWS){ - bridgeSettingsStatus((boolean) p_data.get(0)); + public void onTrigger(orbotEnums.eOrbotViewCommands pCommands, List pData){ + if(pCommands == orbotEnums.eOrbotViewCommands.M_UPDATE_BRIDGE_SETTINGS_VIEWS){ + bridgeSettingsStatus((boolean) pData.get(0)); } - else if(p_commands == orbotEnums.eOrbotViewCommands.S_INIT_POST_UI){ + else if(pCommands == orbotEnums.eOrbotViewCommands.M_INIT_POST_UI){ initPostUI(); } - else if(p_commands == orbotEnums.eOrbotViewCommands.S_INIT_UI){ - initViews((boolean)p_data.get(0),(boolean) p_data.get(1)); + else if(pCommands == orbotEnums.eOrbotViewCommands.M_INIT_UI){ + initViews((boolean)pData.get(0),(boolean) pData.get(1)); + } + else if(pCommands == orbotEnums.eOrbotViewCommands.M_UPDATE_VPN){ + updateVPN((boolean) pData.get(0)); + } + else if(pCommands == orbotEnums.eOrbotViewCommands.M_UPDATE_BRIDGES){ + updateBridgeViews((boolean) pData.get(1), (boolean) pData.get(1)); } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityController.java index 7de6554a..9cbc23b8 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityController.java @@ -4,9 +4,9 @@ import android.os.Bundle; import android.view.View; import android.widget.SeekBar; import android.widget.TextView; - import androidx.appcompat.app.AppCompatActivity; import com.darkweb.genesissearchengine.appManager.activityContextManager; +import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; @@ -16,8 +16,8 @@ import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.pluginManager.pluginController; import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; - import java.util.Arrays; +import java.util.Collections; import java.util.List; public class settingAccessibilityController extends AppCompatActivity { @@ -27,7 +27,6 @@ public class settingAccessibilityController extends AppCompatActivity { private settingAccessibilityViewController mSettingAccessibilityViewController; private SwitchMaterial mZoom; private SwitchMaterial mVoiceInput; - private SwitchMaterial mFontSizeAdjustable; private SeekBar mSeekBar; private TextView mSeekBarSample; private TextView mScalePercentage; @@ -45,12 +44,11 @@ public class settingAccessibilityController extends AppCompatActivity { public void viewsInitializations() { mZoom = findViewById(R.id.pZoom); mVoiceInput = findViewById(R.id.pVoiceInput); - mFontSizeAdjustable = findViewById(R.id.pFontSizeAdjustable); mSeekBar = findViewById(R.id.pSeekBar); mSeekBarSample = findViewById(R.id.pSeekBarSample); mScalePercentage = findViewById(R.id.pScalePercentage); - mSettingAccessibilityViewController = new settingAccessibilityViewController(this, new settingAccessibilityController.settingAccessibilityViewCallback(), mZoom, mVoiceInput, mFontSizeAdjustable, mSeekBar, mSeekBarSample, mScalePercentage); + mSettingAccessibilityViewController = new settingAccessibilityViewController(this, new settingAccessibilityController.settingAccessibilityViewCallback(), mZoom, mVoiceInput, mSeekBar, mSeekBarSample, mScalePercentage); mSettingAccessibilityModel = new settingAccessibilityModel(new settingAccessibilityController.settingAccessibilityModelCallback()); } @@ -88,8 +86,9 @@ public class settingAccessibilityController extends AppCompatActivity { @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { int percentage = ((progress+5)*10); - mSeekBarSample.setTextSize((int)((12.0*percentage)/100)); - mScalePercentage.setText(percentage+"%"); + mSettingAccessibilityViewController.onTrigger(settingAccessibilityEnums.eAccessibilityModel.M_UPDATE_SAMPLE_TEXT, Collections.singletonList((int)((12.0*percentage)/100))); + mSettingAccessibilityViewController.onTrigger(settingAccessibilityEnums.eAccessibilityModel.M_UPDATE_PERCENTAGE, Collections.singletonList((percentage+ constants.CONST_PERCENTAGE_SIGN))); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_FONT_SIZE,percentage)); status.sSettingFontSize = percentage; activityContextManager.getInstance().getHomeController().onLoadFont(); @@ -123,25 +122,13 @@ public class settingAccessibilityController extends AppCompatActivity { } public void onZoomSettingUpdate(View view){ - mSettingAccessibilityModel.onZoomSettingUpdate(!mZoom.isChecked()); + mSettingAccessibilityModel.onTrigger(settingAccessibilityEnums.eAccessibilityViewController.M_ZOOM_SETTING, Collections.singletonList(!mZoom.isChecked())); mZoom.toggle(); } public void onVoiceInputSettingUpdate(View view){ - mSettingAccessibilityModel.onVoiceInputSettingUpdate(!mVoiceInput.isChecked()); + mSettingAccessibilityModel.onTrigger(settingAccessibilityEnums.eAccessibilityViewController.M_VOICE_INPUT_SETTING, Collections.singletonList(!mVoiceInput.isChecked())); mVoiceInput.toggle(); } - public void onFontSizeAdjustableUpdate(View view){ - mSettingAccessibilityModel.onFontSizeAdjustableUpdate(!mFontSizeAdjustable.isChecked()); - mFontSizeAdjustable.toggle(); - - if(!mFontSizeAdjustable.isChecked()){ - mSettingAccessibilityViewController.enableFontManual(); - }else { - mSettingAccessibilityViewController.disableFontManual(); - } - activityContextManager.getInstance().getHomeController().onLoadFont(); - } - } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityEnums.java new file mode 100644 index 00000000..cba7234c --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityEnums.java @@ -0,0 +1,14 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.accessibilityManager; + +class settingAccessibilityEnums +{ + /*History Manager*/ + public enum eAccessibilityModel { + M_UPDATE_SAMPLE_TEXT, M_UPDATE_PERCENTAGE + } + + public enum eAccessibilityViewController { + M_ZOOM_SETTING, M_VOICE_INPUT_SETTING + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityModel.java index 449585a7..c11cb748 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityModel.java @@ -1,14 +1,12 @@ package com.darkweb.genesissearchengine.appManager.settingManager.accessibilityManager; -import android.view.View; - import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.dataManager.dataController; import com.darkweb.genesissearchengine.dataManager.dataEnums; import com.darkweb.genesissearchengine.helperManager.eventObserver; - import java.util.Arrays; +import java.util.List; class settingAccessibilityModel { @@ -24,21 +22,24 @@ class settingAccessibilityModel /*Helper Methods*/ - public void onZoomSettingUpdate(boolean pStatus){ + private void onZoomSettingUpdate(boolean pStatus){ status.sSettingEnableZoom = pStatus; dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_ZOOM,pStatus)); } - public void onVoiceInputSettingUpdate(boolean pStatus){ + private void onVoiceInputSettingUpdate(boolean pStatus){ status.sSettingEnableVoiceInput = pStatus; dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_VOICE_INPUT,pStatus)); } - public void onFontSizeAdjustableUpdate(boolean pStatus){ - status.sSettingFontAdjustable = pStatus; - status.sSettingFontSize = 5; - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_FONT_ADJUSTABLE,pStatus)); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_FONT_SIZE,(int)status.sSettingFontSize)); + public Object onTrigger(settingAccessibilityEnums.eAccessibilityViewController pCommands, List pData){ + if(pCommands.equals(settingAccessibilityEnums.eAccessibilityViewController.M_ZOOM_SETTING)){ + onZoomSettingUpdate((boolean)pData.get(0)); + } + else if(pCommands.equals(settingAccessibilityEnums.eAccessibilityViewController.M_VOICE_INPUT_SETTING)){ + onVoiceInputSettingUpdate((boolean)pData.get(0)); + } + return null; } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityViewController.java index cf67fec2..b497c503 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/accessibilityManager/settingAccessibilityViewController.java @@ -6,14 +6,15 @@ import android.view.Window; import android.view.WindowManager; import android.widget.SeekBar; import android.widget.TextView; - import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; - +import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.List; class settingAccessibilityViewController { @@ -24,20 +25,18 @@ class settingAccessibilityViewController private SwitchMaterial mZoom; private SwitchMaterial mVoiceInput; - private SwitchMaterial mFontSizeAdjustable; private SeekBar mSeekBar; private TextView mSeekBarSample; private TextView mScalePercentage; /*Initializations*/ - settingAccessibilityViewController(settingAccessibilityController pContext, eventObserver.eventListener pEvent, SwitchMaterial pZoom, SwitchMaterial pVoiceInput, SwitchMaterial pFontSizeAdjustable, SeekBar pSeekBar, TextView mSeekBarSample, TextView pScalePercentage) + settingAccessibilityViewController(settingAccessibilityController pContext, eventObserver.eventListener pEvent, SwitchMaterial pZoom, SwitchMaterial pVoiceInput, SeekBar pSeekBar, TextView mSeekBarSample, TextView pScalePercentage) { this.mEvent = pEvent; this.mContext = pContext; this.mZoom = pZoom; this.mVoiceInput = pVoiceInput; - this.mFontSizeAdjustable = pFontSizeAdjustable; this.mSeekBar = pSeekBar; this.mSeekBarSample = mSeekBarSample; this.mScalePercentage = pScalePercentage; @@ -55,8 +54,10 @@ class settingAccessibilityViewController window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } @@ -73,50 +74,38 @@ class settingAccessibilityViewController }else { mVoiceInput.setChecked(false); } - if(status.sSettingFontAdjustable){ - mFontSizeAdjustable.setChecked(true); - mSeekBar.setProgress(5); - mScalePercentage.setText("100%"); - mSeekBar.setEnabled(false); - mSeekBar.setAlpha(0.5f); - mScalePercentage.setAlpha(0.5f); - mSeekBarSample.setAlpha(0.3f); - disableFontManual(); - }else { - mFontSizeAdjustable.setChecked(false); - mSeekBar.setProgress((int)status.sSettingFontSize/10-5); - int percentage = (int)status.sSettingFontSize; - if(status.sSettingFontSize<100){ - mSeekBarSample.setTextSize((int)(12.0*percentage)/100); - }else if(status.sSettingFontSize>100){ - mSeekBarSample.setTextSize((int)(12.0*percentage)/100); - } - mScalePercentage.setText(percentage+"%"); - mSeekBar.setAlpha(1f); - mScalePercentage.setAlpha(1f); - mSeekBarSample.setAlpha(1f); - mSeekBar.setEnabled(true); + mSeekBar.setProgress((int)status.sSettingFontSize/10-5); + float percentage = status.sSettingFontSize; + if(status.sSettingFontSize<100){ + mSeekBarSample.setTextSize((int)((12*percentage)/100)); + }else if(status.sSettingFontSize>100){ + mSeekBarSample.setTextSize((int)((12*percentage)/100)); } - } - public void disableFontManual(){ - mSeekBar.setProgress(5); - mSeekBarSample.setTextSize(12); - mScalePercentage.setText("100%"); - mSeekBar.setEnabled(false); - mSeekBar.animate().setDuration(250).alpha(0.5f); - mScalePercentage.animate().setDuration(250).alpha(0.5f); - mSeekBarSample.animate().setDuration(250).alpha(0.3f); - } - - public void enableFontManual(){ - mSeekBar.setProgress(5); - mSeekBarSample.setTextSize(12); - mScalePercentage.setText("100%"); + mScalePercentage.setText(((int)percentage + constants.CONST_PERCENTAGE_SIGN)); + mSeekBar.setAlpha(1f); + mScalePercentage.setAlpha(1f); + mSeekBarSample.setAlpha(1f); mSeekBar.setEnabled(true); - mSeekBar.animate().setDuration(250).alpha(1f); - mScalePercentage.animate().setDuration(250).alpha(1f); - mSeekBarSample.animate().setDuration(250).alpha(1f); } + + private void updateSampleTextSize(int pText){ + mSeekBarSample.setTextSize(pText); + } + + private void updatePercentage(String pText){ + mScalePercentage.setText(pText); + } + + public Object onTrigger(settingAccessibilityEnums.eAccessibilityModel pCommands, List pData){ + if(pCommands.equals(settingAccessibilityEnums.eAccessibilityModel.M_UPDATE_SAMPLE_TEXT)){ + updateSampleTextSize((int)pData.get(0)); + } + else if(pCommands.equals(settingAccessibilityEnums.eAccessibilityModel.M_UPDATE_PERCENTAGE)){ + updatePercentage((String)pData.get(0)); + } + return null; + } + } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceController.java new file mode 100644 index 00000000..8f2eace5 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceController.java @@ -0,0 +1,132 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.advanceManager; + +import android.os.Bundle; +import android.view.View; +import android.widget.RadioButton; +import androidx.appcompat.app.AppCompatActivity; +import com.darkweb.genesissearchengine.appManager.activityContextManager; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.pluginManager.pluginController; +import com.example.myapplication.R; +import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class settingAdvanceController extends AppCompatActivity { + + /* PRIVATE VARIABLES */ + private settingAdvanceModel mSettingAdvanceModel; + private settingAdvanceViewController mSettingAdvanceViewController; + private SwitchMaterial mRestoreTabs; + private SwitchMaterial mShowWebFonts; + private SwitchMaterial mAllowAutoPlay; + private ArrayList mImageOption = new ArrayList<>(); + private boolean mIsChanged = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + pluginController.getInstance().onCreate(this); + super.onCreate(savedInstanceState); + setContentView(R.layout.setting_advance_view); + + viewsInitializations(); + } + + public void viewsInitializations() { + mRestoreTabs = findViewById(R.id.pRestoreTabs); + mShowWebFonts = findViewById(R.id.pShowWebFonts); + mAllowAutoPlay = findViewById(R.id.pAllowAutoPlay); + mImageOption.add(findViewById(R.id.pAdvanceImageOption1)); + mImageOption.add(findViewById(R.id.pAdvanceImageOption2)); + + mSettingAdvanceViewController = new settingAdvanceViewController(this, new settingAdvanceViewCallback(), mRestoreTabs, mShowWebFonts, mAllowAutoPlay, mImageOption); + mSettingAdvanceModel = new settingAdvanceModel(new settingAdvanceModelCallback()); + } + + /* LISTENERS */ + public class settingAdvanceViewCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + + public class settingAdvanceModelCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + /* LOCAL OVERRIDES */ + + @Override + public void onResume() + { + activityContextManager.getInstance().setCurrentActivity(this); + super.onResume(); + + int notificationStatus = pluginController.getInstance().getNotificationStatus(); + if(notificationStatus==0){ + pluginController.getInstance().disableTorNotification(); + } else if(notificationStatus==1){ + pluginController.getInstance().enableTorNotification(); + } + } + + @Override + public void onPause() + { + super.onPause(); + } + + @Override + public void onBackPressed() { + if(mIsChanged){ + pluginController.getInstance().updatePrivacy(); + activityContextManager.getInstance().getHomeController().initRuntimeSettings(); + } + finish(); + } + + /*UI Redirection*/ + + public void onClose(View view){ + if(mIsChanged){ + pluginController.getInstance().updatePrivacy(); + activityContextManager.getInstance().getHomeController().initRuntimeSettings(); + } + finish(); + } + + public void onRestoreTabs(View view) { + mSettingAdvanceModel.onTrigger(settingAdvanceEnums.eAdvanceModel.M_RESTORE_TAB, Collections.singletonList(!mRestoreTabs.isChecked())); + mRestoreTabs.toggle(); + } + + public void onShowImages(View view) { + mIsChanged = true; + mSettingAdvanceViewController.onTrigger(settingAdvanceEnums.eAdvanceViewController.M_CLEAR_IMAGE, Collections.singletonList(null)); + mSettingAdvanceModel.onTrigger(settingAdvanceEnums.eAdvanceModel.M_SHOW_IMAGE, Collections.singletonList(view)); + mSettingAdvanceViewController.onTrigger(settingAdvanceEnums.eAdvanceViewController.M_SET_IMAGE, Collections.singletonList(view)); + } + + public void onShowWebFonts(View view) { + mIsChanged = true; + mSettingAdvanceModel.onTrigger(settingAdvanceEnums.eAdvanceModel.M_SHOW_WEB_FONTS, Collections.singletonList(!mShowWebFonts.isChecked())); + mShowWebFonts.toggle(); + } + + public void onAllowAutoPlay(View view) { + mIsChanged = true; + mSettingAdvanceModel.onTrigger(settingAdvanceEnums.eAdvanceModel.M_ALLOW_AUTOPLAY, Collections.singletonList(!mAllowAutoPlay.isChecked())); + mAllowAutoPlay.toggle(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceEnums.java new file mode 100644 index 00000000..52d607d0 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceEnums.java @@ -0,0 +1,14 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.advanceManager; + +class settingAdvanceEnums +{ + /*History Manager*/ + public enum eAdvanceModel { + M_RESTORE_TAB, M_SHOW_IMAGE, M_SHOW_WEB_FONTS, M_ALLOW_AUTOPLAY + } + + public enum eAdvanceViewController { + M_CLEAR_IMAGE, M_SET_IMAGE + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceModel.java new file mode 100644 index 00000000..b5b6b31e --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceModel.java @@ -0,0 +1,71 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.advanceManager; + +import android.view.View; + +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.example.myapplication.R; +import java.util.Arrays; +import java.util.List; + +class settingAdvanceModel +{ + /*Variable Declaration*/ + + private eventObserver.eventListener mEvent; + + /*Initializations*/ + + settingAdvanceModel(eventObserver.eventListener mEvent){ + this.mEvent = mEvent; + } + + /*Helper Methods*/ + + private void onRestoreTabs(boolean pStatus) { + status.sRestoreTabs = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_RESTORE_TAB,pStatus)); + } + + private void onShowImages(View pView) { + + if(pView.getId() == R.id.pAdvanceOption1){ + status.sShowImages = 0; + } + else if(pView.getId() == R.id.pAdvanceOption2){ + status.sShowImages = 2; + } + + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_SHOW_IMAGES,status.sShowImages)); + } + + private void onShowWebFonts(boolean pStatus) { + status.sShowWebFonts = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_SHOW_FONTS,pStatus)); + } + + private void onAllowAutoPlay(boolean pStatus) { + status.sAutoPlay = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_AUTO_PLAY,pStatus)); + } + + public Object onTrigger(settingAdvanceEnums.eAdvanceModel pCommands, List pData){ + if(pCommands.equals(settingAdvanceEnums.eAdvanceModel.M_RESTORE_TAB)){ + onRestoreTabs((boolean)pData.get(0)); + } + else if(pCommands.equals(settingAdvanceEnums.eAdvanceModel.M_SHOW_IMAGE)){ + onShowImages((View)pData.get(0)); + } + else if(pCommands.equals(settingAdvanceEnums.eAdvanceModel.M_SHOW_WEB_FONTS)){ + onShowWebFonts((boolean)pData.get(0)); + } + else if(pCommands.equals(settingAdvanceEnums.eAdvanceModel.M_ALLOW_AUTOPLAY)){ + onAllowAutoPlay((boolean)pData.get(0)); + } + return null; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceViewController.java new file mode 100644 index 00000000..fb574357 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/advanceManager/settingAdvanceViewController.java @@ -0,0 +1,125 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.advanceManager; + +import android.content.res.ColorStateList; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.RadioButton; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.content.ContextCompat; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.example.myapplication.R; +import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.ArrayList; +import java.util.List; + +class settingAdvanceViewController +{ + /*Private Variables*/ + + private eventObserver.eventListener mEvent; + private AppCompatActivity mContext; + + private SwitchMaterial mRestoreTabs; + private SwitchMaterial mShowWebFonts; + private SwitchMaterial mAllowAutoPlay; + private ArrayList mImageOption; + + /*Initializations*/ + + settingAdvanceViewController(settingAdvanceController pContext, eventObserver.eventListener pEvent, SwitchMaterial pRestoreTabs, SwitchMaterial pShowWebFonts, SwitchMaterial pAllowAutoPlay, ArrayList pImageOption) + { + this.mEvent = pEvent; + this.mContext = pContext; + this.mRestoreTabs = pRestoreTabs; + this.mShowWebFonts = pShowWebFonts; + this.mAllowAutoPlay = pAllowAutoPlay; + this.mImageOption = pImageOption; + + initViews(); + initPostUI(); + } + + private void initViews() + { + if(status.sRestoreTabs){ + mRestoreTabs.setChecked(true); + }else { + mRestoreTabs.setChecked(false); + } + + if(status.sShowWebFonts){ + mShowWebFonts.setChecked(true); + }else { + mShowWebFonts.setChecked(false); + } + + if(status.sAutoPlay){ + mAllowAutoPlay.setChecked(true); + }else { + mAllowAutoPlay.setChecked(false); + } + + clearImageOptions(); + if(status.sShowImages == 0){ + mImageOption.get(0).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mImageOption.get(0).setChecked(true); + } + else if(status.sShowImages == 2){ + mImageOption.get(1).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mImageOption.get(1).setChecked(true); + } + } + + private void initPostUI(){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = mContext.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + } + else { + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); + } + } + } + + private void clearImageOptions(){ + mImageOption.get(0).setChecked(false); + mImageOption.get(1).setChecked(false); + mImageOption.get(0).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint_default))); + mImageOption.get(1).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint_default))); + } + + private void setImageOptions(View pView){ + clearImageOptions(); + if(pView.getId() == R.id.pAdvanceOption1){ + mImageOption.get(0).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mImageOption.get(0).setChecked(true); + } + else if(pView.getId() == R.id.pAdvanceOption2){ + mImageOption.get(1).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mImageOption.get(1).setChecked(true); + } + } + + public Object onTrigger(settingAdvanceEnums.eAdvanceViewController pCommands, List pData){ + if(pCommands.equals(settingAdvanceEnums.eAdvanceViewController.M_CLEAR_IMAGE)){ + clearImageOptions(); + } + else if(pCommands.equals(settingAdvanceEnums.eAdvanceViewController.M_SET_IMAGE)){ + setImageOptions((View) pData.get(0)); + } + return null; + } + + + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java new file mode 100644 index 00000000..a514a927 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearController.java @@ -0,0 +1,167 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.clearManager; + +import android.content.res.ColorStateList; +import android.os.Bundle; +import android.view.View; +import android.widget.CheckBox; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; + +import com.darkweb.genesissearchengine.appManager.activityContextManager; +import com.darkweb.genesissearchengine.appManager.databaseManager.databaseController; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.sql; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.pluginManager.pluginController; +import com.example.myapplication.R; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class settingClearController extends AppCompatActivity { + + /* PRIVATE VARIABLES */ + private settingClearModel mSettingClearModel; + private settingClearViewController mSettingClearViewController; + private ArrayList mCheckBoxList = new ArrayList<>(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.setting_clear_view); + + pluginController.getInstance().onCreate(this); + viewsInitializations(); + initializeListeners(); + } + + public void viewsInitializations() { + mCheckBoxList.add(findViewById(R.id.pClearChecked_1)); + mCheckBoxList.add(findViewById(R.id.pClearChecked_2)); + mCheckBoxList.add(findViewById(R.id.pClearChecked_3)); + mCheckBoxList.add(findViewById(R.id.pClearChecked_4)); + mCheckBoxList.add(findViewById(R.id.pClearChecked_6)); + mCheckBoxList.add(findViewById(R.id.pClearChecked_7)); + mCheckBoxList.add(findViewById(R.id.pClearChecked_8)); + mCheckBoxList.add(findViewById(R.id.pClearChecked_9)); + + mSettingClearViewController = new settingClearViewController(this, new settingClearController.settingClearViewCallback(), mCheckBoxList); + mSettingClearModel = new settingClearModel(new settingClearController.settingClearModelCallback()); + } + + /* LISTENERS */ + public class settingClearViewCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + + public class settingClearModelCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + public void initializeListeners(){ + } + + public void onCheckBoxTriggered(View view){ + mSettingClearViewController.onTrigger(settingClearEnums.eClearViewController.M_CHECK_INVOKE, Arrays.asList(view.getTag(),!mCheckBoxList.get(Integer.parseInt(view.getTag().toString())).isChecked())); + } + + public void onClearData(View view){ + try{ + if(mCheckBoxList.get(0).isChecked()){ + mCheckBoxList.get(0).setChecked(false); + mCheckBoxList.get(0).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + activityContextManager.getInstance().getHomeController().onClearSession(); + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_CLEAR_TAB, null); + activityContextManager.getInstance().getHomeController().initTab(false); + } + if(mCheckBoxList.get(1).isChecked()){ + mCheckBoxList.get(1).setChecked(false); + mCheckBoxList.get(1).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + databaseController.getInstance().execSQL(sql.SQL_CLEAR_HISTORY,null); + dataController.getInstance().invokeHistory(dataEnums.eHistoryCommands.M_CLEAR_HISTORY ,null); + } + if(mCheckBoxList.get(2).isChecked()){ + mCheckBoxList.get(2).setChecked(false); + mCheckBoxList.get(2).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + databaseController.getInstance().execSQL(sql.SQL_CLEAR_BOOKMARK,null); + dataController.getInstance().invokeBookmark(dataEnums.eBookmarkCommands.M_CLEAR_BOOKMARK ,null); + } + if(mCheckBoxList.get(3).isChecked()){ + mCheckBoxList.get(3).setChecked(false); + mCheckBoxList.get(3).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + activityContextManager.getInstance().getHomeController().onClearCache(); + } + if(mCheckBoxList.get(4).isChecked()){ + mCheckBoxList.get(4).setChecked(false); + mCheckBoxList.get(4).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + dataController.getInstance().invokeSuggestion(dataEnums.eSuggestionCommands.M_CLEAR_SUGGESTION ,null); + } + if(mCheckBoxList.get(5).isChecked()){ + mCheckBoxList.get(5).setChecked(false); + mCheckBoxList.get(5).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + activityContextManager.getInstance().getHomeController().onClearSiteData(); + } + if(mCheckBoxList.get(6).isChecked()){ + mCheckBoxList.get(6).setChecked(false); + mCheckBoxList.get(6).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + activityContextManager.getInstance().getHomeController().onClearSession(); + } + if(mCheckBoxList.get(7).isChecked()){ + mCheckBoxList.get(7).setChecked(false); + mCheckBoxList.get(7).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + activityContextManager.getInstance().getHomeController().onClearCookies(); + } + if(mCheckBoxList.get(8).isChecked()){ + mCheckBoxList.get(8).setChecked(false); + mCheckBoxList.get(8).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.c_checkbox_tint_default))); + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_CLEAR_PREFS, null); + status.initStatus(); + } + + activityContextManager.getInstance().getHomeController().initRuntimeSettings(); + pluginController.getInstance().MessageManagerHandler(this, null, enums.etype.data_cleared); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + + /* LOCAL OVERRIDES */ + + @Override + public void onResume() + { + activityContextManager.getInstance().setCurrentActivity(this); + super.onResume(); + } + + @Override + public void onPause() + { + super.onPause(); + } + + @Override + public void onBackPressed() { + finish(); + } + + /*UI Redirection*/ + public void onClose(View view){ + finish(); + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearEnums.java new file mode 100644 index 00000000..56b97072 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearEnums.java @@ -0,0 +1,13 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.clearManager; + +class settingClearEnums +{ + /*History Manager*/ + public enum eClearModel { + } + + public enum eClearViewController { + M_CHECK_INVOKE + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearModel.java new file mode 100644 index 00000000..0be4bc89 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearModel.java @@ -0,0 +1,20 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.clearManager; + +import com.darkweb.genesissearchengine.helperManager.eventObserver; + +class settingClearModel +{ + /*Variable Declaration*/ + + private eventObserver.eventListener mEvent; + + /*Initializations*/ + + settingClearModel(eventObserver.eventListener mEvent){ + this.mEvent = mEvent; + } + + /*Helper Methods*/ + + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearViewController.java new file mode 100644 index 00000000..f754e735 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/clearManager/settingClearViewController.java @@ -0,0 +1,74 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.clearManager; + +import android.content.res.ColorStateList; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.CheckBox; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.content.ContextCompat; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.example.myapplication.R; +import java.util.ArrayList; +import java.util.List; + +class settingClearViewController +{ + /*Private Variables*/ + + private eventObserver.eventListener mEvent; + private AppCompatActivity mContext; + private ArrayList mCheckBoxList; + + /*Initializations*/ + + settingClearViewController(settingClearController pContext, eventObserver.eventListener pEvent, ArrayList pCheckBoxList) + { + this.mEvent = pEvent; + this.mContext = pContext; + this.mCheckBoxList = pCheckBoxList; + + initViews(); + initPostUI(); + } + + private void initPostUI(){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = mContext.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + } + else { + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); + } + } + } + + private void initViews() + { + } + + private void onClearCheckbox(int pIndex, boolean pStatus){ + mCheckBoxList.get(pIndex).setChecked(pStatus); + if(pStatus){ + mCheckBoxList.get(pIndex).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_checkbox_tint))); + }else { + mCheckBoxList.get(pIndex).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_checkbox_tint_default))); + } + } + + public Object onTrigger(settingClearEnums.eClearViewController pCommands, List pData){ + if(pCommands.equals(settingClearEnums.eClearViewController.M_CHECK_INVOKE)){ + onClearCheckbox(Integer.parseInt(pData.get(0).toString()), (boolean)pData.get(1)); + } + return null; + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralController.java new file mode 100644 index 00000000..8ebf93da --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralController.java @@ -0,0 +1,170 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.generalManager; + +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +import android.widget.RadioButton; +import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import com.darkweb.genesissearchengine.appManager.activityContextManager; +import com.darkweb.genesissearchengine.appManager.languageManager.languageController; +import com.darkweb.genesissearchengine.constants.constants; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.helperManager.helperMethod; +import com.darkweb.genesissearchengine.pluginManager.pluginController; +import com.example.myapplication.R; +import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.Collections; +import java.util.List; + +public class settingGeneralController extends AppCompatActivity { + + /* PRIVATE VARIABLES */ + private settingGeneralModel mSettingGeneralModel; + private settingGeneralViewController mSettingGeneralViewController; + private SwitchMaterial mFullScreenMode; + private SwitchMaterial mOpenURLInNewTab; + private RadioButton mThemeLight; + private RadioButton mThemeDark; + private RadioButton mThemeDefault; + private TextView mHomePageText; + + @Override + protected void onCreate(Bundle savedInstanceState) { + pluginController.getInstance().onCreate(this); + onInitTheme(); + super.onCreate(savedInstanceState); + setContentView(R.layout.setting_general_view); + + viewsInitializations(); + initializeListeners(); + } + + public void viewsInitializations() { + + mFullScreenMode = findViewById(R.id.pFullScreenMode); + mThemeLight = findViewById(R.id.pThemeLight); + mThemeDark = findViewById(R.id.pThemeDark); + mThemeDefault = findViewById(R.id.pThemeDefault); + mHomePageText = findViewById(R.id.pHomePageText); + mOpenURLInNewTab = findViewById(R.id.pOpenURLInNewTab); + + mSettingGeneralViewController = new settingGeneralViewController(this, new settingGeneralViewCallback(), mFullScreenMode, mThemeLight, mThemeDark, mThemeDefault, mHomePageText, mOpenURLInNewTab); + mSettingGeneralModel = new settingGeneralModel(new settingGeneralModelCallback()); + } + + public void onInitTheme(){ + + if(status.sTheme == enums.Theme.THEME_DARK){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + }else if(status.sTheme == enums.Theme.THEME_LIGHT){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + }else { + if(!status.sDefaultNightMode){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + }else { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } + } + } + + /* LISTENERS */ + public class settingGeneralViewCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + if(enums.etype.M_RESET_THEME_INVOKED_BACK.equals(e_type)) + { + helperMethod.restartActivity(getIntent(), settingGeneralController.this); + new Handler().postDelayed(() -> { + overridePendingTransition(R.anim.fade_in, R.anim.fade_out); + activityContextManager.getInstance().getSettingController().applyTheme(); + }, 150); + } + return null; + } + } + + + public class settingGeneralModelCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + public void initializeListeners(){ + } + + /* LOCAL OVERRIDES */ + + @Override + public void onResume() + { + activityContextManager.getInstance().setCurrentActivity(this); + super.onResume(); + } + + @Override + public void onPause() + { + super.onPause(); + } + + @Override + public void onBackPressed() { + finish(); + } + + /*UI Redirection*/ + public void onClose(View view){ + finish(); + } + + public void onManageLanguage(View view) { + helperMethod.openActivity(languageController.class, constants.CONST_LIST_HISTORY, this,true); + } + + public void onFullScreenBrowsing(View view){ + mSettingGeneralModel.onTrigger(settingGeneralEnums.eGeneralModel.M_FULL_SCREEN_BROWSING, Collections.singletonList(!mFullScreenMode.isChecked())); + mFullScreenMode.toggle(); + } + + public void onSelectTheme(View view){ + if(view.getId() == R.id.pOption1){ + if(status.sTheme != enums.Theme.THEME_DARK) { + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_RESET_THEME, null); + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_SET_THEME, Collections.singletonList(enums.Theme.THEME_DARK)); + mSettingGeneralModel.onTrigger(settingGeneralEnums.eGeneralModel.M_SELECT_THEME, Collections.singletonList(enums.Theme.THEME_DARK)); + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_UPDATE_THEME_BLOCKER, Collections.singletonList(enums.Theme.THEME_DARK)); + } + }else if(view.getId() == R.id.pOption2) { + if(status.sTheme != enums.Theme.THEME_LIGHT) { + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_RESET_THEME, null); + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_SET_THEME, Collections.singletonList(enums.Theme.THEME_LIGHT)); + mSettingGeneralModel.onTrigger(settingGeneralEnums.eGeneralModel.M_SELECT_THEME, Collections.singletonList(enums.Theme.THEME_LIGHT)); + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_UPDATE_THEME_BLOCKER, Collections.singletonList(enums.Theme.THEME_LIGHT)); + } + }else { + if(status.sTheme != enums.Theme.THEME_DEFAULT) { + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_RESET_THEME, null); + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_SET_THEME, Collections.singletonList(enums.Theme.THEME_DEFAULT)); + mSettingGeneralModel.onTrigger(settingGeneralEnums.eGeneralModel.M_SELECT_THEME, Collections.singletonList(enums.Theme.THEME_DEFAULT)); + mSettingGeneralViewController.onTrigger(settingGeneralEnums.eGeneralViewController.M_UPDATE_THEME_BLOCKER, Collections.singletonList(enums.Theme.THEME_DEFAULT)); + } + } + } + + public void onURLInNewTab(View view) { + mSettingGeneralModel.onTrigger(settingGeneralEnums.eGeneralModel.M_URL_NEW_TAB, Collections.singletonList(!mOpenURLInNewTab.isChecked())); + mOpenURLInNewTab.toggle(); + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralEnums.java new file mode 100644 index 00000000..55cb43b5 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralEnums.java @@ -0,0 +1,14 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.generalManager; + +class settingGeneralEnums +{ + /*History Manager*/ + public enum eGeneralModel { + M_FULL_SCREEN_BROWSING, M_SELECT_THEME, M_URL_NEW_TAB + } + + public enum eGeneralViewController { + M_SET_THEME, M_RESET_THEME, M_UPDATE_THEME_BLOCKER + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralModel.java new file mode 100644 index 00000000..63cedc3d --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralModel.java @@ -0,0 +1,52 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.generalManager; + +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import java.util.Arrays; +import java.util.List; + +class settingGeneralModel +{ + /*Variable Declaration*/ + + private eventObserver.eventListener mEvent; + + /*Initializations*/ + + settingGeneralModel(eventObserver.eventListener mEvent){ + this.mEvent = mEvent; + } + + /*Helper Methods*/ + private void onFullScreenBrowsing(boolean pStatus){ + status.sFullScreenBrowsing = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_FULL_SCREEN_BROWSIING,pStatus)); + } + + private void onSelectThemeLight(int pStatus){ + status.sTheme = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_THEME,pStatus)); + } + + private void onURLInNewTab(boolean pStatus) { + status.sOpenURLInNewTab = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_OPEN_URL_IN_NEW_TAB,pStatus)); + } + + public Object onTrigger(settingGeneralEnums.eGeneralModel pCommands, List pData){ + if(pCommands.equals(settingGeneralEnums.eGeneralModel.M_FULL_SCREEN_BROWSING)){ + onFullScreenBrowsing((boolean)pData.get(0)); + } + else if(pCommands.equals(settingGeneralEnums.eGeneralModel.M_SELECT_THEME)){ + onSelectThemeLight((int)pData.get(0)); + } + else if(pCommands.equals(settingGeneralEnums.eGeneralModel.M_URL_NEW_TAB)){ + onURLInNewTab((boolean)pData.get(0)); + } + return null; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralViewController.java new file mode 100644 index 00000000..6a8a0f72 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/generalManager/settingGeneralViewController.java @@ -0,0 +1,140 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.generalManager; + +import android.content.res.ColorStateList; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.RadioButton; +import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.content.ContextCompat; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.helperManager.helperMethod; +import com.example.myapplication.R; +import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.Collections; +import java.util.List; + +class settingGeneralViewController +{ + /*Private Variables*/ + + private eventObserver.eventListener mEvent; + private AppCompatActivity mContext; + private SwitchMaterial mFullScreenMode; + private SwitchMaterial mOpenURLInNewTab; + private RadioButton mThemeLight; + private RadioButton mThemeDark; + private RadioButton mThemeDefault; + private TextView mHomePageText; + + /*Initializations*/ + + + settingGeneralViewController(settingGeneralController pContext, eventObserver.eventListener pEvent, SwitchMaterial pFullScreenMode, RadioButton pThemeLight, RadioButton pThemeDark, RadioButton pThemeDefault, TextView pHomePageText, SwitchMaterial pOpenURLInNewTab) + { + this.mEvent = pEvent; + this.mContext = pContext; + this.mFullScreenMode = pFullScreenMode; + this.mThemeLight = pThemeLight; + this.mThemeDark = pThemeDark; + this.mThemeDefault = pThemeDefault; + this.mHomePageText = pHomePageText; + this.mOpenURLInNewTab = pOpenURLInNewTab; + + initViews(); + initPostUI(); + } + + + private void initPostUI(){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = mContext.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + } + else { + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); + } + } + } + + private void initViews() + { + resetThemeSelection(); + + if(status.sTheme == enums.Theme.THEME_LIGHT){ + mThemeLight.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mThemeLight.setChecked(true); + }else if(status.sTheme == enums.Theme.THEME_DARK){ + mThemeDark.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mThemeDark.setChecked(true); + }else{ + mThemeDefault.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mThemeDefault.setChecked(true); + } + + if(status.sFullScreenBrowsing){ + mFullScreenMode.setChecked(true); + }else { + mFullScreenMode.setChecked(false); + } + + if(status.sOpenURLInNewTab){ + mOpenURLInNewTab.setChecked(true); + }else { + mOpenURLInNewTab.setChecked(false); + } + + mHomePageText.setText(helperMethod.getDomainName(status.sSettingSearchStatus)); + } + + private void updateThemeChanger(int pStatus){ + mEvent.invokeObserver(Collections.singletonList(status.sTheme), enums.etype.M_RESET_THEME_INVOKED_BACK); + } + + private void resetThemeSelection(){ + mThemeDark.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint_default))); + mThemeLight.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint_default))); + mThemeDefault.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint_default))); + mThemeDark.setChecked(false); + mThemeLight.setChecked(false); + mThemeDefault.setChecked(false); + } + + private void setThemeLight(int pTheme){ + if(pTheme == enums.Theme.THEME_LIGHT){ + mThemeLight.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mThemeLight.setChecked(true); + }else if(pTheme == enums.Theme.THEME_DARK){ + mThemeDark.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mThemeDark.setChecked(true); + }else{ + mThemeDefault.setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mThemeDefault.setChecked(true); + } + } + + public Object onTrigger(settingGeneralEnums.eGeneralViewController pCommands, List pData){ + if(pCommands.equals(settingGeneralEnums.eGeneralViewController.M_SET_THEME)){ + setThemeLight((int)pData.get(0)); + } + else if(pCommands.equals(settingGeneralEnums.eGeneralViewController.M_RESET_THEME)){ + resetThemeSelection(); + } + else if(pCommands.equals(settingGeneralEnums.eGeneralViewController.M_UPDATE_THEME_BLOCKER)){ + updateThemeChanger((int)pData.get(0)); + } + return null; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationController.java index 66ab5bde..7b09b22f 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationController.java @@ -1,16 +1,16 @@ package com.darkweb.genesissearchengine.appManager.settingManager.notificationManager; -import android.content.Intent; import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; import com.darkweb.genesissearchengine.appManager.activityContextManager; import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.darkweb.genesissearchengine.pluginManager.pluginController; import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; - +import java.util.Collections; import java.util.List; public class settingNotificationController extends AppCompatActivity { @@ -90,14 +90,11 @@ public class settingNotificationController extends AppCompatActivity { } public void onOpenNotificationSettings(View view){ - Intent intent = new Intent(); - intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); - intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName()); - startActivity(intent); + helperMethod.openNotification(this); } public void onSaveLocalNotificationSettings(View view){ - mSettingNotificationModel.updateLocalNotification(!mNotificationManual.isChecked()); + mSettingNotificationModel.onTrigger(settingNotificationEnums.eNotificationModel.M_UPDATE_LOCAL_NOTIFICATION, Collections.singletonList(!mNotificationManual.isChecked())); mNotificationManual.toggle(); } } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationEnums.java new file mode 100644 index 00000000..77599c2e --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationEnums.java @@ -0,0 +1,14 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.notificationManager; + +class settingNotificationEnums +{ + /*History Manager*/ + public enum eNotificationModel { + M_UPDATE_LOCAL_NOTIFICATION + } + + public enum eNotificationViewController { + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationModel.java index 81347f0b..8f8a4d33 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationModel.java @@ -1,18 +1,13 @@ package com.darkweb.genesissearchengine.appManager.settingManager.notificationManager; -import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; -import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.dataManager.dataController; import com.darkweb.genesissearchengine.dataManager.dataEnums; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.pluginManager.pluginController; - import java.util.Arrays; -import java.util.Collections; - -import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_FIRST_PARTY; +import java.util.List; class settingNotificationModel { @@ -29,7 +24,7 @@ class settingNotificationModel /*Helper Methods*/ - public void updateLocalNotification(boolean pStatus){ + private void updateLocalNotification(boolean pStatus){ int mStatus = pStatus ? 1 : 0; status.sBridgeNotificationManual = mStatus; @@ -46,5 +41,11 @@ class settingNotificationModel } } + public Object onTrigger(settingNotificationEnums.eNotificationModel pCommands, List pData){ + if(pCommands.equals(settingNotificationEnums.eNotificationModel.M_UPDATE_LOCAL_NOTIFICATION)){ + updateLocalNotification((boolean)pData.get(0)); + } + return null; + } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationViewController.java index 1209ea31..6dbd0860 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/notificationManager/settingNotificationViewController.java @@ -1,28 +1,19 @@ package com.darkweb.genesissearchengine.appManager.settingManager.notificationManager; -import android.annotation.SuppressLint; import android.os.Build; import android.view.View; import android.view.Window; import android.view.WindowManager; -import android.widget.SeekBar; -import android.widget.Spinner; -import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; -import com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage.settingController; -import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.status; -import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; -import static com.darkweb.genesissearchengine.constants.status.sSettingHistoryStatus; -import static com.darkweb.genesissearchengine.constants.status.sSettingJavaStatus; - class settingNotificationViewController { /*Private Variables*/ @@ -62,8 +53,10 @@ class settingNotificationViewController window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyController.java new file mode 100644 index 00000000..5b4732e8 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyController.java @@ -0,0 +1,138 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.privacyManager; + +import android.os.Bundle; +import android.view.View; +import android.widget.RadioButton; +import androidx.appcompat.app.AppCompatActivity; +import com.darkweb.genesissearchengine.appManager.activityContextManager; +import com.darkweb.genesissearchengine.constants.enums; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.darkweb.genesissearchengine.pluginManager.pluginController; +import com.example.myapplication.R; +import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class settingPrivacyController extends AppCompatActivity { + + /* PRIVATE VARIABLES */ + private settingPrivacyModel mSettingPrivacyModel; + private settingPrivacyViewController mSettingPrivacyViewController; + private SwitchMaterial mJavaScript; + private SwitchMaterial mDoNotTrack; + private SwitchMaterial mTrackingProtection; + private SwitchMaterial mClearDataOnExit; + private ArrayList mCookie = new ArrayList<>(); + private boolean mSettingChanged = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + pluginController.getInstance().onCreate(this); + super.onCreate(savedInstanceState); + setContentView(R.layout.setting_privacy_view); + + viewsInitializations(); + initializeListeners(); + } + + public void viewsInitializations() { + mJavaScript = findViewById(R.id.pJavascript); + mDoNotTrack = findViewById(R.id.pDoNotTrack); + mTrackingProtection = findViewById(R.id.pTrackingProtection); + mClearDataOnExit = findViewById(R.id.pClearDataOnExit); + mCookie.add(findViewById(R.id.pCookieRadioOption1)); + mCookie.add(findViewById(R.id.pCookieRadioOption2)); + mCookie.add(findViewById(R.id.pCookieRadioOption3)); + mCookie.add(findViewById(R.id.pCookieRadioOption4)); + + mSettingPrivacyViewController = new settingPrivacyViewController(this, new settingPrivacyController.settingAccessibilityViewCallback(), mJavaScript, mDoNotTrack, mTrackingProtection, mClearDataOnExit, mCookie); + mSettingPrivacyModel = new settingPrivacyModel(new settingPrivacyController.settingAccessibilityModelCallback()); + } + + /* LISTENERS */ + public class settingAccessibilityViewCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + + public class settingAccessibilityModelCallback implements eventObserver.eventListener{ + + @Override + public Object invokeObserver(List data, enums.etype e_type) + { + return null; + } + } + + public void initializeListeners(){ + } + + /* LOCAL OVERRIDES */ + + @Override + public void onResume() + { + if(mSettingChanged){ + activityContextManager.getInstance().setCurrentActivity(this); + } + super.onResume(); + } + + @Override + public void onPause() + { + super.onPause(); + } + + @Override + public void onBackPressed() { + if(mSettingChanged){ + activityContextManager.getInstance().setCurrentActivity(this); + } + finish(); + } + + /*UI Redirection*/ + public void onClose(View view){ + activityContextManager.getInstance().getHomeController().initRuntimeSettings(); + finish(); + } + + public void onJavaScript(View view){ + mSettingChanged = true; + mSettingPrivacyModel.onTrigger(settingPrivacyEnums.ePrivacyModel.M_SET_JAVASCRIPT, Collections.singletonList(!status.sSettingJavaStatus)); + mJavaScript.toggle(); + } + + public void onDoNotTrack(View view){ + mSettingChanged = true; + mSettingPrivacyModel.onTrigger(settingPrivacyEnums.ePrivacyModel.SET_DONOT_TRACK, Collections.singletonList(!status.sStatusDoNotTrack)); + mDoNotTrack.toggle(); + } + + public void onTrackingProtection(View view){ + mSettingChanged = true; + mSettingPrivacyModel.onTrigger(settingPrivacyEnums.ePrivacyModel.SET_TRACKING_PROTECTION, Collections.singletonList(!status.sSettingTrackingProtection)); + mTrackingProtection.toggle(); + } + + public void onCookies(View view){ + mSettingChanged = true; + mSettingPrivacyViewController.onTrigger(settingPrivacyEnums.ePrivacyViewController.SET_COOKIE_STATUS, Collections.singletonList(view)); + mSettingPrivacyModel.onTrigger(settingPrivacyEnums.ePrivacyModel.SET_COOKIES, Collections.singletonList(view)); + } + + public void onClearPrivateData(View view){ + mSettingChanged = true; + mSettingPrivacyModel.onTrigger(settingPrivacyEnums.ePrivacyModel.SET_CLEAR_PRIVATE_DATA, Collections.singletonList(!status.sClearOnExit)); + mClearDataOnExit.toggle(); + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyEnums.java new file mode 100644 index 00000000..f2983630 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyEnums.java @@ -0,0 +1,14 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.privacyManager; + +class settingPrivacyEnums +{ + /*History Manager*/ + public enum ePrivacyModel { + M_SET_JAVASCRIPT, SET_DONOT_TRACK, SET_TRACKING_PROTECTION, SET_COOKIES, SET_CLEAR_PRIVATE_DATA + } + + public enum ePrivacyViewController { + SET_COOKIE_STATUS + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyModel.java new file mode 100644 index 00000000..dc840433 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyModel.java @@ -0,0 +1,87 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.privacyManager; + +import android.view.View; +import com.darkweb.genesissearchengine.constants.keys; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.example.myapplication.R; +import java.util.Arrays; +import java.util.List; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_ALL; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_FIRST_PARTY; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_NONE; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_NON_TRACKERS; + +class settingPrivacyModel +{ + /*Variable Declaration*/ + + private eventObserver.eventListener mEvent; + + /*Initializations*/ + + settingPrivacyModel(eventObserver.eventListener mEvent){ + this.mEvent = mEvent; + } + + /*Helper Methods*/ + + private void onJavaScript(boolean pStatus){ + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_JAVA_SCRIPT,pStatus)); + status.sSettingJavaStatus = pStatus; + } + + private void onDoNotTrack(boolean pStatus){ + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_DONOT_TRACK,pStatus)); + status.sStatusDoNotTrack = pStatus; + } + + private void onTrackingProtection(boolean pStatus){ + status.sSettingTrackingProtection = pStatus; + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_TRACKING_PROTECTION,pStatus)); + } + + private void onCookies(View pView){ + if(pView.getId() == R.id.pCookieOption1){ + status.sSettingCookieStatus = ACCEPT_ALL; + } + if(pView.getId() == R.id.pCookieOption2){ + status.sSettingCookieStatus = ACCEPT_NON_TRACKERS; + } + if(pView.getId() == R.id.pCookieOption3){ + status.sSettingCookieStatus = ACCEPT_FIRST_PARTY; + } + if(pView.getId() == R.id.pCookieOption4){ + status.sSettingCookieStatus = ACCEPT_NONE; + } + + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_COOKIE_ADJUSTABLE,status.sSettingCookieStatus)); + } + + private void onClearPrivateData(boolean pStatus){ + dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_HISTORY_CLEAR,pStatus)); + status.sClearOnExit = pStatus; + } + + public Object onTrigger(settingPrivacyEnums.ePrivacyModel pCommands, List pData){ + if(pCommands.equals(settingPrivacyEnums.ePrivacyModel.M_SET_JAVASCRIPT)){ + onJavaScript((boolean)pData.get(0)); + } + else if(pCommands.equals(settingPrivacyEnums.ePrivacyModel.SET_DONOT_TRACK)){ + onDoNotTrack((boolean)pData.get(0)); + } + else if(pCommands.equals(settingPrivacyEnums.ePrivacyModel.SET_TRACKING_PROTECTION)){ + onTrackingProtection((boolean)pData.get(0)); + } + else if(pCommands.equals(settingPrivacyEnums.ePrivacyModel.SET_COOKIES)){ + onCookies((View) pData.get(0)); + } + else if(pCommands.equals(settingPrivacyEnums.ePrivacyModel.SET_CLEAR_PRIVATE_DATA)){ + onClearPrivateData((Boolean) pData.get(0)); + } + return null; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyViewController.java new file mode 100644 index 00000000..03ba26ed --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/privacyManager/settingPrivacyViewController.java @@ -0,0 +1,148 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.privacyManager; + +import android.content.res.ColorStateList; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.RadioButton; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.content.ContextCompat; +import com.darkweb.genesissearchengine.constants.status; +import com.darkweb.genesissearchengine.helperManager.eventObserver; +import com.example.myapplication.R; +import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.ArrayList; +import java.util.List; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_ALL; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_FIRST_PARTY; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_NONE; +import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_NON_TRACKERS; + +class settingPrivacyViewController +{ + /*Private Variables*/ + + private eventObserver.eventListener mEvent; + private AppCompatActivity mContext; + private SwitchMaterial mJavaScript; + private SwitchMaterial mDoNotTrack; + private SwitchMaterial mTrackingProtection; + private SwitchMaterial mClearDataOnExit; + private ArrayList mCookie; + + /*Initializations*/ + + settingPrivacyViewController(settingPrivacyController pContext, eventObserver.eventListener pEvent, SwitchMaterial pJavaScript, SwitchMaterial pDoNotTrack, SwitchMaterial pTrackingProtection, SwitchMaterial pClearDataOnExit, ArrayList pCookie) + { + this.mEvent = pEvent; + this.mContext = pContext; + this.mJavaScript = pJavaScript; + this.mTrackingProtection = pTrackingProtection; + this.mClearDataOnExit = pClearDataOnExit; + this.mCookie = pCookie; + this.mDoNotTrack = pDoNotTrack; + + initViews(); + initPostUI(); + } + + private void initPostUI(){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = mContext.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + } + else { + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); + } + } + } + + private void initViews(){ + if(status.sSettingJavaStatus){ + this.mJavaScript.setChecked(true); + }else{ + this.mJavaScript.setChecked(false); + } + + if(status.sClearOnExit){ + this.mClearDataOnExit.setChecked(true); + }else{ + this.mClearDataOnExit.setChecked(false); + } + + if(status.sSettingTrackingProtection){ + this.mTrackingProtection.setChecked(true); + }else{ + this.mTrackingProtection.setChecked(false); + } + + if(status.sStatusDoNotTrack){ + this.mDoNotTrack.setChecked(true); + }else{ + this.mDoNotTrack.setChecked(false); + } + + clearCookieSetting(); + if(status.sSettingCookieStatus == ACCEPT_ALL){ + mCookie.get(0).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mCookie.get(0).setChecked(true); + } + if(status.sSettingCookieStatus == ACCEPT_NON_TRACKERS){ + mCookie.get(1).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mCookie.get(1).setChecked(true); + } + if(status.sSettingCookieStatus == ACCEPT_FIRST_PARTY){ + mCookie.get(2).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mCookie.get(2).setChecked(true); + } + if(status.sSettingCookieStatus == ACCEPT_NONE){ + mCookie.get(3).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mCookie.get(3).setChecked(true); + } + + } + + private void clearCookieSetting(){ + for(int mCounter=0; mCounter pData){ + if(pCommands.equals(settingPrivacyEnums.ePrivacyViewController.SET_COOKIE_STATUS)){ + setCookieStatus((View)pData.get(0)); + } + return null; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchController.java index 410751fc..1ed5b313 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchController.java @@ -1,13 +1,9 @@ package com.darkweb.genesissearchengine.appManager.settingManager.searchEngineManager; -import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.RadioButton; -import android.widget.Spinner; - import androidx.appcompat.app.AppCompatActivity; - import com.darkweb.genesissearchengine.appManager.activityContextManager; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.enums; @@ -15,8 +11,8 @@ import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.pluginManager.pluginController; import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; - import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class settingSearchController extends AppCompatActivity { @@ -52,32 +48,32 @@ public class settingSearchController extends AppCompatActivity { public void onSelectSearchEngine(View view) { if(view.getId() == R.id.pOption1){ - mSettingSearchModel.onSetSearchEngine(constants.CONST_BACKEND_GENESIS_URL); + mSettingSearchModel.onTrigger(settingSearchEnums.eSearchModel.M_SET_SEARCH_ENGINE, Collections.singletonList(constants.CONST_BACKEND_GENESIS_URL)); } else if(view.getId() == R.id.pOption2){ - mSettingSearchModel.onSetSearchEngine(constants.CONST_BACKEND_DUCK_DUCK_GO_URL); + mSettingSearchModel.onTrigger(settingSearchEnums.eSearchModel.M_SET_SEARCH_ENGINE, Collections.singletonList(constants.CONST_BACKEND_DUCK_DUCK_GO_URL)); } else if(view.getId() == R.id.pOption3){ - mSettingSearchModel.onSetSearchEngine(constants.CONST_BACKEND_GOOGLE_URL); + mSettingSearchModel.onTrigger(settingSearchEnums.eSearchModel.M_SET_SEARCH_ENGINE, Collections.singletonList(constants.CONST_BACKEND_GOOGLE_URL)); } else if(view.getId() == R.id.pOption4){ - mSettingSearchModel.onSetSearchEngine(constants.CONST_BACKEND_BING_URL); + mSettingSearchModel.onTrigger(settingSearchEnums.eSearchModel.M_SET_SEARCH_ENGINE, Collections.singletonList(constants.CONST_BACKEND_BING_URL)); } else if(view.getId() == R.id.pOption5){ - mSettingSearchModel.onSetSearchEngine(constants.CONST_BACKEND_WIKI_URL); + mSettingSearchModel.onTrigger(settingSearchEnums.eSearchModel.M_SET_SEARCH_ENGINE, Collections.singletonList(constants.CONST_BACKEND_WIKI_URL)); } - mSettingSearchViewController.resetSearchEngine(); - mSettingSearchViewController.initSearchEngine(); + mSettingSearchViewController.onTrigger(settingSearchEnums.eSearchViewController.M_RESET_SEARCH_ENGINE, Collections.singletonList(null)); + mSettingSearchViewController.onTrigger(settingSearchEnums.eSearchViewController.M_INIT_SEARCH_ENGINE, Collections.singletonList(null)); } public void setSearchHistory(View view){ - mSettingSearchModel.setSearchHistory(!mSearchHistory.isChecked()); + mSettingSearchModel.onTrigger(settingSearchEnums.eSearchModel.M_SET_SEARCH_HISTORY, Collections.singletonList(!mSearchHistory.isChecked())); mSearchHistory.toggle(); } public void setSearchStatus(View view){ - mSettingSearchModel.setSearchStatus(!mSearchSuggestions.isChecked()); + mSettingSearchModel.onTrigger(settingSearchEnums.eSearchModel.M_SET_SEARCH_HISTORY, Collections.singletonList(!mSearchSuggestions.isChecked())); mSearchSuggestions.toggle(); } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchEnums.java new file mode 100644 index 00000000..d8b8bf57 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchEnums.java @@ -0,0 +1,14 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.searchEngineManager; + +class settingSearchEnums +{ + /*History Manager*/ + public enum eSearchModel { + M_SET_SEARCH_ENGINE, M_SET_SEARCH_HISTORY, M_SET_SEARCH_STATUS + } + + public enum eSearchViewController { + M_INIT_SEARCH_ENGINE, M_RESET_SEARCH_ENGINE + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchModel.java index 27c73270..4c2b5584 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchModel.java @@ -1,12 +1,15 @@ package com.darkweb.genesissearchengine.appManager.settingManager.searchEngineManager; +import android.view.View; + +import com.darkweb.genesissearchengine.appManager.historyManager.historyEnums; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.dataManager.dataController; import com.darkweb.genesissearchengine.dataManager.dataEnums; import com.darkweb.genesissearchengine.helperManager.eventObserver; - import java.util.Arrays; +import java.util.List; class settingSearchModel @@ -24,18 +27,33 @@ class settingSearchModel /*Helper Methods*/ - public void onSetSearchEngine(String pUrl){ + private void onSetSearchEngine(String pUrl){ status.sSettingSearchStatus = pUrl; dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.SETTING_SEARCH_ENGINE, pUrl)); } - public void setSearchHistory(boolean pStatus){ + private void setSearchHistory(boolean pStatus){ dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_SEARCH_HISTORY, pStatus)); status.sSettingSearchHistory = pStatus; } - public void setSearchStatus(boolean pStatus){ + private void setSearchStatus(boolean pStatus){ dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_SEARCH_SUGGESTION, pStatus)); status.getsSettingSearchSuggestion = pStatus; } + public Object onTrigger(settingSearchEnums.eSearchModel pCommands, List pData){ + if(pCommands.equals(settingSearchEnums.eSearchModel.M_SET_SEARCH_ENGINE)){ + onSetSearchEngine((String) pData.get(0)); + } + else if(pCommands.equals(settingSearchEnums.eSearchModel.M_SET_SEARCH_HISTORY)){ + + setSearchHistory((boolean) pData.get(0)); + } + else if(pCommands.equals(settingSearchEnums.eSearchModel.M_SET_SEARCH_STATUS)){ + + setSearchStatus((boolean) pData.get(0)); + } + return null; + } + } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchViewController.java index 1f80f668..57f341e9 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/searchEngineManager/settingSearchViewController.java @@ -1,22 +1,21 @@ package com.darkweb.genesissearchengine.appManager.settingManager.searchEngineManager; +import android.content.res.ColorStateList; import android.os.Build; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.RadioButton; -import android.widget.Spinner; - import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; - import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.status; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.example.myapplication.R; import com.google.android.material.switchmaterial.SwitchMaterial; - import java.util.ArrayList; +import java.util.List; class settingSearchViewController { @@ -48,41 +47,6 @@ class settingSearchViewController initSearchViews(); } - public void initSearchViews(){ - if(status.sSettingSearchHistory){ - mSearchHistory.setChecked(true); - } - if(status.getsSettingSearchSuggestion){ - mSearchSuggestions.setChecked(true); - } - } - - public void initSearchEngine(){ - switch (status.sSettingSearchStatus) { - case constants.CONST_BACKEND_GOOGLE_URL: - mSearchEngines.get(2).setChecked(true); - break; - case constants.CONST_BACKEND_GENESIS_URL: - mSearchEngines.get(0).setChecked(true); - break; - case constants.CONST_BACKEND_DUCK_DUCK_GO_URL: - mSearchEngines.get(1).setChecked(true); - break; - case constants.CONST_BACKEND_BING_URL: - mSearchEngines.get(3).setChecked(true); - break; - case constants.CONST_BACKEND_WIKI_URL: - mSearchEngines.get(4).setChecked(true); - break; - } - } - - public void resetSearchEngine(){ - for(int mCounter=0;mCounter= Build.VERSION_CODES.LOLLIPOP) { Window window = mContext.getWindow(); @@ -92,10 +56,64 @@ class settingSearchViewController window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } + private void initSearchViews(){ + if(status.sSettingSearchHistory){ + mSearchHistory.setChecked(true); + } + if(status.getsSettingSearchSuggestion){ + mSearchSuggestions.setChecked(true); + } + } + + private void initSearchEngine(){ + resetSearchEngine(); + switch (status.sSettingSearchStatus) { + case constants.CONST_BACKEND_GOOGLE_URL: + mSearchEngines.get(2).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mSearchEngines.get(2).setChecked(true); + break; + case constants.CONST_BACKEND_GENESIS_URL: + mSearchEngines.get(0).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mSearchEngines.get(0).setChecked(true); + break; + case constants.CONST_BACKEND_DUCK_DUCK_GO_URL: + mSearchEngines.get(1).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mSearchEngines.get(1).setChecked(true); + break; + case constants.CONST_BACKEND_BING_URL: + mSearchEngines.get(3).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mSearchEngines.get(3).setChecked(true); + break; + case constants.CONST_BACKEND_WIKI_URL: + mSearchEngines.get(4).setButtonTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.c_radio_tint))); + mSearchEngines.get(4).setChecked(true); + break; + } + } + + private void resetSearchEngine(){ + for(int mCounter=0;mCounter pData){ + if(pCommands.equals(settingSearchEnums.eSearchViewController.M_INIT_SEARCH_ENGINE)){ + initSearchEngine(); + } + else if(pCommands.equals(settingSearchEnums.eSearchViewController.M_RESET_SEARCH_ENGINE)){ + resetSearchEngine(); + } + return null; + } + } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingController.java index ec8850b5..3f832984 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingController.java @@ -1,18 +1,20 @@ package com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage; import android.content.Intent; +import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.view.View; -import android.widget.AdapterView; -import android.widget.SeekBar; -import android.widget.Spinner; -import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; + import com.darkweb.genesissearchengine.appManager.activityContextManager; -import com.darkweb.genesissearchengine.appManager.homeManager.homeController; import com.darkweb.genesissearchengine.appManager.settingManager.accessibilityManager.settingAccessibilityController; +import com.darkweb.genesissearchengine.appManager.settingManager.advanceManager.settingAdvanceController; +import com.darkweb.genesissearchengine.appManager.settingManager.clearManager.settingClearController; +import com.darkweb.genesissearchengine.appManager.settingManager.generalManager.settingGeneralController; import com.darkweb.genesissearchengine.appManager.settingManager.notificationManager.settingNotificationController; +import com.darkweb.genesissearchengine.appManager.settingManager.privacyManager.settingPrivacyController; import com.darkweb.genesissearchengine.appManager.settingManager.searchEngineManager.settingSearchController; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.enums; @@ -28,80 +30,59 @@ import com.example.myapplication.R; import java.util.Arrays; import java.util.List; import static com.darkweb.genesissearchengine.constants.enums.etype.on_not_support; -import static com.darkweb.genesissearchengine.constants.status.sSettingCookieStatus; -import static com.darkweb.genesissearchengine.constants.status.sSettingHistoryStatus; -import static com.darkweb.genesissearchengine.constants.status.sSettingJavaStatus; public class settingController extends AppCompatActivity { /*Private Observer Classes*/ - private homeController mHomeController; private settingViewController mSettingViewController; private settingModel mSettingModel; - /*Private Variables*/ - - private Spinner mSearch; - private Spinner mJavascript; - private Spinner mHistory; - private Spinner mCookies; - private Spinner mFontAdjustable; - private Spinner mNotification; - private SeekBar mFontSize; - private TextView mFontSizePercentage; - /*Initializations*/ public settingController(){ - mHomeController = activityContextManager.getInstance().getHomeController(); mSettingModel = new settingModel(new settingModelCallback()); - mSettingModel.initNotification(pluginController.getInstance().getNotificationStatus()); } @Override protected void onCreate(Bundle savedInstanceState) { - pluginController.getInstance().onCreate(this); + onInitTheme(); super.onCreate(savedInstanceState); setContentView(R.layout.setting); + pluginController.getInstance().onCreate(this); viewsInitializations(); - modelInitialization(); listenersInitializations(); - initializeFontSizeListener(); } - public void modelInitialization(){ - mSettingModel.setJavaStatus(sSettingJavaStatus, true); - mSettingModel.setHistoryStatus(sSettingHistoryStatus, true); - mSettingModel.setSearchStatus(status.sSettingSearchStatus, true); - mSettingModel.setAdjustableStatus(status.sSettingFontAdjustable, true); - mSettingModel.setFontSize(status.sSettingFontSize, true); + public void onInitTheme(){ + + if(status.sTheme == enums.Theme.THEME_DARK){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + }else if(status.sTheme == enums.Theme.THEME_LIGHT){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + }else { + if((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_NO){ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + }else { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } + } + } + + public void applyTheme(){ + recreate(); } public void viewsInitializations() { - mSearch = findViewById(R.id.search_manager); - mJavascript = findViewById(R.id.javascript_manager); - mHistory = findViewById(R.id.history_manager); - mFontSize = findViewById(R.id.font_size); - mFontAdjustable = findViewById(R.id.font_adjustable); - mFontSizePercentage = findViewById(R.id.font_size_percentage); - mCookies = findViewById(R.id.cookies_manager); - mNotification = findViewById(R.id.notification_manager); - - mSettingViewController = new settingViewController(mSearch, mJavascript, mHistory, mFontSize, mFontAdjustable, mFontSizePercentage,this, new settingModelCallback(), mCookies,mNotification,pluginController.getInstance().getNotificationStatus()); + activityContextManager.getInstance().setSettingController(this); + mSettingViewController = new settingViewController(this, new settingModelCallback()); } public void listenersInitializations() { - initializeItemSelectedListener(mSearch); - initializeItemSelectedListener(mJavascript); - initializeItemSelectedListener(mNotification); - initializeItemSelectedListener(mHistory); - initializeItemSelectedListener(mFontAdjustable); - initializeItemSelectedListener(mCookies); pluginController.getInstance().logEvent(strings.EVENT_SETTINGS_OPENED); } @@ -117,11 +98,13 @@ public class settingController extends AppCompatActivity } } + @Override public void onResume() { activityContextManager.getInstance().setCurrentActivity(this); status.sSettingIsAppPaused = false; + onInitTheme(); super.onResume(); } @@ -137,73 +120,7 @@ public class settingController extends AppCompatActivity finish(); } - public void initializeItemSelectedListener(Spinner view){ - view.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { - if(parentView.getId()== R.id.search_manager) - { - mSettingModel.setSearchStatus(getEngineURL(position), false); - } - else if(parentView.getId()== R.id.javascript_manager) - { - mSettingModel.setJavaStatus(position==0, false); - } - else if(parentView.getId()== R.id.history_manager) - { - mSettingModel.setHistoryStatus(position==0, false); - } - else if(parentView.getId()== R.id.font_adjustable) - { - if(position==0){ - mSettingModel.setFontSize(100, false); - } - mSettingViewController.setFontSizeAdjustable(position==0); - mSettingModel.setAdjustableStatus(position==0, false); - } - else if(parentView.getId()== R.id.cookies_manager) - { - mSettingModel.setCookieStatus(position, false); - } - else if(parentView.getId()== R.id.notification_manager) - { - mSettingModel.setmNotificationStatus(position, false); - } - } - @Override - public void onNothingSelected(AdapterView parentView) { - } - }); - } - - public void initializeFontSizeListener(){ - - mFontSize.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - float cur_progress = seekBar.getProgress(); - mSettingModel.setFontSize((cur_progress), false); - mSettingViewController.updatePercentage(mFontSize.getProgress()); - mSettingViewController.setFontSize(b); - mSettingModel.setAdjustableStatus(b, false); - if(cur_progress<1){ - mFontSize.setProgress(1); - } - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - } - public void onNavigationBackPressed(View view){ - mSettingModel.onSaveSettings(); finish(); } @@ -227,6 +144,22 @@ public class settingController extends AppCompatActivity helperMethod.openActivity(settingAccessibilityController.class, constants.CONST_LIST_HISTORY, this,true); } + public void onManageGeneral(View view) { + helperMethod.openActivity(settingGeneralController.class, constants.CONST_LIST_HISTORY, this,true); + } + + public void onManageSearchClearData(View view) { + helperMethod.openActivity(settingClearController.class, constants.CONST_LIST_HISTORY, this,true); + } + + public void onManageSearchPrivacy(View view) { + helperMethod.openActivity(settingPrivacyController.class, constants.CONST_LIST_HISTORY, this,true); + } + + public void onManageSearchAdvanced(View view) { + helperMethod.openActivity(settingAdvanceController.class, constants.CONST_LIST_HISTORY, this,true); + } + /*Event Observer*/ public class settingViewCallback implements eventObserver.eventListener{ @@ -243,67 +176,8 @@ public class settingController extends AppCompatActivity @Override public Object invokeObserver(List data, enums.etype e_type) { - if(e_type == enums.etype.update_searcn){ - status.sSettingSearchStatus = (String)data.get(0); - mHomeController.onHomeButton(null); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_STRING, Arrays.asList(keys.SETTING_SEARCH_ENGINE, mSettingModel.getSearchStatus())); - } - else if(e_type == enums.etype.update_javascript){ - status.sSettingJavaStatus = (boolean)data.get(0); - mHomeController.onUpdateJavascript(); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_JAVA_SCRIPT, status.sSettingJavaStatus)); - } - else if(e_type == enums.etype.update_history){ - sSettingHistoryStatus = (boolean)data.get(0); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_BOOL, Arrays.asList(keys.SETTING_HISTORY_CLEAR, sSettingHistoryStatus)); - } - else if(e_type == enums.etype.update_notification){ - pluginController.getInstance().setNotificationStatus((int)data.get(0)); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_NOTIFICATION_STATUS, pluginController.getInstance().getNotificationStatus())); - - int notificationStatus = pluginController.getInstance().getNotificationStatus(); - if(notificationStatus==0){ - pluginController.getInstance().disableTorNotification(); - } else if(notificationStatus==1){ - pluginController.getInstance().enableTorNotification(); - }else { - pluginController.getInstance().enableTorNotificationNoBandwidth(); - } - - } - else if(e_type == enums.etype.update_font_adjustable || e_type == enums.etype.update_font_size){ - mHomeController.onLoadFont(); - } - else if(e_type == enums.etype.update_cookies){ - sSettingCookieStatus = (int)data.get(0); - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_COOKIE_ADJUSTABLE, sSettingCookieStatus)); - mHomeController.onUpdateCookies(); - pluginController.getInstance().updateCookiesStatus(); - } - else if(e_type == enums.etype.close_view){ - finish(); - - } return null; } } - /*Helper Methods*/ - - public String getEngineURL(int index){ - - if (index == 0) - { - return constants.CONST_BACKEND_GENESIS_URL; - } - else if (index == 1) - { - return constants.CONST_BACKEND_GOOGLE_URL; - } - else - { - return constants.CONST_BACKEND_DUCK_DUCK_GO_URL; - } - } - } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingHomeEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingHomeEnums.java new file mode 100644 index 00000000..ac23b0c6 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingHomeEnums.java @@ -0,0 +1,12 @@ +package com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage; + +public class settingHomeEnums +{ + /*History Manager*/ + public enum eHomeModel { + } + + public enum eHomeViewController { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingModel.java index 6e53f804..747f7993 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingModel.java @@ -1,135 +1,19 @@ package com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage; -import com.darkweb.genesissearchengine.constants.enums; -import com.darkweb.genesissearchengine.constants.keys; -import com.darkweb.genesissearchengine.constants.status; -import com.darkweb.genesissearchengine.constants.strings; -import com.darkweb.genesissearchengine.dataManager.dataController; -import com.darkweb.genesissearchengine.dataManager.dataEnums; import com.darkweb.genesissearchengine.helperManager.eventObserver; -import java.util.Arrays; -import java.util.Collections; -import static org.mozilla.geckoview.ContentBlocking.CookieBehavior.ACCEPT_FIRST_PARTY; - class settingModel { /*Variable Declaration*/ private eventObserver.eventListener mEvent; - private String mSearchStatus = strings.GENERIC_EMPTY_STR; - private int mCookieStatus = ACCEPT_FIRST_PARTY; - private int mNotificationStatus = 0; - private boolean mJavaStatus = false; - private boolean mHistoryStatus = true; - private boolean mFontAdjustable = true; - private float mFontSize = 1; - private int notificationStatusGlobal; - /*Initializations*/ settingModel(eventObserver.eventListener mEvent){ - init_status(); this.mEvent = mEvent; } /*Helper Methods*/ - private void init_status() - { - mSearchStatus = status.sSettingSearchStatus; - mHistoryStatus = status.sSettingHistoryStatus; - mJavaStatus = status.sSettingJavaStatus; - mCookieStatus = status.sSettingCookieStatus; - } - - void initNotification(int notificationStatus){ - mNotificationStatus = notificationStatus; - notificationStatusGlobal = notificationStatus; - } - - /*Changed Status*/ - - String getSearchStatus(){ - return mSearchStatus; - } - - void setCookieStatus(int cookie_status, boolean isActivityLoading){ - this.mCookieStatus = cookie_status; - if(!isActivityLoading){ - onSaveSettings(); - } - } - - void setSearchStatus(String search_status, boolean isActivityLoading){ - this.mSearchStatus = search_status; - if(!isActivityLoading){ - onSaveSettings(); - } - } - - void setFontSize(float font_size, boolean isActivityLoading){ - this.mFontSize = font_size; - if(!isActivityLoading){ - onSaveSettings(); - } - } - - void setAdjustableStatus(boolean font_status, boolean isActivityLoading){ - this.mFontAdjustable = font_status; - if(!isActivityLoading){ - onSaveSettings(); - } - } - - - void setJavaStatus(boolean java_status, boolean isActivityLoading){ - this.mJavaStatus = java_status; - if(!isActivityLoading){ - onSaveSettings(); - } - } - - void setmNotificationStatus(int notification_status, boolean isActivityLoading){ - this.mNotificationStatus = notification_status; - if(!isActivityLoading){ - onSaveSettings(); - } - } - - void setHistoryStatus(boolean history_status, boolean isActivityLoading){ - this.mHistoryStatus = history_status; - if(!isActivityLoading){ - onSaveSettings(); - } - } - - void onSaveSettings() - { - if(!status.sSettingSearchStatus.equals(mSearchStatus)) - { - mEvent.invokeObserver(Collections.singletonList(mSearchStatus), enums.etype.update_searcn); - } - if(status.sSettingJavaStatus != mJavaStatus) - { - mEvent.invokeObserver(Collections.singletonList(mJavaStatus), enums.etype.update_javascript); - } - if(notificationStatusGlobal != mNotificationStatus) - { - mEvent.invokeObserver(Collections.singletonList(mNotificationStatus), enums.etype.update_notification); - } - if(status.sSettingHistoryStatus != mHistoryStatus) - { - status.sSettingHistoryStatus = mHistoryStatus; - mEvent.invokeObserver(Collections.singletonList(mHistoryStatus), enums.etype.update_history); - } - if(status.sSettingCookieStatus != mCookieStatus) - { - status.sSettingCookieStatus = mCookieStatus; - dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_SET_INT, Arrays.asList(keys.SETTING_COOKIE_ADJUSTABLE,status.sSettingCookieStatus)); - mEvent.invokeObserver(Collections.singletonList(mCookieStatus), enums.etype.update_cookies); - } - } - } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingViewController.java index 989e13ca..387681e3 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/settingManager/settingHomePage/settingViewController.java @@ -1,22 +1,17 @@ package com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage; -import android.annotation.SuppressLint; +import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.Window; import android.view.WindowManager; -import android.widget.SeekBar; -import android.widget.Spinner; -import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; -import com.darkweb.genesissearchengine.constants.constants; + import com.darkweb.genesissearchengine.constants.status; -import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.example.myapplication.R; -import static com.darkweb.genesissearchengine.constants.status.sSettingHistoryStatus; -import static com.darkweb.genesissearchengine.constants.status.sSettingJavaStatus; class settingViewController { @@ -25,39 +20,13 @@ class settingViewController private eventObserver.eventListener mEvent; private AppCompatActivity mContext; - private Spinner mSearch; - private Spinner mJavaScript; - private Spinner mNotification; - private Spinner mHistory; - private Spinner mCookies; - private Spinner mFontAdjustable; - private SeekBar mFontSize; - private TextView mFontSizePercentage; - /*Initializations*/ - settingViewController(Spinner mSearch, Spinner mJavaScript, Spinner mHistory, SeekBar mFontSize, Spinner mFontAdjustable, TextView mFontSizePercentage, settingController mContext, eventObserver.eventListener mEvent, Spinner mCookies, Spinner mNotification, int notificationStatus) + settingViewController(settingController mContext, eventObserver.eventListener mEvent) { - this.mFontSizePercentage = mFontSizePercentage; - this.mSearch = mSearch; - this.mJavaScript = mJavaScript; - this.mNotification = mNotification; - this.mHistory = mHistory; - this.mFontAdjustable = mFontAdjustable; - this.mFontSize = mFontSize; - this.mCookies = mCookies; - this.mEvent = mEvent; this.mContext = mContext; - initNotification(notificationStatus); - initViews(); - initJavascript(); - initHistory(); - initSearchEngine(); - initFontAdjustable(); - initCookies(); - initFontSize(); initPostUI(); } @@ -70,113 +39,12 @@ class settingViewController window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } - private void initViews() - { - mSearch.setDropDownVerticalOffset(15); - mSearch.setDropDownHorizontalOffset(-15); - mJavaScript.setDropDownVerticalOffset(15); - mJavaScript.setDropDownHorizontalOffset(-15); - mNotification.setDropDownVerticalOffset(15); - mNotification.setDropDownHorizontalOffset(-15); - mHistory.setDropDownVerticalOffset(15); - mHistory.setDropDownHorizontalOffset(-15); - mCookies.setDropDownVerticalOffset(15); - mCookies.setDropDownHorizontalOffset(-15); - mFontAdjustable.setDropDownHorizontalOffset(-15); - mFontAdjustable.setDropDownVerticalOffset(15); - } - - private void initJavascript() - { - if (sSettingJavaStatus) - { - mJavaScript.setSelection(0); - } - else - { - mJavaScript.setSelection(1); - } - } - - private void initNotification(int status) - { - mNotification.setSelection(status); - } - - private void initHistory() - { - if (sSettingHistoryStatus) - { - mHistory.setSelection(0); - } - else - { - mHistory.setSelection(1); - } - } - - private void initCookies() - { - mCookies.setSelection(status.sSettingCookieStatus); - } - - private void initFontAdjustable() - { - if (status.sSettingFontAdjustable) - { - mFontAdjustable.setSelection(0); - } - else - { - mFontAdjustable.setSelection(1); - } - } - - private void initFontSize() - { - mFontSize.setProgress((int)status.sSettingFontSize); - updatePercentage(mFontSize.getProgress()); - } - - void setFontSize(boolean status){ - if(status){ - mFontAdjustable.setSelection(1); - } - } - - void setFontSizeAdjustable(boolean status){ - if(status){ - mFontSize.setProgress(100); - } - } - - private void initSearchEngine() - { - mSearch.setSelection(getEngineIndex()); - } - - /*External Helper Methods*/ - - private int getEngineIndex(){ - if(status.sSettingSearchStatus.equals(constants.CONST_BACKEND_GENESIS_URL)){ - return 0; - } - else if(status.sSettingSearchStatus.equals(constants.CONST_BACKEND_GOOGLE_URL)){ - return 1; - } - else - return 2; - } - - @SuppressLint("SetTextI18n") - void updatePercentage(int font_size){ - - mFontSizePercentage.setText(strings.SETTING_CUSTOM_FONTS + strings.GENERIC_EMPTY_SPACE + font_size +strings.SETTING_PERCENT_SIGN); - } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java index c3217f9c..431e5cbd 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabAdapter.java @@ -1,5 +1,7 @@ package com.darkweb.genesissearchengine.appManager.tabManager; +import android.util.DisplayMetrics; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -9,11 +11,16 @@ import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; + +import com.darkweb.genesissearchengine.appManager.activityContextManager; import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.strings; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.example.myapplication.R; + +import org.mozilla.geckoview.GeckoView; + import java.util.ArrayList; import java.util.Collections; @@ -22,15 +29,17 @@ public class tabAdapter extends RecyclerView.Adapter /*Private Variables*/ private ArrayList mModelList; - private ArrayList mTempModelList; private eventObserver.eventListener mEvent; - private String filter = strings.GENERIC_EMPTY_STR; - private boolean isClosing = false; - tabAdapter(ArrayList model_list, eventObserver.eventListener event) { + private GeckoView mCurrentGeckoView = null; + private int mCurrentSession; + + tabAdapter(ArrayList model_list, eventObserver.eventListener event, GeckoView pGeckoView, int pCurrentSession) { this.mModelList = model_list; this.mEvent = event; - mTempModelList = new ArrayList<>(); + + pGeckoView.releaseSession(); + this.mCurrentSession = pCurrentSession; } /*Initializations*/ @@ -38,128 +47,76 @@ public class tabAdapter extends RecyclerView.Adapter @NonNull @Override public listViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_row, parent, false); + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.tabview_row, parent, false); return new listViewHolder(view); } @Override public void onBindViewHolder(@NonNull tabAdapter.listViewHolder holder, int position) { - holder.bindListView(mTempModelList.get(position)); - clearMessageItem(holder.messageButton,position,holder.data_model); - clearMessageItemContainer(holder.itemContainer,position,holder.data_model); + holder.bindListView(mModelList.get(position)); } @Override public int getItemCount() { - return mTempModelList.size(); + return mModelList.size(); } /*Listeners*/ - private void clearMessageItem(ImageButton clearButton, int index,tabRowModel model) - { - clearButton.setOnClickListener(v -> - { - if(!isClosing){ - isClosing = true; - int size = mModelList.size(); - - mEvent.invokeObserver(Collections.singletonList(mTempModelList.get(index).getmId()),enums.etype.url_clear); - mEvent.invokeObserver(Collections.singletonList(index),enums.etype.is_empty); - invokeFilter(false); - model.getSession().stop(); - model.getSession().close(); - if(size>1){ - new Thread(){ - public void run(){ - try - { - sleep(500); - isClosing = false; - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - } - }.start(); - } - } - }); + public void onClose(){ + if(mCurrentGeckoView!=null){ + mCurrentGeckoView.releaseSession(); + } } + public void setOnClickListener(ImageView pLoadSession, tabRowModel model, GeckoView pGeckoView, ImageButton mRemoveRow){ + pLoadSession.setOnClickListener(v -> { + pGeckoView.releaseSession(); + activityContextManager.getInstance().getHomeController().onLoadTab(model.getSession(), false); + activityContextManager.getInstance().getTabController().onBackPressed(null); + activityContextManager.getInstance().getTabController().initTabCount(); + }); - - - private void clearMessageItemContainer(LinearLayout clearButton, int index,tabRowModel model) - { - clearButton.setOnClickListener(v -> - { - if(mTempModelList.size()>index){ - invokeFilter(false); - mEvent.invokeObserver(Collections.singletonList(model),enums.etype.url_triggered); - } + mRemoveRow.setOnClickListener(v -> { + model.getSession().closeSession(); + activityContextManager.getInstance().getTabController().onRemoveView(model.getSession().getSessionID()); + notifyDataSetChanged(); + activityContextManager.getInstance().getTabController().initTabCount(); }); } /*View Holder Extensions*/ - class listViewHolder extends RecyclerView.ViewHolder { - TextView heaaderText; - TextView descriptionText; - ImageButton messageButton; - ImageView empty_message; - LinearLayout itemContainer; - tabRowModel data_model; + GeckoView mGeckoView; + TextView mHeader; + TextView mDescription; + ImageView mLoadSession; + ImageButton mRemoveRow; listViewHolder(View itemView) { super(itemView); } void bindListView(tabRowModel model) { + mGeckoView = itemView.findViewById(R.id.pGeckoView); + mHeader = itemView.findViewById(R.id.pHeader); + mDescription = itemView.findViewById(R.id.pDescription); + mLoadSession = itemView.findViewById(R.id.pLoadSession); + mRemoveRow = itemView.findViewById(R.id.pRemoveRow); - heaaderText = itemView.findViewById(R.id.pHeader); - descriptionText = itemView.findViewById(R.id.pDescription); - //itemContainer = itemView.findViewById(R.id.pRowContainer); - - if(model.getSession().getTitle().equals("") || model.getSession().getTitle().equals("loading")){ - heaaderText.setText(helperMethod.getDomainName(model.getSession().getCurrentURL())); - } - else { - heaaderText.setText(model.getSession().getTitle()); + mGeckoView.releaseSession(); + mGeckoView.setSession(model.getSession()); + if(model.getmId() == mCurrentSession){ + mCurrentGeckoView = mGeckoView; } + model.setGeckoView(mGeckoView); + mHeader.setText(model.getSession().getTitle()); + mDescription.setText(model.getSession().getCurrentURL()); - /*Large file or content based url handling*/ - String url = model.getSession().getCurrentURL(); - if(url.length()>200){ - url = url.substring(0,200); - } - - descriptionText.setText(url); - // messageButton = itemView.findViewById(R.id.message_button); - empty_message = itemView.findViewById(R.id.pEmptyListNotification); - data_model = model; + setOnClickListener(mLoadSession, model, mGeckoView, mRemoveRow); } } - void setFilter(String filter){ - this.filter = filter; - } - - void invokeFilter(boolean notify){ - mTempModelList.clear(); - for(int counter = 0; counter< mModelList.size(); counter++){ - if(mModelList.get(counter).getSession().getTitle().contains(filter) || mModelList.get(counter).getSession().getCurrentURL().contains(filter)){ - tabRowModel model = mModelList.get(counter); - mTempModelList.add(new tabRowModel(model.getSession(),counter)); - } - } - - if(notify){ - mEvent.invokeObserver(null,enums.etype.clear_recycler); - notifyDataSetChanged(); - } - } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java index 4be69a32..e7e21ee1 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabController.java @@ -1,18 +1,17 @@ package com.darkweb.genesissearchengine.appManager.tabManager; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; +import android.os.Handler; +import android.os.Looper; import android.view.View; -import android.view.inputmethod.EditorInfo; import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.darkweb.genesissearchengine.appManager.activityContextManager; import com.darkweb.genesissearchengine.appManager.homeManager.homeController; +import com.darkweb.genesissearchengine.appManager.settingManager.settingHomePage.settingController; +import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.constants.enums; import com.darkweb.genesissearchengine.constants.keys; import com.darkweb.genesissearchengine.constants.status; @@ -23,26 +22,24 @@ import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.darkweb.genesissearchengine.helperManager.helperMethod; import com.darkweb.genesissearchengine.pluginManager.pluginController; import com.example.myapplication.R; - +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Objects; public class tabController extends AppCompatActivity { + /*Private Views*/ + private Button mTabs; + /*Private Variables*/ private tabModel mListModel; private homeController mHomeController; private activityContextManager mContextManager; - - private ImageView mEmptyListNotifier; - private EditText mSearchBar; - private RecyclerView mListView; - private Button mClearButton; - private tabViewController mtabViewController; + private RecyclerView mRecycleView; + private tabAdapter mTabAdapter; /*Initializations*/ @@ -54,88 +51,115 @@ public class tabController extends AppCompatActivity initializeListModel(); initializeViews(); initializeList(); - onEditorInvoked(); + onCustomeListeners(); } public void initializeListModel(){ mListModel = new tabModel(); - mListModel.setList(dataController.getInstance().getTab()); + mListModel.setList((ArrayList)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TAB, null)); mContextManager = activityContextManager.getInstance(); mHomeController = activityContextManager.getInstance().getHomeController(); mContextManager.setTabController(this); pluginController.getInstance().logEvent(strings.EVENT_TAB_OPENED); } public void initializeViews(){ - mEmptyListNotifier = findViewById(R.id.pEmptyListNotification); - mSearchBar = findViewById(R.id.pSearchInput); - mListView = findViewById(R.id.pRecycleView); - mClearButton = findViewById(R.id.pClearButton); - mtabViewController = new tabViewController(mEmptyListNotifier, mListView, mClearButton,this); + mRecycleView = findViewById(R.id.pRecycleView); + mTabs = findViewById(R.id.pTabs); + + mtabViewController = new tabViewController(this, mTabs); } public void initializeList(){ - tabAdapter adapter = new tabAdapter(mListModel.getList(),new adapterCallback()); - adapter.invokeFilter(false); - mListView.setAdapter(adapter); - mListView.setLayoutManager(new LinearLayoutManager(this)); - mtabViewController.updateIfListEmpty(mListModel.getList().size(),0); + LinearLayoutManager layoutManager = new LinearLayoutManager(tabController.this); + tabAdapter adapter = new tabAdapter(mListModel.getList(),new adapterCallback(), mHomeController.getmGeckoView(), ((tabRowModel)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_CURRENT_TAB,null)).getmId()); + mTabAdapter = adapter; + layoutManager.setReverseLayout(true); + + mRecycleView.setAdapter(adapter); + mRecycleView.setItemViewCacheSize(100); + mRecycleView.setNestedScrollingEnabled(false); + mRecycleView.setHasFixedSize(true); + mRecycleView.setAdapter(adapter); + mRecycleView.setItemViewCacheSize(100); + mRecycleView.setDrawingCacheEnabled(true); + mRecycleView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); + mRecycleView.setLayoutManager(new LinearLayoutManager(tabController.this)); } /*View Handlers*/ - public void onEditorInvoked(){ + public void onCustomeListeners(){ - mSearchBar.setOnEditorActionListener((v, actionId, event) ->{ - if (actionId == EditorInfo.IME_ACTION_NEXT) - { - helperMethod.hideKeyboard(this); - return true; - } - return false; - }); - - mSearchBar.addTextChangedListener(new TextWatcher() { - - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){ - - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2){ - - } - - @Override - public void afterTextChanged(Editable editable) - { - if(mListView!=null){ - ((tabAdapter) Objects.requireNonNull(mListView.getAdapter())).setFilter(mSearchBar.getText().toString()); - ((tabAdapter) mListView.getAdapter()).invokeFilter(true); - } - } - }); } - public void reset(){ - if(mListView!=null){ - mListView.setAdapter(null); - } - mListView = null; + public void onReleaseDisplay(){ + mTabAdapter.onClose(); + mHomeController.onAcquireDisplay(); } @Override public void onBackPressed() { super.onBackPressed(); - reset(); + overridePendingTransition(R.anim.popup_anim_in, R.anim.popup_anim_out); } - public void onBackPressed(View view){ - this.finish(); - reset(); + public void onBackPressed(View view) { + onReleaseDisplay(); + finish(); + overridePendingTransition(R.anim.popup_anim_in, R.anim.popup_anim_out); } - public void onclearDataTrigger(View view){ - pluginController.getInstance().MessageManagerHandler(this, Collections.singletonList(strings.GENERIC_EMPTY_STR),enums.etype.clear_tab); + public void onRemoveView(int pId){ + for(int mCounter=0; mCounter data, enums.etype e_type) { - if(e_type.equals(enums.etype.clear_recycler)){ - mListView.getRecycledViewPool().clear(); - } - if(e_type.equals(enums.etype.url_triggered)){ - tabRowModel model = (tabRowModel)data.get(0); - pluginController.getInstance().logEvent(strings.EVENT_TAB_TRIGGERED); - mHomeController.onLoadTab(model.getSession(),false); - tabController.this.finish(); - } - else if(e_type.equals(enums.etype.url_clear)){ - mListModel.onManualClear((int)data.get(0)); - mHomeController.initTabCount(); - } - else if(e_type.equals(enums.etype.is_empty)){ - - mtabViewController.removeFromList((int)data.get(0)); - mtabViewController.updateIfListEmpty(mListModel.getList().size(),300); - mHomeController.releaseSession(); - if(dataController.getInstance().getTotalTabs()<1){ - mHomeController.onNewTab(true,false); - finish(); - }else { - mHomeController.loadExistingTab(); - } - mHomeController.initTabCount(); - } return null; } - } - } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java new file mode 100644 index 00000000..defcf614 --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabEnums.java @@ -0,0 +1,12 @@ +package com.darkweb.genesissearchengine.appManager.tabManager; + +public class tabEnums +{ + /*Settings Manager*/ + public enum eTabViewCommands { + M_DISMISS_MENU, M_SHOW_MENU, INIT_TAB_COUNT + } + + public enum eTabModelCommands { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabModel.java index 2dc1c52e..145b69ff 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabModel.java @@ -14,19 +14,10 @@ class tabModel { mModelList = model; } + ArrayList getList() { return mModelList; } - private void removeFromMainList(int index) - { - if(mModelList.size()>index){ - mModelList.remove(index); - } - } - - void onManualClear(int index){ - removeFromMainList(index); - } } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabRowModel.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabRowModel.java index 12e74895..aeb2a497 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabRowModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabRowModel.java @@ -2,12 +2,15 @@ package com.darkweb.genesissearchengine.appManager.tabManager; import com.darkweb.genesissearchengine.appManager.homeManager.geckoSession; +import org.mozilla.geckoview.GeckoView; + public class tabRowModel { /*Private Variables*/ private geckoSession mSession; private int mId; + private GeckoView mGeckoView = null; /*Initializations*/ @@ -21,6 +24,16 @@ public class tabRowModel return mSession; } + public void setGeckoView(GeckoView pGeckoView){ + mGeckoView = pGeckoView; + } + + public void releaseGeckoView(){ + if(mGeckoView!=null){ + mGeckoView.releaseSession(); + } + } + public int getmId() { return mId; } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java index 0fa29afa..7feb9569 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/appManager/tabManager/tabViewController.java @@ -1,37 +1,52 @@ package com.darkweb.genesissearchengine.appManager.tabManager; +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.os.Build; +import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; +import android.widget.ActionMenuView; import android.widget.Button; -import android.widget.ImageView; +import android.widget.PopupWindow; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; -import com.example.myapplication.R; -import java.util.Objects; +import com.darkweb.genesissearchengine.constants.strings; +import com.darkweb.genesissearchengine.dataManager.dataController; +import com.darkweb.genesissearchengine.dataManager.dataEnums; +import com.darkweb.genesissearchengine.helperManager.helperMethod; +import com.example.myapplication.R; +import java.util.List; +import static android.content.Context.LAYOUT_INFLATER_SERVICE; class tabViewController { /*Private Variables*/ private AppCompatActivity mContext; - - private ImageView mEmptyListNotifier; - private RecyclerView mListView; - private Button mClearButton; + private PopupWindow mTabOptionMenu = null; + private Button mTabs; /*Initializations*/ - tabViewController(ImageView mEmptyListNotifier, RecyclerView mListView, Button mClearButton, AppCompatActivity mContext) + tabViewController(AppCompatActivity mContext, Button pTabs) { this.mContext = mContext; - this.mEmptyListNotifier = mEmptyListNotifier; - this.mListView = mListView; - this.mClearButton = mClearButton; + this.mTabs = pTabs; initPostUI(); + initUI(); + } + + private void initUI(){ + initTabCount(); + } + + private void initTabCount(){ + mTabs.setText((((int)dataController.getInstance().invokeTab(dataEnums.eTabCommands.GET_TOTAL_TAB, null))+ strings.GENERIC_EMPTY_STR)); } private void initPostUI(){ @@ -40,30 +55,45 @@ class tabViewController window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { - window.setStatusBarColor(mContext.getResources().getColor(R.color.blue_dark)); + window.setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_text_v3)); } else { - mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);// set status text dark - mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.white)); + if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO){ + mContext.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + mContext.getWindow().setStatusBarColor(ContextCompat.getColor(mContext, R.color.c_background)); } } } - void updateIfListEmpty(int size,int duration){ - if(size>0){ - mEmptyListNotifier.animate().setDuration(duration).alpha(0f); - mClearButton.animate().setDuration(duration).alpha(1f); - } - else { - mEmptyListNotifier.animate().setDuration(duration).alpha(1f); - mClearButton.animate().setDuration(duration).alpha(0f); + private void onOpenTabMenu(View view) { + onCloseTabMenu(); + LayoutInflater layoutInflater = (LayoutInflater) view.getContext().getSystemService(LAYOUT_INFLATER_SERVICE); + @SuppressLint("InflateParams") final View mPopupView = layoutInflater.inflate(R.layout.tab_menu, null); + mTabOptionMenu = new PopupWindow( mPopupView, ActionMenuView.LayoutParams.WRAP_CONTENT, ActionMenuView.LayoutParams.WRAP_CONTENT, true); + view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + mTabOptionMenu.setOutsideTouchable(true); + mTabOptionMenu.setFocusable(true); + mTabOptionMenu.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + mTabOptionMenu.setAnimationStyle(R.style.popup_window_animation); + mTabOptionMenu.setElevation(7); + mTabOptionMenu.showAsDropDown(view,0, helperMethod.pxFromDp(-45)); + } + + private void onCloseTabMenu() { + if(mTabOptionMenu!=null){ + mTabOptionMenu.dismiss(); } } - void removeFromList(int index) - { - Objects.requireNonNull(mListView.getAdapter()).notifyItemRemoved(index); - mListView.getAdapter().notifyItemRangeChanged(index, mListView.getAdapter().getItemCount()-1); + public void onTrigger(tabEnums.eTabViewCommands pCommands, List pData){ + if(pCommands.equals(tabEnums.eTabViewCommands.M_SHOW_MENU)){ + onOpenTabMenu((View) pData.get(0)); + }else if(pCommands.equals(tabEnums.eTabViewCommands.M_DISMISS_MENU)){ + onCloseTabMenu(); + }else if(pCommands.equals(tabEnums.eTabViewCommands.INIT_TAB_COUNT)){ + initTabCount(); + } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java index b5ea8bf7..9fa0c59f 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/constants.java @@ -15,7 +15,6 @@ public class constants public static final String CONST_GENESIS_UPDATE_URL = "https://boogle.store/manual?abi="; public static final String CONST_PLAYSTORE_URL = "https://play.google.com/store/apps/details?id=com.darkweb.genesissearchengine"; - public static final String CONST_BACKEND_GENESIS_URL = "http://boogle.store/q=$s"; public static final String CONST_BACKEND_GOOGLE_URL = "https://www.google.com/q=$s"; public static final String CONST_BACKEND_DUCK_DUCK_GO_URL = "https://duckduckgo.com/q=$s"; @@ -32,6 +31,14 @@ public class constants public static final boolean CONST_PROXY_DO_NOT_TRACK_HEADER_ENABLED = false; public static final int CONST_PROXY_DO_NOT_TRACK_HEADER_VALUE = 1; + /*HISTORY CONSTANTS*/ + + public static final String HISTORY_LOAD_MORE = "loading_more"; + + /*BOOKMARK CONSTANTS*/ + + public static final String BOOKMARK_LOAD_MORE = "loading_more"; + /*MENU CONSTANTS*/ public static final int CONST_LIST_HISTORY = 1; @@ -43,6 +50,8 @@ public class constants public static final int CONST_FETCHABLE_LIST_SIZE =100; public static final int CONST_MAX_BOOKMARK_SIZE =500; public static final String CONST_DATABASE_NAME ="genesis_dbase"; + public static final String CONST_PERCENTAGE_SIGN ="%"; + public static final String CONST_PERCENTAGE_SIGN_100 ="100%"; /*ADMOB CONSTANTS*/ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java index 6923890b..d57762a6 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/enums.java @@ -4,11 +4,17 @@ public class enums { /*Settings Manager*/ public enum etype{ - on_update_favicon, + on_update_favicon,M_RESET_THEME_INVOKED_BACK, onion,on_verify_selected_url_menu, - welcome,abi_error, rate_failure,reported_success,bookmark, clear_tab,clear_history,clear_bookmark,report_url,rate_app,version_warning,start_orbot,download_file,download_file_long_press,on_long_press_url, + welcome,abi_error, rate_failure,reported_success,bookmark, clear_tab,clear_history,clear_bookmark,report_url,default_home,rate_app,version_warning,start_orbot,download_file,download_file_long_press,on_long_press_url, cancel_welcome,ignore_abi,reload,connect_vpn,app_rated,download_file_manual,download_folder, update_searcn, update_javascript,update_notification, update_history,update_cookies, update_font_size,update_font_adjustable,close_view,open_link_new_tab,open_link_current_tab,copy_link, url_triggered, url_triggered_new_tab,url_clear,clear_recycler,url_clear_at,remove_from_database,is_empty, - on_close_sesson,on_long_press,on_long_press_with_link,on_reset_app,on_bridge_mail,on_not_support,on_full_screen,on_handle_external_intent,on_update_suggestion_url,progress_update,recheck_orbot,on_url_load,on_playstore_load,back_list_empty,start_proxy,on_request_completed, on_update_history,on_update_suggestion,on_page_loaded,on_load_error,download_file_popup,on_init_ads,rate_application,search_update, open_new_tab + on_close_sesson,on_long_press,on_long_press_with_link,on_reset_app,on_bridge_mail,on_not_support, data_cleared,on_full_screen,on_handle_external_intent,on_update_suggestion_url,progress_update,recheck_orbot,on_url_load,on_playstore_load,back_list_empty,start_proxy,on_request_completed, on_update_history,on_update_suggestion,on_page_loaded,on_load_error,download_file_popup,on_init_ads,rate_application,search_update, open_new_tab + } + + public static class Theme { + public static final int THEME_LIGHT = 0; + public static final int THEME_DARK = 1; + public static final int THEME_DEFAULT = 2; } } \ No newline at end of file diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java index b0fd4c56..6347d7a1 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/keys.java @@ -19,6 +19,7 @@ public class keys public static final String PROXY_DO_NOT_TRACK_HEADER_VALUE = "privacy.donottrackheader.value"; public static final String PROXY_IS_APP_RATED = "IS_APP_RATED"; public static final String PROXY_LIST_TYPE = "list_type"; + public static final String PROXY_IMAGE = "permissions.default.image"; /*Settings*/ @@ -40,6 +41,16 @@ public class keys public static final String SETTING_SEARCH_SUGGESTION = "SETTING_SEARCH_STATUS"; public static final String SETTING_ZOOM = "SETTING_ZOOM"; public static final String SETTING_VOICE_INPUT = "SETTING_VOICE_INPUT"; + public static final String SETTING_TRACKING_PROTECTION = "SETTING_TRACKING_PROTECTION"; + public static final String SETTING_DONOT_TRACK = "SETTING_DONOT_TRACK"; + public static final String SETTING_RESTORE_TAB = "SETTING_RESTORE_TAB"; + public static final String SETTING_CHARACTER_ENCODING = "SETTING_CHARACTER_ENCODING"; + public static final String SETTING_SHOW_IMAGES = "SETTING_SHOW_IMAGES"; + public static final String SETTING_SHOW_FONTS = "SETTING_SHOW_FONTS"; + public static final String SETTING_AUTO_PLAY = "SETTING_AUTO_PLAY"; + public static final String SETTING_THEME = "SETTING_THEME_LIGHT"; + public static final String SETTING_FULL_SCREEN_BROWSIING = "SETTING_FULL_SCREEN_BROWSIING"; + public static final String SETTING_OPEN_URL_IN_NEW_TAB = "SETTING_OPEN_URL_IN_NEW_TAB"; /*Bridge Settings*/ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java index fa995e93..bcbff0fb 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/status.java @@ -1,5 +1,7 @@ package com.darkweb.genesissearchengine.constants; +import android.content.res.Configuration; + import com.darkweb.genesissearchengine.dataManager.dataController; import com.darkweb.genesissearchengine.dataManager.dataEnums; @@ -11,8 +13,8 @@ public class status { /*App Status*/ - public static String sAppCurrentABI = "7.0"; public static boolean sPaidStatus = false; + public static String sAppCurrentABI = "7.0"; /*Settings Status*/ @@ -20,29 +22,41 @@ public class status public static String sSettingRedirectStatus = strings.GENERIC_EMPTY_STR; + public static boolean sThemeChanged = false; public static boolean sSettingEnableZoom = true; public static boolean sSettingEnableVoiceInput = true; public static boolean sSettingSearchHistory = false; public static boolean getsSettingSearchSuggestion = false; public static boolean sSettingJavaStatus = true; - public static boolean sSettingHistoryStatus = true; + public static boolean sClearOnExit = true; public static boolean sSettingIsAppPaused = false; public static boolean sSettingIsWelcomeEnabled = true; public static boolean sSettingIsAppStarted = false; public static boolean sSettingIsAppRated = false; public static boolean sSettingFontAdjustable = true; public static boolean sSettingFirstStart = true; + public static boolean sSettingTrackingProtection = true; + public static boolean sStatusDoNotTrack = true; + public static boolean sRestoreTabs = false; + public static boolean sCharacterEncoding = false; + public static boolean sShowWebFonts = false; + public static boolean sAutoPlay = false; + public static boolean sFullScreenBrowsing = false; + public static boolean sOpenURLInNewTab = false; + public static int sTheme = enums.Theme.THEME_DEFAULT; public static int sSettingCookieStatus = ACCEPT_FIRST_PARTY; + public static int sShowImages = -1; public static float sSettingFontSize = 1; public static String sSettingLanguage = "en"; + public static boolean sDefaultNightMode; /*Bridge Status*/ - public static int sBridgeNotificationManual = 0; public static boolean sBridgeGatewayAuto = false; public static boolean sBridgeGatewayManual = false; public static boolean sBridgeVPNStatus = false; public static boolean sBridgeStatus = false; + public static int sBridgeNotificationManual = 0; public static String sBridgeCustomBridge = strings.BRIDGE_CUSTOM_BRIDGE_OBFS4; @@ -51,7 +65,7 @@ public class status status.sSettingSearchHistory = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_SEARCH_HISTORY,true)); status.getsSettingSearchSuggestion = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_SEARCH_SUGGESTION,true)); status.sSettingJavaStatus = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_JAVA_SCRIPT,true)); - status.sSettingHistoryStatus = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_HISTORY_CLEAR,true)); + status.sClearOnExit = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_HISTORY_CLEAR,true)); status.sBridgeGatewayAuto = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_GATEWAY_AUTO,true)); status.sBridgeGatewayManual = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_GATEWAY_MANUAL,false)); status.sSettingIsWelcomeEnabled = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_IS_WELCOME_ENABLED,true)); @@ -62,7 +76,8 @@ public class status status.sSettingFirstStart = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_FIRST_INSTALLED,true)); status.sSettingEnableZoom = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_ZOOM,true)); status.sSettingEnableVoiceInput = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_VOICE_INPUT,true)); - + status.sSettingTrackingProtection = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_TRACKING_PROTECTION,true)); + status.sStatusDoNotTrack = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_DONOT_TRACK,true)); status.sSettingCookieStatus = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_INT, Arrays.asList(keys.SETTING_COOKIE_ADJUSTABLE,ACCEPT_FIRST_PARTY)); status.sSettingFontSize = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_FLOAT, Arrays.asList(keys.SETTING_FONT_SIZE,100)); @@ -70,6 +85,15 @@ public class status status.sSettingSearchStatus = (String)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_STRING, Arrays.asList(keys.SETTING_SEARCH_ENGINE,constants.CONST_BACKEND_GENESIS_URL)); status.sBridgeCustomBridge = (String)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_STRING, Arrays.asList(keys.BRIDGE_CUSTOM_BRIDGE_1,strings.BRIDGE_CUSTOM_BRIDGE_OBFS4)); status.sBridgeNotificationManual = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_INT, Arrays.asList(keys.SETTING_NOTIFICATION_STATUS,0)); + + status.sRestoreTabs = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_RESTORE_TAB,false)); + status.sCharacterEncoding = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_CHARACTER_ENCODING,false)); + status.sShowImages = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_INT, Arrays.asList(keys.SETTING_SHOW_IMAGES,0)); + status.sShowWebFonts = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_SHOW_FONTS,false)); + status.sAutoPlay = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_AUTO_PLAY,false)); + status.sFullScreenBrowsing = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_FULL_SCREEN_BROWSIING,false)); + status.sTheme = (int)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_INT, Arrays.asList(keys.SETTING_THEME,enums.Theme.THEME_DEFAULT)); + status.sOpenURLInNewTab = (boolean)dataController.getInstance().invokePrefs(dataEnums.ePreferencesCommands.M_GET_BOOL, Arrays.asList(keys.SETTING_OPEN_URL_IN_NEW_TAB,false)); } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java b/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java index ef697cfa..8ee90822 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/constants/strings.java @@ -27,6 +27,7 @@ public class strings public static final String SETTING_CUSTOM_FONTS = "Custom Font"; public static final String SETTING_PERCENT_SIGN = "%"; public static final String SETTING_DEFAULT_LANGUAGE = "en"; + public static final String SETTING_DEFAULT_NEW_TAB_URL = "about:blank"; /*Home Manager*/ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/bookmarkDataModel.java b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/bookmarkDataModel.java index d0218682..35712011 100644 --- a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/bookmarkDataModel.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/bookmarkDataModel.java @@ -23,8 +23,10 @@ public class bookmarkDataModel { return mBookmarks; } - void addBookmark(String url, String title){ - if(url.length()>1500){ + void addBookmark(String pURL, String pTitle){ + if(pURL.endsWith("about:blank")) + pURL = "about:blank"; + if(pURL.length()>1500){ return; } int autoval = 0; @@ -38,20 +40,26 @@ public class bookmarkDataModel { autoval = mBookmarks.get(0).getID()+1; } - if(title.equals("")) + if(pTitle.equals("")) { - title = "New_Bookmark"+autoval; + pTitle = "New_Bookmark"+autoval; } String[] params = new String[2]; - params[0] = title; - params[1] = url; + params[0] = pTitle; + params[1] = pURL; - databaseController.getInstance().execSQL("INSERT INTO bookmark(id,title,url) VALUES("+autoval+",?,?);",params); - mBookmarks.add(0,new bookmarkRowModel(title, url,autoval)); + if(!pTitle.equals("loading")){ + databaseController.getInstance().execSQL("INSERT INTO bookmark(id,title,url) VALUES("+autoval+",?,?);",params); + } + mBookmarks.add(0,new bookmarkRowModel(pTitle, pURL,autoval)); } - void clearBookmark(int pID) { + void clearBookmark(){ + mBookmarks.clear(); + } + + void deleteBookmark(int pID) { for(int mCounter=0;mCounter mTabs = new ArrayList<>(); - private ArrayList mSuggestions = new ArrayList<>(); - private Map mSuggestionCache = new HashMap<>(); - - - /*List History*/ - void updateSuggestionURL(String url, String newURL,boolean isLoading){ - if(url.length()>1500){ - return; - } - url = helperMethod.removeLastSlash(url); - url = helperMethod.urlWithoutPrefix(url); - historyRowModel model = mSuggestionCache.get(url); - if(model!=null){ - mSuggestionCache.remove(url); - if(!newURL.equals("loading")) - model.setHeader(newURL); - mSuggestionCache.put(url,model); - } - - String[] params = new String[2]; - params[0] = newURL; - params[1] = url; - if(newURL.length()>0 && !isLoading){ - // databaseController.getInstance().execSQL("UPDATE history SET title = ? , date = DateTime('now') WHERE url = ?",params); - } - } - void addSuggenstions(String url, String title,boolean isLoading){ - if(url.length()>1500 || title.equals("$TITLE") || title.equals("loading")){ - return; - } - - url = helperMethod.removeLastSlash(url); - url = helperMethod.urlWithoutPrefix(url); - historyRowModel tempModel = mSuggestionCache.get(url); - - if(tempModel==null) { - historyRowModel model = new historyRowModel(title, url, -1); - mSuggestionCache.put(url, model); - mSuggestions.add(0, mSuggestionCache.get(url)); - - } - else { - updateSuggestionURL(url,title,isLoading); - } - - String[] params = new String[2]; - params[0] = title; - params[1] = url; - if(title.length()>0 && !isLoading){ - //databaseController.getInstance().execSQL("UPDATE history SET title = ? , date = DateTime('now') WHERE url = ?",params); - } - } - - - /*List Tabs*/ - - void addTabs(geckoSession mSession,boolean isHardCopy){ - if(!isHardCopy){ - mTabs.add(0,new tabRowModel(mSession,mTabs.size())); - } - else { - mTabs.add(0,new tabRowModel(mSession,mTabs.size())); - } - } - ArrayList getTab(){ - return mTabs; - } - void clearTab() { - int size = mTabs.size(); - for(int counter = 0; counter< size; counter++){ - mTabs.get(0).getSession().stop(); - mTabs.remove(0); - } - if(mTabs.size()>0){ - //Log.i("FUCKERRROR125:","_FERROR_"); - mTabs.get(0).getSession().closeSession(); - } - } - void closeTab(geckoSession mSession) { - - for(int counter = 0; counter< mTabs.size(); counter++){ - if(mTabs.get(counter).getSession().getSessionID()==mSession.getSessionID()) - { - mTabs.remove(counter); - break; - } - else { - mTabs.get(counter).setId(mTabs.get(counter).getmId()+1); - } - } - } - void moveTabToTop(geckoSession mSession) { - - for(int counter = 0; counter< mTabs.size(); counter++){ - - if(mTabs.get(counter).getSession().getSessionID()==mSession.getSessionID()) - { - /***BIG PROBLEM***/ - mTabs.remove(counter); - mTabs.add(0,new tabRowModel(mSession,0)); - break; - }else { - mTabs.get(counter).setId(mTabs.get(counter).getmId()+1); - } - } - } - tabRowModel getCurrentTab(){ - if(mTabs.size()>0){ - return mTabs.get(0); - } - else { - return null; - } - } - int getTotalTabs(){ - return mTabs.size(); - } - - /*List Suggestion*/ - - ArrayList getmSuggestions(){ - return mSuggestions; - } - void clearSuggestion(){ - mSuggestions.clear(); - initSuggestions(); - } - void initSuggestions(){ - - addSuggenstions("https://duckduckgo.com","Duckduckgo",true); - addSuggenstions("https://bbc.com","BBC",true); - addSuggenstions("https://youtube.com","Youtube",true); - addSuggenstions("https://facebook.com","Facebook",true); - addSuggenstions("https://twitter.com","Twitter",true); - addSuggenstions("https://amazon.com","Amazon",true); - addSuggenstions("https://imdb.com","IMDB",true); - addSuggenstions("https://reddit.com","Reddit",true); - addSuggenstions("https://pinterest.com","Pinterest",true); - addSuggenstions("https://ebay.com","EBay",true); - addSuggenstions("https://tripadvisor.com","Trip Advisor",true); - addSuggenstions("https://craigslist.org","Craigslist",true); - addSuggenstions("https://walmart.com","Walmart",true); - addSuggenstions("https://instagram.com","Instagram",true); - addSuggenstions("https://google.com","Google",true); - addSuggenstions("https://nytimes.com","NY Times",true); - addSuggenstions("https://apple.com","Apple",true); - addSuggenstions("https://linkedin.com","Linkedin",true); - addSuggenstions("https://indeed.com","Indeed",true); - addSuggenstions("https://play.google.com","Play.Google",true); - addSuggenstions("https://espn.com","ESPN",true); - addSuggenstions("https://webmd.com","Webmd",true); - addSuggenstions("https://cnn.com","CNN",true); - addSuggenstions("https://homedepot.com","Homedepot",true); - addSuggenstions("https://etsy.com","ETSY",true); - addSuggenstions("https://netflix.com","Netflix",true); - addSuggenstions("https://quora.com","Quora",true); - addSuggenstions("https://microsoft.com","Microsoft",true); - addSuggenstions("https://target.com","Target",true); - addSuggenstions("https://merriam-webster.com","Merriam Webster",true); - addSuggenstions("https://forbes.com","Forbes",true); - addSuggenstions("https://mapquest.com","Mapquest",true); - addSuggenstions("https://nih.gov","NIH",true); - addSuggenstions("https://gamepedia.com","Gamepedia",true); - addSuggenstions("https://yahoo.com","Yahoo",true); - addSuggenstions("https://healthline.com","Healthline",true); - addSuggenstions("https://foxnews.com","Foxnews",true); - addSuggenstions("https://allrecipes.com","All Recipes",true); - addSuggenstions("https://quizlet.com","Quizlet",true); - addSuggenstions("https://weather.com","Weather",true); - addSuggenstions("https://bestbuy.com","Bestbuy",true); - addSuggenstions("https://urbandictionary.com","Urbandictionary",true); - addSuggenstions("https://mayoclinic.org","Mayoclinic",true); - addSuggenstions("https://aol.com" ,"AOL",true); - addSuggenstions("https://genius.com","Genius",true); - addSuggenstions("https://zillow.com","Zillow",true); - addSuggenstions("https://usatoday.com","Usatoday",true); - addSuggenstions("https://glassdoor.com","Glassdoor",true); - addSuggenstions("https://msn.com","MSN",true); - addSuggenstions("https://rottentomatoes.com","Rotten Tomatoes",true); - addSuggenstions("https://lowes.com","Lowes",true); - addSuggenstions("https://dictionary.com","Dictionary",true); - addSuggenstions("https://businessinsider.com","Business Insider",true); - addSuggenstions("https://usnews.com","US News",true); - addSuggenstions("https://medicalnewstoday.com","Medical News Today",true); - addSuggenstions("https://britannica.com","Britannica",true); - addSuggenstions("https://washingtonpost.com","Washington Post",true); - addSuggenstions("https://usps.com","USPS",true); - addSuggenstions("https://finance.yahoo.com","Finance Yahoo",true); - addSuggenstions("https://irs.gov","IRS",true); - addSuggenstions("https://yellowpages.com","Yellow Pages",true); - addSuggenstions("https://chase.com","Chase",true); - addSuggenstions("https://retailmenot.com","Retail Menot",true); - addSuggenstions("https://accuweather.com","Accuweather",true); - addSuggenstions("https://wayfair.com","Way Fair",true); - addSuggenstions("https://go.com","GO",true); - addSuggenstions("https://live.com","Live",true); - addSuggenstions("https://login.yahoo.com","Login Yahoo",true); - addSuggenstions("https://steamcommunity.com","Steam Community",true); - addSuggenstions("https://xfinity.com","XFinity",true); - addSuggenstions("https://cnet.com","CNET",true); - addSuggenstions("https://ign.com","IGN",true); - addSuggenstions("https://steampowered.com","Steam Powered",true); - addSuggenstions("https://macys.com","Macys",true); - addSuggenstions("https://wikihow.com","Wikihow",true); - addSuggenstions("https://mail.yahoo.com","Mail Yahoo",true); - addSuggenstions("wiktionary.org","Wiktionary",true); - addSuggenstions("https://cbssports.com","Cbssports",true); - addSuggenstions("https://cnbc.com","CNBC",true); - addSuggenstions("https://bankofamerica.com","Bank Of America",true); - addSuggenstions("https://expedia.com","Expedia",true); - addSuggenstions("https://wellsfargo.com","Wellsfargo",true); - addSuggenstions("https://groupon.com","Groupon",true); - addSuggenstions("https://twitch.tv","Twitch",true); - addSuggenstions("https://khanacademy.org","Khan Academy",true); - addSuggenstions("https://theguardian.com","The Guardian",true); - addSuggenstions("https://paypal.com","Paypal",true); - addSuggenstions("https://spotify.com","Spotify",true); - addSuggenstions("https://att.com","ATT",true); - addSuggenstions("https://nfl.com","NFL",true); - addSuggenstions("https://realtor.com","Realtor",true); - addSuggenstions("https://ca.gov","CA Gov",true); - addSuggenstions("https://goodreads.com","Good Reads",true); - addSuggenstions("https://office.com","Office",true); - addSuggenstions("https://ufl.edu","UFL",true); - addSuggenstions("https://mlb.com","MLB",true); - addSuggenstions("https://foodnetwork.com","Food Network",true); - addSuggenstions("https://apartments.com","Apartments",true); - addSuggenstions("https://npr.org","NPR",true); - addSuggenstions("https://wowhead.com","Wow Head",true); - addSuggenstions("https://bing.com","Bing",true); - addSuggenstions("https://google.com","Google",true); - addSuggenstions("https://boogle.store","Genesis Search",true); - } - -} +package com.darkweb.genesissearchengine.dataManager; + +import com.darkweb.genesissearchengine.appManager.historyManager.historyRowModel; +import com.darkweb.genesissearchengine.helperManager.helperMethod; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class suggestionDataModel { + + private ArrayList mSuggestions = new ArrayList<>(); + private Map mSuggestionCache = new HashMap<>(); + + private void initSuggestions(){ + + addSuggenstions("https://duckduckgo.com","Duckduckgo",true); + addSuggenstions("https://bbc.com","BBC",true); + addSuggenstions("https://youtube.com","Youtube",true); + addSuggenstions("https://facebook.com","Facebook",true); + addSuggenstions("https://twitter.com","Twitter",true); + addSuggenstions("https://amazon.com","Amazon",true); + addSuggenstions("https://imdb.com","IMDB",true); + addSuggenstions("https://reddit.com","Reddit",true); + addSuggenstions("https://pinterest.com","Pinterest",true); + addSuggenstions("https://ebay.com","EBay",true); + addSuggenstions("https://tripadvisor.com","Trip Advisor",true); + addSuggenstions("https://craigslist.org","Craigslist",true); + addSuggenstions("https://walmart.com","Walmart",true); + addSuggenstions("https://instagram.com","Instagram",true); + addSuggenstions("https://google.com","Google",true); + addSuggenstions("https://nytimes.com","NY Times",true); + addSuggenstions("https://apple.com","Apple",true); + addSuggenstions("https://linkedin.com","Linkedin",true); + addSuggenstions("https://indeed.com","Indeed",true); + addSuggenstions("https://play.google.com","Play.Google",true); + addSuggenstions("https://espn.com","ESPN",true); + addSuggenstions("https://webmd.com","Webmd",true); + addSuggenstions("https://cnn.com","CNN",true); + addSuggenstions("https://homedepot.com","Homedepot",true); + addSuggenstions("https://etsy.com","ETSY",true); + addSuggenstions("https://netflix.com","Netflix",true); + addSuggenstions("https://quora.com","Quora",true); + addSuggenstions("https://microsoft.com","Microsoft",true); + addSuggenstions("https://target.com","Target",true); + addSuggenstions("https://merriam-webster.com","Merriam Webster",true); + addSuggenstions("https://forbes.com","Forbes",true); + addSuggenstions("https://mapquest.com","Mapquest",true); + addSuggenstions("https://nih.gov","NIH",true); + addSuggenstions("https://gamepedia.com","Gamepedia",true); + addSuggenstions("https://yahoo.com","Yahoo",true); + addSuggenstions("https://healthline.com","Healthline",true); + addSuggenstions("https://foxnews.com","Foxnews",true); + addSuggenstions("https://allrecipes.com","All Recipes",true); + addSuggenstions("https://quizlet.com","Quizlet",true); + addSuggenstions("https://weather.com","Weather",true); + addSuggenstions("https://bestbuy.com","Bestbuy",true); + addSuggenstions("https://urbandictionary.com","Urbandictionary",true); + addSuggenstions("https://mayoclinic.org","Mayoclinic",true); + addSuggenstions("https://aol.com" ,"AOL",true); + addSuggenstions("https://genius.com","Genius",true); + addSuggenstions("https://zillow.com","Zillow",true); + addSuggenstions("https://usatoday.com","Usatoday",true); + addSuggenstions("https://glassdoor.com","Glassdoor",true); + addSuggenstions("https://msn.com","MSN",true); + addSuggenstions("https://rottentomatoes.com","Rotten Tomatoes",true); + addSuggenstions("https://lowes.com","Lowes",true); + addSuggenstions("https://dictionary.com","Dictionary",true); + addSuggenstions("https://businessinsider.com","Business Insider",true); + addSuggenstions("https://usnews.com","US News",true); + addSuggenstions("https://medicalnewstoday.com","Medical News Today",true); + addSuggenstions("https://britannica.com","Britannica",true); + addSuggenstions("https://washingtonpost.com","Washington Post",true); + addSuggenstions("https://usps.com","USPS",true); + addSuggenstions("https://finance.yahoo.com","Finance Yahoo",true); + addSuggenstions("https://irs.gov","IRS",true); + addSuggenstions("https://yellowpages.com","Yellow Pages",true); + addSuggenstions("https://chase.com","Chase",true); + addSuggenstions("https://retailmenot.com","Retail Menot",true); + addSuggenstions("https://accuweather.com","Accuweather",true); + addSuggenstions("https://wayfair.com","Way Fair",true); + addSuggenstions("https://go.com","GO",true); + addSuggenstions("https://live.com","Live",true); + addSuggenstions("https://login.yahoo.com","Login Yahoo",true); + addSuggenstions("https://steamcommunity.com","Steam Community",true); + addSuggenstions("https://xfinity.com","XFinity",true); + addSuggenstions("https://cnet.com","CNET",true); + addSuggenstions("https://ign.com","IGN",true); + addSuggenstions("https://steampowered.com","Steam Powered",true); + addSuggenstions("https://macys.com","Macys",true); + addSuggenstions("https://wikihow.com","Wikihow",true); + addSuggenstions("https://mail.yahoo.com","Mail Yahoo",true); + addSuggenstions("wiktionary.org","Wiktionary",true); + addSuggenstions("https://cbssports.com","Cbssports",true); + addSuggenstions("https://cnbc.com","CNBC",true); + addSuggenstions("https://bankofamerica.com","Bank Of America",true); + addSuggenstions("https://expedia.com","Expedia",true); + addSuggenstions("https://wellsfargo.com","Wellsfargo",true); + addSuggenstions("https://groupon.com","Groupon",true); + addSuggenstions("https://twitch.tv","Twitch",true); + addSuggenstions("https://khanacademy.org","Khan Academy",true); + addSuggenstions("https://theguardian.com","The Guardian",true); + addSuggenstions("https://paypal.com","Paypal",true); + addSuggenstions("https://spotify.com","Spotify",true); + addSuggenstions("https://att.com","ATT",true); + addSuggenstions("https://nfl.com","NFL",true); + addSuggenstions("https://realtor.com","Realtor",true); + addSuggenstions("https://ca.gov","CA Gov",true); + addSuggenstions("https://goodreads.com","Good Reads",true); + addSuggenstions("https://office.com","Office",true); + addSuggenstions("https://ufl.edu","UFL",true); + addSuggenstions("https://mlb.com","MLB",true); + addSuggenstions("https://foodnetwork.com","Food Network",true); + addSuggenstions("https://apartments.com","Apartments",true); + addSuggenstions("https://npr.org","NPR",true); + addSuggenstions("https://wowhead.com","Wow Head",true); + addSuggenstions("https://bing.com","Bing",true); + addSuggenstions("https://google.com","Google",true); + addSuggenstions("https://boogle.store","Genesis Search",true); + } + + private void addSuggenstions(String url, String title,boolean isLoading){ + url = helperMethod.removeLastSlash(url); + if(url.length()>1500 || title.equals("$TITLE") || title.equals("loading")){ + return; + } + + url = helperMethod.removeLastSlash(url); + url = helperMethod.urlWithoutPrefix(url); + historyRowModel tempModel = mSuggestionCache.get(url); + + if(tempModel==null) { + historyRowModel model = new historyRowModel(title, url, -1); + mSuggestionCache.put(url, model); + mSuggestions.add(0, mSuggestionCache.get(url)); + + } + else { + updateSuggestionURL(url,title); + } + + } + + private void clearSuggestion(){ + mSuggestions.clear(); + initSuggestions(); + } + + private void updateSuggestionURL(String url, String newURL){ + url = helperMethod.removeLastSlash(url); + if(url.length()>1500){ + return; + } + url = helperMethod.removeLastSlash(url); + url = helperMethod.urlWithoutPrefix(url); + historyRowModel model = mSuggestionCache.get(url); + if(model!=null){ + mSuggestionCache.remove(url); + if(!newURL.equals("loading")) + model.setHeader(newURL); + mSuggestionCache.put(url,model); + } + } + + private ArrayList getmSuggestions(){ + return mSuggestions; + } + + public Object onTrigger(dataEnums.eSuggestionCommands p_commands, List p_data){ + if(p_commands.equals(dataEnums.eSuggestionCommands.M_CLEAR_SUGGESTION)){ + clearSuggestion(); + } + else if(p_commands.equals(dataEnums.eSuggestionCommands.M_INIT_SUGGESTION)){ + initSuggestions(); + } + else if(p_commands.equals(dataEnums.eSuggestionCommands.M_GET_SUGGESTION)){ + return getmSuggestions(); + } + else if(p_commands.equals(dataEnums.eSuggestionCommands.M_UPDATE_SUGGESTION)){ + updateSuggestionURL((String)p_data.get(0),(String) p_data.get(1)); + } + else if(p_commands.equals(dataEnums.eSuggestionCommands.M_ADD_SUGGESTION)){ + addSuggenstions((String)p_data.get(0),(String) p_data.get(1),true); + } + return null; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java new file mode 100644 index 00000000..e0bb93ea --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/dataManager/tabDataModel.java @@ -0,0 +1,108 @@ +package com.darkweb.genesissearchengine.dataManager; + +import android.annotation.SuppressLint; + +import com.darkweb.genesissearchengine.appManager.homeManager.geckoSession; +import com.darkweb.genesissearchengine.appManager.tabManager.tabRowModel; + +import java.util.ArrayList; +import java.util.List; + +@SuppressLint("CommitPrefEdits") +class tabDataModel +{ + private ArrayList mTabs = new ArrayList<>(); + + /*List Tabs*/ + + void addTabs(geckoSession mSession,boolean isHardCopy){ + if(!isHardCopy){ + mTabs.add(0,new tabRowModel(mSession,mTabs.size())); + } + else { + mTabs.add(0,new tabRowModel(mSession,mTabs.size())); + } + } + ArrayList getTab(){ + return mTabs; + } + void clearTab() { + int size = mTabs.size(); + for(int counter = 0; counter< size; counter++){ + mTabs.get(0).getSession().stop(); + mTabs.remove(0); + } + if(mTabs.size()>0){ + mTabs.get(0).getSession().closeSession(); + } + } + void closeTab(geckoSession mSession) { + for(int counter = 0; counter< mTabs.size(); counter++){ + if(mTabs.get(counter).getSession().getSessionID()==mSession.getSessionID()) + { + mTabs.remove(counter); + break; + } + else { + mTabs.get(counter).setId(mTabs.get(counter).getmId()+1); + } + } + } + void moveTabToTop(geckoSession mSession) { + + for(int counter = 0; counter< mTabs.size(); counter++){ + + if(mTabs.get(counter).getSession().getSessionID()==mSession.getSessionID()) + { + /* BIG PROBLEM */ + mTabs.remove(counter); + mTabs.add(0,new tabRowModel(mSession,0)); + break; + }else { + mTabs.get(counter).setId(mTabs.get(counter).getmId()+1); + } + } + } + tabRowModel getCurrentTab(){ + if(mTabs.size()>0){ + return mTabs.get(0); + } + else { + return null; + } + } + int getTotalTabs(){ + return mTabs.size(); + } + + /*List Suggestion*/ + public Object onTrigger(dataEnums.eTabCommands p_commands, List p_data){ + if(p_commands == dataEnums.eTabCommands.GET_TOTAL_TAB){ + return getTotalTabs(); + } + else if(p_commands == dataEnums.eTabCommands.GET_CURRENT_TAB){ + return getCurrentTab(); + } + else if(p_commands == dataEnums.eTabCommands.MOVE_TAB_TO_TOP){ + moveTabToTop((geckoSession)p_data.get(0)); + } + else if(p_commands == dataEnums.eTabCommands.CLOSE_TAB){ + closeTab((geckoSession)p_data.get(0)); + } + else if(p_commands == dataEnums.eTabCommands.M_CLEAR_TAB){ + clearTab(); + } + else if(p_commands == dataEnums.eTabCommands.M_CLOSE_TAB_PARAMETERIZED){ + closeTab((geckoSession)p_data.get(0)); + } + else if(p_commands == dataEnums.eTabCommands.M_ADD_TAB){ + addTabs((geckoSession)p_data.get(0), (boolean)p_data.get(1)); + } + else if(p_commands == dataEnums.eTabCommands.GET_TAB){ + return getTab(); + } + + return null; + } + +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/autoFillService.java b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/autoFillService.java new file mode 100644 index 00000000..f8714a5c --- /dev/null +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/autoFillService.java @@ -0,0 +1,25 @@ +package com.darkweb.genesissearchengine.helperManager; + +import android.os.Build; +import android.os.CancellationSignal; +import android.service.autofill.AutofillService; +import android.service.autofill.FillCallback; +import android.service.autofill.FillRequest; +import android.service.autofill.SaveCallback; +import android.service.autofill.SaveRequest; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +@RequiresApi(api = Build.VERSION_CODES.O) +public class autoFillService extends AutofillService { + + @Override + public void onFillRequest(@NonNull FillRequest request, @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback) { + + } + + @Override + public void onSaveRequest(@NonNull SaveRequest request, @NonNull SaveCallback callback) { + + } +} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java index 67b2dd21..35f4f1ea 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/helperManager/helperMethod.java @@ -61,12 +61,14 @@ public class helperMethod { /*Helper Methods General*/ - public static String completeURL(String url){ - + public static String completeURL(String pURL){ + if(pURL.equals("about:blank")){ + return pURL; + } URL weburl = null; try { - weburl = new URL(url); + weburl = new URL(pURL); URLConnection result = weburl.openConnection(); if (result instanceof HttpsURLConnection) { @@ -83,16 +85,16 @@ public class helperMethod e.printStackTrace(); } - if(!url.startsWith("www.")&& !url.startsWith("http://")&& !url.startsWith("https://")){ - url = ""+url; + if(!pURL.startsWith("www.")&& !pURL.startsWith("http://")&& !pURL.startsWith("https://")){ + pURL = ""+pURL; } - if(!url.startsWith("http://")&&!url.startsWith("https://")){ - url = "http://"+url; + if(!pURL.startsWith("http://")&&!pURL.startsWith("https://")){ + pURL = "http://"+pURL; } - return url; + return pURL; } - public static SpannableString urlDesigner(String url){ + public static SpannableString urlDesigner(String url, Context pContext){ if (url.contains("https://")) { @@ -109,7 +111,7 @@ public class helperMethod } else { SpannableString ss = new SpannableString(url); - ss.setSpan(new ForegroundColorSpan(Color.BLACK), 0, url.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + ss.setSpan(new ForegroundColorSpan(pContext.getResources().getColor(R.color.c_text_v1)), 0, url.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return ss; } } @@ -255,6 +257,11 @@ public class helperMethod context.startActivity(myIntent); } + public static void restartActivity( Intent pIntent, AppCompatActivity pContext){ + pContext.finish(); + pContext.startActivity(pIntent); + } + public static void onMinimizeApp(AppCompatActivity context){ Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); @@ -274,6 +281,23 @@ public class helperMethod return rotate; } + public static void openNotification(AppCompatActivity pContext) + { + Intent intent = new Intent(); + intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); + intent.putExtra("android.provider.extra.APP_PACKAGE", pContext.getPackageName()); + pContext.startActivity(intent); + } + + public static String ellipsize(String input, int maxLength) { + String ellip = "..."; + if (input == null || input.length() <= maxLength + || input.length() < ellip.length()) { + return input; + } + return input.substring(0, maxLength - ellip.length()).concat(ellip); + } + public static String getDomainName(String url) { try{ diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/adManager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/adManager.java index 28b01950..801395b1 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/adManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/adManager.java @@ -1,18 +1,16 @@ package com.darkweb.genesissearchengine.pluginManager; -import android.util.Log; - import androidx.appcompat.app.AppCompatActivity; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.helperManager.eventObserver; import com.google.android.gms.ads.*; -import static com.darkweb.genesissearchengine.constants.status.paid_status; +import static com.darkweb.genesissearchengine.constants.status.sPaidStatus; class adManager { - /*Private Variables*/ + /*Private Variables */ private AppCompatActivity mAppContext; private eventObserver.eventListener mEvent; @@ -29,12 +27,12 @@ class adManager } void loadAds(){ - if(!paid_status) + if(!sPaidStatus) { if (!bannerAdsLoading) { bannerAdsLoading = true; - MobileAds.initialize(mAppContext, constants.ADMOB_KEY); + MobileAds.initialize(mAppContext, constants.CONST_ADMOB_KEY); mBannerAds.setAlpha(0f); initializeBannerAds(); } @@ -48,7 +46,7 @@ class adManager /*Local Helper Methods*/ private void admobListeners(){ - if(!paid_status){ + if(!sPaidStatus){ mBannerAds.setAdListener(new AdListener() { @Override public void onAdLoaded() { @@ -83,7 +81,7 @@ class adManager /*External Helper Methods*/ private void initializeBannerAds(){ - if(!paid_status){ + if(!sPaidStatus){ AdRequest request = new AdRequest.Builder().addTestDevice("E731DE5933CDC0E42B335787CE3E23EF").build(); mBannerAds.loadAd(request); admobListeners(); diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java deleted file mode 100755 index 801395b1..00000000 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/admanager.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.darkweb.genesissearchengine.pluginManager; - -import androidx.appcompat.app.AppCompatActivity; -import com.darkweb.genesissearchengine.constants.constants; -import com.darkweb.genesissearchengine.helperManager.eventObserver; -import com.google.android.gms.ads.*; - -import static com.darkweb.genesissearchengine.constants.status.sPaidStatus; - -class adManager -{ - - /*Private Variables */ - - private AppCompatActivity mAppContext; - private eventObserver.eventListener mEvent; - private AdView mBannerAds; - private boolean bannerAdsLoading = false; - private boolean bannerAdsLoaded = false; - - /*Initializations*/ - - adManager(AppCompatActivity app_context, eventObserver.eventListener event, AdView banner_ads) { - this.mAppContext = app_context; - this.mEvent = event; - mBannerAds = banner_ads; - } - - void loadAds(){ - if(!sPaidStatus) - { - if (!bannerAdsLoading) - { - bannerAdsLoading = true; - MobileAds.initialize(mAppContext, constants.CONST_ADMOB_KEY); - mBannerAds.setAlpha(0f); - initializeBannerAds(); - } - } - } - - boolean isAdvertLoaded(){ - return bannerAdsLoaded; - } - - /*Local Helper Methods*/ - - private void admobListeners(){ - if(!sPaidStatus){ - mBannerAds.setAdListener(new AdListener() { - @Override - public void onAdLoaded() { - bannerAdsLoaded = true; - mEvent.invokeObserver(null,null); - } - - @Override - public void onAdFailedToLoad(int errorCode) { - //Log.i("Failure___",""+errorCode); - } - - @Override - public void onAdOpened() { - } - - @Override - public void onAdClicked() { - } - - @Override - public void onAdLeftApplication() { - } - - @Override - public void onAdClosed() { - } - }); - } - } - - /*External Helper Methods*/ - - private void initializeBannerAds(){ - if(!sPaidStatus){ - AdRequest request = new AdRequest.Builder().addTestDevice("E731DE5933CDC0E42B335787CE3E23EF").build(); - mBannerAds.loadAd(request); - admobListeners(); - } - } - -} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticManager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticManager.java index a73e4c82..bc4e54b4 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticManager.java @@ -3,7 +3,6 @@ package com.darkweb.genesissearchengine.pluginManager; import android.content.Context; import android.content.SharedPreferences; import androidx.appcompat.app.AppCompatActivity; -import com.crashlytics.android.Crashlytics; import com.darkweb.genesissearchengine.constants.constants; import com.darkweb.genesissearchengine.helperManager.eventObserver; @@ -11,7 +10,7 @@ import java.util.UUID; class analyticManager { - /*Private Variables*/ + /*Private Variables */ private AppCompatActivity mAppContext; private String mUniqueID = null; @@ -24,7 +23,7 @@ class analyticManager } private void initialize(){ - final String PREF_UNIQUE_ID = constants.UNIQUE_KEY_ID; + final String PREF_UNIQUE_ID = constants.CONST_UNIQUE_KEY_ID; if (mUniqueID == null) { @@ -53,9 +52,6 @@ class analyticManager /*Helper Methods*/ void logUser(){ - Crashlytics.setUserIdentifier(mUniqueID); - Crashlytics.setUserEmail(constants.USER_EMAIL); - Crashlytics.setUserName(mUniqueID); } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticmanager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticmanager.java deleted file mode 100755 index bc4e54b4..00000000 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/analyticmanager.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.darkweb.genesissearchengine.pluginManager; - -import android.content.Context; -import android.content.SharedPreferences; -import androidx.appcompat.app.AppCompatActivity; -import com.darkweb.genesissearchengine.constants.constants; -import com.darkweb.genesissearchengine.helperManager.eventObserver; - -import java.util.UUID; - -class analyticManager -{ - /*Private Variables */ - - private AppCompatActivity mAppContext; - private String mUniqueID = null; - - /*Initializations*/ - - analyticManager(AppCompatActivity app_context, eventObserver.eventListener event){ - this.mAppContext = app_context; - initialize(); - } - - private void initialize(){ - final String PREF_UNIQUE_ID = constants.CONST_UNIQUE_KEY_ID; - - if (mUniqueID == null) - { - SharedPreferences sharedPrefs = mAppContext.getSharedPreferences( - PREF_UNIQUE_ID, Context.MODE_PRIVATE); - mUniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null); - if (mUniqueID == null) { - - new Thread(){ - public void run(){ - try{ - mUniqueID = UUID.randomUUID().toString(); - }catch (Exception ex){ - mUniqueID = UUID.randomUUID().toString(); - } - - SharedPreferences.Editor editor = sharedPrefs.edit(); - editor.putString(PREF_UNIQUE_ID, mUniqueID); - editor.apply(); - } - }.start(); - } - } - } - - /*Helper Methods*/ - - void logUser(){ - } - -} diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java index 65031fe2..732b52d0 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/messageManager.java @@ -79,11 +79,11 @@ class messageManager }); } + @SuppressLint("QueryPermissionsNeeded") private void abiError() { initializeDialog(R.layout.popup_abi_error, Gravity.CENTER); - dialog.findViewById(R.id.pOption1).setOnClickListener(v -> dialog.dismiss()); - dialog.findViewById(R.id.pOption2).setOnClickListener(v -> { + dialog.findViewById(R.id.pOption1).setOnClickListener(v -> { dialog.dismiss(); Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(constants.CONST_GENESIS_UPDATE_URL + status.sAppCurrentABI)); if(browserIntent.resolveActivity(app_context.getPackageManager()) != null) @@ -136,6 +136,12 @@ class messageManager dialog.findViewById(R.id.pDismiss).setOnClickListener(v -> dialog.dismiss()); } + private void dataClearedSuccessfully() + { + initializeDialog(R.layout.popup_data_cleared, Gravity.BOTTOM); + dialog.findViewById(R.id.pDismiss).setOnClickListener(v -> dialog.dismiss()); + } + @SuppressLint("ResourceType") private void bookmark() { @@ -211,6 +217,7 @@ class messageManager }); } + @SuppressLint("QueryPermissionsNeeded") private void rateApp() { initializeDialog(R.layout.popup_rate_us, Gravity.CENTER); @@ -251,12 +258,12 @@ class messageManager String title = data.get(1); int size = name.length(); - if(size>35){ - size = 35; + if(size>235){ + size = 235; } initializeDialog(R.layout.popup_file_longpress, Gravity.CENTER); - ((TextView)dialog.findViewById(R.id.pDescription)).setText((title + data.get(0).substring(0,size)+"...")); + ((TextView)dialog.findViewById(R.id.pDescription)).setText((title + " | " + data.get(0).substring(0,size)+"...")); dialog.findViewById(R.id.pDismiss).setOnClickListener(v -> dialog.dismiss()); dialog.findViewById(R.id.pOption1).setOnClickListener(v -> { event.invokeObserver(Collections.singletonList(data.get(0)), enums.etype.download_file_manual); @@ -281,8 +288,8 @@ class messageManager int size = data.get(0).length()-1; String title = data.get(1); - if(size>35){ - size = 35; + if(size>235){ + size = 235; } initializeDialog(R.layout.popup_url_longpress, Gravity.CENTER); @@ -303,7 +310,6 @@ class messageManager } private void popupDownloadFull(){ - String url = data.get(0); String file = data.get(1); String title = data.get(2); @@ -311,25 +317,28 @@ class messageManager String data_local = app_context.getString(R.string.ALERT_LONG_URL_MESSAGE); int size = url.length(); - if(size>35){ - size = 35; + if(size>235){ + size = 235; } int size1 = file.length(); - if(size1>35){ - size1 = 35; + if(size1>235){ + size1 = 235; } if(!url.equals("")){ data_local = title + url.substring(0,size)+"..."; } else if(!file.equals("")){ - data_local = title + file.substring(0,size1)+"..."; + data_local = file.substring(0,size1)+"..."; + } + String mTitle = title; + if(mTitle.length()<=1){ + mTitle = data.get(0).substring(0,size)+"..."; } - - initializeDialog(R.layout.popup_url_longpress, Gravity.CENTER); - ((TextView)dialog.findViewById(R.id.pHeader)).setText((title + data.get(0).substring(0,size)+"...")); + initializeDialog(R.layout.popup_download_full, Gravity.CENTER); + ((TextView)dialog.findViewById(R.id.pHeader)).setText(mTitle); ((TextView)dialog.findViewById(R.id.pDescription)).setText((data_local)); dialog.findViewById(R.id.pDismiss).setOnClickListener(v -> dialog.dismiss()); dialog.findViewById(R.id.pOption1).setOnClickListener(v -> { @@ -456,7 +465,7 @@ class messageManager case on_long_press_with_link: popupDownloadFull(); - break; + break; case on_bridge_mail: sendBridgeMail(); @@ -465,6 +474,10 @@ class messageManager case on_not_support: notSupportMessage(); break; + + case data_cleared: + dataClearedSuccessfully(); + break; } } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java index af84f742..be6abc8a 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/orbotManager.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.os.Build; import androidx.appcompat.app.AppCompatActivity; + import com.darkweb.genesissearchengine.constants.*; import com.darkweb.genesissearchengine.dataManager.dataController; import com.darkweb.genesissearchengine.dataManager.dataEnums; @@ -41,8 +42,8 @@ class orbotManager } void startOrbot(Context context){ - orbotLocalConstants.bridges = status.sBridgeCustomBridge; - orbotLocalConstants.sIsManualBridge = status.sBridgeGatewayManual; + orbotLocalConstants.mBridges = status.sBridgeCustomBridge; + orbotLocalConstants.mIsManualBridge = status.sBridgeGatewayManual; this.mAppContext = context; Prefs.putBridgesEnabled(status.sBridgeGatewayManual |status.sBridgeGatewayAuto); Intent mServiceIntent = new Intent(context, OrbotService.class); @@ -58,10 +59,10 @@ class orbotManager } int getNotificationStatus(){ - return orbotLocalConstants.sNotificationStatus; + return orbotLocalConstants.mNotificationStatus; } void initNotification(int status){ - orbotLocalConstants.sNotificationStatus = status; + orbotLocalConstants.mNotificationStatus = status; } void enableTorNotification(){ OrbotService.getServiceObject().enableNotification(); @@ -129,20 +130,22 @@ class orbotManager setPrivacyPrefs(); } - private void setPrivacyPrefs () + public void setPrivacyPrefs () { + PrefsHelper.setPref(keys.PROXY_IMAGE, status.sShowImages); + PrefsHelper.setPref("browser.display.show_image_placeholders",true); PrefsHelper.setPref("browser.cache.disk.enable",false); PrefsHelper.setPref("browser.cache.memory.enable",true); PrefsHelper.setPref("browser.cache.disk.capacity",0); PrefsHelper.setPref("privacy.resistFingerprinting",true); - PrefsHelper.setPref("privacy.clearOnShutdown.cache",status.sSettingHistoryStatus); - PrefsHelper.setPref("privacy.clearOnShutdown.downloads",status.sSettingHistoryStatus); - PrefsHelper.setPref("privacy.clearOnShutdown.formdata",status.sSettingHistoryStatus); - PrefsHelper.setPref("privacy.clearOnShutdown.history",status.sSettingHistoryStatus); - PrefsHelper.setPref("privacy.clearOnShutdown.offlineApps",status.sSettingHistoryStatus); - PrefsHelper.setPref("privacy.clearOnShutdown.passwords",status.sSettingHistoryStatus); - PrefsHelper.setPref("privacy.clearOnShutdown.sessions",status.sSettingHistoryStatus); - PrefsHelper.setPref("privacy.clearOnShutdown.siteSettings",status.sSettingHistoryStatus); + PrefsHelper.setPref("privacy.clearOnShutdown.cache",status.sClearOnExit); + PrefsHelper.setPref("privacy.clearOnShutdown.downloads",status.sClearOnExit); + PrefsHelper.setPref("privacy.clearOnShutdown.formdata",status.sClearOnExit); + PrefsHelper.setPref("privacy.clearOnShutdown.history",status.sClearOnExit); + PrefsHelper.setPref("privacy.clearOnShutdown.offlineApps",status.sClearOnExit); + PrefsHelper.setPref("privacy.clearOnShutdown.passwords",status.sClearOnExit); + PrefsHelper.setPref("privacy.clearOnShutdown.sessions",status.sClearOnExit); + PrefsHelper.setPref("privacy.clearOnShutdown.siteSettings",status.sClearOnExit); PrefsHelper.setPref("privacy.donottrackheader.enabled",false); PrefsHelper.setPref("privacy.donottrackheader.value",1); PrefsHelper.setPref("network.http.sendRefererHeader", 0); @@ -155,7 +158,7 @@ class orbotManager String getLogs() { - String logs = orbotLocalConstants.tor_logs_status; + String logs = orbotLocalConstants.mTorLogsStatus; if(!logs.contains("Bootstrapped") && !mLogsStarted){ logs = "Initializing Bootstrap"; @@ -178,7 +181,7 @@ class orbotManager } boolean isOrbotRunning(){ - return orbotLocalConstants.sIsTorInitialized; + return orbotLocalConstants.mIsTorInitialized; } } diff --git a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java index 823dc6a9..32a1a0f9 100755 --- a/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java +++ b/app/src/main/java/com/darkweb/genesissearchengine/pluginManager/pluginController.java @@ -121,6 +121,9 @@ public class pluginController public void setProxy(String url){ orbotManager.getInstance().setProxy(url); } + public void updatePrivacy(){ + orbotManager.getInstance().setPrivacyPrefs(); + } public String orbotLogs(){ return orbotManager.getInstance().getLogs(); } @@ -245,7 +248,7 @@ public class pluginController dataController.getInstance().invokeHistory(dataEnums.eHistoryCommands.M_CLEAR_HISTORY ,null); mContextManager.getHistoryController().onclearData(); mHomeController.onClearSession(); - dataController.getInstance().clearTabs(); + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_CLEAR_TAB, null); mHomeController.initTab(false); } else if(event_type.equals(enums.etype.clear_bookmark)){ @@ -283,7 +286,7 @@ public class pluginController helperMethod.copyURL(data.get(0).toString(),mContextManager.getHomeController()); } else if(event_type.equals(enums.etype.clear_tab)){ - dataController.getInstance().clearTabs(); + dataController.getInstance().invokeTab(dataEnums.eTabCommands.M_CLEAR_TAB, null); mHomeController.initTab(true); activityContextManager.getInstance().getTabController().finish(); } diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml index b9abe68c..d35de463 100755 --- a/app/src/main/res/anim/fade_in.xml +++ b/app/src/main/res/anim/fade_in.xml @@ -1,8 +1,7 @@ - - + - + android:duration="100" + android:fromAlpha="0.5" + android:interpolator="@android:anim/linear_interpolator" + android:toAlpha="1.0" /> \ No newline at end of file diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml new file mode 100644 index 00000000..cfc55613 --- /dev/null +++ b/app/src/main/res/anim/fade_out.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_left.xml b/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_left.xml index 1bbce1d6..7c8204ac 100644 --- a/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_left.xml +++ b/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_left.xml @@ -1,5 +1,5 @@ + android:color="@color/c_view_divier_background"> diff --git a/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_right.xml b/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_right.xml index 4d1bff53..dd163480 100644 --- a/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_right.xml +++ b/app/src/main/res/custom-xml/alert/xml/ax_bottom_rounded_corner_right.xml @@ -1,5 +1,5 @@ + android:color="@color/c_ripple"> diff --git a/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_bottom.xml b/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_bottom.xml new file mode 100644 index 00000000..2c2af2ce --- /dev/null +++ b/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_bottom.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_left.xml b/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_left.xml index 4d1bff53..93f43199 100644 --- a/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_left.xml +++ b/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_left.xml @@ -1,11 +1,11 @@ + android:color="@color/c_ripple"> diff --git a/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_right.xml b/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_right.xml index 1bbce1d6..e399ab35 100644 --- a/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_right.xml +++ b/app/src/main/res/custom-xml/alert/xml/ax_ripple_default_round_right.xml @@ -1,11 +1,11 @@ + android:color="@color/c_ripple"> - + diff --git a/app/src/main/res/custom-xml/generic/xml/gx_generic_input.xml b/app/src/main/res/custom-xml/generic/xml/gx_generic_input.xml index 5238b973..d754f0a2 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_generic_input.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_generic_input.xml @@ -5,7 +5,7 @@ android:top="113dp"> - + @@ -13,7 +13,7 @@ android:top="113dp"> - + diff --git a/app/src/main/res/custom-xml/generic/xml/gx_generic_input_square.xml b/app/src/main/res/custom-xml/generic/xml/gx_generic_input_square.xml new file mode 100644 index 00000000..4de0ff64 --- /dev/null +++ b/app/src/main/res/custom-xml/generic/xml/gx_generic_input_square.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml b/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml index 74e94289..51946e32 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_generic_tab_button.xml @@ -4,26 +4,26 @@ + android:shape="rectangle" android:padding="15dp" > - + + android:color="@color/c_tab_border" /> + android:shape="rectangle" android:padding="15dp" > - + + android:width="2dp" + android:color="@color/c_text_v5" /> diff --git a/app/src/main/res/custom-xml/generic/xml/gx_ripple_blue.xml b/app/src/main/res/custom-xml/generic/xml/gx_ripple_blue.xml index 24aa3de5..72ae4dc1 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_ripple_blue.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_ripple_blue.xml @@ -1,5 +1,5 @@ + android:color="@color/c_ripple"> diff --git a/app/src/main/res/custom-xml/generic/xml/gx_ripple_default_round.xml b/app/src/main/res/custom-xml/generic/xml/gx_ripple_default_round.xml index b8468451..29103274 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_ripple_default_round.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_ripple_default_round.xml @@ -1,5 +1,5 @@ + android:color="@color/c_ripple"> diff --git a/app/src/main/res/custom-xml/generic/xml/gx_ripple_gray.xml b/app/src/main/res/custom-xml/generic/xml/gx_ripple_gray.xml index f1635852..ef31b852 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_ripple_gray.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_ripple_gray.xml @@ -1,5 +1,5 @@ + android:color="@color/c_ripple"> diff --git a/app/src/main/res/custom-xml/generic/xml/gx_rounded_corner_alert.xml b/app/src/main/res/custom-xml/generic/xml/gx_rounded_corner_alert.xml index 1b5be0c7..2b54d45f 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_rounded_corner_alert.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_rounded_corner_alert.xml @@ -12,8 +12,8 @@ diff --git a/app/src/main/res/custom-xml/generic/xml/gx_side_item.xml b/app/src/main/res/custom-xml/generic/xml/gx_side_item.xml index f979fa51..58185999 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_side_item.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_side_item.xml @@ -1,6 +1,6 @@ + android:color="@color/c_ripple_v1"> diff --git a/app/src/main/res/custom-xml/generic/xml/gx_side_item_bottom.xml b/app/src/main/res/custom-xml/generic/xml/gx_side_item_bottom.xml index 6b34449e..4debc24a 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_side_item_bottom.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_side_item_bottom.xml @@ -1,6 +1,6 @@ + android:color="@color/c_ripple_v1"> diff --git a/app/src/main/res/custom-xml/generic/xml/gx_side_item_popup.xml b/app/src/main/res/custom-xml/generic/xml/gx_side_item_popup.xml index d15d3b96..20206895 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_side_item_popup.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_side_item_popup.xml @@ -4,17 +4,17 @@ - + + android:color="@color/c_view_divier_background" /> + android:topRightRadius="4dp"/> @@ -22,22 +22,22 @@ - + + android:color="@color/c_view_divier_background" /> + android:topRightRadius="4dp"/> diff --git a/app/src/main/res/custom-xml/generic/xml/gx_side_item_top.xml b/app/src/main/res/custom-xml/generic/xml/gx_side_item_top.xml index fdec7461..b10097de 100644 --- a/app/src/main/res/custom-xml/generic/xml/gx_side_item_top.xml +++ b/app/src/main/res/custom-xml/generic/xml/gx_side_item_top.xml @@ -1,9 +1,9 @@ + android:color="@color/c_ripple_v1"> - + - + + android:color="@color/c_view_divier_background" /> + android:topRightRadius="4dp"/> @@ -22,22 +22,22 @@ - + + android:color="@color/c_view_divier_background" /> + android:topRightRadius="4dp"/> diff --git a/app/src/main/res/custom-xml/history/xml/hx_border.xml b/app/src/main/res/custom-xml/history/xml/hx_border.xml index c6b41317..900b4ffc 100644 --- a/app/src/main/res/custom-xml/history/xml/hx_border.xml +++ b/app/src/main/res/custom-xml/history/xml/hx_border.xml @@ -2,12 +2,12 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/history/xml/hx_circle_favicon.xml b/app/src/main/res/custom-xml/history/xml/hx_circle_favicon.xml index 85096710..e573e69e 100644 --- a/app/src/main/res/custom-xml/history/xml/hx_circle_favicon.xml +++ b/app/src/main/res/custom-xml/history/xml/hx_circle_favicon.xml @@ -2,7 +2,7 @@ + android:startColor="@color/c_profile_radial_inner" android:endColor="@color/c_profile_radial_outer" /> + android:color="@color/c_alert_background" android:layout_height="match_parent" android:layout_width="match_parent"> - + + android:color="@color/c_alert_background" /> - + + android:color="@color/c_alert_background" /> diff --git a/app/src/main/res/custom-xml/history/xml/hx_menu_popup_container.xml b/app/src/main/res/custom-xml/history/xml/hx_menu_popup_container.xml index b63c9dac..a3fc13da 100644 --- a/app/src/main/res/custom-xml/history/xml/hx_menu_popup_container.xml +++ b/app/src/main/res/custom-xml/history/xml/hx_menu_popup_container.xml @@ -12,7 +12,7 @@ android:right="1dp" android:top="1dp" /> - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/home/xml/hox_rounded_corner.xml b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner.xml index 6802f78b..ca8356ce 100644 --- a/app/src/main/res/custom-xml/home/xml/hox_rounded_corner.xml +++ b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner.xml @@ -12,8 +12,8 @@ diff --git a/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container.xml b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container.xml new file mode 100644 index 00000000..ab1575f0 --- /dev/null +++ b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container_bottom.xml b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container_bottom.xml new file mode 100644 index 00000000..2a485e68 --- /dev/null +++ b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_container_bottom.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_splash.xml b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_splash.xml new file mode 100644 index 00000000..426be64b --- /dev/null +++ b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_splash.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_suggestion_settings.xml b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_suggestion_settings.xml index 13e3357c..26aed53a 100644 --- a/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_suggestion_settings.xml +++ b/app/src/main/res/custom-xml/home/xml/hox_rounded_corner_suggestion_settings.xml @@ -1,6 +1,6 @@ + android:color="@color/text_color_v1"> @@ -12,8 +12,8 @@ diff --git a/app/src/main/res/custom-xml/images/xml/ic_baseline_add.xml b/app/src/main/res/custom-xml/images/xml/ic_baseline_add.xml new file mode 100644 index 00000000..eb232541 --- /dev/null +++ b/app/src/main/res/custom-xml/images/xml/ic_baseline_add.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/custom-xml/images/xml/ic_baseline_bookmark.xml b/app/src/main/res/custom-xml/images/xml/ic_baseline_bookmark.xml new file mode 100644 index 00000000..b6d93cac --- /dev/null +++ b/app/src/main/res/custom-xml/images/xml/ic_baseline_bookmark.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/custom-xml/images/xml/ic_baseline_bug.xml b/app/src/main/res/custom-xml/images/xml/ic_baseline_bug.xml new file mode 100644 index 00000000..7853f61c --- /dev/null +++ b/app/src/main/res/custom-xml/images/xml/ic_baseline_bug.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/custom-xml/images/xml/ic_baseline_cross.xml b/app/src/main/res/custom-xml/images/xml/ic_baseline_cross.xml new file mode 100644 index 00000000..16d6d37d --- /dev/null +++ b/app/src/main/res/custom-xml/images/xml/ic_baseline_cross.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/custom-xml/images/xml/ic_baseline_delete.xml b/app/src/main/res/custom-xml/images/xml/ic_baseline_delete.xml new file mode 100644 index 00000000..b0b1d8d0 --- /dev/null +++ b/app/src/main/res/custom-xml/images/xml/ic_baseline_delete.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/custom-xml/images/xml/ic_secondary_gradinet.xml b/app/src/main/res/custom-xml/images/xml/ic_secondary_gradinet.xml index c20cd60c..59187ce1 100644 --- a/app/src/main/res/custom-xml/images/xml/ic_secondary_gradinet.xml +++ b/app/src/main/res/custom-xml/images/xml/ic_secondary_gradinet.xml @@ -3,8 +3,8 @@ - - + + diff --git a/app/src/main/res/custom-xml/orbot_log/xml/olx_rounded_corner_warning.xml b/app/src/main/res/custom-xml/orbot_log/xml/olx_rounded_corner_warning.xml new file mode 100644 index 00000000..c3d5caf0 --- /dev/null +++ b/app/src/main/res/custom-xml/orbot_log/xml/olx_rounded_corner_warning.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/setting/xml/sx_border_left.xml b/app/src/main/res/custom-xml/setting/xml/sx_border_left.xml new file mode 100644 index 00000000..c2faa39f --- /dev/null +++ b/app/src/main/res/custom-xml/setting/xml/sx_border_left.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/setting/xml/sx_button_round.xml b/app/src/main/res/custom-xml/setting/xml/sx_button_round.xml new file mode 100644 index 00000000..ed43521b --- /dev/null +++ b/app/src/main/res/custom-xml/setting/xml/sx_button_round.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/custom-xml/setting/xml/sx_font_change_round_background.xml b/app/src/main/res/custom-xml/setting/xml/sx_font_change_round_background.xml new file mode 100644 index 00000000..47824208 --- /dev/null +++ b/app/src/main/res/custom-xml/setting/xml/sx_font_change_round_background.xml @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/app/src/main/res/custom-xml/setting/xml/sx_seekbar_trail.xml b/app/src/main/res/custom-xml/setting/xml/sx_seekbar_trail.xml new file mode 100644 index 00000000..527edf49 --- /dev/null +++ b/app/src/main/res/custom-xml/setting/xml/sx_seekbar_trail.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/custom-xml/tab/xml/tx_border_round_geckoview.xml b/app/src/main/res/custom-xml/tab/xml/tx_border_round_geckoview.xml new file mode 100644 index 00000000..f0ebe3cb --- /dev/null +++ b/app/src/main/res/custom-xml/tab/xml/tx_border_round_geckoview.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/empty_bookmark.png b/app/src/main/res/drawable-hdpi/empty_bookmark.png index 282b5daf84ef71d3d29f9057f39b66118d53ab9a..311ea592ca8d652be91d871c30e9b02509e0cb48 100644 GIT binary patch literal 70991 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 z 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 Kn!Z2%%YOry5Q@M6 literal 80271 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 ZizRkZJg*gWd^wcN+S2}1<%x@N{|~9Gr=S1; diff --git a/app/src/main/res/drawable-hdpi/empty_history.png b/app/src/main/res/drawable-hdpi/empty_history.png index 1e6642e2641a5e77d05e6904194fcf6408b659f1..397f0170807e34bfbae22a07100d90a3f3347022 100644 GIT binary patch literal 80073 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 literal 63080 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�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 I%9sWI2X4a + + diff --git a/app/src/main/res/drawable/ic_baseline_advance.xml b/app/src/main/res/drawable/ic_baseline_advance.xml new file mode 100644 index 00000000..f4916f73 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_advance.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_baseline_browser.xml b/app/src/main/res/drawable/ic_baseline_browser.xml new file mode 100644 index 00000000..3f70646b --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_browser.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_clear.xml b/app/src/main/res/drawable/ic_baseline_clear.xml new file mode 100644 index 00000000..60b9c1d5 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_clear.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_home.xml b/app/src/main/res/drawable/ic_baseline_home.xml new file mode 100644 index 00000000..3a4c7dac --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_home.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_notifications.xml b/app/src/main/res/drawable/ic_baseline_notifications.xml new file mode 100644 index 00000000..c3204226 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_notifications.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_privacy.xml b/app/src/main/res/drawable/ic_baseline_privacy.xml new file mode 100644 index 00000000..99e31f21 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_privacy.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_search.xml b/app/src/main/res/drawable/ic_baseline_search.xml new file mode 100644 index 00000000..07b76d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_search.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layouts/alert/layout/popup_abi_error.xml b/app/src/main/res/layouts/alert/layout/popup_abi_error.xml index d5eae4d9..91d138ad 100644 --- a/app/src/main/res/layouts/alert/layout/popup_abi_error.xml +++ b/app/src/main/res/layouts/alert/layout/popup_abi_error.xml @@ -27,7 +27,7 @@ android:paddingStart="15dp" android:text="@string/ALERT_ABI_ERROR" android:textAlignment="textStart" - android:textColor="@color/secondary" + android:textColor="@color/c_text_setting_heading_v2" android:textSize="17sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" @@ -46,7 +46,7 @@ android:paddingStart="15dp" android:textSize="13sp" app:layout_constraintEnd_toEndOf="parent" - android:textColor="#242B64" + android:textColor="@color/c_text_v1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/pHeader" tools:ignore="SmallSp" /> @@ -56,7 +56,7 @@ android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="35dp" - android:background="@color/holo_gray_light" + android:background="@color/c_view_divier_background" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/pDescription" /> @@ -75,11 +75,11 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" - android:background="@xml/ax_ripple_default_round_right" + android:background="@xml/ax_ripple_default_round_left" android:padding="0dp" android:text="@string/ALERT_LOCAL_UPGRADE" android:textAllCaps="false" - android:textColor="@color/cursor_blue" + android:textColor="@color/c_button_text_v1" android:textSize="15sp" android:textStyle="bold" /> @@ -87,7 +87,7 @@ android:id="@+id/pDividerHorizontal" android:layout_width="1dp" android:layout_height="match_parent" - android:background="@color/holo_gray_light" + android:background="@color/c_view_divier_background" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/pRating" /> @@ -101,7 +101,7 @@ android:padding="0dp" android:text="@string/ALERT_PLAYSTORE_UPGRADE" android:textAllCaps="false" - android:textColor="@color/cursor_blue" + android:textColor="@color/c_button_text_v1" android:textSize="15sp" android:textStyle="bold" /> diff --git a/app/src/main/res/layouts/alert/layout/popup_bridge_mail.xml b/app/src/main/res/layouts/alert/layout/popup_bridge_mail.xml index 1c15c43c..c1056483 100644 --- a/app/src/main/res/layouts/alert/layout/popup_bridge_mail.xml +++ b/app/src/main/res/layouts/alert/layout/popup_bridge_mail.xml @@ -1,108 +1,111 @@ +xmlns:android="http://schemas.android.com/apk/res/android" +xmlns:app="http://schemas.android.com/apk/res-auto" +xmlns:tools="http://schemas.android.com/tools" +android:layout_width="match_parent" +android:layout_height="match_parent"> - + + + app:layout_constraintTop_toTopOf="parent" /> - + - + + + +