From 9757bc9cea13d182c56ebc09b4c9b959a185ddb8 Mon Sep 17 00:00:00 2001 From: Sunil Gupta <131786207+skgupta507@users.noreply.github.com> Date: Sun, 3 Mar 2024 11:43:19 +0530 Subject: [PATCH] Andriod Source Animedex The Andriod App Source Code For The Website Animedex --- .github/workflows/firebase-testing.yml | 46 + .gitignore | 10 + AppIcon | Bin 0 -> 8507 bytes CHANGELOG.md | 42 + HeaderImage | Bin 0 -> 12920 bytes NotificationIcon | Bin 0 -> 2720 bytes REVISION | 1 + app/.gitignore | 1 + app/build.gradle | 184 ++ app/proguard-project.txt | 60 + app/src/androidTest/AndroidManifest.xml | 4 + app/src/androidTest/assets/HelperClass.java | 5 + app/src/androidTest/assets/appConfig.json | 153 + .../com/median/testFiles/FirstTestClass.java | 105 + .../com/median/testFiles/TestMethods.java | 183 ++ app/src/main/AndroidManifest.xml | 153 + app/src/main/assets/BlobDownloader.js | 77 + .../main/assets/GoNativeJSBridgeLibrary.js | 339 +++ app/src/main/assets/appConfig.json | 335 +++ app/src/main/assets/custom-icons.json | 3 + app/src/main/assets/fonts/custom-icons.ttf | Bin 0 -> 5860 bytes app/src/main/assets/offline.html | 49 + .../java/co/median/android/ActionManager.java | 639 ++++ .../co/median/android/AppLinksActivity.java | 29 + .../co/median/android/AppUpgradeReceiver.java | 21 + .../java/co/median/android/AudioUtils.java | 183 ++ .../co/median/android/ConfigPreferences.java | 38 + .../java/co/median/android/ConfigUpdater.java | 76 + .../java/co/median/android/CustomHeaders.java | 69 + .../co/median/android/DownloadService.java | 316 ++ .../co/median/android/FileDownloader.java | 393 +++ .../android/FileUploadIntentsCreator.kt | 204 ++ .../co/median/android/FileWriterSharer.java | 321 ++ .../median/android/GoNativeApplication.java | 116 + .../median/android/GoNativeWindowManager.java | 153 + .../java/co/median/android/HtmlIntercept.java | 273 ++ .../main/java/co/median/android/IOUtils.java | 30 + .../java/co/median/android/Installation.java | 150 + .../median/android/JsCustomCodeExecutor.java | 64 + .../co/median/android/JsResultBridge.java | 5 + .../co/median/android/JsonMenuAdapter.java | 434 +++ .../java/co/median/android/KeyboardManager.kt | 78 + .../co/median/android/LaunchActivity.java | 4 + .../java/co/median/android/LoginManager.java | 137 + .../java/co/median/android/MainActivity.java | 2659 +++++++++++++++++ .../median/android/MySwipeRefreshLayout.java | 39 + .../java/co/median/android/ProfilePicker.java | 129 + .../median/android/RegistrationManager.java | 163 + .../median/android/SegmentedController.java | 128 + .../median/android/ShakeDialogFragment.java | 46 + .../java/co/median/android/TabManager.java | 350 +++ .../java/co/median/android/UrlInspector.java | 63 + .../java/co/median/android/UrlNavigation.java | 1033 +++++++ .../java/co/median/android/WebViewPool.java | 278 ++ .../android/WebViewPoolDisownPolicy.java | 10 + .../android/files/CapturedImageSaver.kt | 46 + .../android/widget/CircleImageView.java | 142 + .../android/widget/GoNativeDrawerLayout.java | 50 + .../widget/GoNativeSwipeRefreshLayout.java | 1222 ++++++++ .../co/median/android/widget/HandleView.kt | 155 + .../widget/SwipeHistoryNavigationLayout.kt | 474 +++ .../android/widget/WebViewContainerView.java | 81 + app/src/main/res/anim/fast_fade_out.xml | 6 + .../res/drawable-hdpi/drawer_shadow.9.png | Bin 0 -> 161 bytes .../main/res/drawable-hdpi/ic_actionbar.png | Bin 0 -> 2625 bytes .../drawable-hdpi/ic_chevron_down_light.png | Bin 0 -> 364 bytes .../res/drawable-hdpi/ic_chevron_up_light.png | Bin 0 -> 366 bytes .../res/drawable-hdpi/ic_notification.png | Bin 0 -> 761 bytes .../drawable-hdpi/ic_refresh_black_24dp.png | Bin 0 -> 864 bytes .../drawable-hdpi/ic_refresh_white_24dp.png | Bin 0 -> 900 bytes .../drawable-hdpi/ic_search_black_24dp.png | Bin 0 -> 779 bytes .../drawable-hdpi/ic_search_white_24dp.png | Bin 0 -> 815 bytes .../res/drawable-hdpi/ic_share_black_24dp.png | Bin 0 -> 948 bytes .../res/drawable-hdpi/ic_share_white_24dp.png | Bin 0 -> 984 bytes app/src/main/res/drawable-hdpi/splash.png | Bin 0 -> 29843 bytes .../res/drawable-mdpi/drawer_shadow.9.png | Bin 0 -> 142 bytes .../main/res/drawable-mdpi/ic_actionbar.png | Bin 0 -> 1620 bytes .../drawable-mdpi/ic_chevron_down_light.png | Bin 0 -> 276 bytes .../res/drawable-mdpi/ic_chevron_up_light.png | Bin 0 -> 272 bytes .../res/drawable-mdpi/ic_notification.png | Bin 0 -> 522 bytes .../drawable-mdpi/ic_refresh_black_24dp.png | Bin 0 -> 635 bytes .../drawable-mdpi/ic_refresh_white_24dp.png | Bin 0 -> 671 bytes .../drawable-mdpi/ic_search_black_24dp.png | Bin 0 -> 600 bytes .../drawable-mdpi/ic_search_white_24dp.png | Bin 0 -> 636 bytes .../res/drawable-mdpi/ic_share_black_24dp.png | Bin 0 -> 695 bytes .../res/drawable-mdpi/ic_share_white_24dp.png | Bin 0 -> 731 bytes app/src/main/res/drawable-mdpi/splash.png | Bin 0 -> 15626 bytes .../res/drawable-night-hdpi/ic_actionbar.png | Bin 0 -> 6755 bytes .../main/res/drawable-night-hdpi/splash.png | Bin 0 -> 29843 bytes .../res/drawable-night-mdpi/ic_actionbar.png | Bin 0 -> 3973 bytes .../main/res/drawable-night-mdpi/splash.png | Bin 0 -> 15626 bytes .../res/drawable-night-xhdpi/ic_actionbar.png | Bin 0 -> 9428 bytes .../main/res/drawable-night-xhdpi/splash.png | Bin 0 -> 46283 bytes .../drawable-night-xxhdpi/ic_actionbar.png | Bin 0 -> 13834 bytes .../main/res/drawable-night-xxhdpi/splash.png | Bin 0 -> 86311 bytes .../drawable-night-xxxhdpi/ic_actionbar.png | Bin 0 -> 22077 bytes .../res/drawable-night-xxxhdpi/splash.png | Bin 0 -> 131477 bytes .../res/drawable-xhdpi/drawer_shadow.9.png | Bin 0 -> 174 bytes .../main/res/drawable-xhdpi/ic_actionbar.png | Bin 0 -> 3757 bytes .../drawable-xhdpi/ic_chevron_down_light.png | Bin 0 -> 456 bytes .../drawable-xhdpi/ic_chevron_up_light.png | Bin 0 -> 460 bytes .../res/drawable-xhdpi/ic_notification.png | Bin 0 -> 989 bytes .../drawable-xhdpi/ic_refresh_black_24dp.png | Bin 0 -> 1095 bytes .../drawable-xhdpi/ic_refresh_white_24dp.png | Bin 0 -> 1131 bytes .../drawable-xhdpi/ic_search_black_24dp.png | Bin 0 -> 938 bytes .../drawable-xhdpi/ic_search_white_24dp.png | Bin 0 -> 974 bytes .../drawable-xhdpi/ic_share_black_24dp.png | Bin 0 -> 1087 bytes .../drawable-xhdpi/ic_share_white_24dp.png | Bin 0 -> 1123 bytes app/src/main/res/drawable-xhdpi/splash.png | Bin 0 -> 46283 bytes .../res/drawable-xxhdpi/drawer_shadow.9.png | Bin 0 -> 208 bytes .../main/res/drawable-xxhdpi/ic_actionbar.png | Bin 0 -> 6737 bytes .../drawable-xxhdpi/ic_chevron_down_light.png | Bin 0 -> 685 bytes .../drawable-xxhdpi/ic_chevron_up_light.png | Bin 0 -> 674 bytes .../res/drawable-xxhdpi/ic_notification.png | Bin 0 -> 1465 bytes .../drawable-xxhdpi/ic_refresh_black_24dp.png | Bin 0 -> 1419 bytes .../drawable-xxhdpi/ic_refresh_white_24dp.png | Bin 0 -> 1455 bytes .../drawable-xxhdpi/ic_search_black_24dp.png | Bin 0 -> 1243 bytes .../drawable-xxhdpi/ic_search_white_24dp.png | Bin 0 -> 1279 bytes .../drawable-xxhdpi/ic_share_black_24dp.png | Bin 0 -> 1310 bytes .../drawable-xxhdpi/ic_share_white_24dp.png | Bin 0 -> 1346 bytes app/src/main/res/drawable-xxhdpi/splash.png | Bin 0 -> 86311 bytes .../res/drawable-xxxhdpi/ic_actionbar.png | Bin 0 -> 10384 bytes .../res/drawable-xxxhdpi/ic_notification.png | Bin 0 -> 1849 bytes .../ic_refresh_black_24dp.png | Bin 0 -> 1738 bytes .../ic_refresh_white_24dp.png | Bin 0 -> 1774 bytes .../drawable-xxxhdpi/ic_search_black_24dp.png | Bin 0 -> 1534 bytes .../drawable-xxxhdpi/ic_search_white_24dp.png | Bin 0 -> 1570 bytes .../drawable-xxxhdpi/ic_share_black_24dp.png | Bin 0 -> 1677 bytes .../drawable-xxxhdpi/ic_share_white_24dp.png | Bin 0 -> 1713 bytes app/src/main/res/drawable-xxxhdpi/splash.png | Bin 0 -> 131477 bytes app/src/main/res/drawable/bg_nav_icon.xml | 10 + .../drawable/ic_baseline_arrow_back_24.xml | 10 + .../drawable/ic_baseline_arrow_forward_24.xml | 10 + app/src/main/res/drawable/ic_go_back.xml | 5 + app/src/main/res/drawable/ic_go_forward.xml | 5 + .../drawable/ic_stat_onesignal_default.xml | 5 + app/src/main/res/drawable/shape_rounded.xml | 13 + app/src/main/res/layout/actionbar_title.xml | 23 + app/src/main/res/layout/activity_gonative.xml | 196 ++ app/src/main/res/layout/button_menu.xml | 13 + app/src/main/res/layout/empty.xml | 5 + app/src/main/res/layout/menu_child_icon.xml | 37 + app/src/main/res/layout/menu_child_noicon.xml | 22 + app/src/main/res/layout/menu_group_icon.xml | 48 + app/src/main/res/layout/menu_group_noicon.xml | 32 + .../res/layout/profile_picker_dropdown.xml | 10 + app/src/main/res/layout/splash_banner.xml | 16 + app/src/main/res/layout/tab.xml | 9 + app/src/main/res/layout/view_handle.xml | 32 + app/src/main/res/menu/topmenu.xml | 3 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3757 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 7260 bytes .../main/res/mipmap-hdpi/ic_sidebar_logo.png | Bin 0 -> 3757 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2274 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 4094 bytes .../main/res/mipmap-mdpi/ic_sidebar_logo.png | Bin 0 -> 2274 bytes .../res/mipmap-night-hdpi/ic_sidebar_logo.png | Bin 0 -> 3757 bytes .../res/mipmap-night-mdpi/ic_sidebar_logo.png | Bin 0 -> 2274 bytes .../mipmap-night-xhdpi/ic_sidebar_logo.png | Bin 0 -> 5647 bytes .../mipmap-night-xxhdpi/ic_sidebar_logo.png | Bin 0 -> 10384 bytes .../mipmap-night-xxxhdpi/ic_sidebar_logo.png | Bin 0 -> 16360 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5647 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 11238 bytes .../main/res/mipmap-xhdpi/ic_sidebar_logo.png | Bin 0 -> 5647 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10384 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 21268 bytes .../res/mipmap-xxhdpi/ic_sidebar_logo.png | Bin 0 -> 10384 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 16360 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 34048 bytes .../res/mipmap-xxxhdpi/ic_sidebar_logo.png | Bin 0 -> 16360 bytes app/src/main/res/values-ko/strings.xml | 16 + app/src/main/res/values-large/styles.xml | 10 + app/src/main/res/values-night-v29/styles.xml | 20 + app/src/main/res/values-night/colors.xml | 22 + app/src/main/res/values-night/styles.xml | 20 + app/src/main/res/values-sw600dp/attr.xml | 4 + app/src/main/res/values-sw600dp/dimens.xml | 8 + .../main/res/values-sw720dp-land/dimens.xml | 9 + app/src/main/res/values-v21/styles.xml | 17 + app/src/main/res/values-v29/styles.xml | 20 + app/src/main/res/values/attrs.xml | 35 + app/src/main/res/values/colors.xml | 22 + app/src/main/res/values/dimens.xml | 20 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/integers.xml | 9 + app/src/main/res/values/strings.xml | 49 + app/src/main/res/values/styles.xml | 85 + app/src/main/res/xml/filepaths.xml | 9 + .../main/res/xml/network_security_config.xml | 8 + .../android/GoNativeWebChromeClient.java | 278 ++ .../median/android/GoNativeWebviewClient.java | 123 + .../java/co/median/android/LeanWebView.java | 338 +++ .../co/median/android/PoolWebViewClient.java | 55 + .../java/co/median/android/WebViewSetup.java | 144 + .../android/WebkitCookieManagerProxy.java | 126 + build.gradle | 32 + generate-app-icons.sh | 109 + generate-header-images.sh | 31 + generate-plugin-icons.sh | 43 + generate-theme.js | 260 ++ generate-tinted-icons.sh | 80 + gradle.properties | 6 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 + gradlew.bat | 90 + plugins.gradle | 157 + settings.gradle | 5 + 210 files changed, 15505 insertions(+) create mode 100644 .github/workflows/firebase-testing.yml create mode 100644 .gitignore create mode 100644 AppIcon create mode 100644 CHANGELOG.md create mode 100644 HeaderImage create mode 100644 NotificationIcon create mode 100644 REVISION create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-project.txt create mode 100644 app/src/androidTest/AndroidManifest.xml create mode 100644 app/src/androidTest/assets/HelperClass.java create mode 100644 app/src/androidTest/assets/appConfig.json create mode 100644 app/src/androidTest/java/com/median/testFiles/FirstTestClass.java create mode 100644 app/src/androidTest/java/com/median/testFiles/TestMethods.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/BlobDownloader.js create mode 100644 app/src/main/assets/GoNativeJSBridgeLibrary.js create mode 100644 app/src/main/assets/appConfig.json create mode 100644 app/src/main/assets/custom-icons.json create mode 100644 app/src/main/assets/fonts/custom-icons.ttf create mode 100644 app/src/main/assets/offline.html create mode 100644 app/src/main/java/co/median/android/ActionManager.java create mode 100644 app/src/main/java/co/median/android/AppLinksActivity.java create mode 100644 app/src/main/java/co/median/android/AppUpgradeReceiver.java create mode 100644 app/src/main/java/co/median/android/AudioUtils.java create mode 100644 app/src/main/java/co/median/android/ConfigPreferences.java create mode 100644 app/src/main/java/co/median/android/ConfigUpdater.java create mode 100644 app/src/main/java/co/median/android/CustomHeaders.java create mode 100644 app/src/main/java/co/median/android/DownloadService.java create mode 100644 app/src/main/java/co/median/android/FileDownloader.java create mode 100644 app/src/main/java/co/median/android/FileUploadIntentsCreator.kt create mode 100644 app/src/main/java/co/median/android/FileWriterSharer.java create mode 100644 app/src/main/java/co/median/android/GoNativeApplication.java create mode 100644 app/src/main/java/co/median/android/GoNativeWindowManager.java create mode 100644 app/src/main/java/co/median/android/HtmlIntercept.java create mode 100644 app/src/main/java/co/median/android/IOUtils.java create mode 100644 app/src/main/java/co/median/android/Installation.java create mode 100644 app/src/main/java/co/median/android/JsCustomCodeExecutor.java create mode 100644 app/src/main/java/co/median/android/JsResultBridge.java create mode 100644 app/src/main/java/co/median/android/JsonMenuAdapter.java create mode 100644 app/src/main/java/co/median/android/KeyboardManager.kt create mode 100644 app/src/main/java/co/median/android/LaunchActivity.java create mode 100644 app/src/main/java/co/median/android/LoginManager.java create mode 100644 app/src/main/java/co/median/android/MainActivity.java create mode 100644 app/src/main/java/co/median/android/MySwipeRefreshLayout.java create mode 100644 app/src/main/java/co/median/android/ProfilePicker.java create mode 100644 app/src/main/java/co/median/android/RegistrationManager.java create mode 100644 app/src/main/java/co/median/android/SegmentedController.java create mode 100644 app/src/main/java/co/median/android/ShakeDialogFragment.java create mode 100644 app/src/main/java/co/median/android/TabManager.java create mode 100644 app/src/main/java/co/median/android/UrlInspector.java create mode 100644 app/src/main/java/co/median/android/UrlNavigation.java create mode 100644 app/src/main/java/co/median/android/WebViewPool.java create mode 100644 app/src/main/java/co/median/android/WebViewPoolDisownPolicy.java create mode 100644 app/src/main/java/co/median/android/files/CapturedImageSaver.kt create mode 100644 app/src/main/java/co/median/android/widget/CircleImageView.java create mode 100644 app/src/main/java/co/median/android/widget/GoNativeDrawerLayout.java create mode 100644 app/src/main/java/co/median/android/widget/GoNativeSwipeRefreshLayout.java create mode 100644 app/src/main/java/co/median/android/widget/HandleView.kt create mode 100644 app/src/main/java/co/median/android/widget/SwipeHistoryNavigationLayout.kt create mode 100644 app/src/main/java/co/median/android/widget/WebViewContainerView.java create mode 100644 app/src/main/res/anim/fast_fade_out.xml create mode 100644 app/src/main/res/drawable-hdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-hdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-hdpi/ic_chevron_down_light.png create mode 100644 app/src/main/res/drawable-hdpi/ic_chevron_up_light.png create mode 100644 app/src/main/res/drawable-hdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_search_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_search_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/splash.png create mode 100644 app/src/main/res/drawable-mdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-mdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-mdpi/ic_chevron_down_light.png create mode 100644 app/src/main/res/drawable-mdpi/ic_chevron_up_light.png create mode 100644 app/src/main/res/drawable-mdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-mdpi/ic_refresh_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_search_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_search_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/splash.png create mode 100644 app/src/main/res/drawable-night-hdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-night-hdpi/splash.png create mode 100644 app/src/main/res/drawable-night-mdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-night-mdpi/splash.png create mode 100644 app/src/main/res/drawable-night-xhdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-night-xhdpi/splash.png create mode 100644 app/src/main/res/drawable-night-xxhdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-night-xxhdpi/splash.png create mode 100644 app/src/main/res/drawable-night-xxxhdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-night-xxxhdpi/splash.png create mode 100644 app/src/main/res/drawable-xhdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_chevron_down_light.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_chevron_up_light.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_refresh_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_search_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_search_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/splash.png create mode 100644 app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_chevron_down_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_chevron_up_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_refresh_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_search_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/splash.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_actionbar.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_refresh_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/splash.png create mode 100644 app/src/main/res/drawable/bg_nav_icon.xml create mode 100644 app/src/main/res/drawable/ic_baseline_arrow_back_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml create mode 100644 app/src/main/res/drawable/ic_go_back.xml create mode 100644 app/src/main/res/drawable/ic_go_forward.xml create mode 100644 app/src/main/res/drawable/ic_stat_onesignal_default.xml create mode 100644 app/src/main/res/drawable/shape_rounded.xml create mode 100644 app/src/main/res/layout/actionbar_title.xml create mode 100644 app/src/main/res/layout/activity_gonative.xml create mode 100644 app/src/main/res/layout/button_menu.xml create mode 100644 app/src/main/res/layout/empty.xml create mode 100644 app/src/main/res/layout/menu_child_icon.xml create mode 100644 app/src/main/res/layout/menu_child_noicon.xml create mode 100644 app/src/main/res/layout/menu_group_icon.xml create mode 100644 app/src/main/res/layout/menu_group_noicon.xml create mode 100644 app/src/main/res/layout/profile_picker_dropdown.xml create mode 100644 app/src/main/res/layout/splash_banner.xml create mode 100644 app/src/main/res/layout/tab.xml create mode 100644 app/src/main/res/layout/view_handle.xml create mode 100644 app/src/main/res/menu/topmenu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-night-hdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-night-mdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-night-xhdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-night-xxhdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-night-xxxhdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_sidebar_logo.png create mode 100644 app/src/main/res/values-ko/strings.xml create mode 100644 app/src/main/res/values-large/styles.xml create mode 100644 app/src/main/res/values-night-v29/styles.xml create mode 100644 app/src/main/res/values-night/colors.xml create mode 100644 app/src/main/res/values-night/styles.xml create mode 100644 app/src/main/res/values-sw600dp/attr.xml create mode 100644 app/src/main/res/values-sw600dp/dimens.xml create mode 100644 app/src/main/res/values-sw720dp-land/dimens.xml create mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values-v29/styles.xml create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/integers.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/filepaths.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/normal/java/co/median/android/GoNativeWebChromeClient.java create mode 100644 app/src/normal/java/co/median/android/GoNativeWebviewClient.java create mode 100644 app/src/normal/java/co/median/android/LeanWebView.java create mode 100644 app/src/normal/java/co/median/android/PoolWebViewClient.java create mode 100644 app/src/normal/java/co/median/android/WebViewSetup.java create mode 100644 app/src/normal/java/co/median/android/WebkitCookieManagerProxy.java create mode 100644 build.gradle create mode 100644 generate-app-icons.sh create mode 100644 generate-header-images.sh create mode 100644 generate-plugin-icons.sh create mode 100644 generate-theme.js create mode 100644 generate-tinted-icons.sh create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 plugins.gradle create mode 100644 settings.gradle diff --git a/.github/workflows/firebase-testing.yml b/.github/workflows/firebase-testing.yml new file mode 100644 index 0000000..1887134 --- /dev/null +++ b/.github/workflows/firebase-testing.yml @@ -0,0 +1,46 @@ +name: firebase-testing +on: [push, workflow_dispatch] +jobs: + test-app: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up gcloud Cloud SDK environment + # You may pin to the exact commit or the version. + # uses: google-github-actions/setup-gcloud@94337306dda8180d967a56932ceb4ddcf01edae7 + uses: google-github-actions/setup-gcloud@v0.2.0 + with: + # Version of the gcloud SDK to install. If unspecified or set to "latest", the latest available gcloud SDK version for the target platform will be installed. Example: "290.0.1". + version: latest + # Service account email address to use for authentication. This is required for legacy .p12 keys but can be omitted for .json keys. This is usually of the format @.iam.gserviceaccount.com. + + # Service account key to use for authentication. This should be the JSON formatted private key which can be exported from the Cloud Console. The value can be raw or base64-encoded. + service_account_key: ${{ secrets.GCLOUD_KEY }} + # ID of the Google Cloud project. If provided, this will configure gcloud to use this project ID by default for commands. Individual commands can still override the project using the --project flag which takes precedence. + project_id: gn-test-firebase-test-lab + # Export the provided credentials as Google Default Application Credentials. This will make the credentials available to later steps via the GOOGLE_APPLICATION_CREDENTIALS environment variable. Future steps that consume Default Application Credentials will automatically detect and use these credentials. + export_default_credentials: true + + - name: Make gradlew executable + run: chmod +x ./gradlew + + - name: Copying the appConfig file from androidTest to main + run: cp -f ./app/src/androidTest/assets/appConfig.json ./app/src/main/assets/appConfig.json + + - name: Add dependencies in app/build.gradle + run: sed -i "s/dependencies *\n*{/dependencies {\nandroidTestImplementation 'androidx.test.ext:junit:1.1.2'\nandroidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'\nandroidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0'\nandroidTestImplementation 'androidx.test.espresso:espresso-web:3.3.0'\nandroidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'\n/" ./app/build.gradle + + - name: Add test runner in defaultConfig in app/build.gradle + run: sed -i "s/defaultConfig *\n*{/defaultConfig {\ntestInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'/" ./app/build.gradle + + - name: Adding Helper method in GoNativeWebviewClient.java + run: sed -i "s/super.onPageFinished *( *view *, *url *) *;/super.onPageFinished(view, url);\nHelperClass.newLoad++;/" ./app/src/normal/java/io/gonative/android/GoNativeWebviewClient.java + + - name: Copying HelperClass.java from androidTest/assets to normal/java/io/gonative/android/ + run: cp -f ./app/src/androidTest/assets/HelperClass.java ./app/src/normal/java/io/gonative/android/HelperClass.java + + - name: Build the App + run: ./gradlew assembleDebug assembleAndroidTest + + - name: Testing the App + run: gcloud firebase test android run --type instrumentation --app ./app/build/outputs/apk/normal/debug/app-normal-debug.apk --test ./app/build/outputs/apk/androidTest/normal/debug/app-normal-debug-androidTest.apk --device model=flo,version=21,locale=en,orientation=portrait --device model=hammerhead,version=23,locale=en,orientation=portrait --device model=griffin,version=24,locale=en,orientation=portrait --device model=G8142,version=25,locale=en,orientation=portrait --device model=star2qlteue,version=26,locale=en,orientation=portrait --device model=walleye,version=27,locale=en,orientation=portrait --device model=OnePlus5T,version=28,locale=en,orientation=portrait --device model=x1q,version=29,locale=en,orientation=portrait --device model=flame,version=30,locale=en,orientation=portrait --results-bucket cloud-test-gn-test-firebase-test-lab --timeout 300s diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..855669b --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*~ +.idea/ +.gradle/ +*.iml +local.properties +app/build/ +build/ +captures/ +.DS_Store +plugins/ diff --git a/AppIcon b/AppIcon new file mode 100644 index 0000000000000000000000000000000000000000..13449985fcb9ead7ad55a9f0125276fc33050da6 GIT binary patch literal 8507 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 literal 0 HcmV?d00001 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5f486a1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,42 @@ +# Changelog + +## 2014-01-04 + +- Fix a crash on reload with no page loaded. + +## 2015-01-02 + +- Update to latest gradle and build tools versions, making the project compatible with Android Studio 1.0. +- Fix bugs related to syncing of tabs with sidebar menu. + +## 2014-12-23 + +- Allow setting of viewport while preserving ability to zoom. +- Allow dynamic config of navigation title image URLs. +- Various bug fixes involving javascript after page load, and tab coloring, tab animations, and a crash on application resume. + +## 2014-12-22 + +- Fix various threading bugs where UI methods were called from non-UI threads. + +## 2014-12-05 + +- Support showing the navigation title image on specific URLs. + +## 2014-12-03 + +- Support customizing user agent per URL. +- Add color styling options for tabs. + +## 2014-11-30 + +- New tabs with better material design and animations. +- Fix some automatic icon generation scripts. + +## 2014-11-26 + +- Fix a crash involving webview pools. + +## 2014-11-25 + +- Add support for custom actions in action bar. diff --git a/HeaderImage b/HeaderImage new file mode 100644 index 0000000000000000000000000000000000000000..198c8f3d953c3de63d9cb6f1d64b06bbd46a4a34 GIT binary patch literal 12920 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 literal 0 HcmV?d00001 diff --git a/REVISION b/REVISION new file mode 100644 index 0000000..27adc48 --- /dev/null +++ b/REVISION @@ -0,0 +1 @@ +bea6b380227dae2dae6694deb038c7a854605c80 diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..08e808f --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,184 @@ +import groovy.json.JsonSlurper + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +//[enabled by builder] apply plugin: 'com.google.gms.google-services' +//[enabled by builder] apply plugin: 'com.google.firebase.crashlytics' + +ext { + fbAppId = "" + fbClientToken = "" + onesignalAppId = "" + adMobAppId = "" + googleServiceInvalid = "false" + auth0Domain = "" + auth0Scheme = "" +} + +task parseAppConfig { + def jsonFile = file('src/main/assets/appConfig.json') + def parsedJson = new JsonSlurper().parseText(jsonFile.text) + if (parsedJson.services.facebook) { + if (parsedJson.services.facebook.appId) { + fbAppId = parsedJson.services.facebook.appId + } + if (parsedJson.services.facebook.clientToken) { + fbClientToken = parsedJson.services.facebook.clientToken + } + } + if (parsedJson.services.socialLogin && parsedJson.services.socialLogin.facebookLogin) { + if (parsedJson.services.socialLogin.facebookLogin.appId) { + fbAppId = parsedJson.services.socialLogin.facebookLogin.appId + } + if (parsedJson.services.socialLogin.facebookLogin.clientToken) { + fbClientToken = parsedJson.services.socialLogin.facebookLogin.clientToken + } + } + if (parsedJson.services.oneSignal && parsedJson.services.oneSignal.applicationId) { + onesignalAppId = parsedJson.services.oneSignal.applicationId + } + if (parsedJson.services.admob && parsedJson.services.admob.admobAndroid && parsedJson.services.admob.admobAndroid.applicationId) { + adMobAppId = parsedJson.services.admob.admobAndroid.applicationId + } + if (parsedJson.services.braze) { + if (parsedJson.services.braze.androidApiKey) { + gradle.ext.set("braze_api_key", parsedJson.services.braze.androidApiKey) + } + if (parsedJson.services.braze.androidEndpointKey) { + gradle.ext.set("braze_endpoint_key", parsedJson.services.braze.androidEndpointKey) + } + } + if (parsedJson.services.auth0) { + if (parsedJson.services.auth0.domain) { + auth0Domain = parsedJson.services.auth0.domain + } + if (parsedJson.services.auth0.scheme) { + auth0Scheme = parsedJson.services.auth0.scheme + } + } +} + +task checkGoogleService { + plugins.withId("com.google.gms.google-services") { + def googleServiceJsonFile = file('google-services.json') + if (project.file(googleServiceJsonFile).exists()) { + if (googleServiceJsonFile.text.isEmpty()) { + googleServiceInvalid = "true" + } + } else { + googleServiceInvalid = "true" + } + } +} + +build.dependsOn parseAppConfig +build.dependsOn checkGoogleService + +android { + defaultConfig { + compileSdk 34 + minSdkVersion 23 + targetSdkVersion 34 + applicationId "co.median.android.lnooda" + versionCode 6 + multiDexEnabled true + vectorDrawables.useSupportLibrary = true + + manifestPlaceholders = [manifestApplicationId: "${applicationId}", + onesignal_app_id: onesignalAppId, + onesignal_google_project_number: "", + admob_app_id: adMobAppId, + facebook_app_id: fbAppId, + facebook_client_token: fbClientToken, + auth0Domain: auth0Domain, auth0Scheme: auth0Scheme ] + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + + signingConfigs { + release { + storeFile file("../../release.keystore") + storePassword "password" + keyAlias "release" + keyPassword "password" + } + upload { + storeFile file("../../upload.keystore") + storePassword "password" + keyAlias "upload" + keyPassword "password" + } + } + + buildTypes { + debug { + applicationIdSuffix ".debug" + } + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' + zipAlignEnabled true + debuggable project.getProperties().get("enableLogsInRelease").toBoolean() + signingConfig signingConfigs.release + } + upload { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' + zipAlignEnabled true + matchingFallbacks = ['release'] + debuggable project.getProperties().get("enableLogsInRelease").toBoolean() + signingConfig signingConfigs.upload + } + buildTypes.each { + it.buildConfigField 'boolean', 'GOOGLE_SERVICE_INVALID', googleServiceInvalid + } + } + + flavorDimensions "webview" + + productFlavors { + normal { + dimension "webview" + } + } + namespace 'co.median.android' + testNamespace '${applicationId}.test' + buildFeatures { + buildConfig true + } +} + +dependencies { + /**** dependencies used by all apps ****/ + implementation "androidx.core:core-ktx:1.12.0" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.squareup:seismic:1.0.2' + implementation 'androidx.webkit:webkit:1.10.0' + implementation 'androidx.core:core-splashscreen:1.0.1' + implementation "com.github.gonativeio:gonative-icons:$iconsVersion" + implementation "com.github.gonativeio:gonative-android-core:$coreVersion" + /**** end all apps ****/ + + /**** add-on module dependencies ****/ + /**** end modules ****/ + + /**** Google Android and Play Services dependencies ****/ + implementation 'androidx.multidex:multidex:2.0.1' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.browser:browser:1.7.0' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.11.0' + implementation "androidx.drawerlayout:drawerlayout:1.2.0" + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + /**** end google ****/ + + /**** local dependencies ****/ + implementation fileTree(dir: 'libs', include: '*.jar') + implementation fileTree(dir: 'libs', include: '*.aar') + /**** end local ****/ +} + +apply from: file("../plugins.gradle"); applyNativeModulesAppBuildGradle(project) \ No newline at end of file diff --git a/app/proguard-project.txt b/app/proguard-project.txt new file mode 100644 index 0000000..68dbf68 --- /dev/null +++ b/app/proguard-project.txt @@ -0,0 +1,60 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# webview interfaces + +-keepclassmembers class co.median.android.ProfilePicker$ProfileJsBridge { + ; +} +-keepclassmembers class co.median.android.MainActivity$StatusCheckerBridge { + ; +} +-keepattributes JavascriptInterface + +# stuff for google play services +-keep class * extends java.util.ListResourceBundle { + protected Object[][] getContents(); +} + +-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { + public static final *** NULL; +} + +-keepnames @com.google.android.gms.common.annotation.KeepName class * +-keepclassmembernames class * { + @com.google.android.gms.common.annotation.KeepName *; +} + +-keepnames class * implements android.os.Parcelable { + public static final ** CREATOR; +} + +# Google Cloud Messaging +-keep class com.google.android.gms.** { *; } +-keep interface com.google.android.gms.** { *; } + +# appcompat library +-dontwarn android.support.v4.** +-keep class android.support.v4.** { *; } +-keep interface android.support.v4.** { *; } +-dontwarn android.support.v7.** +-keep class android.support.v7.** { *; } +-keep interface android.support.v7.** { *; } diff --git a/app/src/androidTest/AndroidManifest.xml b/app/src/androidTest/AndroidManifest.xml new file mode 100644 index 0000000..dc5ed4d --- /dev/null +++ b/app/src/androidTest/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/androidTest/assets/HelperClass.java b/app/src/androidTest/assets/HelperClass.java new file mode 100644 index 0000000..20701b0 --- /dev/null +++ b/app/src/androidTest/assets/HelperClass.java @@ -0,0 +1,5 @@ +package io.median.android; + +public class HelperClass { + public volatile static int newLoad = 0; +} diff --git a/app/src/androidTest/assets/appConfig.json b/app/src/androidTest/assets/appConfig.json new file mode 100644 index 0000000..f73f66d --- /dev/null +++ b/app/src/androidTest/assets/appConfig.json @@ -0,0 +1,153 @@ +{ + "general": { + "userAgentAdd": "gonative", + "initialUrl": "https://gonative.io", + "appName": "GoNative.io" + }, + "navigation": { + "androidPullToRefresh": true, + "sidebarNavigation": { + "sidebarEnabledRegex": null, + "menus": [{ + "name": "default", + "items": [{ + "url": "https://gonative.io", + "label": "Home", + "subLinks": [] + }, { + "url": "https://gonative.io/about", + "label": "About", + "subLinks": [] + }, { + "url": "https://gonative.io/examples", + "label": "Examples", + "subLinks": [] + }], + "active": true + }] + }, + "tabNavigation": { + "tabSelectionConfig": [{ + "id": "1", + "regex": ".*about.*" + }], + "tabMenus": [{ + "id": "1", + "items": [{ + "icon": "fa-cloud", + "label": "Tab 1", + "url": "https://www.gonative.io/pricing" + }, { + "icon": "fa-globe", + "label": "Tab 2", + "url": "https://www.gonative.io/examples" + }, { + "icon": "fa-users", + "label": "Tab 3", + "url": "javascript:alert('You selected tab 3. These tabs are only shown on the about page')" + }] + }], + "active": true + }, + "actionConfig": { + "active": true, + "actions": [{ + "id": "exampleActions", + "items": [{ + "label": "Globe", + "icon": "fa-globe", + "url": "javascript:alert('You tapped the globe! It only appears on the Examples page')" + }] + }], + "actionSelection": [{ + "regex": ".*/examples.*", + "id": "exampleActions" + }] + }, + "regexInternalExternal": { + "rules": [{ + "regex": "https?://([-\\w]+\\.)*facebook\\.com/login.php.*", + "internal": true + }, { + "regex": "https?://([-\\w]+\\.)*facebook\\.com/pages/.*", + "internal": false + }, { + "regex": "https?://([-\\w]+\\.)*facebook\\.com/sharer\\.php.*", + "internal": false + }, { + "regex": "https?://([-\\w]+\\.)*plus\\.google\\.com/share.*", + "internal": false + }, { + "regex": "https?://([-\\w]+\\.)*twitter\\.com/intent/.*", + "internal": false + }, { + "regex": "https?://([-\\w]+\\.)*gonative\\.io/?.*", + "internal": true + }, { + "regex": "https?://([-\\w]+\\.)*google\\.com/?.*", + "internal": true + }, { + "regex": "https://gonative-test-web.web.app/.*", + "internal": true + }, + { + "regex": "https://us-central1-gn-test-firebase-test-lab.cloudfunctions.net/.*", + "internal": true + }], + "active": true + }, + "redirects": [{ + "from": "https://example.com/from/", + "to": "https://example.com/to/" + }] + }, + "forms": { + "search": { + "active": true, + "searchTemplateURL": "https://us-central1-gn-test-firebase-test-lab.cloudfunctions.net/gnTestSearch?q=" + } + }, + "styling": { + "showActionBar": true, + "showNavigationBar": true, + "iosTitleColor": "#333333", + "iosTintColor": "#0091fe", + "androidTheme": "Light.DarkActionBar", + "androidSidebarBackgroundColor": "#111111", + "androidSidebarForegroundColor": "#d0d0d0", + "androidHideTitleInActionBar": false, + "androidPullToRefreshColor": "#333333", + "androidTabBarBackgroundColor": "#fefefe", + "androidTabBarTextColor": "#747474", + "androidTabBarIndicatorColorx": "#2f79fe", + "androidShowSplash": true, + "androidShowSplashMaxTime": null, + "androidShowSplashForceTime": null, + "disableAnimations": false, + "menuAnimationDuration": 0.15, + "transitionInteractiveDelayMax": 0.2 + }, + "permissions": { + "usesGeolocation": false, + "androidDownloadToPublicStorage": false + }, + "services": { + "oneSignal": { + "active": false, + "applicationId": "" + }, + "facebook": { + "active": false, + "appId": "", + "displayName": "" + }, + "registration": { + "active": false, + "endpoints": [{ + "url": "https://gonative.io/example_push_endpoint", + "dataType": "onesignal", + "urlRegex": ".*/loginfinished" + }] + } + } +} diff --git a/app/src/androidTest/java/com/median/testFiles/FirstTestClass.java b/app/src/androidTest/java/com/median/testFiles/FirstTestClass.java new file mode 100644 index 0000000..ec21525 --- /dev/null +++ b/app/src/androidTest/java/com/median/testFiles/FirstTestClass.java @@ -0,0 +1,105 @@ +package com.median.testFiles; + +import android.webkit.WebView; +import androidx.test.ext.junit.rules.ActivityScenarioRule; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.filters.SdkSuppress; +import androidx.test.uiautomator.UiDevice; +import org.json.JSONException; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import io.median.android.MainActivity; +import io.median.android.R; +import io.median.median_core.AppConfig; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; + +@RunWith(AndroidJUnit4.class) +@SdkSuppress(minSdkVersion = 18) +@LargeTest +public class FirstTestClass{ + TestMethods testMethods; + AppConfig appConfig; + WebView webView; + private UiDevice uiDevice; + + @Rule + public ActivityScenarioRule activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class); + + @Before + public void initMethod() throws InterruptedException { + for(int i = 0; i < 10; i++){ + try{ + uiDevice = UiDevice.getInstance(getInstrumentation()); + }catch (RuntimeException runtimeException){ + Thread.sleep(2000); + continue; + } + Thread.sleep(1000); + break; + } + activityScenarioRule.getScenario().onActivity(activity -> { + appConfig = AppConfig.getInstance(activity); + webView = activity.findViewById(R.id.webview); + testMethods = new TestMethods(activity, webView); + }); + } + + //Sidebar Navigation Test + @Test + public void testSidebarNavigation() throws InterruptedException, JSONException { + if(appConfig.showNavigationMenu && (appConfig.menus.get("default") != null)){ + if(appConfig.menus.get("default") == null) throw new RuntimeException("Navigation drawer list not found."); + else { + testMethods.waitForPageLoaded(); + testMethods.testNavigation(appConfig.menus.get("default")); + } + } + } + + //Tab Menu Navigation Test + @Test + public void testTabMenuNavigation() throws JSONException, InterruptedException { + if(appConfig.tabMenuRegexes.size() == 0) throw new RuntimeException("No Tab Menus found."); + else{ + testMethods.waitForPageLoaded(); + testMethods.m_testTabNavigation(appConfig.tabMenus, appConfig.tabMenuRegexes); + } + } + + //Internal vs External Links Test + @Test + public void testIvE() throws InterruptedException { + testMethods.waitForPageLoaded(); + testMethods.testInternalvExternalLinks(uiDevice); + } + + //Pull to Refresh Test + @Test + public void pullToRefresh() throws InterruptedException { + if(appConfig.pullToRefresh){ + testMethods.waitForPageLoaded(); + testMethods.testPullToRefresh(); + } + } + + //Search Button Test + @Test + public void testSearch() throws InterruptedException { + if(appConfig.searchTemplateUrl != null && !appConfig.searchTemplateUrl.isEmpty()){ + testMethods.waitForPageLoaded(); + testMethods.testSearchButton(); + } + } + + //Refresh Button Test + @Test + public void testRefreshButton() throws InterruptedException { + if(appConfig.showRefreshButton){ + testMethods.waitForPageLoaded(); + testMethods.testRefreshButton(); + } + } +} diff --git a/app/src/androidTest/java/com/median/testFiles/TestMethods.java b/app/src/androidTest/java/com/median/testFiles/TestMethods.java new file mode 100644 index 0000000..56dda2c --- /dev/null +++ b/app/src/androidTest/java/com/median/testFiles/TestMethods.java @@ -0,0 +1,183 @@ +package com.median.testFiles; +import android.webkit.WebView; +import androidx.test.espresso.NoMatchingViewException; +import androidx.test.espresso.PerformException; +import androidx.test.espresso.contrib.DrawerActions; +import androidx.test.espresso.web.webdriver.Locator; +import androidx.test.uiautomator.UiDevice; +import io.gonative.android.HelperClass; +import org.json.JSONArray; +import org.json.JSONException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.regex.Pattern; +import static androidx.test.espresso.Espresso.onData; +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.Espresso.pressBackUnconditionally; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.pressImeActionButton; +import static androidx.test.espresso.action.ViewActions.swipeDown; +import static androidx.test.espresso.action.ViewActions.typeText; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withResourceName; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static androidx.test.espresso.web.assertion.WebViewAssertions.webMatches; +import static androidx.test.espresso.web.sugar.Web.onWebView; +import static androidx.test.espresso.web.webdriver.DriverAtoms.findElement; +import static androidx.test.espresso.web.webdriver.DriverAtoms.getText; +import static androidx.test.espresso.web.webdriver.DriverAtoms.webClick; +import static org.hamcrest.Matchers.anything; +import static org.hamcrest.Matchers.equalTo; +import io.median.android.MainActivity; +import io.median.android.R; + +public class TestMethods { + + public TestMethods(MainActivity mainActivity, WebView webView){ + m_mainActivity = mainActivity; + m_webView = webView; + } + + protected static String currentURL = "URL Not assigned yet"; + protected static String prevURL = "URL Not assigned yet"; + private final WebView m_webView; + private final MainActivity m_mainActivity; + + private void m_UpdateCurrentURL() throws InterruptedException { + m_mainActivity.runOnUiThread(() -> currentURL = m_webView.getOriginalUrl()); + Thread.sleep(1000); + } + + protected int getNewLoad(){ + return HelperClass.newLoad; + } + + public boolean isURL(String url){ + try { + new URL(url); + return true; + }catch (MalformedURLException e){ + return false; + } + } + + public void waitForPageLoaded() throws InterruptedException { + int counter = 0; + while (getNewLoad() == 0) { + if (counter >= 15) throw new RuntimeException("Page failed to load in less than 15 seconds."); + Thread.sleep(1000); + counter++; + } + m_UpdateCurrentURL(); + Thread.sleep(1000); + counter = 0; + while(currentURL == null && counter <= 10){ + Thread.sleep(1000); + counter++; + m_UpdateCurrentURL(); + } + if(currentURL != null) HelperClass.newLoad = 0; + else throw new RuntimeException("Current URL cannot be retrieved from the WebView."); + } + + public void testNavigation(JSONArray sidebarObjects) throws InterruptedException, JSONException { + for(int i = 0; i < sidebarObjects.length(); i++){ + onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); + onData(anything()).inAdapterView(withId(R.id.drawer_list)).atPosition(i).perform(click()); + waitForPageLoaded(); + String sidebarURL = sidebarObjects.getJSONObject(i).getString("url"); + if(!currentURL.matches(sidebarURL)) throw new RuntimeException("Sidebar Menu " + (i+1) + " did not load the designated URL - " + sidebarURL); + } + } + + public void testInternalvExternalLinks(UiDevice uiDevice) throws InterruptedException { + m_mainActivity.runOnUiThread(() -> m_webView.loadUrl("https://gonative-test-web.web.app/")); + waitForPageLoaded(); + onWebView().withElement(findElement(Locator.ID, "facebook_link")).perform(webClick()); + waitForPageLoaded(); + String dFacebook = uiDevice.getCurrentPackageName(); + + if(dFacebook.contains("io.gonative.android")){ + uiDevice.pressBack(); + Thread.sleep(2000); + }else throw new RuntimeException("Facebook link opened externally"); + + onWebView().withElement(findElement(Locator.ID, "twitter_link")).perform(webClick()); + Thread.sleep(8000); + String dTwitter = uiDevice.getCurrentPackageName(); + if(dTwitter.contains("io.gonative.android")) throw new RuntimeException("Twitter opened internally."); + else { + uiDevice.pressBack(); + Thread.sleep(1000); + } + } + + public void testRefreshButton() throws InterruptedException { + onView(withId(R.id.action_refresh)).perform(click()); + waitForPageLoaded(); + } + + public void testSearchButton() throws InterruptedException { + String query = "Gonative"; + onView(withId(R.id.action_search)).perform(click()); + Thread.sleep(1000); + onView(withResourceName("search_src_text")).perform(typeText(query), pressImeActionButton()); + waitForPageLoaded(); + try{ + onWebView().withElement(findElement(Locator.ID, "search_param")).check(webMatches(getText(), equalTo(query))); + }catch (Exception exception){ + throw new RuntimeException("Search button failed to load the results with query - " + query); + } + pressBackUnconditionally(); + Thread.sleep(2000); + } + + public void m_testTabNavigation(HashMap tabMenus, ArrayList tabMenuRegexes) throws JSONException, InterruptedException { + while(!(currentURL.matches(tabMenuRegexes.get(0).pattern()))){ + m_mainActivity.runOnUiThread(() -> m_webView.loadUrl("https://gonative.io/about/")); + waitForPageLoaded(); + } + if (tabMenus.size() == 0) throw new RuntimeException("No Tab Menus Added."); + else { + for (Pattern p : tabMenuRegexes) { + if (currentURL.matches(p.pattern())) { + try { + for (String i : tabMenus.keySet()) { + for (int j = 0; j < tabMenus.get(i).length(); ) { + if (currentURL.matches(p.pattern())) { + if (isURL(tabMenus.get(i).getJSONObject(j).get("url").toString())) { + Thread.sleep(1000); + onView(withText(tabMenus.get(i).getJSONObject(j).get("label").toString())).perform(click()); + waitForPageLoaded(); + prevURL = currentURL; + pressBackUnconditionally(); + waitForPageLoaded(); + String tabURL = tabMenus.get(i).getJSONObject(j).get("url").toString(); + if (!(prevURL.matches(tabURL))) throw new RuntimeException("Tab " + (j+1) + " could not load the designated URL - " + prevURL); + j++; + prevURL = currentURL; + } else { + onView(withText(tabMenus.get(i).getJSONObject(j).get("label").toString())).perform(click()); + j++; + Thread.sleep(2000); + } + } + } + } + } catch (NoMatchingViewException | PerformException noMatchingViewException) { + throw new RuntimeException("Tab Menu not displayed in the desired regex: " + p.pattern()); + } + } else{ + throw new RuntimeException("No Tab Menus found on the current page."); + } + } + } + } + + public void testPullToRefresh() throws InterruptedException { + onView(withId(R.id.webview)).perform(swipeDown()); + waitForPageLoaded(); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a4cbca0 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/BlobDownloader.js b/app/src/main/assets/BlobDownloader.js new file mode 100644 index 0000000..2faaee9 --- /dev/null +++ b/app/src/main/assets/BlobDownloader.js @@ -0,0 +1,77 @@ +// This is used because download from native side won't have session changes. + +function gonativeDownloadBlobUrl(url) { + var req = new XMLHttpRequest(); + req.open('GET', url, true); + req.responseType = 'blob'; + + req.onload = function(event) { + var blob = req.response; + saveBlob(blob); + }; + req.send(); + + function sendMessage(message) { + if (window.webkit && window.webkit.messageHandlers && + window.webkit.messageHandlers.fileWriterSharer) { + window.webkit.messageHandlers.fileWriterSharer.postMessage(message); + } + if (window.gonative_file_writer_sharer && window.gonative_file_writer_sharer.postMessage) { + window.gonative_file_writer_sharer.postMessage(JSON.stringify(message)); + } + } + + function saveBlob(blob, filename) { + var chunkSize = 1024 * 1024; // 1mb + var index = 0; + // random string to identify this file transfer + var id = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); + + function sendHeader() { + sendMessage({ + event: 'fileStart', + id: id, + size: blob.size, + type: blob.type, + name: filename + }); + } + + function sendChunk() { + if (index >= blob.size) { + return sendEnd(); + } + + var chunkToSend = blob.slice(index, index + chunkSize); + var reader = new FileReader(); + reader.readAsDataURL(chunkToSend); + reader.onloadend = function() { + sendMessage({ + event: 'fileChunk', + id: id, + data: reader.result + }); + index += chunkSize; + setTimeout(sendChunk); + }; + } + + function sendEnd() { + sendMessage({ + event: 'fileEnd', + id:id + }); + } + + sendHeader(); + gonative_run_after_storage_permissions.push(sendChunk); + } +} + +gonative_run_after_storage_permissions = []; +function gonativeGotStoragePermissions() { + while (gonative_run_after_storage_permissions.length > 0) { + var run = gonative_run_after_storage_permissions.shift(); + run(); + } +} diff --git a/app/src/main/assets/GoNativeJSBridgeLibrary.js b/app/src/main/assets/GoNativeJSBridgeLibrary.js new file mode 100644 index 0000000..0285534 --- /dev/null +++ b/app/src/main/assets/GoNativeJSBridgeLibrary.js @@ -0,0 +1,339 @@ +// this function accepts a callback function as params.callback that will be called with the command results +// if a callback is not provided it returns a promise that will resolve with the command results +function addCommandCallback(command, params, persistCallback) { + if(params?.callback || params?.callbackFunction || params?.statuscallback){ + // execute command with provided callback function + addCommand(command, params, persistCallback); + } else { + // create a temporary function and return a promise that executes command + var tempFunctionName = '_median_temp_' + Math.random().toString(36).slice(2); + if(!params) params = {}; + params.callback = tempFunctionName; + return new Promise(function(resolve, reject) { + // declare a temporary function + window[tempFunctionName] = function(data) { + resolve(data); + delete window[tempFunctionName]; + } + // execute command + addCommand(command, params); + }); + } +} + +function addCallbackFunction(callbackFunction, persistCallback){ + var callbackName; + if(typeof callbackFunction === 'string'){ + callbackName = callbackFunction; + } else { + callbackName = '_median_temp_' + Math.random().toString(36).slice(2); + window[callbackName] = function(...args) { + callbackFunction.apply(null, args); + if(!persistCallback){ // if callback is used just once + delete window[callbackName]; + } + } + } + return callbackName; +} + +function addCommand(command, params, persistCallback){ + var data = undefined; + if(params) { + var commandObject = {}; + if(params.callback && typeof params.callback === 'function'){ + params.callback = addCallbackFunction(params.callback, persistCallback); + } + if(params.callbackFunction && typeof params.callbackFunction === 'function'){ + params.callbackFunction = addCallbackFunction(params.callbackFunction, persistCallback); + } + if(params.statuscallback && typeof params.statuscallback === 'function'){ + params.statuscallback = addCallbackFunction(params.statuscallback, persistCallback); + } + commandObject.medianCommand = command; + commandObject.data = params; + data = JSON.stringify(commandObject); + } else data = command; + + JSBridge.postMessage(data); +} + +/////////////////////////////// +//// General Commands //// +/////////////////////////////// + +var median = {}; + +// backward compatibility for GoNative +var gonative = median; + +// to be modified as required +median.nativebridge = { + custom: function (params){ + addCommand("median://nativebridge/custom", params); + }, + multi: function (params){ + addCommand("median://nativebridge/multi", params); + } +}; + +median.registration = { + send: function(customData){ + var params = {customData: customData}; + addCommand("median://registration/send", params); + } +}; + +median.sidebar = { + setItems: function (params){ + addCommand("median://sidebar/setItems", params); + }, + getItems: function (params){ + return addCommandCallback("median://sidebar/getItems", params); + } +}; + +median.tabNavigation = { + selectTab: function (tabIndex){ + addCommand("median://tabs/select/" + tabIndex); + }, + deselect: function (){ + addCommand("median://tabs/deselect"); + }, + setTabs: function (tabsObject){ + var params = {tabs: tabsObject}; + addCommand("median://tabs/setTabs", params); + } +}; + +median.share = { + sharePage: function (params){ + addCommand("median://share/sharePage", params); + }, + downloadFile: function (params){ + addCommand("median://share/downloadFile", params); + }, + downloadImage: function(params){ + addCommand("median://share/downloadImage", params); + } +}; + +median.open = { + appSettings: function (){ + addCommand("median://open/app-settings"); + } +}; + +median.webview = { + clearCache: function(){ + addCommand("median://webview/clearCache"); + }, + clearCookies: function(){ + addCommand("median://webview/clearCookies"); + }, + reload: function (){ + addCommand("median://webview/reload"); + } +}; + +median.config = { + set: function(params){ + addCommand("median://config/set", params); + } +}; + +median.navigationTitles = { + set: function (parameters){ + var params = { + persist: parameters.persist, + data: parameters + }; + addCommand("median://navigationTitles/set", params); + }, + setCurrent: function (params){ + addCommand("median://navigationTitles/setCurrent", params); + }, + revert: function(){ + addCommand("median://navigationTitles/set?persist=true"); + } +}; + +median.navigationLevels = { + set: function (parameters){ + var params = { + persist: parameters.persist, + data: parameters + }; + addCommand("median://navigationLevels/set", params); + }, + setCurrent: function(params){ + addCommand("median://navigationLevels/set", params); + }, + revert: function(){ + addCommand("median://navigationLevels/set?persist=true"); + } +}; + +median.statusbar = { + set: function (params){ + addCommand("median://statusbar/set", params); + } +}; + +median.screen = { + setBrightness: function(data){ + var params = data; + if(typeof params === 'number'){ + params = {brightness: data}; + } + addCommand("median://screen/setBrightness", params); + }, + setMode: function(params) { + if (params.mode) { + addCommand("median://screen/setMode", params); + } + } +}; + +median.navigationMaxWindows = { + set: function (maxWindows, autoClose){ + var params = { + data: maxWindows, + autoClose: autoClose, + persist: true + }; + addCommand("median://navigationMaxWindows/set", params); + }, + setCurrent: function(maxWindows, autoClose){ + var params = {data: maxWindows, autoClose: autoClose}; + addCommand("median://navigationMaxWindows/set", params); + } +} + +median.window = { + open: function (urlString, mode) { + var params = {url: urlString, mode}; + addCommand("median://window/open", params); + }, + close: function () { + addCommand("median://window/close"); + } +} + +median.connectivity = { + get: function (params){ + return addCommandCallback("median://connectivity/get", params); + }, + subscribe: function (params){ + return addCommandCallback("median://connectivity/subscribe", params, true); + }, + unsubscribe: function (){ + addCommand("median://connectivity/unsubscribe"); + } +}; + +median.run = { + deviceInfo: function(){ + addCommand("median://run/median_device_info"); + } +}; + +median.deviceInfo = function(params){ + return addCommandCallback("median://run/median_device_info", params, true); +}; + +median.internalExternal = { + set: function(params){ + addCommand("median://internalExternal/set", params); + } +}; + +median.clipboard = { + set: function(params){ + addCommand("median://clipboard/set", params); + }, + get: function(params){ + return addCommandCallback("median://clipboard/get", params); + } +}; + +median.keyboard = { + info: function(params){ + return addCommandCallback("median://keyboard/info", params); + }, + listen: function(callback){ + var params = {callback}; + addCommand("median://keyboard/listen", params); + } +}; + +////////////////////////////////////// +//// Webpage Helper Functions //// +////////////////////////////////////// + +function median_match_statusbar_to_body_background_color() { + let rgb = window.getComputedStyle(document.body, null).getPropertyValue('background-color'); + let sep = rgb.indexOf(",") > -1 ? "," : " "; + rgb = rgb.substring(rgb.indexOf('(')+1).split(")")[0].split(sep).map(function(x) { return x * 1; }); + if(rgb.length === 4){ + rgb = rgb.map(function(x){ return parseInt(x * rgb[3]); }) + } + let hex = '#' + rgb[0].toString(16).padStart(2,'0') + rgb[1].toString(16).padStart(2,'0') + rgb[2].toString(16).padStart(2,'0'); + let luma = 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]; // per ITU-R BT.709 + if(luma > 40){ + median.statusbar.set({'style': 'dark', 'color': hex}); + } + else{ + median.statusbar.set({'style': 'light', 'color': hex}); + } +} + +function gonative_match_statusbar_to_body_background_color() { + median_match_statusbar_to_body_background_color(); +} + +/////////////////////////////// +//// Android Exclusive //// +/////////////////////////////// + +median.android = {}; + +median.android.geoLocation = { + promptLocationServices: function(){ + addCommand("median://geoLocation/promptLocationServices"); + }, + isLocationServicesEnabled: function(params) { + return addCommandCallback("median://geoLocation/isLocationServicesEnabled", params); + } +}; + +median.android.screen = { + fullscreen: function(){ + addCommand("median://screen/fullscreen"); + }, + normal: function(){ + addCommand("median://screen/normal"); + }, + keepScreenOn: function(){ + addCommand("median://screen/keepScreenOn"); + }, + keepScreenNormal: function(){ + addCommand("median://screen/keepScreenNormal"); + } +}; + +median.android.audio = { + requestFocus: function(enabled){ + var params = {enabled: enabled}; + addCommand("median://audio/requestFocus", params); + } +}; + +median.android.swipeGestures = { + enable: function() { + addCommand("median://swipeGestures/enable"); + }, + disable: function() { + addCommand("median://swipeGestures/disable"); + } +} diff --git a/app/src/main/assets/appConfig.json b/app/src/main/assets/appConfig.json new file mode 100644 index 0000000..06ace48 --- /dev/null +++ b/app/src/main/assets/appConfig.json @@ -0,0 +1,335 @@ +{ + "general": { + "screenOrientation": { + "iphone": null, + "ipad": null, + "androidPhone": null, + "androidTablet": null + }, + "userAgentRegexes": [], + "replaceStrings": [], + "nativeBridgeUrls": [], + "languages": [], + "userAgentAdd": "median", + "enableWindowOpen": true, + "forceUserAgent": "", + "publicKey": "lnooda", + "deviceRegKey": "x92rdmjynczrv92tyrydrypfxw", + "appName": "AnimeDex", + "initialUrl": "https://animedex.pp.ua/", + "iosBundleId": "co.median.ios.lnooda", + "androidPackageName": "co.median.android.lnooda", + "iosUserAgentAdd": "median", + "androidUserAgentAdd": "median", + "androidSigningKey": "upload", + "injectMedianJS": true, + "androidForceUserAgent": "", + "iosForceUserAgent": "", + "iosCustomHeaders": {}, + "androidCustomHeaders": {}, + "version": 5 + }, + "navigation": { + "tabNavigation": { + "tabSelectionConfig": [], + "tabMenus": [], + "active": false + }, + "sidebarNavigation": { + "menuSelectionConfig": { + "redirectLocations": [ + { + "regex": ".*", + "menuName": "default", + "loggedIn": true + } + ] + }, + "menus": [ + { + "active": false, + "items": [ + { + "url": "https://github.com/TechShreyash", + "label": "Made with by tech\n shreyash", + "subLinks": [] + }, + { + "url": "https://techzbots.t.me/", + "label": "(@techzbots)", + "subLinks": [] + } + ], + "name": "default" + } + ] + }, + "regexInternalExternal": { + "rules": [ + { + "mode": "external", + "label": "Non-web links", + "pagesToTrigger": "custom", + "regex": "^(?!https?://).*" + }, + { + "mode": "appbrowser", + "label": "Facebook", + "pagesToTrigger": "custom", + "regex": "https?://([-\\w]+\\.)*facebook\\.com.*" + }, + { + "mode": "appbrowser", + "label": "Twitter", + "pagesToTrigger": "custom", + "regex": "https?://([-\\w]+\\.)*twitter\\.com/.*" + }, + { + "mode": "appbrowser", + "label": "Instagram", + "pagesToTrigger": "custom", + "regex": "https?://([-\\w]+\\.)*instagram\\.com/.*" + }, + { + "mode": "appbrowser", + "label": "Google Maps", + "pagesToTrigger": "custom", + "regex": "https?://maps\\.google\\.com.*" + }, + { + "mode": "appbrowser", + "label": "Google Maps Search", + "pagesToTrigger": "custom", + "regex": "https?://([-\\w]+\\.)*google\\.com/maps/search/.*" + }, + { + "mode": "appbrowser", + "label": "LinkedIn", + "pagesToTrigger": "custom", + "regex": "https?://([-\\w]+\\.)*linkedin\\.com/.*" + }, + { + "mode": "internal", + "label": "All pages on my domain", + "pagesToTrigger": "domain", + "regex": "https?:\\/\\/([-\\w]+\\.)*pp.ua(\\/.*)?$" + }, + { + "mode": "appbrowser", + "label": "All Other Links", + "pagesToTrigger": "all", + "regex": ".*" + } + ], + "active": true + }, + "androidPullToRefresh": false, + "iosPullToRefresh": true, + "navigationTitles": { + "titles": [], + "active": true + }, + "ignorePageFinishedRegexes": [], + "actionConfig": { + "actions": [], + "actionSelection": [], + "active": true + }, + "androidShowRefreshButton": false, + "iosShowRefreshButton": false, + "deepLinkDomains": { + "domains": [], + "enableAndroidApplinks": false + }, + "navigationLevels": { + "levels": [], + "active": true + }, + "toolbarNavigation": { + "enabled": true, + "visibilityByPages": "allPages", + "visibilityByBackButton": "backButtonActive", + "regexes": [ + { + "enabled": true, + "regex": ".*" + } + ], + "items": [ + { + "system": "back", + "titleType": "defaultText", + "visibility": "allPages", + "urlRegex": [ + { + "enabled": true, + "regex": ".*" + } + ] + }, + { + "system": "refresh", + "enabled": false, + "visibility": "allPages", + "urlRegex": [ + { + "enabled": true, + "regex": ".*" + } + ] + }, + { + "system": "forward", + "enabled": false, + "titleType": "defaultText", + "visibility": "allPages", + "urlRegex": [ + { + "enabled": true, + "regex": ".*" + } + ] + } + ], + "v2": true + }, + "redirects": [], + "iosShowOfflinePage": true, + "iosConnectionOfflineTime": 10, + "androidShowOfflinePage": true, + "androidConnectionOfflineTime": 10, + "maxWindows": { + "enabled": false, + "numWindows": 5, + "autoClose": false + }, + "iosSettings": {} + }, + "styling": { + "iosLaunchScreen": { + "backgroundColor": "#FFFFFF", + "backgroundColorDark": "#000000", + "backgroundImage": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312962764_0fcwb4r07j8j8_FFFFFF_1_2x2.png", + "backgroundImageDark": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312962794_k3dj5r2qbq5q8_000000_1_2x2.png", + "centerImageDark": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/app_icon_1707312962.png", + "centerImage": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/app_icon_1707312962.png" + }, + "androidLaunchImages": { + "mdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963013_mru49z2gh2arg_180x180.png", + "hdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963039_7yjqubru19g1a_270x270.png", + "xhdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963072_za3gzyetd6ya0_360x360.png", + "xxhdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963104_3dby9pkhqx1gy_540x540.png", + "xxxhdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963139_pxb0xka9bakfj_720x720.png" + }, + "androidLaunchImagesDark": { + "mdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963162_uhek9gfcjb8cg_180x180.png", + "hdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963212_xec70t55m2jzj_270x270.png", + "xhdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963266_xurfw0b0d9kw0_360x360.png", + "xxhdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963314_b8bkdzz8hvwq6_540x540.png", + "xxxhdpi": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/1707312963380_y3djj1e3gctz8_720x720.png" + }, + "transitionInteractiveDelayMax": 0.2, + "menuAnimationDuration": 0.15, + "androidShowSplash": true, + "disableAnimations": false, + "hideWebviewAlpha": 0.5, + "iosDarkMode": "auto", + "iosTitleColor": "#0E0D08", + "iosTitleColorDark": "#ffffff", + "iosTintColor": "#0E0D08", + "iosTintColorDark": "#ffffff", + "iosSidebarTextColor": "#0E0D08", + "iosSidebarTextColorDark": "#ffffff", + "iosStatusBarBackgroundColor": "#ffffffff", + "iosStatusBarBackgroundColorDark": "#000000", + "iosEnableBlurInStatusBar": false, + "iosSidebarBackgroundColor": "#f8f8f8", + "iosSidebarBackgroundColorDark": "#202020", + "iosNavigationBarTintColor": "#f8f8f8", + "iosNavigationBarTintColorDark": "#202020", + "iosTabBarTintColor": "#f8f8f8", + "iosTabBarTintColorDark": "#000000", + "icon": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/app_icon_1707312962.png", + "iosHeaderImage": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/app_icon_1707312962.png", + "showActionBar": false, + "showNavigationBar": false, + "iosSidebarFont": "Default", + "androidHideTitleInActionBar": false, + "navigationTitleImage": false, + "iosTheme": "default", + "androidTheme": "auto", + "androidBackgroundColor": "#FFFFFF", + "androidSidebarBackgroundColor": "#FFFFFF", + "androidSidebarForegroundColor": "#1A100B", + "androidActionBarBackgroundColor": "#FFFFFF", + "androidActionBarForegroundColor": "#1A100B", + "androidPullToRefreshColor": "#1A100B", + "androidAccentColor": "#009688", + "androidSidebarSeparatorColor": "#CCCCCC", + "androidSidebarHighlightColor": "#1A100B", + "androidTabBarBackgroundColor": "#FFFFFF", + "androidTabBarTextColor": "#949494", + "androidTabBarIndicatorColor": "#1A100B", + "androidTabPressedBackgroundColor": "#CCCCCC", + "androidStatusBarBackgroundColor": "#5C5C5C", + "androidShowLogoInSideBar": true, + "androidShowAppNameInSideBar": true, + "androidSwipeNavigationBackgroundColor": "#FFFFFF", + "androidSwipeNavigationActiveColor": "#000000", + "androidSwipeNavigationInactiveColor": "#666666", + "androidActionBarBackgroundColorDark": "#333333", + "androidStatusBarBackgroundColorDark": "#333333", + "androidActionBarForegroundColorDark": "#FFFFFF", + "androidAccentColorDark": "#80cbc4", + "androidBackgroundColorDark": "#333333", + "androidSidebarForegroundColorDark": "#FFFFFF", + "androidSidebarBackgroundColorDark": "#333333", + "androidSidebarSeparatorColorDark": "#666666", + "androidSidebarHighlightColorDark": "#FFFFFF", + "androidPullToRefreshColorDark": "#FFFFFF", + "androidTabBarTextColorDark": "#FFFFFF", + "androidTabBarBackgroundColorDark": "#333333", + "androidTabBarIndicatorColorDark": "#666666", + "androidTabPressedBackgroundColorDark": "#999999", + "androidSwipeNavigationBackgroundColorDark": "#333333", + "androidSwipeNavigationActiveColorDark": "#FFFFFF", + "androidSwipeNavigationInactiveColorDark": "#666666", + "androidSplashBackgroundColor": "#FFFFFF", + "androidSplashBackgroundColorDark": "#000000", + "androidWebviewTextZoom": null, + "androidIcon": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/app_icon_1707312962.png", + "iosIcon": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/app_icon_1707312962.png", + "iosStatusBarStyle": "auto", + "iosEnableOverlayInStatusBar": false, + "androidStatusBarStyle": "auto", + "androidEnableOverlayInStatusBar": false, + "iosActivityIndicatorColor": "#808080", + "iosActivityIndicatorColorDark": "#808080", + "androidActivityIndicatorColor": "#808080", + "androidActivityIndicatorColorDark": "#808080", + "navigationTitleImageLocation": "assets/defaults/app-icon-placeholder.png", + "navigationTitleImageLocationDark": "assets/defaults/app-icon-placeholder.png", + "androidHeaderImage": "assets/defaults/app-icon-placeholder.png", + "androidHeaderImageDark": "assets/defaults/app-icon-placeholder.png", + "iosHeaderImageDark": "https://s3.amazonaws.com/gonativeio/app_files/lnooda/app_icon_1707312962.png" + }, + "permissions": { + "usesGeolocation": false, + "androidDownloadToPublicStorage": false, + "enableWebRTCamera": false, + "enableWebRTCMicrophone": false, + "iosLocationUsageDescription": "", + "iosCameraUsageDescription": "", + "iOSATTUserTrackingDescription": "", + "iOSRequestATTConsentOnLoad": false, + "iosMicrophoneUsageDescription": "" + }, + "developmentTools": { + "enableWebConsoleLogs": false + }, + "services": { + "oneSignal": { + "active": false + } + } +} \ No newline at end of file diff --git a/app/src/main/assets/custom-icons.json b/app/src/main/assets/custom-icons.json new file mode 100644 index 0000000..902f205 --- /dev/null +++ b/app/src/main/assets/custom-icons.json @@ -0,0 +1,3 @@ +{ + "gonative-icon": 59392 +} diff --git a/app/src/main/assets/fonts/custom-icons.ttf b/app/src/main/assets/fonts/custom-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d86e4aeef11cbb23ce4c45efb143ae075637b18d GIT binary patch literal 5860 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/offline.html b/app/src/main/assets/offline.html new file mode 100644 index 0000000..1d561f4 --- /dev/null +++ b/app/src/main/assets/offline.html @@ -0,0 +1,49 @@ + + + + Device Offline + + + +
+ + +

No internet connection
Check your connection and try again

+
+ +
+ + + \ No newline at end of file diff --git a/app/src/main/java/co/median/android/ActionManager.java b/app/src/main/java/co/median/android/ActionManager.java new file mode 100644 index 0000000..37dfeb1 --- /dev/null +++ b/app/src/main/java/co/median/android/ActionManager.java @@ -0,0 +1,639 @@ +package co.median.android; + +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.widget.LinearLayoutCompat; +import androidx.appcompat.widget.SearchView; +import androidx.core.content.ContextCompat; +import androidx.drawerlayout.widget.DrawerLayout; + +import com.google.android.material.appbar.MaterialToolbar; + +import io.gonative.android.icons.Icon; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.regex.Pattern; + +import co.median.median_core.AppConfig; + +/** + * Created by weiyin on 11/25/14. + * Copyright 2014 GoNative.io LLC + */ +public class ActionManager { + private static final String TAG = ActionManager.class.getName(); + private static final String ACTION_SHARE = "share"; + private static final String ACTION_REFRESH = "refresh"; + private static final String ACTION_SEARCH = "search"; + private static final int ACTIONBAR_ITEM_MARGIN = 132; + + private final MainActivity activity; + private final HashMapitemToUrl; + private final int action_button_size; + private final ActionBar actionBar; + private final ImageView actionBarImageTitle; + private final int colorForeground; + private final int colorBackground; + private boolean isRoot; + private String currentMenuID; + private LinearLayout header; + private LinearLayoutCompat menuContainer; + private RelativeLayout titleContainer; + private boolean isOnSearchMode = false; + private SearchView searchView; + + private int leftItemsCount = 0; + private int rightItemsCount = 0; + + private String currentUrl; + + ActionManager(MainActivity activity) { + this.activity = activity; + this.itemToUrl = new HashMap<>(); + this.action_button_size = this.activity.getResources().getInteger(R.integer.action_button_size); + this.actionBar = activity.getSupportActionBar(); + + this.actionBarImageTitle = new ImageView(activity); + this.actionBarImageTitle.setImageResource(R.drawable.ic_actionbar); + + this.colorForeground = activity.getResources().getColor(R.color.titleTextColor); + this.colorBackground = activity.getResources().getColor(R.color.colorPrimary); + } + + public void setupActionBar(boolean isRoot) { + if (actionBar == null) return; + + this.isRoot = isRoot; + AppConfig appConfig = AppConfig.getInstance(activity); + + // Change hamburger button to back arrow if window is not root + if (!isRoot) { + actionBar.setDisplayHomeAsUpEnabled(true); + Drawable backArrow = ContextCompat.getDrawable(activity, R.drawable.abc_ic_ab_back_material); + backArrow.setColorFilter(colorForeground, PorterDuff.Mode.SRC_ATOP); + actionBar.setHomeAsUpIndicator(backArrow); + } + + header = (LinearLayout) activity.getLayoutInflater().inflate(R.layout.actionbar_title, null); + // why use a custom view and not setDisplayUseLogoEnabled and setLogo? + // Because logo doesn't work! + actionBar.setDisplayShowCustomEnabled(true); + actionBar.setDisplayShowTitleEnabled(false); + actionBar.setCustomView(header); + ActionBar.LayoutParams params = (ActionBar.LayoutParams) header.getLayoutParams(); + params.width = ActionBar.LayoutParams.MATCH_PARENT; + titleContainer = header.findViewById(R.id.title_container); + + menuContainer = header.findViewById(R.id.left_menu_container); + + ViewGroup.MarginLayoutParams titleContainerParams = (ViewGroup.MarginLayoutParams) titleContainer.getLayoutParams(); + titleContainerParams.rightMargin = ACTIONBAR_ITEM_MARGIN + 8; + + MaterialToolbar toolbar = activity.findViewById(R.id.toolbar); + toolbar.setBackgroundColor(colorBackground); + } + + public void setupTitleDisplayForUrl(String url) { + if (actionBar == null || url == null) return; + AppConfig appConfig = AppConfig.getInstance(activity); + this.currentUrl = url; + + boolean urlHasNavTitle = false; + boolean urlHasActionMenu = false; + + // Check for Nav title + HashMap urlNavTitle = appConfig.getNavigationTitleForUrl(url); + if (urlNavTitle != null) { + urlHasNavTitle = true; + } + + // Check for Action Menus + ArrayList regexes = appConfig.actionRegexes; + ArrayList ids = appConfig.actionIDs; + if (regexes != null && ids != null) { + for (int i = 0; i < regexes.size(); i++) { + Pattern regex = regexes.get(i); + if (regex.matcher(url).matches()) { + urlHasActionMenu = true; + break; + } + } + } + + if (!appConfig.showActionBar && !appConfig.showNavigationMenu && !urlHasNavTitle && !urlHasActionMenu) { + actionBar.hide(); + } else { + if (urlHasNavTitle) { + boolean showImage = true; + if (urlNavTitle.containsKey("showImage")) showImage = (boolean) urlNavTitle.get("showImage"); + + if (showImage) { + // Show image title + actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); + showTitleView(actionBarImageTitle); + } else { + // Show text title + String title = activity.getTitle().toString();; + if (urlNavTitle.containsKey("title")) title = (String) urlNavTitle.get("title"); + showTextActionBarTitle(title); + } + } else { + showLogoInActionBar(appConfig.shouldShowNavigationTitleImageForUrl(currentUrl)); + } + setupActionBarDisplay(); + actionBar.show(); + } + } + + private void showLogoInActionBar(boolean show) { + if (actionBar == null) return; + if (show) { + showTitleView(actionBarImageTitle); + } else { + // Show Text + showTextActionBarTitle(activity.getTitle()); + } + } + + public void showTextActionBarTitle(CharSequence title) { + TextView textView = new TextView(activity); + textView.setText(TextUtils.isEmpty(title) ? activity.getTitle() : title); + textView.setTextSize(18); + textView.setTypeface(null, Typeface.BOLD); + textView.setMaxLines(1); + textView.setEllipsize(TextUtils.TruncateAt.END); + textView.setTextColor(colorForeground); + showTitleView(textView); + } + + public void showTitleView(View titleView) { + if (actionBar == null) return; + if (titleView == null) return; + + LinearLayout header = (LinearLayout) actionBar.getCustomView(); + + if (header == null) return; + + // Remove Title Container child views if there is any + titleContainer.removeAllViews(); + + // Remove Title View parent if there is any + if (titleView.getParent() != null) { + ((ViewGroup) titleView.getParent()).removeView(titleView); + } + + titleContainer.addView(titleView); + } + + public void checkActions(String url) { + if (this.activity == null || url == null) return; + + AppConfig appConfig = AppConfig.getInstance(this.activity); + + ArrayList regexes = appConfig.actionRegexes; + ArrayList ids = appConfig.actionIDs; + if (regexes == null || ids == null) { + setMenuID(null); + return; + } + + for (int i = 0; i < regexes.size(); i++) { + Pattern regex = regexes.get(i); + if (regex.matcher(url).matches()) { + setMenuID(ids.get(i)); + return; + } + } + + setMenuID(null); + } + + private void setMenuID(String menuID) { + boolean changed; + + if (this.currentMenuID == null) { + changed = menuID != null; + } else { + changed = menuID == null || !this.currentMenuID.equals(menuID); + } + + if (changed) { + this.currentMenuID = menuID; + this.activity.invalidateOptionsMenu(); + } + } + + public void addActions(Menu menu) { + this.itemToUrl.clear(); + this.rightItemsCount = 0; + this.leftItemsCount = 0; + + AppConfig appConfig = AppConfig.getInstance(this.activity); + if (appConfig.actions == null) return; + menuContainer.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; + + JSONArray actions = appConfig.actions.get(currentMenuID); + if (actions == null || actions.length() == 0) { + replaceLeftIcon(null); + } else { + if (actions.length() <= 2) { + for (int itemID = 0; itemID < actions.length(); itemID++) { + JSONObject entry = actions.optJSONObject(itemID); + addRightButton(appConfig, menu, itemID, entry); + } + } else { + for (int itemID = 0; itemID < actions.length(); itemID++) { + JSONObject entry = actions.optJSONObject(itemID); + if (itemID == 0) { + addLeftButton(appConfig, entry); + } else { + addRightButton(appConfig, menu, itemID, entry); + } + } + } + } + setupActionBarDisplay(); + } + + private void addLeftButton(AppConfig appConfig, JSONObject entry) { + if (entry == null) return; + + String system = AppConfig.optString(entry, "system"); + String icon = AppConfig.optString(entry, "icon"); + String url = AppConfig.optString(entry, "url"); + + if (!TextUtils.isEmpty(system)) { + if (system.equalsIgnoreCase("refresh")) { + if (TextUtils.isEmpty(icon)) { + icon = "fa-rotate-right"; + } + Button refresh = createButtonMenu(icon); + refresh.setOnClickListener(v -> this.activity.onRefresh()); + replaceLeftIcon(refresh); + } else if (system.equalsIgnoreCase("share")) { + if (TextUtils.isEmpty(icon)) { + icon = "fa-share"; + } + Button share = createButtonMenu(icon); + share.setOnClickListener(v -> this.activity.sharePage(null, null)); + replaceLeftIcon(share); + } else if (system.equalsIgnoreCase("search")) { + if (TextUtils.isEmpty(icon)) { + icon = "fa fa-search"; + } + this.searchView = createSearchView(appConfig, icon, url, null, true); + replaceLeftIcon(this.searchView); + } else { + addLeftCustomButton(icon, url); + } + } else { + addLeftCustomButton(icon, url); + } + + if (!appConfig.showNavigationMenu) { + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) menuContainer.getLayoutParams(); + params.leftMargin = 35; + } + + leftItemsCount++; + } + + private void addLeftCustomButton(String icon, String url) { + Button userButton = createButtonMenu(icon); + userButton.setOnClickListener(v -> this.activity.loadUrl(url)); + replaceLeftIcon(userButton); + } + + private void addRightButton(AppConfig appConfig, Menu menu, int itemID, JSONObject entry) { + if (entry == null) return; + + String system = AppConfig.optString(entry, "system"); + String label = AppConfig.optString(entry, "label"); + String icon = AppConfig.optString(entry, "icon"); + String url = AppConfig.optString(entry, "url"); + + if (!TextUtils.isEmpty(system)) { + if (system.equalsIgnoreCase("refresh")) { + + if (TextUtils.isEmpty(icon)) { + icon = "fa-rotate-right"; + } + + Drawable refreshIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); + + String menuLabel = !TextUtils.isEmpty(label) ? label : "Refresh"; + + MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) + .setIcon(refreshIcon) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); + + itemToUrl.put(menuItem, ACTION_REFRESH); + } else if (system.equalsIgnoreCase("share")) { + + if (TextUtils.isEmpty(icon)) { + icon = "fa-share"; + } + + Drawable refreshIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable();; + + String menuLabel = !TextUtils.isEmpty(label) ? label : "Share"; + + MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) + .setIcon(refreshIcon) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); + + itemToUrl.put(menuItem, ACTION_SHARE); + + } else if (system.equalsIgnoreCase("search")) { + + if (TextUtils.isEmpty(icon)) { + icon = "fa fa-search"; + } + + String menuLabel = !TextUtils.isEmpty(label) ? label : "Search"; + + MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); + + this.searchView = createSearchView(appConfig, icon, url, menuItem, false); + menuItem.setActionView(searchView); + + itemToUrl.put(menuItem, ACTION_SEARCH); + } else { + addRightCustomButton(menu, itemID, label, icon, url); + } + } else { + addRightCustomButton(menu, itemID, label, icon, url); + } + + rightItemsCount++; + } + + private void addRightCustomButton(Menu menu, int itemID, String label, String icon, String url) { + Drawable iconDrawable = null; + if (icon != null) { + iconDrawable = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); + } + MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, label) + .setIcon(iconDrawable) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); + + if (url != null) { + this.itemToUrl.put(menuItem, url); + } + } + + private void replaceLeftIcon(View view) { + if (menuContainer == null) return; + menuContainer.removeAllViews(); + if (view != null) { + menuContainer.addView(view); + menuContainer.setVisibility(View.VISIBLE); + } else { + menuContainer.setVisibility(View.GONE); + } + } + + private Button createButtonMenu(String iconString) { + Drawable icon = new Icon(activity, iconString, action_button_size, colorForeground).getDrawable(); + icon.setBounds(0, 0, 50, 50); + LinearLayout tempView = (LinearLayout) LayoutInflater.from(activity).inflate(R.layout.button_menu, null); + Button button = tempView.findViewById(R.id.menu_button); + tempView.removeView(button); + button.setCompoundDrawables(icon, null, null, null); + return button; + } + + private SearchView createSearchView(AppConfig appConfig, String icon, String url, MenuItem menuItem, boolean forLeftSide) { + SearchView searchView = new SearchView(activity); + + // Set layout Params to WRAP_CONTENT + ViewGroup.LayoutParams searchViewParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + searchView.setLayoutParams(searchViewParams); + + // Left Drawer Instance + DrawerLayout drawerLayout = activity.getDrawerLayout(); + ActionBarDrawerToggle drawerToggle = activity.getDrawerToggle(); + + // search item in action bar + SearchView.SearchAutoComplete searchAutoComplete = searchView.findViewById(androidx.appcompat.R.id.search_src_text); + if (searchAutoComplete != null) { + searchAutoComplete.setTextColor(colorForeground); + int hintColor = colorForeground; + hintColor = Color.argb(192, Color.red(hintColor), Color.green(hintColor), + Color.blue(hintColor)); + searchAutoComplete.setHintTextColor(hintColor); + } + + searchView.setOnSearchClickListener(view -> { + searchViewParams.width = ActionBar.LayoutParams.MATCH_PARENT; + + // Need to check this otherwise the app will crash + if (!activity.isNotRoot() && appConfig.showNavigationMenu) { + drawerToggle.setDrawerIndicatorEnabled(false); + drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + + drawerToggle.setDrawerIndicatorEnabled(false); + actionBar.setDisplayShowHomeEnabled(true); + } else if (!activity.isNotRoot()) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + isOnSearchMode = true; + }); + + searchView.setOnCloseListener(() -> { + if (forLeftSide) { + titleContainer.setVisibility(View.VISIBLE); + } else { + header.setVisibility(View.VISIBLE); + activity.invalidateOptionsMenu(); + } + searchViewParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; + + activity.setMenuItemsVisible(true); + if (!activity.isNotRoot() && appConfig.showNavigationMenu) { + drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); + actionBar.setDisplayShowHomeEnabled(false); + drawerToggle.setDrawerIndicatorEnabled(true); + } else if (!activity.isNotRoot()) { + actionBar.setDisplayHomeAsUpEnabled(false); + } + return false; + }); + + // listener to process query + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + if (!searchView.isIconified()) { + searchView.setIconified(true); + } + try { + String q = URLEncoder.encode(query, "UTF-8"); + activity.loadUrl(url + q); + } catch (UnsupportedEncodingException e) { + return true; + } + + return true; + } + + @Override + public boolean onQueryTextChange(String newText) { + // do nothing + return true; + } + }); + + // listener to collapse action view when soft keyboard is closed + searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + if (!searchView.isIconified()) { + searchView.setIconified(true); + } + } + } + }); + + // Search view button icon and color + ImageView searchIcon = searchView.findViewById(androidx.appcompat.R.id.search_button); + if (searchIcon != null) { + icon = !TextUtils.isEmpty(icon) ? icon : "fa fa-search"; + Drawable searchButtonNewIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); + searchIcon.setImageDrawable(searchButtonNewIcon); + searchIcon.setColorFilter(colorForeground); + + // Handling a bug when SearchView is expanded and setting other menu + // visibility to false, SearchView would trigger unnecessary onClose event + // Solution is to hide other menus first before expanding + searchIcon.setOnClickListener(v -> { + if (forLeftSide) { + activity.setMenuItemsVisible(false); + titleContainer.setVisibility(View.GONE); + } else { + header.setVisibility(View.GONE); + activity.setMenuItemsVisible(false, menuItem); + } + // Expand SearchView, simulates onSearchViewClicked event + searchView.setIconified(false); + }); + } + + //Search view close button foreground color + ImageView closeButtonImage = searchView.findViewById(androidx.appcompat.R.id.search_close_btn); + if (closeButtonImage != null) { + closeButtonImage.setColorFilter(colorForeground); + } + + return searchView; + } + + // Count left and right actionbar buttons to calculate side margins + public void setupActionBarDisplay() { + + if (actionBar == null) return; + + AppConfig appConfig = AppConfig.getInstance(activity); + + // Add to temporary fields so actual items count would not be affected + int tempLeftItemsCount = leftItemsCount; + + // Limit right menu count to three for margin + int tempRightItemsCount = Math.min(rightItemsCount, 3); + + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) titleContainer.getLayoutParams(); + + // Reset the margins + params.rightMargin = 0; + params.leftMargin = 0; + + if (isRoot) { + if (appConfig.showNavigationMenu) { + tempLeftItemsCount++; + } + + if (tempLeftItemsCount > tempRightItemsCount) { + int margin = tempLeftItemsCount - tempRightItemsCount; + params.rightMargin = ACTIONBAR_ITEM_MARGIN * margin; + } else { + int margin = tempRightItemsCount - tempLeftItemsCount; + params.leftMargin = ACTIONBAR_ITEM_MARGIN * margin; + } + } else { + tempLeftItemsCount++; + + if (tempLeftItemsCount > tempRightItemsCount) { + int margin = tempLeftItemsCount - tempRightItemsCount; + params.rightMargin = ACTIONBAR_ITEM_MARGIN * margin; + } else { + int margin = tempRightItemsCount - tempLeftItemsCount; + params.leftMargin = ACTIONBAR_ITEM_MARGIN * margin; + } + } + } + + public boolean isOnSearchMode() { + return isOnSearchMode; + } + + public void setOnSearchMode(boolean onSearchMode) { + isOnSearchMode = onSearchMode; + } + + public void closeSearchView() { + if (searchView == null) return; + + if (!searchView.isIconified()) { + searchView.setIconified(true); + } + } + + public boolean onOptionsItemSelected(MenuItem item) { + if (activity.getCurrentFocus() instanceof SearchView.SearchAutoComplete) { + activity.getCurrentFocus().clearFocus(); + } + String url = this.itemToUrl.get(item); + if (url != null) { + switch (url) { + case ACTION_SHARE: + this.activity.sharePage(null, null); + return true; + case ACTION_REFRESH: + this.activity.onRefresh(); + return true; + case ACTION_SEARCH: + // Ignore + return true; + } + + this.activity.loadUrl(url); + return true; + } else { + return false; + } + } +} diff --git a/app/src/main/java/co/median/android/AppLinksActivity.java b/app/src/main/java/co/median/android/AppLinksActivity.java new file mode 100644 index 0000000..a3eba92 --- /dev/null +++ b/app/src/main/java/co/median/android/AppLinksActivity.java @@ -0,0 +1,29 @@ +package co.median.android; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +public class AppLinksActivity extends AppCompatActivity { + + public static final String LAUNCH_SOURCE_APP_LINKS = "app_links"; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + launchApp(); + } + + private void launchApp() { + Intent intent = new Intent(this, MainActivity.class); + if (getIntent().getData() != null) { + intent.setData(getIntent().getData()); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra("source", LAUNCH_SOURCE_APP_LINKS); + } + startActivity(intent); + finish(); + } +} diff --git a/app/src/main/java/co/median/android/AppUpgradeReceiver.java b/app/src/main/java/co/median/android/AppUpgradeReceiver.java new file mode 100644 index 0000000..bab4c75 --- /dev/null +++ b/app/src/main/java/co/median/android/AppUpgradeReceiver.java @@ -0,0 +1,21 @@ +package co.median.android; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import co.median.median_core.AppConfig; + +public class AppUpgradeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + // This will be executed when a new version of the app has been installed over an existing one + // Does not work in debug mode. + if (context == null || intent == null) return; + if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())) { + AppConfig appConfig = AppConfig.getInstance(context); + appConfig.deletePersistentConfigFiles(); + } + } +} diff --git a/app/src/main/java/co/median/android/AudioUtils.java b/app/src/main/java/co/median/android/AudioUtils.java new file mode 100644 index 0000000..42359e4 --- /dev/null +++ b/app/src/main/java/co/median/android/AudioUtils.java @@ -0,0 +1,183 @@ +package co.median.android; + +import android.content.Context; +import android.media.AudioAttributes; +import android.media.AudioFocusRequest; +import android.media.AudioManager; +import android.util.Log; + +public class AudioUtils { + private static final String TAG = AudioUtils.class.getName(); + private static AudioFocusRequest initialFocusRequest; + private static AudioFocusRequest focusRequest; + private static AudioManager.OnAudioFocusChangeListener initialAudioFocusChangeListener; + private static AudioManager.OnAudioFocusChangeListener audioFocusChangeListener; + + /** + * @param mode - Accepts int for speaker mode: + * 0 - phone speaker (default) + * 1 - headset / wired device + * 2 - bluetooth + */ + public static void setUpAudioDevice(MainActivity mainActivity, int mode) { + AudioManager mAudioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); + if (mode == 2) { + // bluetooth device + mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); + mAudioManager.startBluetoothSco(); + mAudioManager.setBluetoothScoOn(true); + } else if (mode == 1) { + // wired device + mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); + mAudioManager.stopBluetoothSco(); + mAudioManager.setBluetoothScoOn(false); + mAudioManager.setSpeakerphoneOn(false); + } else { + // phone speaker + mAudioManager.setMode(AudioManager.MODE_NORMAL); + mAudioManager.stopBluetoothSco(); + mAudioManager.setBluetoothScoOn(false); + mAudioManager.setSpeakerphoneOn(true); + } + } + + public static void reconnectToBluetooth(MainActivity mainActivity, AudioManager audioManager) { + if (audioManager.isBluetoothScoAvailableOffCall() && !audioManager.isBluetoothScoOn()) { + Log.d(TAG, "Resetting audio to bluetooth device"); + setUpAudioDevice(mainActivity, 2); + } + } + + /** + * Listen to the first AUDIOFOCUS_GAIN before taking the audio input/output priority through requestAudioFocus() + * + * @param mainActivity + */ + public static void initAudioFocusListener(MainActivity mainActivity) { + int result; + final Object focusLock = new Object(); + + AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) { + Log.w(TAG, "AudioManager is null. Aborting initAudioFocusListener()"); + } + + initialAudioFocusChangeListener = focusChange -> { + if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { + synchronized (focusLock) { + Log.d(TAG, "AudioFocusListener GAINED. Try to request audio focus"); + requestAudioFocus(mainActivity); + abandonFocusRequest(mainActivity); + } + } + }; + + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { + result = audioManager.requestAudioFocus(initialAudioFocusChangeListener, + AudioManager.STREAM_VOICE_CALL, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); + } else { + AudioAttributes playbackAttributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) + .build(); + initialFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) + .setAudioAttributes(playbackAttributes) + .setAcceptsDelayedFocusGain(true) + .setOnAudioFocusChangeListener(initialAudioFocusChangeListener) + .build(); + result = audioManager.requestAudioFocus(initialFocusRequest); + } + + synchronized (focusLock) { + if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + Log.d(TAG, "AudioFocusListener REQUEST GRANTED"); + } + } + } + + /** + * Prioritizes the bluetooth device if available. + * Reconnects the bluetooth device when the audio focus is lost as a workaround for aborted connections + * due to AudioRecord.AUDIO_INPUT_FLAG_FAST denial. + * + * @param mainActivity + */ + public static void requestAudioFocus(MainActivity mainActivity) { + int result; + final Object focusLock = new Object(); + + AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) { + Log.w(TAG, "AudioManager is null. Aborting requestAudioFocus()"); + } + audioFocusChangeListener = focusChange -> { + switch (focusChange) { + case AudioManager.AUDIOFOCUS_GAIN: + synchronized (focusLock) { + Log.d(TAG, "AudioFocus GAINED. Try to connect bluetooth device"); + reconnectToBluetooth(mainActivity, audioManager); + } + break; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: + case AudioManager.AUDIOFOCUS_LOSS: + synchronized (focusLock) { + Log.d(TAG, "AudioFocus LOST. Try to reconnect bluetooth device"); + reconnectToBluetooth(mainActivity, audioManager); + } + break; + } + }; + + abandonFocusRequest(mainActivity); + + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { + result = audioManager.requestAudioFocus(audioFocusChangeListener, + AudioManager.STREAM_VOICE_CALL, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); + } else { + AudioAttributes playbackAttributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) + .build(); + focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) + .setAudioAttributes(playbackAttributes) + .setAcceptsDelayedFocusGain(true) + .setOnAudioFocusChangeListener(audioFocusChangeListener) + .build(); + result = audioManager.requestAudioFocus(focusRequest); + } + + synchronized (focusLock) { + if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + Log.d(TAG, "AudioFocus REQUEST GRANTED"); + reconnectToBluetooth(mainActivity, audioManager); + } + } + } + + public static void abandonFocusRequest(MainActivity mainActivity) { + AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) { + Log.w(TAG, "AudioManager is null. Aborting abandonFocusRequest()"); + } + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { + if (initialAudioFocusChangeListener != null) { + audioManager.abandonAudioFocus(initialAudioFocusChangeListener); + initialAudioFocusChangeListener = null; + } + if (audioFocusChangeListener != null) { + audioManager.abandonAudioFocus(audioFocusChangeListener); + audioFocusChangeListener = null; + } + } else { + if (initialFocusRequest != null) { + audioManager.abandonAudioFocusRequest(initialFocusRequest); + initialFocusRequest = null; + } + if (focusRequest != null) { + audioManager.abandonAudioFocusRequest(focusRequest); + focusRequest = null; + } + } + } +} diff --git a/app/src/main/java/co/median/android/ConfigPreferences.java b/app/src/main/java/co/median/android/ConfigPreferences.java new file mode 100644 index 0000000..b9e03b9 --- /dev/null +++ b/app/src/main/java/co/median/android/ConfigPreferences.java @@ -0,0 +1,38 @@ +package co.median.android; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.text.TextUtils; + +public class ConfigPreferences { + private static final String APP_THEME_KEY = "io.gonative.android.appTheme"; + + private Context context; + private SharedPreferences sharedPreferences; + + public ConfigPreferences(Context context) { + this.context = context; + } + + private SharedPreferences getSharedPreferences() { + if (this.sharedPreferences == null) { + this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this.context); + } + return this.sharedPreferences; + } + + public String getAppTheme() { + SharedPreferences preferences = getSharedPreferences(); + return preferences.getString(APP_THEME_KEY, null); + } + + public void setAppTheme(String appTheme) { + SharedPreferences preferences = getSharedPreferences(); + if (TextUtils.isEmpty(appTheme)) { + preferences.edit().remove(APP_THEME_KEY).commit(); + } else { + preferences.edit().putString(APP_THEME_KEY, appTheme).commit(); + } + } +} diff --git a/app/src/main/java/co/median/android/ConfigUpdater.java b/app/src/main/java/co/median/android/ConfigUpdater.java new file mode 100644 index 0000000..bd721e9 --- /dev/null +++ b/app/src/main/java/co/median/android/ConfigUpdater.java @@ -0,0 +1,76 @@ +package co.median.android; + +import android.content.Context; +import android.os.AsyncTask; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.OutputStreamWriter; +import java.lang.ref.WeakReference; +import java.net.HttpURLConnection; +import java.net.URL; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; + +/** + * Created by weiyin on 8/8/14. + */ +public class ConfigUpdater { + private static final String TAG = ConfigUpdater.class.getName(); + + private Context context; + + ConfigUpdater(Context context) { + this.context = context; + } + + public void registerEvent() { + if (AppConfig.getInstance(context).disableEventRecorder) return; + + new EventTask(context).execute(); + } + + private static class EventTask extends AsyncTask { + WeakReference contextReference; + + EventTask(Context context) { + this.contextReference = new WeakReference<>(context); + } + + @Override + protected Void doInBackground(Void... params) { + Context context = contextReference.get(); + if (context == null) return null; + + JSONObject json = new JSONObject(Installation.getInfo(context)); + + try { + json.put("event", "launch"); + } catch (JSONException e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + return null; + } + + try { + URL url = new URL("https://events.gonative.io/api/events/new"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + connection.setDoInput(false); // we do not care about response + OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); + writer.write(json.toString()); + writer.close(); + connection.connect(); + connection.getResponseCode(); + connection.disconnect(); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + + return null; + } + } +} diff --git a/app/src/main/java/co/median/android/CustomHeaders.java b/app/src/main/java/co/median/android/CustomHeaders.java new file mode 100644 index 0000000..db835bc --- /dev/null +++ b/app/src/main/java/co/median/android/CustomHeaders.java @@ -0,0 +1,69 @@ +package co.median.android; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Build; +import android.provider.Settings; +import android.util.Base64; + +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +import co.median.median_core.AppConfig; + +/** + * Created by weiyin on 5/1/17. + */ + +public class CustomHeaders { + public static Map getCustomHeaders(Context context) { + AppConfig appConfig = AppConfig.getInstance(context); + if (appConfig.customHeaders == null) return null; + + HashMap result = new HashMap<>(); + for (Map.Entry entry : appConfig.customHeaders.entrySet()) { + String key = entry.getKey(); + String val; + try { + val = interpolateValues(context, entry.getValue()); + } catch (UnsupportedEncodingException e) { + val = null; + } + + if (key != null & val != null) { + result.put(key, val); + } + } + + return result; + } + + private static String interpolateValues(Context context, String value) throws UnsupportedEncodingException { + if (value == null) return null; + + if (value.contains("%DEVICEID%")) { + @SuppressLint("HardwareIds") + String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + if (androidId == null) androidId = ""; + value = value.replace("%DEVICEID%", androidId); + } + + if (value.contains("%DEVICENAME64%")) { + // base 64 encoded name + String manufacturer = Build.MANUFACTURER; + String model = Build.MODEL; + String name; + if (model.startsWith(manufacturer)) { + name = model; + } else { + name = manufacturer + " " + model; + } + + String name64 = Base64.encodeToString(name.getBytes("UTF-8"), Base64.NO_WRAP); + value = value.replace("%DEVICENAME64%", name64); + } + + return value; + } +} diff --git a/app/src/main/java/co/median/android/DownloadService.java b/app/src/main/java/co/median/android/DownloadService.java new file mode 100644 index 0000000..fab50b3 --- /dev/null +++ b/app/src/main/java/co/median/android/DownloadService.java @@ -0,0 +1,316 @@ +package co.median.android; + +import android.app.Service; +import android.content.ActivityNotFoundException; +import android.content.ContentResolver; +import android.content.Intent; +import android.net.Uri; +import android.os.Binder; +import android.os.Build; +import android.os.Environment; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.text.TextUtils; +import android.util.Log; +import android.webkit.MimeTypeMap; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.core.content.FileProvider; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; +import co.median.median_core.LeanUtils; + +public class DownloadService extends Service { + + private static final String TAG = "DownloadService"; + private static final String EXTRA_DOWNLOAD_ID = "download_id"; + private static final String ACTION_CANCEL_DOWNLOAD = "action_cancel_download"; + private static final int BUFFER_SIZE = 4096; + private static final int timeout = 5; // in seconds + private final Handler handler = new Handler(Looper.getMainLooper()); + + private final Map downloadTasks = new HashMap<>(); + private int downloadId = 0; + private String userAgent; + + @Override + public void onCreate() { + super.onCreate(); + AppConfig appConfig = AppConfig.getInstance(this); + this.userAgent = appConfig.userAgent; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent.getAction().equals(ACTION_CANCEL_DOWNLOAD)) { + int id = intent.getIntExtra(EXTRA_DOWNLOAD_ID, 0); + cancelDownload(id); + } + return START_NOT_STICKY; + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return new DownloadBinder(); + } + + public class DownloadBinder extends Binder { + public DownloadService getService() { + return DownloadService.this; + } + } + + public void startDownload(String url, String filename, String mimetype, boolean shouldSaveToGallery, boolean open, FileDownloader.DownloadLocation location) { + DownloadTask downloadTask = new DownloadTask(url, filename, mimetype, shouldSaveToGallery, open, location); + downloadTasks.put(downloadTask.getId(), downloadTask); + downloadTask.startDownload(); + } + + public void cancelDownload(int downloadId) { + DownloadTask downloadTask = downloadTasks.get(downloadId); + if (downloadTask != null && downloadTask.isDownloading()) { + downloadTask.cancelDownload(); + } + } + + public void handleDownloadUri(FileDownloader.DownloadLocation location, Uri uri, String mimeType, boolean shouldSaveToGallery, boolean open, String filename) { + if (uri == null) return; + if (location == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { + + if (shouldSaveToGallery) { + addFileToGallery(uri); + } + + if (open) { + viewFile(uri, mimeType); + } else { + handler.post(() -> { + if (shouldSaveToGallery) { + Toast.makeText(this, R.string.file_download_finished_gallery, Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, String.format(this.getString(R.string.file_download_finished_with_name), filename), Toast.LENGTH_SHORT).show(); + } + }); + } + } else { + if (open) { + viewFile(uri, mimeType); + } else { + handler.post(() -> Toast.makeText(this, String.format(this.getString(R.string.file_download_finished_with_name), filename), Toast.LENGTH_SHORT).show()); + } + } + } + + private void viewFile(Uri uri, String mimeType) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(uri, mimeType); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } catch (ActivityNotFoundException e) { + String message = getResources().getString(R.string.file_handler_not_found); + handler.post(() -> { + Toast.makeText(this, message, Toast.LENGTH_LONG).show(); + }); + } catch (Exception ex) { + GNLog.getInstance().logError(TAG, "viewFile: Exception:", ex); + } + } + + private void addFileToGallery(Uri uri) { + Log.d(TAG, "addFileToGallery: Adding to Albums . . ."); + Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + mediaScanIntent.setData(uri); + sendBroadcast(mediaScanIntent); + } + + private class DownloadTask { + private final int id; + private final String url; + private boolean isDownloading; + private HttpURLConnection connection; + private InputStream inputStream; + private FileOutputStream outputStream; + private File outputFile = null; + private Uri downloadUri; + private String filename; + private String extension; + private String mimetype; + private boolean saveToGallery; + private boolean openOnFinish; + private final FileDownloader.DownloadLocation location; + + public DownloadTask(String url, String filename, String mimetype, boolean saveToGallery, boolean open, FileDownloader.DownloadLocation location) { + this.id = downloadId++; + this.url = url; + this.filename = filename; + this.mimetype = mimetype; + this.isDownloading = false; + this.saveToGallery = saveToGallery; + this.openOnFinish = open; + this.location = location; + } + + public int getId() { + return id; + } + + public boolean isDownloading() { + return isDownloading; + } + + public void startDownload() { + Log.d(TAG, "startDownload: Starting download"); + isDownloading = true; + AtomicReference finalFilename = new AtomicReference<>(""); + new Thread(() -> { + Log.d(TAG, "startDownload: Thread started"); + try { + URL downloadUrl = new URL(url); + connection = (HttpURLConnection) downloadUrl.openConnection(); + connection.setInstanceFollowRedirects(true); + connection.setRequestProperty("User-Agent", userAgent); + connection.setConnectTimeout(timeout * 1000); + connection.connect(); + + if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { + GNLog.getInstance().logError(TAG, "Server returned HTTP " + connection.getResponseCode() + + " " + connection.getResponseMessage()); + isDownloading = false; + return; + } + + double fileSizeInMB = connection.getContentLength() / 1048576.0; + Log.d(TAG, "startDownload: File size in MB: " + fileSizeInMB); + + if (connection.getHeaderField("Content-Type") != null) + mimetype = connection.getHeaderField("Content-Type"); + + if (!TextUtils.isEmpty(filename)) { + extension = FileDownloader.getFilenameExtension(filename); + if (TextUtils.isEmpty(extension)) { + extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimetype); + } else if (Objects.equals(filename, extension)) { + filename = "download"; + } else { + filename = filename.substring(0, filename.length() - (extension.length() + 1)); + mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + } else { + // guess file name and extension + String guessedName = LeanUtils.guessFileName(url, + connection.getHeaderField("Content-Disposition"), + mimetype); + int pos = guessedName.lastIndexOf('.'); + + if (pos == -1) { + filename = guessedName; + extension = ""; + } else if (pos == 0) { + filename = "download"; + extension = guessedName.substring(1); + } else { + filename = guessedName.substring(0, pos); + extension = guessedName.substring(pos + 1); + } + + if (!TextUtils.isEmpty(extension)) { + // Update mimetype based on final filename extension + mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + } + + if (location == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + ContentResolver contentResolver = getApplicationContext().getContentResolver(); + if (saveToGallery && mimetype.contains("image")) { + downloadUri = FileDownloader.createExternalFileUri(contentResolver, filename, mimetype, Environment.DIRECTORY_PICTURES); + } else { + downloadUri = FileDownloader.createExternalFileUri(contentResolver, filename, mimetype, Environment.DIRECTORY_DOWNLOADS); + saveToGallery = false; + } + if (downloadUri != null) { + finalFilename.set(FileDownloader.getFileNameFromUri(downloadUri, contentResolver)); + outputStream = (FileOutputStream) contentResolver.openOutputStream(downloadUri); + } else { + isDownloading = false; + handler.post(() -> { + Toast.makeText(DownloadService.this, getString(R.string.file_download_error), Toast.LENGTH_SHORT).show(); + }); + GNLog.getInstance().logError(TAG, "Error creating file - " + + "filename: " + filename + ", " + + "mimetype: " + mimetype); + return; + } + } else { + if (saveToGallery) { + outputFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), filename, extension); + } else { + outputFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), filename, extension); + } + finalFilename.set(outputFile.getName()); + outputStream = new FileOutputStream(outputFile); + } + } else { + this.openOnFinish = true; + outputFile = FileDownloader.createOutputFile(getFilesDir(), filename, extension); + finalFilename.set(outputFile.getName()); + outputStream = new FileOutputStream(outputFile); + } + int fileLength = connection.getContentLength(); + inputStream = connection.getInputStream(); + + byte[] buffer = new byte[BUFFER_SIZE]; + int bytesRead; + int bytesDownloaded = 0; + + while ((bytesRead = inputStream.read(buffer)) != -1 && isDownloading) { + outputStream.write(buffer, 0, bytesRead); + bytesDownloaded += bytesRead; + int progress = (int) (bytesDownloaded * 100 / fileLength); + Log.d(TAG, "startDownload: Download progress: " + progress); + } + if (!isDownloading && outputFile != null) { + outputFile.delete(); + outputFile = null; + } + } catch (IOException e) { + GNLog.getInstance().logError(TAG, "startDownload: ", e); + } finally { + try { + if (inputStream != null) inputStream.close(); + if (outputStream != null) outputStream.close(); + if (connection != null) connection.disconnect(); + } catch (IOException e) { + GNLog.getInstance().logError(TAG, "startDownload: ", e); + } + isDownloading = false; + if (downloadUri == null && outputFile != null) { + downloadUri = FileProvider.getUriForFile(DownloadService.this, DownloadService.this.getApplicationContext().getPackageName() + ".fileprovider", outputFile); + } + handleDownloadUri(location, downloadUri, mimetype, saveToGallery, openOnFinish, finalFilename.get()); + } + }).start(); + } + + public void cancelDownload() { + isDownloading = false; + Toast.makeText(DownloadService.this, getString(R.string.download_canceled) + " " + filename, Toast.LENGTH_SHORT).show(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/co/median/android/FileDownloader.java b/app/src/main/java/co/median/android/FileDownloader.java new file mode 100644 index 0000000..e27d3cf --- /dev/null +++ b/app/src/main/java/co/median/android/FileDownloader.java @@ -0,0 +1,393 @@ +package co.median.android; + +import android.Manifest; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.os.IBinder; +import android.provider.MediaStore; +import android.text.TextUtils; +import android.util.Log; +import android.webkit.DownloadListener; +import android.webkit.MimeTypeMap; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.core.content.ContextCompat; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import co.median.median_core.AppConfig; +import co.median.median_core.LeanUtils; + +/** + * Created by weiyin on 6/24/14. + */ +public class FileDownloader implements DownloadListener { + public enum DownloadLocation { + PUBLIC_DOWNLOADS, PRIVATE_INTERNAL + } + + private static final String TAG = FileDownloader.class.getName(); + private final MainActivity context; + private final DownloadLocation defaultDownloadLocation; + private final ActivityResultLauncher requestPermissionLauncher; + private UrlNavigation urlNavigation; + private String lastDownloadedUrl; + private DownloadService downloadService; + private boolean isBound = false; + private PreDownloadInfo preDownloadInfo; + + private final ServiceConnection serviceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName componentName, IBinder iBinder) { + DownloadService.DownloadBinder binder = (DownloadService.DownloadBinder) iBinder; + downloadService = binder.getService(); + isBound = true; + } + + @Override + public void onServiceDisconnected(ComponentName componentName) { + downloadService = null; + isBound = false; + } + }; + + FileDownloader(MainActivity context) { + this.context = context; + + AppConfig appConfig = AppConfig.getInstance(this.context); + if (appConfig.downloadToPublicStorage) { + this.defaultDownloadLocation = DownloadLocation.PUBLIC_DOWNLOADS; + } else { + this.defaultDownloadLocation = DownloadLocation.PRIVATE_INTERNAL; + } + + Intent intent = new Intent(context, DownloadService.class); + context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); + + // initialize request permission launcher + requestPermissionLauncher = context.registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), isGranted -> { + + if (isGranted.containsKey(Manifest.permission.WRITE_EXTERNAL_STORAGE) && Boolean.FALSE.equals(isGranted.get(Manifest.permission.WRITE_EXTERNAL_STORAGE))) { + Toast.makeText(context, "Unable to save download, storage permission denied", Toast.LENGTH_SHORT).show(); + return; + } + + if (preDownloadInfo != null && isBound) { + if (preDownloadInfo.isBlob) { + context.getFileWriterSharer().downloadBlobUrl(preDownloadInfo.url, preDownloadInfo.filename, preDownloadInfo.open); + } else { + downloadService.startDownload(preDownloadInfo.url, preDownloadInfo.filename, preDownloadInfo.mimetype, preDownloadInfo.shouldSaveToGallery, preDownloadInfo.open, defaultDownloadLocation); + } + preDownloadInfo = null; + } + }); + } + + @Override + public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { + if (urlNavigation != null) { + urlNavigation.onDownloadStart(); + } + + if (context != null) { + context.runOnUiThread(new Runnable() { + @Override + public void run() { + context.showWebview(); + } + }); + } + + // get filename from content disposition + String guessFilename = null; + if (!TextUtils.isEmpty(contentDisposition)) { + guessFilename = LeanUtils.guessFileName(url, contentDisposition, mimetype); + } + + if (url.startsWith("blob:") && context != null) { + + boolean openAfterDownload = defaultDownloadLocation == DownloadLocation.PRIVATE_INTERNAL; + + if (requestRequiredPermission(new PreDownloadInfo(url, guessFilename, true, openAfterDownload))) { + return; + } + + context.getFileWriterSharer().downloadBlobUrl(url, guessFilename, openAfterDownload); + return; + } + + lastDownloadedUrl = url; + + // try to guess mimetype + if (mimetype == null || mimetype.equalsIgnoreCase("application/force-download") || + mimetype.equalsIgnoreCase("application/octet-stream")) { + MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); + String extension = MimeTypeMap.getFileExtensionFromUrl(url); + if (extension != null && !extension.isEmpty()) { + String guessedMimeType = mimeTypeMap.getMimeTypeFromExtension(extension); + if (guessedMimeType != null) { + mimetype = guessedMimeType; + } + } + } + + startDownload(url, guessFilename, mimetype, false, false); + } + + public void downloadFile(String url, String filename, boolean shouldSaveToGallery, boolean open) { + if (TextUtils.isEmpty(url)) { + Log.d(TAG, "downloadFile: Url empty!"); + return; + } + + if (url.startsWith("blob:") && context != null) { + + if (defaultDownloadLocation == DownloadLocation.PRIVATE_INTERNAL) { + open = true; + } + + if (requestRequiredPermission(new PreDownloadInfo(url, filename, true, open))) { + return; + } + context.getFileWriterSharer().downloadBlobUrl(url, filename, open); + return; + } + + String mimetype = "*/*"; + MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); + String extension = MimeTypeMap.getFileExtensionFromUrl(url); + if (extension != null && !extension.isEmpty()) { + String guessedMimeType = mimeTypeMap.getMimeTypeFromExtension(extension); + if (guessedMimeType != null) { + mimetype = guessedMimeType; + } + } + + startDownload(url, filename, mimetype, shouldSaveToGallery, open); + } + + private void startDownload(String downloadUrl, String filename, String mimetype, boolean shouldSaveToGallery, boolean open) { + if (isBound) { + if (requestRequiredPermission(new PreDownloadInfo(downloadUrl, filename, mimetype, shouldSaveToGallery, open, false))) return; + downloadService.startDownload(downloadUrl, filename, mimetype, shouldSaveToGallery, open, defaultDownloadLocation); + } + } + + // Requests required permission depending on device's SDK version + private boolean requestRequiredPermission(PreDownloadInfo preDownloadInfo) { + + List permissions = new ArrayList<>(); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P && + ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && + defaultDownloadLocation == DownloadLocation.PUBLIC_DOWNLOADS) { + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + if (permissions.size() > 0) { + this.preDownloadInfo = preDownloadInfo; + requestPermissionLauncher.launch(permissions.toArray(new String[] {})); + return true; + } + return false; + } + + public String getLastDownloadedUrl() { + return lastDownloadedUrl; + } + + public void setUrlNavigation(UrlNavigation urlNavigation) { + this.urlNavigation = urlNavigation; + } + + public void unbindDownloadService() { + if (isBound) { + context.unbindService(serviceConnection); + isBound = false; + } + } + + public static Uri createExternalFileUri(ContentResolver contentResolver, String filename, String mimetype, String environment) { + ContentValues contentValues = new ContentValues(); + contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, filename); + contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimetype); + contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, environment); + + Uri baseExternalUri = getBaseExternalUriForEnvironment(environment); + + if (baseExternalUri == null) { + return null; + } + + return createFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); + } + + private static Uri createFileUri(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename, String mimetype) { + try { + // Let the system create the unique URI first. Some device models(e.g., Samsung) will throw IllegalStateException + // https://stackoverflow.com/questions/61654022/java-lang-illegalstateexception-failed-to-build-unique-file-storage-emulated + Uri uri = contentResolver.insert(baseExternalUri, contentValues); + + // On certain Android versions (e.g., Android 10), a null URI may be returned due to a System-thrown SQLiteConstraintException. + // We handle this by forcibly creating one. + if (uri == null) { + uri = createUniqueFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); + } + return uri; + } catch (IllegalStateException ex) { + return createUniqueFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); + } + } + + private static Uri createUniqueFileUri(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename, String mimetype) { + try { + String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimetype); + contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, getUniqueExternalFileName(contentResolver, baseExternalUri, filename, extension)); + return contentResolver.insert(baseExternalUri, contentValues); + } catch (IllegalStateException ex) { + return createUniqueFileUriWithTimeStamp(baseExternalUri, contentResolver, contentValues, filename); + } + } + + private static Uri createUniqueFileUriWithTimeStamp(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename) { + try { + contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, filename + "_" + System.currentTimeMillis()); + return contentResolver.insert(baseExternalUri, contentValues); + } catch (IllegalStateException ex) { + return null; + } + } + + public static String getFileNameFromUri(Uri uri, ContentResolver contentResolver) { + String fileName = null; + + String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME}; + Cursor cursor = contentResolver.query(uri, projection, null, null, null); + + if (cursor != null) { + try { + if (cursor.moveToFirst()) { + int columnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME); + fileName = cursor.getString(columnIndex); + } + } finally { + cursor.close(); + } + } + + return fileName; + } + + private static Uri getBaseExternalUriForEnvironment(String environment) { + if (Objects.equals(environment, Environment.DIRECTORY_PICTURES)) { + return MediaStore.Images.Media.getContentUri("external"); + } else if (Objects.equals(environment, Environment.DIRECTORY_DOWNLOADS)) { + return MediaStore.Files.getContentUri("external"); + } + return null; + } + + private static String getUniqueExternalFileName(ContentResolver contentResolver, Uri baseUri, String filename, String extension) { + int suffix = 1; + String newFilename = filename; + + while (externalFileExists(contentResolver, baseUri, newFilename + "." + extension)) { + newFilename = filename + " (" + suffix + ")"; + suffix++; + } + + return newFilename; + } + + private static boolean externalFileExists(ContentResolver contentResolver, Uri baseUri, String filename) { + String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME}; + String selection = MediaStore.MediaColumns.DISPLAY_NAME + "=?"; + String[] selectionArgs = {filename}; + + try (Cursor cursor = contentResolver.query(baseUri, projection, selection, selectionArgs, null)) { + if (cursor != null && cursor.moveToFirst()) { + return true; + } + } catch (Exception e) { + Log.w(TAG, "externalFileExists: ", e); + } + + return false; + } + + public static File createOutputFile(File dir, String filename, String extension) { + return new File(dir, FileDownloader.getUniqueFileName(filename + "." + extension, dir)); + } + + public static String getUniqueFileName(String fileName, File dir) { + File file = new File(dir, fileName); + + if (!file.exists()) { + return fileName; + } + + int count = 1; + String nameWithoutExt = fileName.substring(0, fileName.lastIndexOf('.')); + String ext = fileName.substring(fileName.lastIndexOf('.')); + String newFileName = nameWithoutExt + "_" + count + ext; + file = new File(dir, newFileName); + + while (file.exists()) { + count++; + newFileName = nameWithoutExt + "_" + count + ext; + file = new File(dir, newFileName); + } + + return file.getName(); + } + + public static String getFilenameExtension(String name) { + int pos = name.lastIndexOf('.'); + if (pos == -1) { + return null; + } else if (pos == 0) { + return name; + } else { + return name.substring(pos + 1); + } + } + + private static class PreDownloadInfo { + String url; + String filename; + String mimetype; + boolean shouldSaveToGallery; + boolean open; + boolean isBlob; + + public PreDownloadInfo(String url, String filename, String mimetype, boolean shouldSaveToGallery, boolean open, boolean isBlob) { + this.url = url; + this.filename = filename; + this.mimetype = mimetype; + this.shouldSaveToGallery = shouldSaveToGallery; + this.open = open; + this.isBlob = isBlob; + } + + public PreDownloadInfo(String url, String filename, boolean isBlob, boolean open) { + this.url = url; + this.filename = filename; + this.isBlob = isBlob; + this.open = open; + } + } +} diff --git a/app/src/main/java/co/median/android/FileUploadIntentsCreator.kt b/app/src/main/java/co/median/android/FileUploadIntentsCreator.kt new file mode 100644 index 0000000..76ee685 --- /dev/null +++ b/app/src/main/java/co/median/android/FileUploadIntentsCreator.kt @@ -0,0 +1,204 @@ +package co.median.android + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.* +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import android.net.Uri +import android.os.Build +import android.os.Parcelable +import android.provider.MediaStore +import android.webkit.MimeTypeMap +import androidx.core.content.FileProvider +import co.median.android.R +import co.median.median_core.AppConfig +import co.median.median_core.Utils +import java.io.File +import java.text.SimpleDateFormat +import java.util.* + + +class FileUploadIntentsCreator(val context: Context, val mimeTypeSpecs: Array, val multiple: Boolean) { + private val mimeTypes = hashSetOf() + private val appConfig = AppConfig.getInstance(context) + private var packageManger = context.packageManager + + var currentCaptureUri: Uri? = null + + init { + extractMimeTypes() + } + + private fun extractMimeTypes() { + mimeTypeSpecs.forEach { spec -> + val specParts = spec.split("[,;\\s]") + specParts.forEach { + if (it.startsWith(".")) { + val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(it.substring(1)) + mimeType?.let { it1 -> mimeTypes.add(it1) } + } else if (it.contains("/")) { + mimeTypes.add(it) + } + } + } + + if (mimeTypes.isEmpty()) { + mimeTypes.add("*/*") + } + } + + private fun imagesAllowed(): Boolean { + if (!Utils.isPermissionGranted(context as Activity, android.Manifest.permission.CAMERA)) return false + return canUploadImage(); + } + + private fun videosAllowed(): Boolean { + if (!Utils.isPermissionGranted(context as Activity, android.Manifest.permission.CAMERA)) return false + return canUploadVideo() + } + + fun canUploadImage(): Boolean { + return mimeTypes.contains("*/*") || mimeTypes.any { it.contains("image/") } + } + + fun canUploadVideo(): Boolean { + return mimeTypes.contains("*/*") || mimeTypes.any { it.contains("video/") } + } + + private fun photoCameraIntents(): ArrayList { + val intents = arrayListOf() + + if (!appConfig.directCameraUploads) { + return intents + } + + val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) + val imageFileName = "IMG_$timeStamp.jpg" + val storageDir = this.context.filesDir + val captureFile = File(storageDir, imageFileName) + + currentCaptureUri = FileProvider.getUriForFile(context, context.applicationContext.packageName + ".fileprovider", captureFile); + + val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + val resolveList: List = listOfAvailableAppsForIntent(captureIntent) + for (resolve in resolveList) { + val packageName = resolve.activityInfo.packageName + val intent = Intent(captureIntent) + intent.component = ComponentName(resolve.activityInfo.packageName, resolve.activityInfo.name) + intent.setPackage(packageName) + intent.putExtra(MediaStore.EXTRA_OUTPUT, currentCaptureUri) + intents.add(intent) + } + + return intents + } + + private fun videoCameraIntents(): ArrayList { + val intents = arrayListOf() + + if (!appConfig.directCameraUploads) { + return intents + } + + val captureIntent = Intent(MediaStore.ACTION_VIDEO_CAPTURE) + val resolveList: List = listOfAvailableAppsForIntent(captureIntent) + for (resolve in resolveList) { + val packageName = resolve.activityInfo.packageName + val intent = Intent(captureIntent) + intent.component = ComponentName(resolve.activityInfo.packageName, resolve.activityInfo.name) + intent.setPackage(packageName) + intents.add(intent) + } + + return intents + } + + private fun filePickerIntent(): Intent { + var intent: Intent + intent = Intent(Intent.ACTION_GET_CONTENT) // or ACTION_OPEN_DOCUMENT + intent.type = mimeTypes.joinToString(", ") + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes.toTypedArray()) + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multiple) + intent.addCategory(Intent.CATEGORY_OPENABLE) + + val resolveList: List = listOfAvailableAppsForIntent(intent) + + if (resolveList.isEmpty() && Build.MANUFACTURER.equals("samsung", ignoreCase = true)) { + intent = Intent("com.sec.android.app.myfiles.PICK_DATA") + intent.putExtra("CONTENT_TYPE", "*/*") + intent.addCategory(Intent.CATEGORY_DEFAULT) + return intent + } + + return intent + } + + fun cameraIntent(): Intent { + val mediaIntents = if (imagesAllowed()) { + photoCameraIntents() + } else { + videoCameraIntents() + } + return mediaIntents.first() + } + + @SuppressLint("IntentReset") + fun chooserIntent(): Intent { + val directCaptureIntents = arrayListOf() + if (imagesAllowed()) { + directCaptureIntents.addAll(photoCameraIntents()) + } + if (videosAllowed()) { + directCaptureIntents.addAll(videoCameraIntents()) + } + + val chooserIntent: Intent? + val mediaIntent: Intent? + + if (imagesAllowed() xor videosAllowed()) { + mediaIntent = getMediaInitialIntent() + mediaIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multiple) + chooserIntent = Intent.createChooser(mediaIntent, context.getString(R.string.choose_action)) + } else if (onlyImagesAndVideo() && !isGooglePhotosDefaultApp()) { + mediaIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + mediaIntent.type = "image/*, video/*" + mediaIntent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*")) + mediaIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multiple) + chooserIntent = Intent.createChooser(mediaIntent, context.getString(R.string.choose_action)) + } else { + chooserIntent = Intent.createChooser(filePickerIntent(), context.getString(R.string.choose_action)) + } + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, directCaptureIntents.toTypedArray()) + + return chooserIntent + } + + private fun getMediaInitialIntent(): Intent { + return if (imagesAllowed()) { + Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + } else { + Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI) + } + } + + private fun onlyImagesAndVideo(): Boolean { + return mimeTypes.all { it.startsWith("image/") || it.startsWith("video/") } + } + + private fun isGooglePhotosDefaultApp(): Boolean { + val captureIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + val resolveList: List = listOfAvailableAppsForIntent(captureIntent) + + return resolveList.size == 1 && resolveList.first().activityInfo.packageName == "com.google.android.apps.photos" + } + + private fun listOfAvailableAppsForIntent(intent: Intent): List { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManger.queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong())) + } else { + @Suppress("DEPRECATION") + packageManger.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/co/median/android/FileWriterSharer.java b/app/src/main/java/co/median/android/FileWriterSharer.java new file mode 100644 index 0000000..76b44a4 --- /dev/null +++ b/app/src/main/java/co/median/android/FileWriterSharer.java @@ -0,0 +1,321 @@ +package co.median.android; + +import android.Manifest; +import android.content.ActivityNotFoundException; +import android.content.ContentResolver; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; +import android.webkit.JavascriptInterface; +import android.webkit.MimeTypeMap; +import android.widget.Toast; + +import androidx.core.content.FileProvider; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; +import co.median.median_core.LeanUtils; + +public class FileWriterSharer { + private static final String TAG = FileWriterSharer.class.getSimpleName(); + private static final long MAX_SIZE = 1024 * 1024 * 1024; // 1 gigabyte + private static final String BASE64TAG = ";base64,"; + private final FileDownloader.DownloadLocation defaultDownloadLocation; + private String downloadFilename; + private boolean open = false; + + private static class FileInfo{ + public String id; + public String name; + public long size; + public String mimetype; + public String extension; + public File savedFile; + public Uri savedUri; + public OutputStream fileOutputStream; + public long bytesWritten; + } + + private class JavascriptBridge { + @JavascriptInterface + public void postMessage(String jsonMessage) { + Log.d(TAG, "got message " + jsonMessage); + try { + JSONObject json = new JSONObject(jsonMessage); + String event = LeanUtils.optString(json, "event"); + if ("fileStart".equals(event)) { + onFileStart(json); + } else if ("fileChunk".equals(event)) { + onFileChunk(json); + } else if ("fileEnd".equals(event)) { + onFileEnd(json); + } else if ("nextFileInfo".equals(event)) { + onNextFileInfo(json); + } else { + GNLog.getInstance().logError(TAG, "Invalid event " + event); + } + } catch (JSONException e) { + GNLog.getInstance().logError(TAG, "Error parsing message as json", e); + } catch (IOException e) { + GNLog.getInstance().logError(TAG, "IO Error", e); + } + } + } + + private JavascriptBridge javascriptBridge; + private MainActivity context; + private Map idToFileInfo; + private String nextFileName; + + public FileWriterSharer(MainActivity context) { + this.javascriptBridge = new JavascriptBridge(); + this.context = context; + this.idToFileInfo = new HashMap<>(); + + AppConfig appConfig = AppConfig.getInstance(this.context); + if (appConfig.downloadToPublicStorage) { + this.defaultDownloadLocation = FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS; + } else { + this.defaultDownloadLocation = FileDownloader.DownloadLocation.PRIVATE_INTERNAL; + } + } + + public JavascriptBridge getJavascriptBridge() { + return javascriptBridge; + } + + public void downloadBlobUrl(String url, String filename, boolean open) { + if (url == null || !url.startsWith("blob:")) { + return; + } + + this.downloadFilename = filename; + this.open = open; + + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BufferedInputStream is = new BufferedInputStream(context.getAssets().open("BlobDownloader.js")); + IOUtils.copy(is, baos); + String js = baos.toString(); + context.runJavascript(js); + js = "gonativeDownloadBlobUrl(" + LeanUtils.jsWrapString(url) + ")"; + context.runJavascript(js); + } catch (IOException e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + } + + private void onFileStart(JSONObject message) throws IOException { + String identifier = LeanUtils.optString(message, "id"); + if (identifier == null || identifier.isEmpty()) { + GNLog.getInstance().logError(TAG, "Invalid file id"); + return; + } + + String fileName; + String extension = null; + String type = null; + + if (!TextUtils.isEmpty(downloadFilename)) { + extension = FileDownloader.getFilenameExtension(downloadFilename); + if (!TextUtils.isEmpty(extension)) { + if (Objects.equals(extension, downloadFilename)) { + fileName = "download"; + } else { + fileName = downloadFilename.substring(0, downloadFilename.length() - (extension.length() + 1)); + } + type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } else { + fileName = downloadFilename; + } + } else { + fileName = LeanUtils.optString(message, "name"); + if (fileName == null || fileName.isEmpty()) { + if (this.nextFileName != null) { + fileName = this.nextFileName; + this.nextFileName = null; + } else { + fileName = "download"; + } + } + } + + long fileSize = message.optLong("size", -1); + if (fileSize <= 0 || fileSize > MAX_SIZE) { + GNLog.getInstance().logError(TAG, "Invalid file size"); + return; + } + + if (TextUtils.isEmpty(type)) { + type = LeanUtils.optString(message, "type"); + if (TextUtils.isEmpty(type)) { + GNLog.getInstance().logError(TAG, "Invalid file type"); + return; + } + } + + if (TextUtils.isEmpty(extension)) { + MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); + extension = mimeTypeMap.getExtensionFromMimeType(type); + } + + final FileInfo info = new FileInfo(); + info.id = identifier; + info.name = fileName; + info.size = fileSize; + info.mimetype = type; + info.extension = extension; + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && defaultDownloadLocation == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { + // request permissions + context.getPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, (permissions, grantResults) -> { + try { + onFileStartAfterPermission(info, grantResults[0] == PackageManager.PERMISSION_GRANTED); + final String js = "gonativeGotStoragePermissions()"; + context.runOnUiThread(() -> context.runJavascript(js)); + } catch (IOException e) { + GNLog.getInstance().logError(TAG, "IO Error", e); + } + }); + } else { + onFileStartAfterPermission(info, true); + final String js = "gonativeGotStoragePermissions()"; + context.runOnUiThread(() -> context.runJavascript(js)); + } + } + + private void onFileStartAfterPermission(FileInfo info, boolean granted) throws IOException { + if (granted && defaultDownloadLocation == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + ContentResolver contentResolver = context.getApplicationContext().getContentResolver(); + Uri uri = FileDownloader.createExternalFileUri(contentResolver, info.name, info.mimetype, Environment.DIRECTORY_DOWNLOADS); + if (uri != null) { + info.fileOutputStream = contentResolver.openOutputStream(uri); + info.savedUri = uri; + } + } else { + info.savedFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), info.name, info.extension); + info.fileOutputStream = new BufferedOutputStream(new FileOutputStream(info.savedFile)); + } + } else { + info.savedFile = FileDownloader.createOutputFile(context.getFilesDir(), info.name, info.extension); + info.fileOutputStream = new BufferedOutputStream(new FileOutputStream(info.savedFile)); + } + info.bytesWritten = 0; + this.idToFileInfo.put(info.id, info); + } + + private void onFileChunk(JSONObject message) throws IOException { + String identifier = LeanUtils.optString(message, "id"); + if (identifier == null || identifier.isEmpty()) { + return; + } + + FileInfo fileInfo = this.idToFileInfo.get(identifier); + if (fileInfo == null) { + return; + } + + String data = LeanUtils.optString(message, "data"); + if (data == null) { + return; + } + + int idx = data.indexOf(BASE64TAG); + if (idx == -1) { + return; + } + + idx += BASE64TAG.length(); + byte[] chunk = Base64.decode(data.substring(idx), Base64.DEFAULT); + + if (fileInfo.bytesWritten + chunk.length > fileInfo.size) { + GNLog.getInstance().logError(TAG, "Received too many bytes. Expected " + fileInfo.size); + try { + fileInfo.fileOutputStream.close(); + fileInfo.savedFile.delete(); + this.idToFileInfo.remove(identifier); + } catch (Exception ignored) { + + } + + return; + } + + fileInfo.fileOutputStream.write(chunk); + fileInfo.bytesWritten += chunk.length; + } + + private void onFileEnd(JSONObject message) throws IOException { + String identifier = LeanUtils.optString(message, "id"); + if (identifier == null || identifier.isEmpty()) { + GNLog.getInstance().logError(TAG, "Invalid identifier " + identifier + " for fileEnd"); + return; + } + + final FileInfo fileInfo = this.idToFileInfo.get(identifier); + if (fileInfo == null) { + GNLog.getInstance().logError(TAG, "Invalid identifier " + identifier + " for fileEnd"); + return; + } + + fileInfo.fileOutputStream.close(); + + if (open) { + context.runOnUiThread(() -> { + if (fileInfo.savedUri == null && fileInfo.savedFile != null) { + fileInfo.savedUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", fileInfo.savedFile); + } + if (fileInfo.savedUri == null) return; + + Intent intent = getIntentToOpenFile(fileInfo.savedUri, fileInfo.mimetype); + try { + context.startActivity(intent); + } catch (ActivityNotFoundException e) { + String message1 = context.getResources().getString(R.string.file_handler_not_found); + Toast.makeText(context, message1, Toast.LENGTH_LONG).show(); + } + }); + } else { + String downloadCompleteMessage = fileInfo.name != null && !fileInfo.name.isEmpty() + ? String.format(context.getString(R.string.file_download_finished_with_name), fileInfo.name + '.' + fileInfo.extension) + : context.getString(R.string.file_download_finished); + Toast.makeText(context, downloadCompleteMessage, Toast.LENGTH_SHORT).show(); + } + } + + private Intent getIntentToOpenFile(Uri uri, String mimetype) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(uri, mimetype); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } + + private void onNextFileInfo(JSONObject message) { + String name = LeanUtils.optString(message, "name"); + if (name == null || name.isEmpty()) { + GNLog.getInstance().logError(TAG, "Invalid name for nextFileInfo"); + return; + } + this.nextFileName = name; + } +} diff --git a/app/src/main/java/co/median/android/GoNativeApplication.java b/app/src/main/java/co/median/android/GoNativeApplication.java new file mode 100644 index 0000000..6b7329e --- /dev/null +++ b/app/src/main/java/co/median/android/GoNativeApplication.java @@ -0,0 +1,116 @@ +package co.median.android; + +import android.content.ComponentCallbacks2; +import android.os.Message; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatDelegate; +import androidx.multidex.MultiDexApplication; + +import java.util.List; +import java.util.Map; + +import co.median.median_core.AppConfig; +import co.median.median_core.Bridge; +import co.median.median_core.BridgeModule; +import co.median.median_core.GNLog; + +/** + * Created by weiyin on 9/2/15. + * Copyright 2014 GoNative.io LLC + */ +public class GoNativeApplication extends MultiDexApplication { + + private LoginManager loginManager; + private RegistrationManager registrationManager; + private WebViewPool webViewPool; + private Message webviewMessage; + private GoNativeWindowManager goNativeWindowManager; + private List plugins; + private final static String TAG = GoNativeApplication.class.getSimpleName(); + public final Bridge mBridge = new Bridge(this) { + @Override + protected List getPlugins() { + if (GoNativeApplication.this.plugins == null) { + GoNativeApplication.this.plugins = new PackageList(GoNativeApplication.this).getPackages(); + } + + return GoNativeApplication.this.plugins; + } + }; + + private boolean appBackgrounded = false; + + @Override + public void onCreate() { + super.onCreate(); + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); + + mBridge.onApplicationCreate(this); + + AppConfig appConfig = AppConfig.getInstance(this); + if (appConfig.configError != null) { + Toast.makeText(this, "Invalid appConfig json", Toast.LENGTH_LONG).show(); + GNLog.getInstance().logError(TAG, "AppConfig error", appConfig.configError); + } + + this.loginManager = new LoginManager(this); + + if (appConfig.registrationEndpoints != null) { + this.registrationManager = new RegistrationManager(this); + registrationManager.processConfig(appConfig.registrationEndpoints); + } + + // some global webview setup + WebViewSetup.setupWebviewGlobals(this); + + webViewPool = new WebViewPool(); + + goNativeWindowManager = new GoNativeWindowManager(); + } + + public LoginManager getLoginManager() { + return loginManager; + } + + public RegistrationManager getRegistrationManager() { + return registrationManager; + } + + public WebViewPool getWebViewPool() { + return webViewPool; + } + + public Message getWebviewMessage() { + return webviewMessage; + } + + public void setWebviewMessage(Message webviewMessage) { + this.webviewMessage = webviewMessage; + } + + public Map getAnalyticsProviderInfo() { + return mBridge.getAnalyticsProviderInfo(); + } + + public GoNativeWindowManager getWindowManager() { + return goNativeWindowManager; + } + + @Override + public void onTrimMemory(int level) { + super.onTrimMemory(level); + if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { + // App has gone into the background + setAppBackgrounded(true); + } + } + + public boolean isAppBackgrounded() { + return appBackgrounded; + } + + public void setAppBackgrounded(boolean appBackgrounded) { + this.appBackgrounded = appBackgrounded; + } +} diff --git a/app/src/main/java/co/median/android/GoNativeWindowManager.java b/app/src/main/java/co/median/android/GoNativeWindowManager.java new file mode 100644 index 0000000..0e47063 --- /dev/null +++ b/app/src/main/java/co/median/android/GoNativeWindowManager.java @@ -0,0 +1,153 @@ +package co.median.android; + +import android.text.TextUtils; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class GoNativeWindowManager { + private final LinkedHashMap windows; + private ExcessWindowsClosedListener excessWindowsClosedListener; + + public GoNativeWindowManager() { + windows = new LinkedHashMap<>(); + } + + public void addNewWindow(String activityId, boolean isRoot) { + this.windows.put(activityId, new ActivityWindow(activityId, isRoot)); + } + + public void removeWindow(String activityId) { + this.windows.remove(activityId); + + if (excessWindowsClosedListener != null && windows.size() <= 1) { + excessWindowsClosedListener.onAllExcessWindowClosed(); + } + } + + public void setOnExcessWindowClosedListener(ExcessWindowsClosedListener listener) { + this.excessWindowsClosedListener = listener; + } + + public ActivityWindow getActivityWindowInfo(String activityId) { + return windows.get(activityId); + } + + public void setUrlLevel(String activityId, int urlLevel) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + window.setUrlLevels(urlLevel, window.parentUrlLevel); + } + } + + public int getUrlLevel(String activityId) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + return window.urlLevel; + } + return -1; + } + + public void setParentUrlLevel(String activityId, int parentLevel) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + window.setUrlLevels(window.urlLevel, parentLevel); + } + } + + public int getParentUrlLevel(String activityId) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + return window.parentUrlLevel; + } + return -1; + } + + public void setUrlLevels(String activityId, int urlLevel, int parentLevel) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + window.setUrlLevels(urlLevel, parentLevel); + } + } + + public boolean isRoot(String activityId) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + return window.isRoot; + } + return false; + } + + public void setAsNewRoot(String activityId) { + for (Map.Entry entry : windows.entrySet()) { + ActivityWindow window = entry.getValue(); + if (TextUtils.equals(activityId, entry.getKey())) { + window.isRoot = true; + } else { + window.isRoot = false; + } + } + } + + public void setIgnoreInterceptMaxWindows(String activityId, boolean ignore) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + window.ignoreInterceptMaxWindows = ignore; + } + } + + public boolean isIgnoreInterceptMaxWindows(String activityId) { + ActivityWindow window = windows.get(activityId); + if (window != null) { + return window.ignoreInterceptMaxWindows; + } + return false; + } + + public int getWindowCount() { + return windows.size(); + } + + // Returns ID of the next window after root as Excess window + public String getExcessWindow() { + for (Map.Entry entry : windows.entrySet()) { + ActivityWindow window = entry.getValue(); + if (window.isRoot) continue; + return window.id; + } + return null; + } + + public static class ActivityWindow { + private final String id; + private boolean isRoot; + private int urlLevel; + private int parentUrlLevel; + private boolean ignoreInterceptMaxWindows; + + ActivityWindow(String id, boolean isRoot) { + this.id = id; + this.isRoot = isRoot; + this.urlLevel = -1; + this.parentUrlLevel = -1; + } + + public void setUrlLevels(int urlLevel, int parentUrlLevel) { + this.urlLevel = urlLevel; + this.parentUrlLevel = parentUrlLevel; + } + + @Override + public String toString() { + return "id=" + id + "\n" + + "isRoot=" + isRoot + "\n" + + "urlLevel=" + urlLevel + "\n" + + "parentUrlLevel=" + parentUrlLevel; + } + } + + + interface ExcessWindowsClosedListener { + void onAllExcessWindowClosed(); + } +} diff --git a/app/src/main/java/co/median/android/HtmlIntercept.java b/app/src/main/java/co/median/android/HtmlIntercept.java new file mode 100644 index 0000000..64c4d60 --- /dev/null +++ b/app/src/main/java/co/median/android/HtmlIntercept.java @@ -0,0 +1,273 @@ +package co.median.android; + +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; +import android.webkit.WebResourceResponse; +import android.webkit.WebView; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Locale; +import java.util.Map; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; +import co.median.median_core.GoNativeWebviewInterface; + +/** + * Created by weiyin on 1/29/16. + */ + +public class HtmlIntercept { + private static final String TAG = HtmlIntercept.class.getName(); + + private Context context; + private String interceptUrl; + private String JSBridgeScript; + private String redirectedUrl; + + // track whether we have intercepted a page at all. We will always try to intercept the first time, + // because interceptUrl may not have been set if restoring from a bundle. + private boolean hasIntercepted = false; + + HtmlIntercept(Context context) { + this.context = context; + } + + public void setInterceptUrl(String interceptUrl) { + this.interceptUrl = interceptUrl; + } + + public WebResourceResponse interceptHtml(GoNativeWebviewInterface view, String url, String referer) { + + AppConfig appConfig = AppConfig.getInstance(context); + if (!appConfig.interceptHtml && (appConfig.customHeaders == null || appConfig.customHeaders.isEmpty())) return null; + + if (!hasIntercepted) { + interceptUrl = url; + hasIntercepted = true; + } + if (!urlMatches(interceptUrl, url)) return null; + + InputStream is = null; + ByteArrayOutputStream baos = null; + + try { + URL parsedUrl = new URL(url); + String protocol = parsedUrl.getProtocol(); + if (!protocol.equalsIgnoreCase("http") && !protocol.equalsIgnoreCase("https")) return null; + + HttpURLConnection connection = (HttpURLConnection)parsedUrl.openConnection(); + connection.setInstanceFollowRedirects(false); + String customUserAgent = appConfig.userAgentForUrl(parsedUrl.toString()); + if (customUserAgent != null) { + connection.setRequestProperty("User-Agent", customUserAgent); + } else { + connection.setRequestProperty("User-Agent", appConfig.userAgent); + } + connection.setRequestProperty("Cache-Control", "no-cache"); + + if (referer != null) { + connection.setRequestProperty("Referer", referer); + } + + Map customHeaders = CustomHeaders.getCustomHeaders(context); + if (customHeaders != null) { + for (Map.Entry entry : customHeaders.entrySet()) { + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + + connection.connect(); + int responseCode = connection.getResponseCode(); + + if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || + responseCode == HttpURLConnection.HTTP_MOVED_TEMP || + responseCode == HttpURLConnection.HTTP_SEE_OTHER || + responseCode == 307) { + // Get redirect URL to be loaded directly to webview, return blank resource which we cancel on UrlNavigation.onPageStart() + // We cannot pass headers in webresourceresponse until Android API 21, and we cannot return null + // or else the webview will handle the request entirely without intercept + String location = connection.getHeaderField("Location"); + + // validate location as URL + try { + new URL(location); + } catch (MalformedURLException ex) { + URL base = new URL(url); + location = new URL(base, location).toString(); + } + + if (!TextUtils.isEmpty(location)) { + this.redirectedUrl = url; + MainActivity mainActivity = (MainActivity) context; + WebView webView = (WebView) mainActivity.getWebView(); + String finalLocation = location; // needed, for this should be effectively final + webView.post(() -> webView.loadUrl(finalLocation)); + } + return new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream("".getBytes())); + } + + String mimetype = connection.getContentType(); + if (mimetype == null) { + try { + is = new BufferedInputStream(connection.getInputStream()); + } catch (IOException e) { + is = new BufferedInputStream(connection.getErrorStream()); + } + mimetype = HttpURLConnection.guessContentTypeFromStream(is); + } + + // if not html, then return null so that webview loads directly. + if (mimetype == null || !mimetype.startsWith("text/html")) + return null; + + // get and intercept the data + String characterEncoding = getCharset(mimetype); + if (characterEncoding == null) { + characterEncoding = "UTF-8"; + } else if (characterEncoding.toLowerCase().equals("iso-8859-1")) { + // windows-1252 is a superset of ios-8859-1 that supports the euro symbol €. + // The html5 spec actually maps "iso-8859-1" to windows-1252 encoding + characterEncoding = "windows-1252"; + } + + if (is == null) { + try { + is = new BufferedInputStream(connection.getInputStream()); + } catch (IOException e) { + is = new BufferedInputStream(connection.getErrorStream()); + } + } + + int initialLength = connection.getContentLength(); + if (initialLength < 0) + initialLength = UrlNavigation.DEFAULT_HTML_SIZE; + + baos = new ByteArrayOutputStream(initialLength); + IOUtils.copy(is, baos); + String origString; + try { + origString = baos.toString(characterEncoding); + } catch (UnsupportedEncodingException e){ + // Everything should support UTF-8 + origString = baos.toString("UTF-8"); + } + + // modify the string! + String newString; + int insertPoint = origString.indexOf(""); + if (insertPoint >= 0) { + StringBuilder builder = new StringBuilder(initialLength); + builder.append(origString.substring(0, insertPoint)); + + if (appConfig.stringViewport != null) { + builder.append(""); + } + if (!Double.isNaN(appConfig.forceViewportWidth)) { + if (appConfig.zoomableForceViewport) { + builder.append(String.format(Locale.US, "", + appConfig.forceViewportWidth)); + } + else { + // we want to use user-scalable=no, but android has a bug that sets scale to + // 1.0 if user-scalable=no. The workaround to is calculate the scale and set + // it for initial, minimum, and maximum. + // http://stackoverflow.com/questions/12723844/android-viewport-setting-user-scalable-no-breaks-width-zoom-level-of-viewpor + double webViewWidth = view.getWidth() / context.getResources().getDisplayMetrics().density; + double viewportWidth = appConfig.forceViewportWidth; + double scale = webViewWidth / viewportWidth; + builder.append(String.format(Locale.US, "", + viewportWidth, scale, scale, scale)); + } + } + + builder.append(origString.substring(insertPoint)); + newString = builder.toString(); + } + else { + Log.d(TAG, "could not find closing tag"); + newString = origString; + } + + return new WebResourceResponse("text/html", "UTF-8", + new ByteArrayInputStream(newString.getBytes("UTF-8"))); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.toString(), e); + return null; + } finally { + IOUtils.close(is); + IOUtils.close(baos); + } + } + + // Do these urls match, ignoring trailing slash in path + private static boolean urlMatches(String url1, String url2) { + if (url1 == null || url2 == null) return false; + + try { + URL parsed1 = new URL(url1); + URL parsed2 = new URL(url2); + + if (stringsNotEqual(parsed1.getProtocol(), parsed2.getProtocol())) return false; + + if (stringsNotEqual(parsed1.getAuthority(), parsed2.getAuthority())) return false; + + if (stringsNotEqual(parsed1.getQuery(), parsed2.getQuery())) return false; + + String path1 = parsed1.getPath(); + String path2 = parsed2.getPath(); + if (path1 == null) path1 = ""; + if (path2 == null) path2 = ""; + + int lengthDiff = path2.length() - path2.length(); + if (lengthDiff > 1 || lengthDiff < -1) return false; + if (lengthDiff == 0) return path1.equals(path2); + if (lengthDiff == 1) { + return path2.equals(path1 + "/"); + } + + // lengthDiff == -1 + return path1.equals(path2 + "/"); + } catch (MalformedURLException e) { + return false; + } + } + + private static boolean stringsNotEqual(String s1, String s2) { + return !(s1 == null ? s2 == null : s1.equals(s2)); + } + + private static String getCharset(String contentType) { + if (contentType == null || contentType.isEmpty()) { + return null; + } + + String[] tokens = contentType.split("; *"); + for (String s : tokens) { + if (s.startsWith("charset=")) { + return s.substring("charset=".length()); + } + } + + return null; + } + + public String getRedirectedUrl() { + return redirectedUrl; + } + + public void setRedirectedUrl(String redirectUrl) { + this.redirectedUrl = redirectUrl; + } +} diff --git a/app/src/main/java/co/median/android/IOUtils.java b/app/src/main/java/co/median/android/IOUtils.java new file mode 100644 index 0000000..9ee9ce5 --- /dev/null +++ b/app/src/main/java/co/median/android/IOUtils.java @@ -0,0 +1,30 @@ +package co.median.android; + + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import co.median.median_core.GNLog; + +public class IOUtils { + private static final String TAG = IOUtils.class.getName(); + + public static void copy(InputStream in, OutputStream out) throws IOException{ + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + } + + public static void close(Closeable c) { + if (c == null) return; + try { + c.close(); + } catch (IOException e){ + GNLog.getInstance().logError(TAG, e.toString(), e); + } + } +} diff --git a/app/src/main/java/co/median/android/Installation.java b/app/src/main/java/co/median/android/Installation.java new file mode 100644 index 0000000..18ef060 --- /dev/null +++ b/app/src/main/java/co/median/android/Installation.java @@ -0,0 +1,150 @@ +package co.median.android; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Build; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.util.Log; + +import androidx.core.app.ActivityCompat; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; +import java.util.UUID; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; + +/** + * Created by weiyin on 8/8/14. + */ +public class Installation { + private static final String TAG = Installation.class.getName(); + + private static String sID = null; + private static final String INSTALLATION = "INSTALLATION"; + + public synchronized static String id(Context context) { + if (sID == null) { + File installation = new File(context.getFilesDir(), INSTALLATION); + try { + if (!installation.exists()) + writeInstallationFile(installation); + sID = readInstallationFile(installation); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return sID; + } + + public static Map getInfo(Context context) { + HashMap info = new HashMap<>(); + + info.put("platform", "android"); + + String publicKey = AppConfig.getInstance(context).publicKey; + if (publicKey == null) publicKey = ""; + info.put("publicKey", publicKey); + + String packageName = context.getPackageName(); + info.put("appId", packageName); + + + PackageManager manager = context.getPackageManager(); + try { + PackageInfo packageInfo = manager.getPackageInfo(packageName, 0); + info.put("appVersion", packageInfo.versionName); + info.put("appVersionCode", packageInfo.versionCode); + } catch (PackageManager.NameNotFoundException e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + + String distribution; + boolean isDebuggable = ( 0 != ( context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) ); + if (isDebuggable) { + distribution = "debug"; + } else { + String installer = manager.getInstallerPackageName(packageName); + if (installer == null) { + distribution = "adhoc"; + } else if (installer.equals("com.android.vending") || installer.equals("com.google.market")) { + distribution = "playstore"; + } else if (installer.equals("com.amazon.venezia")) { + distribution = "amazon"; + } else { + distribution = installer; + } + } + info.put("distribution", distribution); + + info.put("language", Locale.getDefault().getLanguage()); + info.put("os", "Android"); + info.put("osVersion", Build.VERSION.RELEASE); + info.put("model", Build.MANUFACTURER + " " + Build.MODEL); + info.put("hardware", Build.FINGERPRINT); + info.put("timeZone", TimeZone.getDefault().getID()); + info.put("deviceName", getDeviceName()); + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { + SubscriptionManager subscriptionManager = SubscriptionManager.from(context); + + if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { + List carriers = new ArrayList<>(); + for (SubscriptionInfo subscriptionInfo : subscriptionManager.getActiveSubscriptionInfoList()) { + carriers.add(subscriptionInfo.getCarrierName().toString()); + } + info.put("carrierNames", carriers); + try { + info.put("carrierName", carriers.get(0)); + } catch ( IndexOutOfBoundsException e ) { + Log.w(TAG, "getInfo: No carriers registered with subscription manager"); + } + } else { + Log.w(TAG, "getInfo: Cannot get carrierNames, READ_PHONE_STATE not granted"); + } + } + + info.put("installationId", Installation.id(context)); + + return info; + } + + private static String readInstallationFile(File installation) throws IOException { + RandomAccessFile f = new RandomAccessFile(installation, "r"); + byte[] bytes = new byte[(int) f.length()]; + f.readFully(bytes); + f.close(); + return new String(bytes); + } + + private static void writeInstallationFile(File installation) throws IOException { + FileOutputStream out = new FileOutputStream(installation); + String id = UUID.randomUUID().toString(); + out.write(id.getBytes()); + out.close(); + } + + private static String getDeviceName() { + String manufacturer = Build.MANUFACTURER; + String model = Build.MODEL; + String name; + if (model.startsWith(manufacturer)) { + name = model; + } else { + name = manufacturer + " " + model; + } + return name; + } +} \ No newline at end of file diff --git a/app/src/main/java/co/median/android/JsCustomCodeExecutor.java b/app/src/main/java/co/median/android/JsCustomCodeExecutor.java new file mode 100644 index 0000000..6488d38 --- /dev/null +++ b/app/src/main/java/co/median/android/JsCustomCodeExecutor.java @@ -0,0 +1,64 @@ +package co.median.android; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Map; + +import co.median.median_core.GNLog; + +public class JsCustomCodeExecutor { + private static final String TAG = JsCustomCodeExecutor.class.getName(); + + public static interface CustomCodeHandler { + JSONObject execute(Map params); + } + + // The default CustomCodeHandler "Echo" + // Simply maps all the key/values of the given params into a JSONObject + private static CustomCodeHandler handler = new CustomCodeHandler() { + @Override + public JSONObject execute(Map params) { + if(params != null) { + JSONObject json = new JSONObject(); + try { + for(Map.Entry entry : params.entrySet()) { + json.put(entry.getKey(), entry.getValue()); + } + } + catch(JSONException e) { + GNLog.getInstance().logError(TAG, "Error building custom Json Data", e); + } + return json; + } + return null; + } + }; + + /** + * Set new CustomCodeHandler to override the default "Echo" handler + * @param customHandler + */ + public static void setHandler(CustomCodeHandler customHandler) { + if(customHandler == null) + return; + handler = customHandler; + } + + /** + * Code Handler gets triggered by the UrlNavigation class + * + * @param params A map consisting of all URI parameters and their values + * @return A JSONObject as defined by the Code Handler + * + * @see UrlNavigation#shouldOverrideUrlLoading + */ + public static JSONObject execute(Map params) { + try { + return handler.execute(params); + } catch(Exception e) { + GNLog.getInstance().logError(TAG, "Error executing custom code", e); + return null; + } + } +} diff --git a/app/src/main/java/co/median/android/JsResultBridge.java b/app/src/main/java/co/median/android/JsResultBridge.java new file mode 100644 index 0000000..e2412a6 --- /dev/null +++ b/app/src/main/java/co/median/android/JsResultBridge.java @@ -0,0 +1,5 @@ +package co.median.android; + +public class JsResultBridge { + public static String jsResult = ""; +} diff --git a/app/src/main/java/co/median/android/JsonMenuAdapter.java b/app/src/main/java/co/median/android/JsonMenuAdapter.java new file mode 100644 index 0000000..ad6ad68 --- /dev/null +++ b/app/src/main/java/co/median/android/JsonMenuAdapter.java @@ -0,0 +1,434 @@ +package co.median.android; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.StateListDrawable; +import android.util.Pair; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; +import android.widget.ExpandableListView; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import org.json.JSONArray; +import org.json.JSONObject; + +import io.gonative.android.icons.Icon; +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; + +/** + * Created by weiyin on 4/14/14. + */ +public class JsonMenuAdapter extends BaseExpandableListAdapter + implements ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener { + private static final String TAG = JsonMenuAdapter.class.getName(); + + private MainActivity mainActivity; + private JSONArray menuItems; + + private boolean groupsHaveIcons = false; + private boolean childrenHaveIcons = false; + private String status; + private int selectedIndex; + private ExpandableListView expandableListView; + private Integer highlightColor; + private int sidebar_icon_size; + private int sidebar_expand_indicator_size; + + JsonMenuAdapter(MainActivity activity, ExpandableListView expandableListView) { + this.mainActivity = activity; + sidebar_icon_size = mainActivity.getResources().getInteger(R.integer.sidebar_icon_size); + sidebar_expand_indicator_size = mainActivity.getResources().getInteger(R.integer.sidebar_expand_indicator_size); + this.expandableListView = expandableListView; + menuItems = null; + + this.highlightColor = activity.getResources().getColor(R.color.sidebarHighlight); + + // broadcast messages + BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction() != null && intent.getAction().equals(AppConfig.PROCESSED_MENU_MESSAGE)) { + update(); + } + } + }; + LocalBroadcastManager.getInstance(this.mainActivity) + .registerReceiver(broadcastReceiver, + new IntentFilter(AppConfig.PROCESSED_MENU_MESSAGE)); + + } + + private synchronized void update() { + update(this.status); + } + + public synchronized void update(String status) { + if (status == null) status = "default"; + this.status = status; + + menuItems = AppConfig.getInstance(mainActivity).menus.get(status); + if (menuItems == null) menuItems = new JSONArray(); + + // figure out groupsHaveIcons and childrenHaveIcons (for layout alignment) + groupsHaveIcons = false; + childrenHaveIcons = false; + for (int i = 0; i < menuItems.length(); i++) { + JSONObject item = menuItems.optJSONObject(i); + if (item == null) continue; + + if (!item.isNull("icon") && !item.optString("icon").isEmpty()) { + groupsHaveIcons = true; + } + + if (item.optBoolean("isGrouping", false)) { + JSONArray sublinks = item.optJSONArray("subLinks"); + if (sublinks != null) { + for (int j = 0; j < sublinks.length(); j++) { + JSONObject sublink = sublinks.optJSONObject(j); + if (sublink != null && !sublink.isNull("icon") && !sublink.optString("icon").isEmpty()) { + childrenHaveIcons = true; + break; + } + } + } + + } + } + + notifyDataSetChanged(); + } + + + private String itemString(String s, int groupPosition) { + String value = null; + try { + JSONObject section = (JSONObject) menuItems.get(groupPosition); + if (!section.isNull(s)) + value = section.getString(s).trim(); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + + return value; + } + + private String itemString(String s, int groupPosition, int childPosition) { + String value = null; + try { + JSONObject section = (JSONObject) menuItems.get(groupPosition); + JSONObject sublink = section.getJSONArray("subLinks").getJSONObject(childPosition); + if (!sublink.isNull(s)) + value = sublink.getString(s).trim(); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + + return value; + } + + private String getTitle(int groupPosition) { + return itemString("label", groupPosition); + } + + private String getTitle(int groupPosition, int childPosition) { + return itemString("label", groupPosition, childPosition); + } + + private Pair getUrlAndJavascript(int groupPosition) { + String url = itemString("url", groupPosition); + String js = itemString("javascript", groupPosition); + return new Pair<>(url, js); + } + + private Pair getUrlAndJavascript(int groupPosition, int childPosition) { + String url = itemString("url", groupPosition, childPosition); + String js = itemString("javascript", groupPosition, childPosition); + return new Pair<>(url, js); + } + + private boolean isGrouping(int groupPosition) { + try { + JSONObject section = (JSONObject) menuItems.get(groupPosition); + return section.optBoolean("isGrouping", false); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + return false; + } + } + + @Override + public int getGroupCount() { + return menuItems.length(); + } + + @Override + public int getChildrenCount(int groupPosition) { + int count = 0; + try { + JSONObject section = (JSONObject) menuItems.get(groupPosition); + if (section.optBoolean("isGrouping", false)) { + count = section.getJSONArray("subLinks").length(); + } else { + count = 0; + } + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + return count; + } + + @Override + public Object getGroup(int i) { + return null; + } + + @Override + public Object getChild(int i, int i2) { + return null; + } + + @Override + public long getGroupId(int i) { + return 0; + } + + @Override + public long getChildId(int i, int i2) { + return 0; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { + if (convertView == null) { + LayoutInflater inflater = mainActivity.getLayoutInflater(); + + convertView = inflater.inflate(groupsHaveIcons ? + R.layout.menu_group_icon : R.layout.menu_group_noicon, null); + + + TextView title = convertView.findViewById(R.id.menu_item_title); + title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); + + } + RelativeLayout menuItem = convertView.findViewById(R.id.menu_item); + GradientDrawable shape = getHighlightDrawable(); + StateListDrawable stateListDrawable = new StateListDrawable(); + stateListDrawable.addState(new int[]{android.R.attr.state_activated}, shape); + stateListDrawable.addState(new int[]{android.R.attr.state_selected}, shape); + + menuItem.setBackground(stateListDrawable); + + // expand/collapse indicator + ImageView indicator = convertView.findViewById(R.id.menu_group_indicator); + if (isGrouping(groupPosition)) { + String iconName; + int color = Color.BLACK; + if (isExpanded) { + iconName = "fas fa-angle-up"; + } else { + iconName = "fas fa-angle-down"; + } + + if (groupPosition == this.selectedIndex) { + color = this.highlightColor; + } else { + color = mainActivity.getResources().getColor(R.color.sidebarForeground); + } + indicator.setImageDrawable(new Icon(mainActivity, iconName, sidebar_expand_indicator_size, color).getDrawable()); + + indicator.setVisibility(View.VISIBLE); + } else { + indicator.setVisibility(View.GONE); + } + + //set the title + TextView title = convertView.findViewById(R.id.menu_item_title); + title.setText(getTitle(groupPosition)); + if (this.selectedIndex == groupPosition) { + title.setTextColor(this.highlightColor); + } else { + title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); + } + + // set icon + String icon = itemString("icon", groupPosition); + ImageView imageView = convertView.findViewById(R.id.menu_item_icon); + if (icon != null && !icon.isEmpty()) { + int color; + if (groupPosition == this.selectedIndex) { + color = this.highlightColor; + } else { + color = mainActivity.getResources().getColor(R.color.sidebarForeground); + } + Drawable iconDrawable = new Icon(mainActivity, icon, sidebar_icon_size, color).getDrawable(); + + imageView.setImageDrawable(iconDrawable); + imageView.setVisibility(View.VISIBLE); + } else if (imageView != null) { + imageView.setVisibility(View.INVISIBLE); + } + + return convertView; + } + + @Override + public View getChildView(int groupPosition, int childPosition, boolean isLastChild, + View convertView, ViewGroup parent) { + + if (convertView == null) { + LayoutInflater inflater = mainActivity.getLayoutInflater(); + + if (groupsHaveIcons || childrenHaveIcons) + convertView = inflater.inflate(R.layout.menu_child_icon, parent, false); + else + convertView = inflater.inflate(R.layout.menu_child_noicon, parent, false); + + // style it + TextView title = convertView.findViewById(R.id.menu_item_title); + title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); + } + + RelativeLayout menuItem = convertView.findViewById(R.id.menu_item); + GradientDrawable shape = getHighlightDrawable(); + StateListDrawable stateListDrawable = new StateListDrawable(); + stateListDrawable.addState(new int[]{android.R.attr.state_activated}, shape); + stateListDrawable.addState(new int[]{android.R.attr.state_selected}, shape); + + menuItem.setBackground(stateListDrawable); + + // set title + TextView title = convertView.findViewById(R.id.menu_item_title); + title.setText(getTitle(groupPosition, childPosition)); + if (this.selectedIndex == (groupPosition + childPosition) + 1) { + title.setTextColor(this.highlightColor); + } else { + title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); + } + + // set icon + String icon = itemString("icon", groupPosition, childPosition); + ImageView imageView = convertView.findViewById(R.id.menu_item_icon); + if (icon != null && !icon.isEmpty()) { + int color; + if (this.selectedIndex == (groupPosition + childPosition) + 1) { + color = this.highlightColor; + } else { + color = mainActivity.getResources().getColor(R.color.sidebarForeground); + } + Drawable iconDrawable = new Icon(mainActivity, icon, sidebar_icon_size, color).getDrawable(); + + imageView.setImageDrawable(iconDrawable); + imageView.setVisibility(View.VISIBLE); + } else if (imageView != null) { + imageView.setVisibility(View.INVISIBLE); + } + + return convertView; + } + + @Override + public boolean isChildSelectable(int groupPosition, int childPosition) { + return true; + } + + @Override + public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { + try { + if (isGrouping(groupPosition)) { + // return false for default handling behavior + return false; + } else { + Pair urlAndJavascript = getUrlAndJavascript(groupPosition); + loadUrlAndJavascript(urlAndJavascript.first, urlAndJavascript.second); + return true; // tell android that we have handled it + } + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + + return false; + } + + @Override + public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { + int index = parent.getFlatListPosition(ExpandableListView.getPackedPositionForChild(groupPosition, childPosition)); + parent.setItemChecked(index, true); + this.selectedIndex = index; + Pair urlAndJavascript = getUrlAndJavascript(groupPosition, childPosition); + loadUrlAndJavascript(urlAndJavascript.first, urlAndJavascript.second); + return true; + } + + private void loadUrlAndJavascript(String url, String javascript) { + // check for GONATIVE_USERID + if (UrlInspector.getInstance().getUserId() != null) { + url = url.replaceAll("GONATIVE_USERID", UrlInspector.getInstance().getUserId()); + } + + if (javascript == null) mainActivity.loadUrl(url); + else mainActivity.loadUrlAndJavascript(url, javascript); + + mainActivity.closeDrawers(); + } + + public void autoSelectItem(String url) { + String formattedUrl = url.replaceAll("/$", ""); + if (menuItems == null) return; + + for (int i = 0; i < menuItems.length(); i++) { + if (formattedUrl.equals(menuItems.optJSONObject(i).optString("url").replaceAll("/$", ""))) { + expandableListView.setItemChecked(i, true); + selectedIndex = i; + return; + } + } + } + + private GradientDrawable getHighlightDrawable() { + GradientDrawable shape = new GradientDrawable(); + shape.setCornerRadius(10); + shape.setColor(this.highlightColor); + shape.setAlpha(30); + + return shape; + } + + @Override + public int getChildType(int groupPosition, int childPosition) { + if (groupsHaveIcons || childrenHaveIcons) return 0; + else return 1; + } + + @Override + public int getChildTypeCount() { + return 2; + } + + @Override + public int getGroupType(int groupPosition) { + if (groupsHaveIcons) return 0; + else return 1; + } + + @Override + public int getGroupTypeCount() { + return 2; + } +} diff --git a/app/src/main/java/co/median/android/KeyboardManager.kt b/app/src/main/java/co/median/android/KeyboardManager.kt new file mode 100644 index 0000000..f324882 --- /dev/null +++ b/app/src/main/java/co/median/android/KeyboardManager.kt @@ -0,0 +1,78 @@ +package co.median.android + +import android.graphics.Rect +import android.text.TextUtils +import android.view.ViewGroup +import co.median.median_core.LeanUtils +import org.json.JSONObject + + +class KeyboardManager(val activity: MainActivity, private val rootLayout: ViewGroup) { + + var callback: String? = "" + private var keyboardWidth = 0 + private var keyboardHeight = 0 + private var screenWidth = 0 + private var screenHeight = 0 + private var isKeyboardVisible = false + private var screenHeightOffset = 0 + + init { + rootLayout.viewTreeObserver + .addOnGlobalLayoutListener { + val r = Rect() + rootLayout.getWindowVisibleDisplayFrame(r) + + if (screenHeightOffset == 0) { + screenHeightOffset = rootLayout.rootView.height - r.bottom + } + + screenWidth = rootLayout.rootView.width + screenHeight = r.bottom + screenHeightOffset + + keyboardHeight = rootLayout.rootView.height - screenHeight + + if (keyboardHeight == screenHeightOffset) { + keyboardHeight = 0 + } + + val visible = keyboardHeight != 0 + + if (visible) { + keyboardWidth = screenWidth + if (!isKeyboardVisible) { + isKeyboardVisible = true + notifyCallback(); + } + } else { + keyboardWidth = 0 + if (isKeyboardVisible) { + isKeyboardVisible = false + notifyCallback(); + } + } + } + } + + private fun notifyCallback() { + if (TextUtils.isEmpty(callback)) return + activity.runJavascript(LeanUtils.createJsForCallback(callback, getKeyboardData())) + } + + fun getKeyboardData() : JSONObject { + val keyboardWindowSize = JSONObject() + keyboardWindowSize.put("width", keyboardWidth) + keyboardWindowSize.put("height", keyboardHeight) + + val visibleWindowSize = JSONObject() + visibleWindowSize.put("width", screenWidth) + visibleWindowSize.put("height", screenHeight) + + val data = JSONObject() + data.put("visible", isKeyboardVisible) + data.put("keyboardWindowSize", keyboardWindowSize) + data.put("visibleWindowSize", visibleWindowSize) + + return data + } +} \ No newline at end of file diff --git a/app/src/main/java/co/median/android/LaunchActivity.java b/app/src/main/java/co/median/android/LaunchActivity.java new file mode 100644 index 0000000..c4385fb --- /dev/null +++ b/app/src/main/java/co/median/android/LaunchActivity.java @@ -0,0 +1,4 @@ +package co.median.android; + +public class LaunchActivity extends MainActivity{ +} diff --git a/app/src/main/java/co/median/android/LoginManager.java b/app/src/main/java/co/median/android/LoginManager.java new file mode 100644 index 0000000..19f51cf --- /dev/null +++ b/app/src/main/java/co/median/android/LoginManager.java @@ -0,0 +1,137 @@ +package co.median.android; + +import android.content.Context; +import android.os.AsyncTask; + +import org.json.JSONObject; + +import java.lang.ref.WeakReference; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; +import java.util.Observable; +import java.util.regex.Pattern; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; + +/** + * Created by weiyin on 3/16/14. + */ +public class LoginManager extends Observable { + private static final String TAG = LoginManager.class.getName(); + + private Context context; + private CheckRedirectionTask task = null; + + private boolean loggedIn = false; + + LoginManager(Context context) { + this.context = context; + checkLogin(); + } + + public void checkLogin() { + if (task != null) + task.cancel(true); + + String loginDetectionUrl = AppConfig.getInstance(context).loginDetectionUrl; + if (loginDetectionUrl == null) { + return; + } + + task = new CheckRedirectionTask(this); + task.execute(AppConfig.getInstance(context).loginDetectionUrl); + } + + public boolean isLoggedIn() { + return loggedIn; + } + + + private static class CheckRedirectionTask extends AsyncTask { + private WeakReference loginManagerReference; + + public CheckRedirectionTask(LoginManager loginManager) { + this.loginManagerReference = new WeakReference<>(loginManager); + } + + @Override + protected String doInBackground(String... urls){ + LoginManager loginManager = loginManagerReference.get(); + if (loginManager == null) return null; + + try { + URL parsedUrl = new URL(urls[0]); + HttpURLConnection connection = null; + boolean wasRedirected; + int numRedirects = 0; + do { + if (connection != null) + connection.disconnect(); + + connection = (HttpURLConnection) parsedUrl.openConnection(); + connection.setInstanceFollowRedirects(true); + connection.setRequestProperty("User-Agent", AppConfig.getInstance(loginManager.context).userAgent); + + connection.connect(); + int responseCode = connection.getResponseCode(); + + if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || + responseCode == HttpURLConnection.HTTP_MOVED_TEMP) { + wasRedirected = true; + parsedUrl = new URL(parsedUrl, connection.getHeaderField("Location")); + numRedirects++; + } else { + wasRedirected = false; + } + } while (!isCancelled() && wasRedirected && numRedirects < 10); + + String finalUrl = connection.getURL().toString(); + connection.disconnect(); + return finalUrl; + + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + return null; + } + } + + @Override + protected void onPostExecute(String finalUrl) { + LoginManager loginManager = loginManagerReference.get(); + if (loginManager == null) return; + + UrlInspector.getInstance().inspectUrl(finalUrl); + String loginStatus; + + if (finalUrl == null) { + loginManager.loggedIn = false; + loginStatus = "default"; + loginManager.setChanged(); + loginManager.notifyObservers(); + return; + } + + // iterate through loginDetectionRegexes + AppConfig appConfig = AppConfig.getInstance(loginManager.context); + + List regexes = appConfig.loginDetectRegexes; + for (int i = 0; i < regexes.size(); i++) { + Pattern regex = regexes.get(i); + if (regex.matcher(finalUrl).matches()) { + JSONObject entry = appConfig.loginDetectLocations.get(i); + loginManager.loggedIn = entry.optBoolean("loggedIn", false); + + loginStatus = AppConfig.optString(entry, "menuName"); + if (loginStatus == null) loginStatus = loginManager.loggedIn ? "loggedIn" : "default"; + + loginManager.setChanged(); + loginManager.notifyObservers(); + break; + } + } + } + + } +} diff --git a/app/src/main/java/co/median/android/MainActivity.java b/app/src/main/java/co/median/android/MainActivity.java new file mode 100644 index 0000000..817a5ef --- /dev/null +++ b/app/src/main/java/co/median/android/MainActivity.java @@ -0,0 +1,2659 @@ +package co.median.android; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ActivityNotFoundException; +import android.content.BroadcastReceiver; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.PorterDuff; +import android.hardware.SensorManager; +import android.location.LocationManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Parcel; +import android.preference.PreferenceManager; +import android.provider.Settings; +import android.telephony.PhoneStateListener; +import android.telephony.SignalStrength; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.ViewTreeObserver; +import android.view.WindowManager; +import android.webkit.CookieManager; +import android.webkit.JavascriptInterface; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.widget.ExpandableListView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.Toolbar; +import androidx.browser.customtabs.CustomTabColorSchemeParams; +import androidx.browser.customtabs.CustomTabsIntent; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.Insets; +import androidx.core.splashscreen.SplashScreen; +import androidx.core.view.GravityCompat; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.DialogFragment; +import androidx.lifecycle.SavedStateHandle; +import androidx.lifecycle.SavedStateViewModelFactory; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.webkit.WebSettingsCompat; +import androidx.webkit.WebViewFeature; + +import com.google.android.material.progressindicator.CircularProgressIndicator; +import com.squareup.seismic.ShakeDetector; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.net.CookieHandler; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; +import java.util.Stack; +import java.util.UUID; +import java.util.regex.Pattern; + +import co.median.android.files.CapturedImageSaver; +import co.median.android.widget.GoNativeDrawerLayout; +import co.median.android.widget.GoNativeSwipeRefreshLayout; +import co.median.android.widget.SwipeHistoryNavigationLayout; +import co.median.android.widget.WebViewContainerView; +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; +import co.median.median_core.GoNativeActivity; +import co.median.median_core.GoNativeWebviewInterface; +import co.median.median_core.LeanUtils; +import co.median.median_core.IOUtils; + +public class MainActivity extends AppCompatActivity implements Observer, + GoNativeActivity, + GoNativeSwipeRefreshLayout.OnRefreshListener, + ShakeDetector.Listener, + ShakeDialogFragment.ShakeDialogListener { + public static final String BROADCAST_RECEIVER_ACTION_WEBVIEW_LIMIT_REACHED = "io.gonative.android.MainActivity.Extra.BROADCAST_RECEIVER_ACTION_WEBVIEW_LIMIT_REACHED"; + private static final String webviewDatabaseSubdir = "webviewDatabase"; + private static final String TAG = MainActivity.class.getName(); + public static final String INTENT_TARGET_URL = "targetUrl"; + public static final String EXTRA_WEBVIEW_WINDOW_OPEN = "io.gonative.android.MainActivity.Extra.WEBVIEW_WINDOW_OPEN"; + public static final String EXTRA_NEW_ROOT_URL = "newRootUrl"; + public static final String EXTRA_EXCESS_WINDOW_ID = "excessWindowId"; + public static final String EXTRA_IGNORE_INTERCEPT_MAXWINDOWS = "ignoreInterceptMaxWindows"; + public static final int REQUEST_SELECT_FILE = 100; + private static final int REQUEST_PERMISSION_READ_EXTERNAL_STORAGE = 101; + private static final int REQUEST_PERMISSION_GEOLOCATION = 102; + private static final int REQUEST_PERMISSION_WRITE_EXTERNAL_STORAGE = 103; + private static final int REQUEST_PERMISSION_GENERIC = 199; + private static final int REQUEST_WEBFORM = 300; + public static final int REQUEST_WEB_ACTIVITY = 400; + public static final int GOOGLE_SIGN_IN = 500; + private static final String ON_RESUME_CALLBACK = "median_app_resumed"; + private static final String ON_RESUME_CALLBACK_GN = "gonative_app_resumed"; + private static final String ON_RESUME_CALLBACK_NPM = "_median_app_resumed"; + private static final String CALLBACK_APP_BROWSER_CLOSED = "median_appbrowser_closed"; + + private static final String SAVED_STATE_ACTIVITY_ID = "activityId"; + private static final String SAVED_STATE_IS_ROOT = "isRoot"; + private static final String SAVED_STATE_URL_LEVEL = "urlLevel"; + private static final String SAVED_STATE_PARENT_URL_LEVEL = "parentUrlLevel"; + private static final String SAVED_STATE_SCROLL_X = "scrollX"; + private static final String SAVED_STATE_SCROLL_Y = "scrollY"; + private static final String SAVED_STATE_WEBVIEW_STATE = "webViewState"; + private static final String SAVED_STATE_IGNORE_THEME_SETUP = "ignoreThemeSetup"; + + private boolean isActivityPaused = false; + + private WebViewContainerView mWebviewContainer; + private GoNativeWebviewInterface mWebview; + boolean isPoolWebview = false; + private Stack backHistory = new Stack<>(); + + private View webviewOverlay; + private String initialUrl; + private boolean sidebarNavigationEnabled = true; + + private ValueCallback mUploadMessage; + private ValueCallback uploadMessageLP; + private Uri directUploadImageUri; + private GoNativeDrawerLayout mDrawerLayout; + private View mDrawerView; + private ExpandableListView mDrawerList; + private CircularProgressIndicator mProgress; + private MySwipeRefreshLayout swipeRefreshLayout; + private SwipeHistoryNavigationLayout swipeNavLayout; + private RelativeLayout fullScreenLayout; + private JsonMenuAdapter menuAdapter = null; + private ActionBarDrawerToggle mDrawerToggle; + private ConnectivityManager cm = null; + private ProfilePicker profilePicker = null; + private TabManager tabManager; + private ActionManager actionManager; + private boolean isRoot; + private boolean webviewIsHidden = false; + private Handler handler = new Handler(); + private float hideWebviewAlpha = 0.0f; + private boolean isFirstHideWebview = false; + private Menu mOptionsMenu; + private String activityId; + + private final Runnable statusChecker = new Runnable() { + @Override + public void run() { + runOnUiThread(() -> checkReadyStatus()); + handler.postDelayed(statusChecker, 100); // 0.1 sec + } + }; + private ShakeDetector shakeDetector = new ShakeDetector(this); + private FileDownloader fileDownloader; + private FileWriterSharer fileWriterSharer; + private LoginManager loginManager; + private RegistrationManager registrationManager; + private ConnectivityChangeReceiver connectivityReceiver; + private KeyboardManager keyboardManager; + private BroadcastReceiver navigationTitlesChangedReceiver; + private BroadcastReceiver navigationLevelsChangedReceiver; + private BroadcastReceiver webviewLimitReachedReceiver; + private boolean startedLoading = false; // document readystate checke + protected String postLoadJavascript; + protected String postLoadJavascriptForRefresh; + private StackpreviousWebviewStates; + private GeolocationPermissionCallback geolocationPermissionCallback; + private ArrayList pendingPermissionRequests = new ArrayList<>(); + private ArrayList pendingStartActivityAfterPermissions = new ArrayList<>(); + private String connectivityCallback; + private String connectivityOnceCallback; + private PhoneStateListener phoneStateListener; + private SignalStrength latestSignalStrength; + private boolean restoreBrightnessOnNavigation = false; + private ActivityResultLauncher requestPermissionLauncher; + private ActivityResultLauncher appBrowserActivityLauncher; + private String deviceInfoCallback = ""; + private boolean flagThemeConfigurationChange = false; + private boolean isContentReady; + private String launchSource; + private SavedStateViewModel vm; + + public static class SavedStateViewModel extends ViewModel { + private SavedStateHandle state; + + public SavedStateViewModel(SavedStateHandle savedStateHandle) { + state = savedStateHandle; + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + final AppConfig appConfig = AppConfig.getInstance(this); + GoNativeApplication application = (GoNativeApplication)getApplication(); + GoNativeWindowManager windowManager = application.getWindowManager(); + + this.isRoot = getIntent().getBooleanExtra("isRoot", true); + // Splash events + if (this.isRoot) { + SplashScreen.installSplashScreen(this); + + // remove splash after 7 seconds + new Handler(Looper.getMainLooper()).postDelayed(this::removeSplashWithAnimation, 7000); + } + + this.launchSource = getIntent().getStringExtra("source"); + this.launchSource = TextUtils.isEmpty(this.launchSource) ? "default" : this.launchSource; + + if(appConfig.androidFullScreen){ + toggleFullscreen(true); + } + // must be done AFTER toggleFullScreen to force screen orientation + setScreenOrientationPreference(); + + if (appConfig.keepScreenOn) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + this.hideWebviewAlpha = appConfig.hideWebviewAlpha; + + // App theme setup + ConfigPreferences configPreferences = new ConfigPreferences(this); + String appTheme = configPreferences.getAppTheme(); + + if (TextUtils.isEmpty(appTheme)) { + if (!TextUtils.isEmpty(appConfig.androidTheme)) { + appTheme = appConfig.androidTheme; + } else { + appTheme = "light"; // default is 'light' to support apps with no night assets provided + } + configPreferences.setAppTheme(appTheme); + } + + boolean ignoreThemeUpdate = false; + if (savedInstanceState != null) { + ignoreThemeUpdate = savedInstanceState.getBoolean(SAVED_STATE_IGNORE_THEME_SETUP, false); + } + + if (ignoreThemeUpdate) { + // Ignore app theme setup cause its already called from function setupAppTheme() + Log.d(TAG, "onCreate: configuration change from setupAppTheme(), ignoring theme setup"); + } else { + if ("light".equals(appTheme)) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } else if ("dark".equals(appTheme)) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } else if ("auto".equals(appTheme)) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + } else { + // default + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + configPreferences.setAppTheme("light"); + } + } + + super.onCreate(savedInstanceState); + + this.activityId = UUID.randomUUID().toString(); + int urlLevel = getIntent().getIntExtra("urlLevel", -1); + int parentUrlLevel = getIntent().getIntExtra("parentUrlLevel", -1); + + if (savedInstanceState != null) { + this.activityId = savedInstanceState.getString(SAVED_STATE_ACTIVITY_ID, activityId); + this.isRoot = savedInstanceState.getBoolean(SAVED_STATE_IS_ROOT, isRoot); + urlLevel = savedInstanceState.getInt(SAVED_STATE_URL_LEVEL, urlLevel); + parentUrlLevel = savedInstanceState.getInt(SAVED_STATE_PARENT_URL_LEVEL, parentUrlLevel); + } + + windowManager.addNewWindow(activityId, isRoot); + windowManager.setUrlLevels(activityId, urlLevel, parentUrlLevel); + + if (appConfig.maxWindowsEnabled) { + windowManager.setIgnoreInterceptMaxWindows(activityId, getIntent().getBooleanExtra(EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, false)); + } + + if (isRoot) { + initialRootSetup(); + } + + this.loginManager = application.getLoginManager(); + + this.fileWriterSharer = new FileWriterSharer(this); + this.fileDownloader = new FileDownloader(this); + + // webview pools + application.getWebViewPool().init(this); + + cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + + setContentView(R.layout.activity_gonative); + application.mBridge.onActivityCreate(this, isRoot); + + final ViewGroup content = findViewById(android.R.id.content); + content.getViewTreeObserver().addOnPreDrawListener( + new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + // Check whether the initial data is ready. + if (isContentReady || !isRoot) { + // The content is ready. Start drawing. + content.getViewTreeObserver().removeOnPreDrawListener(this); + return true; + } else { + // The content isn't ready. Suspend. + return false; + } + } + }); + + mProgress = findViewById(R.id.progress); + this.fullScreenLayout = findViewById(R.id.fullscreen); + + swipeRefreshLayout = findViewById(R.id.swipe_refresh); + swipeRefreshLayout.setEnabled(appConfig.pullToRefresh); + swipeRefreshLayout.setOnRefreshListener(this); + swipeRefreshLayout.setCanChildScrollUpCallback(() -> mWebview.getWebViewScrollY() > 0); + + if (isAndroidGestureEnabled()) { + appConfig.swipeGestures = false; + } + swipeNavLayout = findViewById(R.id.swipe_history_nav); + swipeNavLayout.setEnabled(appConfig.swipeGestures); + swipeNavLayout.setSwipeNavListener(new SwipeHistoryNavigationLayout.OnSwipeNavListener() { + @Override + public boolean canSwipeLeftEdge() { + if (mWebview.getMaxHorizontalScroll() > 0) { + if (mWebview.getScrollX() > 0) return false; + } + return canGoBack(); + } + + @Override + public boolean canSwipeRightEdge() { + if (mWebview.getMaxHorizontalScroll() > 0) { + if (mWebview.getScrollX() < mWebview.getMaxHorizontalScroll()) return false; + } + return canGoForward(); + } + + @NonNull + @Override + public String getGoBackLabel() { + return ""; + } + + @Override + public boolean navigateBack() { + if (appConfig.swipeGestures && canGoBack()) { + goBack(); + return true; + } + return false; + } + + @Override + public boolean navigateForward() { + if (appConfig.swipeGestures && canGoForward()) { + goForward(); + return true; + } + return false; + } + + @Override + public void leftSwipeReachesLimit() { + + } + + @Override + public void rightSwipeReachesLimit() { + + } + + @Override + public boolean isSwipeEnabled() { + return appConfig.swipeGestures; + } + }); + + swipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.pull_to_refresh_color)); + swipeNavLayout.setActiveColor(getResources().getColor(R.color.pull_to_refresh_color)); + swipeRefreshLayout.setProgressBackgroundColorSchemeColor(getResources().getColor(R.color.swipe_nav_background)); + swipeNavLayout.setBackgroundColor(getResources().getColor(R.color.swipe_nav_background)); + + this.webviewOverlay = findViewById(R.id.webviewOverlay); + this.mWebviewContainer = this.findViewById(R.id.webviewContainer); + this.mWebview = this.mWebviewContainer.getWebview(); + this.mWebviewContainer.setupWebview(this, isRoot); + setupWebviewTheme(appTheme); + + boolean isWebViewStateRestored = false; + + // Restore WebView state + SavedStateViewModelFactory factory = new SavedStateViewModelFactory(getApplication(), this); + vm = new ViewModelProvider(this, factory).get(SavedStateViewModel.class); + if (vm.state.contains(SAVED_STATE_WEBVIEW_STATE)) { + Bundle webViewStateBundle = vm.state.get(SAVED_STATE_WEBVIEW_STATE); + if (webViewStateBundle != null) { + // Restore page and history + mWebview.restoreStateFromBundle(webViewStateBundle); + isWebViewStateRestored = true; + } + } + + // Restore scroll state + if(savedInstanceState != null) { + // Restore scroll position (if exists) + int scrollX = savedInstanceState.getInt(SAVED_STATE_SCROLL_X, 0); + int scrollY = savedInstanceState.getInt(SAVED_STATE_SCROLL_Y, 0); + mWebview.scrollTo(scrollX, scrollY); + } + + // profile picker + if (isRoot && (appConfig.showActionBar || appConfig.showNavigationMenu)) { + setupProfilePicker(); + } + + // proxy cookie manager for httpUrlConnection (syncs to webview cookies) + CookieHandler.setDefault(new WebkitCookieManagerProxy()); + + + this.postLoadJavascript = getIntent().getStringExtra("postLoadJavascript"); + this.postLoadJavascriptForRefresh = this.postLoadJavascript; + + this.previousWebviewStates = new Stack<>(); + + // tab navigation + this.tabManager = new TabManager(this, findViewById(R.id.bottom_navigation)); + tabManager.showTabs(false); + + Toolbar toolbar = findViewById(R.id.toolbar); + // Add action bar if getSupportActionBar() is null + // regardless of appConfig.showActionBar value to setup drawers, sidenav + if (getSupportActionBar() == null) { + // Set Material Toolbar as Action Bar. + setSupportActionBar(toolbar); + } + // Hide action bar if showActionBar is FALSE and showNavigationMenu is FALSE + if (!appConfig.showActionBar && !appConfig.showNavigationMenu) { + getSupportActionBar().hide(); + } + + if (!appConfig.showLogoInSideBar && !appConfig.showAppNameInSideBar) { + RelativeLayout headerLayout = findViewById(R.id.header_layout); + if (headerLayout != null) { + headerLayout.setVisibility(View.GONE); + } + } + + if (!appConfig.showLogoInSideBar) { + ImageView appIcon = findViewById(R.id.app_logo); + if (appIcon != null) { + appIcon.setVisibility(View.GONE); + } + } + TextView appName = findViewById(R.id.app_name); + if (appName != null) { + if(appConfig.showAppNameInSideBar) { + appName.setText(appConfig.appName); + } else { + appName.setVisibility(View.INVISIBLE); + } + } + + // actions in action bar + this.actionManager = new ActionManager(this); + this.actionManager.setupActionBar(isRoot); + + // overflow menu icon color + if (toolbar!= null && toolbar.getOverflowIcon() != null) { + toolbar.getOverflowIcon().setColorFilter(getResources().getColor(R.color.titleTextColor), PorterDuff.Mode.SRC_ATOP); + } + + // load url + String url; + + if (isWebViewStateRestored) { + // WebView already has loaded URL when function mWebview.restoreStateFromBundle() was called + url = mWebview.getUrl(); + } else { + Intent intent = getIntent(); + url = getUrlFromIntent(intent); + + if (url == null && isRoot) url = appConfig.getInitialUrl(); + // url from intent (hub and spoke nav) + if (url == null) url = intent.getStringExtra("url"); + + if (url != null) { + + // let plugins add query params to url before loading to WebView + Map queries = application.mBridge.getInitialUrlQueryItems(this, isRoot); + if (queries != null && !queries.isEmpty()) { + Uri.Builder builder = Uri.parse(url).buildUpon(); + for (Map.Entry entry : queries.entrySet()) { + builder.appendQueryParameter(entry.getKey(), entry.getValue()); + } + url = builder.build().toString(); + } + + this.initialUrl = url; + this.mWebview.loadUrl(url); + } else if (intent.getBooleanExtra(EXTRA_WEBVIEW_WINDOW_OPEN, false)) { + // no worries, loadUrl will be called when this new web view is passed back to the message + } else { + GNLog.getInstance().logError(TAG, "No url specified for MainActivity"); + } + } + + showNavigationMenu(isRoot && appConfig.showNavigationMenu); + + actionManager.setupTitleDisplayForUrl(url); + + ViewCompat.setOnApplyWindowInsetsListener(content, (v, insets) -> { + // fix system navigation blocking bottom bar + Insets systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) content.getLayoutParams(); + layoutParams.bottomMargin = systemBarInsets.bottom; + + return WindowInsetsCompat.CONSUMED; + }); + + updateStatusBarOverlay(appConfig.enableOverlayInStatusBar); + updateStatusBarStyle(appConfig.statusBarStyle); + + this.keyboardManager = new KeyboardManager(this, content); + + // style sidebar + if (mDrawerView != null) { + mDrawerView.setBackgroundColor(getResources().getColor(R.color.sidebarBackground)); + } + + // respond to navigation titles processed + this.navigationTitlesChangedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (AppConfig.PROCESSED_NAVIGATION_TITLES.equals(intent.getAction())) { + String url = mWebview.getUrl(); + if (url == null) return; + String title = titleForUrl(url); + if (title != null) { + setTitle(title); + } else { + setTitle(R.string.app_name); + } + } + } + }; + LocalBroadcastManager.getInstance(this).registerReceiver(this.navigationTitlesChangedReceiver, + new IntentFilter(AppConfig.PROCESSED_NAVIGATION_TITLES)); + + this.navigationLevelsChangedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (AppConfig.PROCESSED_NAVIGATION_LEVELS.equals(intent.getAction())) { + String url = mWebview.getUrl(); + if (url == null) return; + int level = urlLevelForUrl(url); + setUrlLevel(level); + } + } + }; + LocalBroadcastManager.getInstance(this).registerReceiver(this.navigationLevelsChangedReceiver, + new IntentFilter(AppConfig.PROCESSED_NAVIGATION_LEVELS)); + + this.webviewLimitReachedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (BROADCAST_RECEIVER_ACTION_WEBVIEW_LIMIT_REACHED.equals(intent.getAction())) { + + String excessWindowId = intent.getStringExtra(EXTRA_EXCESS_WINDOW_ID); + if (!TextUtils.isEmpty(excessWindowId)) { + if (excessWindowId.equals(activityId)) finish(); + return; + } + + boolean isActivityRoot = getGNWindowManager().isRoot(activityId); + if (!isActivityRoot) { + finish(); + } + } + } + }; + LocalBroadcastManager.getInstance(this).registerReceiver(this.webviewLimitReachedReceiver, + new IntentFilter(BROADCAST_RECEIVER_ACTION_WEBVIEW_LIMIT_REACHED)); + + validateGoogleService(); + + requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { + runGonativeDeviceInfo(deviceInfoCallback, false); + }); + + appBrowserActivityLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), result -> { + String callback = LeanUtils.createJsForCallback(CALLBACK_APP_BROWSER_CLOSED, null); + runJavascript(callback); + }); + } + + public String getActivityId() { + return this.activityId; + } + + private void initialRootSetup() { + File databasePath = new File(getCacheDir(), webviewDatabaseSubdir); + if (databasePath.mkdirs()) { + Log.v(TAG, "databasePath " + databasePath.toString() + " exists"); + } + + // url inspector + UrlInspector.getInstance().init(this); + + // Register launch + ConfigUpdater configUpdater = new ConfigUpdater(this); + configUpdater.registerEvent(); + + // registration service + this.registrationManager = ((GoNativeApplication) getApplication()).getRegistrationManager(); + } + + private void setupProfilePicker() { + Spinner profileSpinner = findViewById(R.id.profile_picker); + profilePicker = new ProfilePicker(this, profileSpinner); + + Spinner segmentedSpinner = findViewById(R.id.segmented_control); + new SegmentedController(this, segmentedSpinner); + } + + private void showNavigationMenu(boolean showNavigation) { + AppConfig appConfig = AppConfig.getInstance(this); + // do the list stuff + mDrawerLayout = findViewById(R.id.drawer_layout); + mDrawerView = findViewById(R.id.left_drawer); + mDrawerList = findViewById(R.id.drawer_list); + + if (showNavigation) { + + // unlock drawer + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); + + // set shadow + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, + R.string.drawer_open, R.string.drawer_close) { + //Called when a drawer has settled in a completely closed state. + public void onDrawerClosed(View view) { + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + mDrawerLayout.setDisableTouch(appConfig.swipeGestures && canGoBack()); + } + + //Called when a drawer has settled in a completely open state. + public void onDrawerOpened(View drawerView) { + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + mDrawerLayout.setDisableTouch(false); + } + }; + + mDrawerToggle.setDrawerIndicatorEnabled(true); + mDrawerToggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.titleTextColor)); + + mDrawerLayout.addDrawerListener(mDrawerToggle); + + setupMenu(); + + // update the menu + if (appConfig.loginDetectionUrl != null) { + this.loginManager.addObserver(this); + } + } else { + // lock drawer so it could not be swiped + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + } + } + + private String getUrlFromIntent(Intent intent) { + if (intent == null) return null; + // first check intent in case it was created from push notification + String targetUrl = intent.getStringExtra(INTENT_TARGET_URL); + if (targetUrl != null && !targetUrl.isEmpty()){ + return targetUrl; + } + + if (Intent.ACTION_VIEW.equals(intent.getAction())) { + Uri uri = intent.getData(); + if (uri != null && (uri.getScheme().endsWith(".http") || uri.getScheme().endsWith(".https"))) { + Uri.Builder builder = uri.buildUpon(); + if (uri.getScheme().endsWith(".https")) { + builder.scheme("https"); + } else if (uri.getScheme().endsWith(".http")) { + builder.scheme("http"); + } + return builder.build().toString(); + } else { + return intent.getDataString(); + } + } + + return null; + } + + protected void onPause() { + super.onPause(); + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.mBridge.onActivityPause(this); + this.isActivityPaused = true; + stopCheckingReadyStatus(); + + if (application.mBridge.pauseWebViewOnActivityPause()) { + this.mWebview.onPause(); + } + + // unregister connectivity + if (this.connectivityReceiver != null) { + unregisterReceiver(this.connectivityReceiver); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + CookieManager.getInstance().flush(); + } + + shakeDetector.stop(); + } + + @Override + protected void onStart() { + super.onStart(); + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.mBridge.onActivityStart(this); + if (AppConfig.getInstance(this).enableWebRTCBluetoothAudio) { + AudioUtils.initAudioFocusListener(this); + } + } + + @Override + protected void onResume() { + super.onResume(); + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.setAppBackgrounded(false); + application.mBridge.onActivityResume(this); + this.mWebview.onResume(); + + AppConfig appConfig = AppConfig.getInstance(this); + + if (isActivityPaused) { + this.isActivityPaused = false; + if (appConfig.injectMedianJS) { + runJavascript(LeanUtils.createJsForCallback(ON_RESUME_CALLBACK, null)); + runJavascript(LeanUtils.createJsForCallback(ON_RESUME_CALLBACK_GN, null)); + } else { + runJavascript(LeanUtils.createJsForCallback(ON_RESUME_CALLBACK_NPM, null)); + } + } + + retryFailedPage(); + // register to listen for connectivity changes + this.connectivityReceiver = new ConnectivityChangeReceiver(); + registerReceiver(this.connectivityReceiver, + new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + + // check login status + this.loginManager.checkLogin(); + + if (appConfig.shakeToClearCache) { + SensorManager sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); + shakeDetector.setSensitivity(ShakeDetector.SENSITIVITY_HARD); + shakeDetector.start(sensorManager); + } + } + + @Override + protected void onStop() { + super.onStop(); + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.mBridge.onActivityStop(this); + if (isRoot) { + if (AppConfig.getInstance(this).clearCache) { + this.mWebview.clearCache(true); + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.mBridge.onActivityDestroy(this); + application.getWindowManager().removeWindow(activityId); + + if (fileDownloader != null) fileDownloader.unbindDownloadService(); + + // destroy webview + if (this.mWebview != null) { + this.mWebview.stopLoading(); + // must remove from view hierarchy to destroy + ViewGroup parent = (ViewGroup) this.mWebview.getParent(); + if (parent != null) { + parent.removeView((View)this.mWebview); + } + if (!this.isPoolWebview) this.mWebview.destroy(); + } + + this.loginManager.deleteObserver(this); + + if (this.navigationTitlesChangedReceiver != null) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(this.navigationTitlesChangedReceiver); + } + if (this.navigationLevelsChangedReceiver != null) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(this.navigationLevelsChangedReceiver); + } + if (this.webviewLimitReachedReceiver != null) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(this.webviewLimitReachedReceiver); + } + } + + @Override + public void onSubscriptionChanged() { + if (registrationManager == null) return; + registrationManager.subscriptionInfoChanged(); + } + + @Override + public void launchNotificationActivity(String extra) { + Intent mainIntent = new Intent(this, MainActivity.class); + mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + if (extra != null && !extra.isEmpty()) { + mainIntent.putExtra(INTENT_TARGET_URL, extra); + } + + startActivity(mainIntent); + } + + private void retryFailedPage() { + // skip if webview is currently loading + if (this.mWebview.getProgress() < 100) return; + + // skip if webview has a page loaded + String currentUrl = this.mWebview.getUrl(); + if (currentUrl != null && !currentUrl.equals(UrlNavigation.OFFLINE_PAGE_URL)) return; + + // skip if there is nothing in history + if (this.backHistory.isEmpty()) return; + + // skip if no network connectivity + if (this.isDisconnected()) return; + + // finally, retry loading the page + this.loadUrl(this.backHistory.pop()); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + // Saves current WebView's history and URL or loaded page state to a new bundle + Bundle webViewOutState = new Bundle(); + mWebview.saveStateToBundle(webViewOutState); + // Initialize ViewModel for WebView state/configuration changes + SavedStateViewModelFactory factory = new SavedStateViewModelFactory(getApplication(), this); + vm = new ViewModelProvider(this, factory).get(SavedStateViewModel.class); + // Save the new WebView state bundle to a ViewModel + vm.state.set(SAVED_STATE_WEBVIEW_STATE, webViewOutState); + + // Save other WebView data to the bundle + outState.putString(SAVED_STATE_ACTIVITY_ID, activityId); + outState.putBoolean(SAVED_STATE_IS_ROOT, getGNWindowManager().isRoot(activityId)); + outState.putInt(SAVED_STATE_URL_LEVEL, getGNWindowManager().getUrlLevel(activityId)); + outState.putInt(SAVED_STATE_PARENT_URL_LEVEL, getGNWindowManager().getParentUrlLevel(activityId)); + outState.putInt(SAVED_STATE_SCROLL_X, mWebview.getWebViewScrollX()); + outState.putInt(SAVED_STATE_SCROLL_Y, mWebview.getWebViewScrollY()); + if (flagThemeConfigurationChange) { + outState.putBoolean(SAVED_STATE_IGNORE_THEME_SETUP, true); + } + + super.onSaveInstanceState(outState); + } + + public void addToHistory(String url) { + if (url == null) return; + + if (this.backHistory.isEmpty() || !this.backHistory.peek().equals(url)) { + this.backHistory.push(url); + } + + checkNavigationForPage(url); + + // this is a little hack to show the webview after going back in history in single-page apps. + // We may never get onPageStarted or onPageFinished, hence the webview would be forever + // hidden when navigating back in single-page apps. We do, however, get an updatedHistory callback. + showWebview(0.3); + } + + @Override + public void hearShake() { + String FRAGMENT_TAG = "ShakeDialogFragment"; + if (getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG) != null) { + return; + } + + ShakeDialogFragment dialog = new ShakeDialogFragment(); + dialog.show(getSupportFragmentManager(), FRAGMENT_TAG); + } + + @Override + public void onClearCache(DialogFragment dialog) { + clearWebviewCache(); + Toast.makeText(this, R.string.cleared_cache, Toast.LENGTH_SHORT).show(); + } + + public boolean canGoBack() { + if (this.mWebview == null) return false; + return this.mWebview.canGoBack(); + } + + public void goBack() { + if (this.mWebview == null) return; + if (LeanWebView.isCrosswalk()) { + // not safe to do for non-crosswalk, as we may never get a page finished callback + // for single-page apps + hideWebview(); + } + + this.mWebview.goBack(); + } + + private boolean canGoForward() { + return this.mWebview.canGoForward(); + } + + private void goForward() { + if (LeanWebView.isCrosswalk()) { + // not safe to do for non-crosswalk, as we may never get a page finished callback + // for single-page apps + hideWebview(); + } + + this.mWebview.goForward(); + } + + @Override + public void sharePage(String optionalUrl, String optionalText) { + String shareUrl; + String currentUrl = this.mWebview.getUrl(); + if (TextUtils.isEmpty(optionalUrl)) { + shareUrl = currentUrl; + } else { + try { + java.net.URI optionalUri = new java.net.URI(optionalUrl); + if (optionalUri.isAbsolute()) { + shareUrl = optionalUrl; + } else { + java.net.URI currentUri = new java.net.URI(currentUrl); + shareUrl = currentUri.resolve(optionalUri).toString(); + } + } catch (URISyntaxException e) { + shareUrl = optionalUrl; + } + } + + if (TextUtils.isEmpty(shareUrl)) return; + + String shareData = TextUtils.isEmpty(optionalText) ? shareUrl : optionalText + System.lineSeparator() + shareUrl; + + Intent share = new Intent(Intent.ACTION_SEND); + share.setType("text/plain"); + share.putExtra(Intent.EXTRA_TEXT, shareData); + startActivity(Intent.createChooser(share, getString(R.string.action_share))); + } + + private void logout() { + this.mWebview.stopLoading(); + + // log out by clearing all cookies and going to home page + clearWebviewCookies(); + + updateMenu(false); + this.loginManager.checkLogin(); + this.mWebview.loadUrl(AppConfig.getInstance(this).getInitialUrl()); + } + + public void loadUrl(String url) { + loadUrl(url, false); + } + + public void loadUrl(String url, boolean isFromTab) { + if (url == null) return; + + this.postLoadJavascript = null; + this.postLoadJavascriptForRefresh = null; + + if (url.equalsIgnoreCase("median_logout") || url.equalsIgnoreCase("gonative_logout")) + logout(); + else + this.mWebview.loadUrl(url); + + if (!isFromTab && this.tabManager != null) this.tabManager.selectTab(url, null); + } + + public void loadUrlAndJavascript(String url, String javascript) { + loadUrlAndJavascript(url, javascript, false); + } + + public void loadUrlAndJavascript(String url, String javascript, boolean isFromTab) { + String currentUrl = this.mWebview.getUrl(); + + if (url != null && currentUrl != null && url.equals(currentUrl)) { + runJavascript(javascript); + this.postLoadJavascriptForRefresh = javascript; + } else { + this.postLoadJavascript = javascript; + this.postLoadJavascriptForRefresh = javascript; + this.mWebview.loadUrl(url); + } + + if (!isFromTab && this.tabManager != null) this.tabManager.selectTab(url, javascript); + } + + public void runJavascript(String javascript) { + if (javascript == null) return; + this.mWebview.runJavascript(javascript); + } + + public boolean isDisconnected(){ + NetworkInfo ni = cm.getActiveNetworkInfo(); + return ni == null || !ni.isConnected(); + } + + @Override + public void clearWebviewCache() { + mWebview.clearCache(true); + } + + @Override + public void clearWebviewCookies() { + CookieManager cookieManager = CookieManager.getInstance(); + cookieManager.removeAllCookies(aBoolean -> Log.d(TAG, "clearWebviewCookies: onReceiveValue callback: " + aBoolean)); + AsyncTask.THREAD_POOL_EXECUTOR.execute(cookieManager::flush); + } + + @Override + public void hideWebview() { + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.mBridge.onHideWebview(this); + + if (AppConfig.getInstance(this).disableAnimations) return; + + this.webviewIsHidden = true; + mProgress.setAlpha(1.0f); + mProgress.setVisibility(View.VISIBLE); + + if (this.isFirstHideWebview) { + this.webviewOverlay.setAlpha(1.0f); + } else { + this.webviewOverlay.setAlpha(1 - this.hideWebviewAlpha); + } + + showWebview(10); + } + + private void showWebview(double delay) { + if (delay > 0) { + handler.postDelayed(this::showWebview, (int) (delay * 1000)); + } else { + showWebview(); + } + } + + // shows webview with no animation + public void showWebviewImmediately() { + this.isFirstHideWebview = false; + webviewIsHidden = false; + startedLoading = false; + stopCheckingReadyStatus(); + this.webviewOverlay.setAlpha(0.0f); + this.mProgress.setVisibility(View.INVISIBLE); + } + + + @Override + public void showWebview() { + this.isFirstHideWebview = false; + startedLoading = false; + + if (!webviewIsHidden) { + // don't animate if already visible + mProgress.setVisibility(View.INVISIBLE); + return; + } + + webviewIsHidden = false; + + webviewOverlay.animate().alpha(0.0f) + .setDuration(300) + .setStartDelay(150); + + mProgress.animate().alpha(0.0f) + .setDuration(60); + } + + public void updatePageTitle() { + if (AppConfig.getInstance(this).useWebpageTitle) { + setTitle(this.mWebview.getTitle()); + } + } + + public void update (Observable sender, Object data) { + if (sender instanceof LoginManager) { + updateMenu(((LoginManager) sender).isLoggedIn()); + } + } + + @Override + public void updateMenu(){ + this.loginManager.checkLogin(); + } + + private void updateMenu(boolean isLoggedIn){ + if (menuAdapter == null) + setupMenu(); + + try { + if (isLoggedIn) + menuAdapter.update("loggedIn"); + else + menuAdapter.update("default"); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + } + + private boolean isDrawerOpen() { + return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mDrawerView); + } + + private void setDrawerEnabled(boolean enabled) { + if (!isRoot) return; + + AppConfig appConfig = AppConfig.getInstance(this); + if (!appConfig.showNavigationMenu) return; + + if (mDrawerLayout != null) { + mDrawerLayout.setDrawerLockMode(enabled ? GoNativeDrawerLayout.LOCK_MODE_UNLOCKED : + GoNativeDrawerLayout.LOCK_MODE_LOCKED_CLOSED); + } + + if((sidebarNavigationEnabled || appConfig.showActionBar ) && enabled){ + Toolbar toolbar = findViewById(R.id.toolbar); + if (toolbar != null) { + toolbar.setVisibility(View.VISIBLE); + } + } + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(enabled); + } + } + + private void setupMenu(){ + menuAdapter = new JsonMenuAdapter(this, mDrawerList); + try { + menuAdapter.update("default"); + mDrawerList.setAdapter(menuAdapter); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, "Error setting up menu", e); + } + + mDrawerList.setOnGroupClickListener(menuAdapter); + mDrawerList.setOnChildClickListener(menuAdapter); + } + + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.mBridge.onPostCreate(this, savedInstanceState, isRoot); + + // Sync the toggle state after onRestoreInstanceState has occurred. + if (mDrawerToggle != null) + mDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + this.actionManager.setupActionBarDisplay(); + + GoNativeApplication application = (GoNativeApplication)getApplication(); + // Pass any configuration change to the drawer toggles + if (mDrawerToggle != null) + mDrawerToggle.onConfigurationChanged(newConfig); +// if (swipeRefreshLayout != null) +// TODO swipeRefreshLayout.onConfigurationChanged(newConfig); + application.mBridge.onConfigurationChange(this); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + GoNativeApplication application = (GoNativeApplication)getApplication(); + application.mBridge.onActivityResult(this, requestCode, resultCode, data); + + if (data != null && data.getBooleanExtra("exit", false)) + finish(); + + String url = null; + boolean success = false; + if (data != null) { + url = data.getStringExtra("url"); + success = data.getBooleanExtra("success", false); + } + + if (requestCode == REQUEST_WEBFORM && resultCode == RESULT_OK) { + if (url != null) + loadUrl(url); + else { + // go to initialURL without login/signup override + this.mWebview.setCheckLoginSignup(false); + this.mWebview.loadUrl(AppConfig.getInstance(this).getInitialUrl()); + } + + if (AppConfig.getInstance(this).showNavigationMenu) { + updateMenu(success); + } + } + + if (requestCode == REQUEST_WEB_ACTIVITY && resultCode == RESULT_OK) { + if (url != null) { + int urlLevel = data.getIntExtra("urlLevel", -1); + int parentUrlLevel = getGNWindowManager().getParentUrlLevel(activityId); + if (urlLevel == -1 || parentUrlLevel == -1 || urlLevel > parentUrlLevel) { + // open in this activity + this.postLoadJavascript = data.getStringExtra("postLoadJavascript"); + loadUrl(url); + } else { + // urlLevel <= parentUrlLevel, so pass up the chain + setResult(RESULT_OK, data); + finish(); + } + } + } + + if (requestCode == REQUEST_SELECT_FILE) { + if (resultCode != RESULT_OK) { + cancelFileUpload(); + return; + } + + // from documents (and video camera) + if (data != null && data.getData() != null) { + if (mUploadMessage != null) { + mUploadMessage.onReceiveValue(data.getData()); + mUploadMessage = null; + } + + if (uploadMessageLP != null) { + uploadMessageLP.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data)); + uploadMessageLP = null; + } + + return; + } + + // we may get clip data for multi-select documents + if (data != null && data.getClipData() != null) { + ClipData clipData = data.getClipData(); + ArrayList files = new ArrayList<>(clipData.getItemCount()); + for (int i = 0; i < clipData.getItemCount(); i++) { + ClipData.Item item = clipData.getItemAt(i); + if (item.getUri() != null) { + files.add(item.getUri()); + } + } + + if (mUploadMessage != null) { + // shouldn never happen, but just in case, send the first item + if (files.size() > 0) { + mUploadMessage.onReceiveValue(files.get(0)); + } else { + mUploadMessage.onReceiveValue(null); + } + mUploadMessage = null; + } + + if (uploadMessageLP != null) { + uploadMessageLP.onReceiveValue(files.toArray(new Uri[files.size()])); + uploadMessageLP = null; + } + + return; + } + + // from camera + if (this.directUploadImageUri != null) { + Uri currentCaptureUri = new CapturedImageSaver().saveCapturedBitmap(this, this.directUploadImageUri); + if (mUploadMessage != null) { + mUploadMessage.onReceiveValue(currentCaptureUri); + mUploadMessage = null; + } + if (uploadMessageLP != null) { + uploadMessageLP.onReceiveValue(new Uri[]{currentCaptureUri}); + uploadMessageLP = null; + } + getContentResolver().delete(this.directUploadImageUri, null, null); + this.directUploadImageUri = null; + + return; + } + + // Should not reach here. + cancelFileUpload(); + } + } + + public void cancelFileUpload() { + if (mUploadMessage != null) { + mUploadMessage.onReceiveValue(null); + mUploadMessage = null; + } + + if (uploadMessageLP != null) { + uploadMessageLP.onReceiveValue(null); + uploadMessageLP = null; + } + + this.directUploadImageUri = null; + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + String url = getUrlFromIntent(intent); + if (url != null && !url.isEmpty()) { + if (!urlEqualsIgnoreSlash(url, mWebview.getUrl())) + loadUrl(url); + return; + } + Log.w(TAG, "Received intent without url"); + + ((GoNativeApplication) getApplication()).mBridge.onActivityNewIntent(this, intent); + } + + private boolean urlEqualsIgnoreSlash(String url1, String url2) { + if (url1 == null || url2 == null) return false; + if (url1.endsWith("/")) { + url1 = url1.substring(0, url1.length() - 1); + } + if (url2.endsWith("/")) { + url2 = url2.substring(0, url2.length() - 1); + } + if (url1.startsWith("http://")) { + url1 = "https://" + url1.substring(7); + } + return url1.equals(url2); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_BACK)) { + if (AppConfig.getInstance(this).disableBackButton) { + return true; + } + + if (this.mWebview.exitFullScreen()) { + return true; + } + + if (isDrawerOpen()){ + mDrawerLayout.closeDrawers(); + return true; + } + else if (canGoBack()) { + goBack(); + return true; + } + else if (!this.previousWebviewStates.isEmpty()) { + Bundle state = previousWebviewStates.pop(); + LeanWebView webview = new LeanWebView(this); + webview.restoreStateFromBundle(state); + switchToWebview(webview, /* isPool */ false, /* isBack */ true); + return true; + } + } + + if (((GoNativeApplication) getApplication()).mBridge.onKeyDown(keyCode, event)) { + return true; + } + + return super.onKeyDown(keyCode, event); + } + + // isPoolWebView is used to keep track of whether we are showing a pooled webview, which has implications + // for page navigation, namely notifying the pool to disown the webview. + // isBack means the webview is being switched in as part of back navigation behavior. If isBack=false, + // then we will save the state of the old one switched out. + public void switchToWebview(GoNativeWebviewInterface newWebview, boolean isPoolWebview, boolean isBack) { + this.mWebviewContainer.setupWebview(this, isRoot); + + // scroll to top + ((View)newWebview).scrollTo(0, 0); + + View prev = (View)this.mWebview; + + if (!isBack) { + // save the state for back button behavior + Bundle stateBundle = new Bundle(); + this.mWebview.saveStateToBundle(stateBundle); + this.previousWebviewStates.add(stateBundle); + } + + // replace the current web view in the parent with the new view + if (newWebview != prev) { + // a view can only have one parent, and attempting to add newWebview if it already has + // a parent will cause a runtime exception. So be extra safe by removing it from its parent. + ViewParent temp = newWebview.getParent(); + if (temp instanceof ViewGroup) { + ((ViewGroup) temp).removeView((View)newWebview); + } + + ViewGroup parent = (ViewGroup) prev.getParent(); + int index = parent.indexOfChild(prev); + parent.removeView(prev); + parent.addView((View) newWebview, index); + ((View)newWebview).setLayoutParams(prev.getLayoutParams()); + + // webviews can still send some extraneous events to this activity if we do not remove + // its callbacks + WebViewSetup.removeCallbacks((LeanWebView) prev); + + if (!this.isPoolWebview) { + ((GoNativeWebviewInterface)prev).destroy(); + } + } + + this.isPoolWebview = isPoolWebview; + this.mWebview = newWebview; + + if (this.postLoadJavascript != null) { + runJavascript(this.postLoadJavascript); + this.postLoadJavascript = null; + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.topmenu, menu); + mOptionsMenu = menu; + + if (this.actionManager != null) { + this.actionManager.addActions(menu); + } + + return true; + } + + public Menu getOptionsMenu () { + return mOptionsMenu; + } + + public void setMenuItemsVisible (boolean visible) { + setMenuItemsVisible(visible, null); + } + + public void setMenuItemsVisible(boolean visible, MenuItem exception) { + + for (int i = 0; i < mOptionsMenu.size(); i++) { + MenuItem item = mOptionsMenu.getItem(i); + if (item == exception) { + continue; + } + + item.setVisible(visible); + item.setEnabled(visible); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Pass the event to ActionBarDrawerToggle, if it returns + // true, then it has handled the app icon touch event + + if (mDrawerToggle != null) { + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + } + + // actions + if (this.actionManager != null) { + if (this.actionManager.onOptionsItemSelected(item)) { + return true; + } + } + + // handle other items + if (item.getItemId() == android.R.id.home) { + if (this.actionManager.isOnSearchMode()) { + this.actionManager.closeSearchView(); + this.actionManager.setOnSearchMode(false); + return true; + } + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onRefresh() { + refreshPage(); + stopNavAnimation(true, 1000); + } + + private void stopNavAnimation(boolean isConsumed){ + stopNavAnimation(isConsumed, 100); + } + + private void stopNavAnimation(boolean isConsumed, int delay){ + // let the refreshing spinner stay for a little bit if the native show/hide is disabled + // otherwise there isn't enough of a user confirmation that the page is refreshing + if (isConsumed && AppConfig.getInstance(this).disableAnimations) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + } + }, delay); + } else { + this.swipeRefreshLayout.setRefreshing(false); + } + } + + public void refreshPage() { + String url = this.mWebview.getUrl(); + if (url != null && url.equals(UrlNavigation.OFFLINE_PAGE_URL)){ + if (this.mWebview.canGoBack()) { + this.mWebview.goBack(); + } else if (this.initialUrl != null) { + this.mWebview.loadUrl(this.initialUrl); + } + updateMenu(); + } + else { + this.postLoadJavascript = this.postLoadJavascriptForRefresh; + this.mWebview.loadUrl(url); + } + } + + private void removeSplashWithAnimation() { + isContentReady = true; + stopCheckingReadyStatus(); + } + + // onPageFinished + @Override + public void checkNavigationForPage(String url) { + // don't change anything on navigation if the url that just finished was a file download + if (url.equals(this.fileDownloader.getLastDownloadedUrl())) return; + + if (this.tabManager != null) { + this.tabManager.checkTabs(url); + } + + if (this.actionManager != null) { + this.actionManager.checkActions(url); + } + + if (this.registrationManager != null) { + this.registrationManager.checkUrl(url); + } + + if (this.menuAdapter != null) { + this.menuAdapter.autoSelectItem(url); + } + } + + // onPageStarted + @Override + public void checkPreNavigationForPage(String url) { + if (this.tabManager != null) { + this.tabManager.autoSelectTab(url); + } + + if (this.menuAdapter != null) { + this.menuAdapter.autoSelectItem(url); + } + + AppConfig appConfig = AppConfig.getInstance(this); + setDrawerEnabled(appConfig.shouldShowSidebarForUrl(url) && sidebarNavigationEnabled); + + // When current URL canGoBack and swipeGestures are enabled, disable touch events on DrawerLayout + if (this.mDrawerLayout != null && this.mDrawerLayout.getDrawerLockMode(GravityCompat.START) != DrawerLayout.LOCK_MODE_LOCKED_CLOSED) { + mDrawerLayout.setDisableTouch(appConfig.swipeGestures && canGoBack()); + } + } + + public ActionManager getActionManager() { + return this.actionManager; + } + + @Override + public void setupTitleDisplayForUrl(String url) { + if (this.actionManager == null) return; + this.actionManager.setupTitleDisplayForUrl(url); + } + + @Override + public int urlLevelForUrl(String url) { + ArrayList entries = AppConfig.getInstance(this).navStructureLevelsRegex; + if (entries != null) { + for (int i = 0; i < entries.size(); i++) { + Pattern regex = entries.get(i); + if (regex.matcher(url).matches()) { + return AppConfig.getInstance(this).navStructureLevels.get(i); + } + } + } + + // return unknown + return -1; + } + + @Override + public String titleForUrl(String url) { + ArrayList> entries = AppConfig.getInstance(this).navTitles; + String title = null; + + if (entries != null) { + for (HashMap entry : entries) { + Pattern regex = (Pattern)entry.get("regex"); + + if (regex.matcher(url).matches()) { + if (entry.containsKey("title")) { + title = (String)entry.get("title"); + } + } + } + } + + return title; + } + + public void closeDrawers() { + mDrawerLayout.closeDrawers(); + } + + public boolean isNotRoot() { + return !isRoot; + } + + @Override + public int getParentUrlLevel() { + return getGNWindowManager().getParentUrlLevel(activityId); + } + + @Override + public int getUrlLevel() { + return getGNWindowManager().getUrlLevel(activityId); + } + + @Override + public void setUrlLevel(int urlLevel) { + getGNWindowManager().setUrlLevel(activityId, urlLevel); + } + + public ProfilePicker getProfilePicker() { + return profilePicker; + } + + public FileDownloader getFileDownloader() { + return fileDownloader; + } + + public FileWriterSharer getFileWriterSharer() { + return fileWriterSharer; + } + + public StatusCheckerBridge getStatusCheckerBridge() { + return new StatusCheckerBridge(); + } + + @Override + public void setTitle(CharSequence title) { + super.setTitle(title); + if (actionManager != null) { + actionManager.showTextActionBarTitle(title); + } + } + + @Override + public void startCheckingReadyStatus() { + statusChecker.run(); + } + + private void stopCheckingReadyStatus() { + handler.removeCallbacks(statusChecker); + } + + public void checkReadyStatus() { + this.mWebview.runJavascript("if (median_status_checker && typeof median_status_checker.onReadyState === 'function') median_status_checker.onReadyState(document.readyState);"); + } + + private void checkReadyStatusResult(String status) { + // if interactiveDelay is specified, then look for readyState=interactive, and show webview + // with a delay. If not specified, wait for readyState=complete. + double interactiveDelay = AppConfig.getInstance(this).interactiveDelay; + + if (status.equals("loading") || (Double.isNaN(interactiveDelay) && status.equals("interactive"))) { + startedLoading = true; + } else if ((!Double.isNaN(interactiveDelay) && status.equals("interactive")) + || (startedLoading && status.equals("complete"))) { + + if (status.equals("interactive")) { + showWebview(interactiveDelay); + } else { + showWebview(); + } + if (isContentReady) { + stopCheckingReadyStatus(); + } + } + + if (status.equals("complete") || status.equals("interactive")) { + removeSplashWithAnimation(); + } + } + + @Override + public void toggleFullscreen(boolean fullscreen) { + ActionBar actionBar = this.getSupportActionBar(); + View decorView = getWindow().getDecorView(); + int visibility = decorView.getSystemUiVisibility(); + int fullscreenFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; + + if (Build.VERSION.SDK_INT >= 16) { + fullscreenFlags |= View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; + } + + if (Build.VERSION.SDK_INT >= 19) { + fullscreenFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + } + + if (fullscreen) { + visibility |= fullscreenFlags; + if (actionBar != null) actionBar.hide(); + } else { + visibility &= ~fullscreenFlags; + if (actionBar != null && AppConfig.getInstance(this).showActionBar) actionBar.show(); + + // Fix for webview keyboard not showing, see https://github.com/mozilla-tw/FirefoxLite/issues/842 + this.mWebview.clearFocus(); + } + + decorView.setSystemUiVisibility(visibility); + + // Full-screen is used for playing videos. + // Allow sensor-based rotation when in full screen (even overriding user rotation preference) + // If orientation is forced landscape don't set sensor based orientation + if (fullscreen && AppConfig.getInstance(this).forceScreenOrientation != AppConfig.ScreenOrientations.LANDSCAPE) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); + } else { + setScreenOrientationPreference(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + ((GoNativeApplication) getApplication()).mBridge.onRequestPermissionsResult(this, requestCode, permissions, grantResults); + switch (requestCode) { + case REQUEST_PERMISSION_GEOLOCATION: + if (this.geolocationPermissionCallback != null) { + if (grantResults.length >= 2 && + grantResults[0] == PackageManager.PERMISSION_GRANTED && + grantResults[1] == PackageManager.PERMISSION_GRANTED) { + this.geolocationPermissionCallback.onResult(true); + } else { + this.geolocationPermissionCallback.onResult(false); + } + this.geolocationPermissionCallback = null; + } + break; + case REQUEST_PERMISSION_GENERIC: + Iterator it = pendingPermissionRequests.iterator(); + while (it.hasNext()) { + PermissionsCallbackPair pair = it.next(); + if (pair.permissions.length != permissions.length) continue; + boolean skip = false; + for (int i = 0; i < pair.permissions.length && i < permissions.length; i++) { + if (!pair.permissions[i].equals(permissions[i])) { + skip = true; + break; + } + } + if (skip) continue; + + // matches PermissionsCallbackPair + if (pair.callback != null) { + pair.callback.onPermissionResult(permissions, grantResults); + } + it.remove(); + } + + if (pendingPermissionRequests.size() == 0 && pendingStartActivityAfterPermissions.size() > 0) { + Iterator i = pendingStartActivityAfterPermissions.iterator(); + while (i.hasNext()) { + Intent intent = i.next(); + startActivity(intent); + i.remove(); + } + } + break; + } + } + + public GoNativeWindowManager getGNWindowManager() { + return ((GoNativeApplication) getApplication()).getWindowManager(); + } + + @Override + public int getWindowCount() { + return getGNWindowManager().getWindowCount(); + } + + public void setUploadMessage(ValueCallback mUploadMessage) { + this.mUploadMessage = mUploadMessage; + } + + public void setUploadMessageLP(ValueCallback uploadMessageLP) { + this.uploadMessageLP = uploadMessageLP; + } + + public void setDirectUploadImageUri(Uri directUploadImageUri) { + this.directUploadImageUri = directUploadImageUri; + } + + public RelativeLayout getFullScreenLayout() { + return fullScreenLayout; + } + + @Override + public GoNativeWebviewInterface getWebView() { + return mWebview; + } + + public class StatusCheckerBridge { + @JavascriptInterface + public void onReadyState(final String state) { + runOnUiThread(() -> checkReadyStatusResult(state)); + } + } + + private class ConnectivityChangeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + retryFailedPage(); + if (connectivityCallback != null) { + sendConnectivity(connectivityCallback); + } + } + } + + public void getRuntimeGeolocationPermission(final GeolocationPermissionCallback callback) { + if (isLocationPermissionGranted()) { + callback.onResult(true); + } + + if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION) || + ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) { + Toast.makeText(this, R.string.request_permission_explanation_geolocation, Toast.LENGTH_SHORT).show(); + } + + this.geolocationPermissionCallback = callback; + ActivityCompat.requestPermissions(this, new String[]{ + Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION + }, REQUEST_PERMISSION_GEOLOCATION); + } + + public void getPermission(String[] permissions, PermissionCallback callback) { + boolean needToRequest = false; + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { + needToRequest = true; + break; + } + } + + if (needToRequest) { + if (callback != null) { + pendingPermissionRequests.add(new PermissionsCallbackPair(permissions, callback)); + } + + ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION_GENERIC); + } else { + // send all granted result + if (callback != null) { + int[] results = new int[permissions.length]; + for (int i = 0; i < results.length; i++) { + results[i] = PackageManager.PERMISSION_GRANTED; + } + callback.onPermissionResult(permissions, results); + } + } + } + + public void startActivityAfterPermissions(Intent intent) { + if (pendingPermissionRequests.size() == 0) { + startActivity(intent); + } else { + pendingStartActivityAfterPermissions.add(intent); + } + } + + private void setScreenOrientationPreference() { + AppConfig appConfig = AppConfig.getInstance(this); + if (appConfig.forceScreenOrientation != null) { + setDeviceOrientation(appConfig.forceScreenOrientation); + return; + } + + if (getResources().getBoolean(R.bool.isTablet)) { + if (appConfig.tabletScreenOrientation != null) { + setDeviceOrientation(appConfig.tabletScreenOrientation); + return; + } + } else { + if (appConfig.phoneScreenOrientation != null) { + setDeviceOrientation(appConfig.phoneScreenOrientation); + return; + } + } + + if (!appConfig.androidFullScreen) { + setDeviceOrientation(AppConfig.ScreenOrientations.UNSPECIFIED); + } + } + + @SuppressLint("SourceLockedOrientationActivity") + private void setDeviceOrientation(AppConfig.ScreenOrientations orientation) { + switch (orientation) { + case UNSPECIFIED: + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); + break; + case PORTRAIT: + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + break; + case LANDSCAPE: + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + break; + } + } + + public TabManager getTabManager() { + return tabManager; + } + + public interface PermissionCallback { + void onPermissionResult(String[] permissions, int[] grantResults); + } + + private class PermissionsCallbackPair { + String[] permissions; + PermissionCallback callback; + + PermissionsCallbackPair(String[] permissions, PermissionCallback callback) { + this.permissions = permissions; + this.callback = callback; + } + } + + public void enableSwipeRefresh() { + if (this.swipeRefreshLayout != null) { + this.swipeRefreshLayout.setEnabled(true); + } + } + + public void restoreSwipRefreshDefault() { + if (this.swipeRefreshLayout != null) { + AppConfig appConfig = AppConfig.getInstance(this); + this.swipeRefreshLayout.setEnabled(appConfig.pullToRefresh); + } + } + + @Override + public void deselectTabs() { + this.tabManager.deselectTabs(); + } + + private void listenForSignalStrength() { + if (this.phoneStateListener != null) return; + + this.phoneStateListener = new PhoneStateListener() { + @Override + public void onSignalStrengthsChanged(SignalStrength signalStrength) { + latestSignalStrength = signalStrength; + sendConnectivityOnce(); + if (connectivityCallback != null) { + sendConnectivity(connectivityCallback); + } + } + }; + + try { + TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); + if (telephonyManager == null) { + GNLog.getInstance().logError(TAG, "Error getting system telephony manager"); + } else { + telephonyManager.listen(this.phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); + } + } catch (Exception e) { + GNLog.getInstance().logError(TAG, "Error listening for signal strength", e); + } + + } + + @Override + public void sendConnectivityOnce(String callback) { + if (callback == null) return; + + this.connectivityOnceCallback = callback; + if (this.phoneStateListener != null) { + sendConnectivity(callback); + } else { + listenForSignalStrength(); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + sendConnectivityOnce(); + } + }, 500); + } + } + + private void sendConnectivityOnce() { + if (this.connectivityOnceCallback == null) return; + sendConnectivity(this.connectivityOnceCallback); + this.connectivityOnceCallback = null; + } + + private void sendConnectivity(String callback) { + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + boolean connected = activeNetwork != null && activeNetwork.isConnected(); + String typeString; + if (activeNetwork != null) { + typeString = activeNetwork.getTypeName(); + } else { + typeString = "DISCONNECTED"; + } + + try { + JSONObject data = new JSONObject(); + data.put("connected", connected); + data.put("type", typeString); + + if (this.latestSignalStrength != null) { + JSONObject signalStrength = new JSONObject(); + + signalStrength.put("cdmaDbm", latestSignalStrength.getCdmaDbm()); + signalStrength.put("cdmaEcio", latestSignalStrength.getCdmaEcio()); + signalStrength.put("evdoDbm", latestSignalStrength.getEvdoDbm()); + signalStrength.put("evdoEcio", latestSignalStrength.getEvdoEcio()); + signalStrength.put("evdoSnr", latestSignalStrength.getEvdoSnr()); + signalStrength.put("gsmBitErrorRate", latestSignalStrength.getGsmBitErrorRate()); + signalStrength.put("gsmSignalStrength", latestSignalStrength.getGsmSignalStrength()); + if (Build.VERSION.SDK_INT >= 23) { + signalStrength.put("level", latestSignalStrength.getLevel()); + } + data.put("cellSignalStrength", signalStrength); + } + + String js = LeanUtils.createJsForCallback(callback, data); + runJavascript(js); + } catch (JSONException e) { + GNLog.getInstance().logError(TAG, "JSON error sending connectivity", e); + } + } + + @Override + public void subscribeConnectivity(final String callback) { + this.connectivityCallback = callback; + listenForSignalStrength(); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + sendConnectivity(callback); + } + }, 500); + } + + @Override + public void unsubscribeConnectivity() { + this.connectivityCallback = null; + } + + public interface GeolocationPermissionCallback { + void onResult(boolean granted); + } + + // set brightness to a negative number to restore default + @Override + public void setBrightness(float brightness) { + WindowManager.LayoutParams layout = getWindow().getAttributes(); + layout.screenBrightness = brightness; + getWindow().setAttributes(layout); + } + + @Override + public void setSidebarNavigationEnabled(boolean enabled) { + sidebarNavigationEnabled = enabled; + setDrawerEnabled(enabled); + } + + public GoNativeDrawerLayout getDrawerLayout() { + return this.mDrawerLayout; + } + + public ActionBarDrawerToggle getDrawerToggle() { + return this.mDrawerToggle; + } + + /** + * @param appTheme set to null if will use sharedPreferences + */ + + @Override + public void setupAppTheme(String appTheme) { + ConfigPreferences preferences = new ConfigPreferences(this); + preferences.setAppTheme(appTheme); + + // Updating app theme on runtime triggers a configuration change and recreates the app + // To prevent consecutive calls, ignore theme setup on onCreate() by enabling this flag + flagThemeConfigurationChange = true; + + if ("light".equals(appTheme)) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } else if ("dark".equals(appTheme)) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } else { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + } + } + + @SuppressLint("RequiresFeature") + private void setupWebviewTheme(String appTheme) { + if (!WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { + Log.d(TAG, "Dark mode feature is not supported"); + return; + } + + if (mWebview.getSettings() == null) { + return; + } + + if ("dark".equals(appTheme)) { + WebSettingsCompat.setForceDark(this.mWebview.getSettings(), WebSettingsCompat.FORCE_DARK_ON); + } else if ("light".equals(appTheme)) { + WebSettingsCompat.setForceDark(this.mWebview.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); + } else { + switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) { + case Configuration.UI_MODE_NIGHT_YES: + WebSettingsCompat.setForceDark(this.mWebview.getSettings(), WebSettingsCompat.FORCE_DARK_ON); + break; + case Configuration.UI_MODE_NIGHT_NO: + case Configuration.UI_MODE_NIGHT_UNDEFINED: + WebSettingsCompat.setForceDark(this.mWebview.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); + break; + } + + // Force dark on if supported, and only use theme from web + if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) { + WebSettingsCompat.setForceDarkStrategy( + this.mWebview.getSettings(), + WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY + ); + } + } + } + + private void validateGoogleService() { + try { + if (BuildConfig.GOOGLE_SERVICE_INVALID) { + Toast.makeText(this, R.string.google_service_required, Toast.LENGTH_LONG).show(); + GNLog.getInstance().logError(TAG, "validateGoogleService: " + R.string.google_service_required, null, GNLog.TYPE_TOAST_ERROR); + } + } catch (NullPointerException ex) { + GNLog.getInstance().logError(TAG, "validateGoogleService: " + ex.getMessage(), null, GNLog.TYPE_TOAST_ERROR); + } + } + + @SuppressLint("DiscouragedApi") + private boolean isAndroidGestureEnabled() { + if (Build.VERSION.SDK_INT < 29) return false; + try { + int resourceId = getResources().getIdentifier("config_navBarInteractionMode", "integer", "android"); + if (resourceId > 0) { + // 0 : Navigation is displaying with 3 buttons + // 1 : Navigation is displaying with 2 button(Android P navigation mode) + // 2 : Full screen gesture(Gesture on android Q) + return getResources().getInteger(resourceId) == 2; + } + return false; + } catch (Resources.NotFoundException ex) { + GNLog.getInstance().logError(TAG, "isAndroidGestureEnabled: ", ex); + return false; + } + } + + @Override + public void updateStatusBarOverlay(boolean isOverlayEnabled) { + WindowCompat.setDecorFitsSystemWindows(getWindow(), !isOverlayEnabled); + } + + @Override + public void updateStatusBarStyle(String statusBarStyle) { + if (!TextUtils.isEmpty(statusBarStyle) && Build.VERSION.SDK_INT >= 23) { + WindowInsetsControllerCompat controllerCompat = WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView()); + switch (statusBarStyle) { + case "light": { + controllerCompat.setAppearanceLightStatusBars(true); + break; + } + case "dark": { + controllerCompat.setAppearanceLightStatusBars(false); + break; + } + case "auto": + int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { + controllerCompat.setAppearanceLightStatusBars(false); + } else if (nightModeFlags == Configuration.UI_MODE_NIGHT_NO) { + controllerCompat.setAppearanceLightStatusBars(true); + } else { + GNLog.getInstance().logError(TAG, "updateStatusBarStyle: Current mode is undefined"); + } + break; + } + } + } + + @Override + public void setStatusBarColor(int color) { + getWindow().setStatusBarColor(color); + } + + @Override + public void runGonativeDeviceInfo(String callback, boolean includeCarrierNames) { + if (includeCarrierNames) { + deviceInfoCallback = callback; + requestPermissionLauncher.launch(Manifest.permission.READ_PHONE_STATE); + } else { + Map installationInfo = Installation.getInfo(this); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + if (!sharedPreferences.getBoolean("hasLaunched", false)) { + sharedPreferences.edit().putBoolean("hasLaunched", true).commit(); + installationInfo.put("isFirstLaunch", true); + } else { + installationInfo.put("isFirstLaunch", false); + } + + // insert additional device info from other plugins + GoNativeApplication application = (GoNativeApplication)getApplication(); + installationInfo.putAll(application.mBridge.getExtraDeviceInfo(this)); + + JSONObject jsonObject = new JSONObject(installationInfo); + String js = LeanUtils.createJsForCallback(callback, jsonObject); + this.runJavascript(js); + } + } + + @Override + public Map getDeviceInfo() { + return Installation.getInfo(this); + } + + @Override + public void windowFlag(boolean add, int flag) { + if (add) { + getWindow().addFlags(flag); + } else { + getWindow().clearFlags(flag); + } + } + + @Override + public void setCustomTitle(String title) { + if (!title.isEmpty()) { + setTitle(title); + } else { + setTitle(R.string.app_name); + } + } + + @Override + public void downloadFile(String url, String filename, boolean shouldSaveToGallery, boolean open) { + fileDownloader.downloadFile(url, filename, shouldSaveToGallery, open); + } + + @Override + public void selectTab(int tabNumber) { + if (tabManager == null) return; + tabManager.selectTabNumber(tabNumber, false); + } + + @Override + public void setTabsWithJson(JSONObject tabsJson, int tabMenuId) { + if (tabManager == null) return; + tabManager.setTabsWithJson(tabsJson, tabMenuId); + } + + @Override + public void focusAudio(boolean enabled) { + if (enabled) { + AudioUtils.requestAudioFocus(this); + } else { + AudioUtils.abandonFocusRequest(this); + } + } + + @Override + public void clipboardSet(String content) { + if (content.isEmpty()) return; + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("copy", content); + clipboard.setPrimaryClip(clip); + } + + @Override + public void clipboardGet(String callback) { + if (!TextUtils.isEmpty(callback)) { + Map params = new HashMap<>(); + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + CharSequence pasteData; + if (clipboard.hasPrimaryClip()) { + ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0); + pasteData = item.getText(); + if (pasteData != null) + params.put("data", pasteData.toString()); + else + params.put("error", "Clipboard item is not a string."); + } else { + params.put("error", "No Clipboard item available."); + } + JSONObject jsonObject = new JSONObject(params); + runJavascript(LeanUtils.createJsForCallback(callback, jsonObject)); + } + } + + @Override + public void sendRegistration(JSONObject data) { + if(registrationManager == null) return; + + if(data != null){ + JSONObject customData = data.optJSONObject("customData"); + if(customData == null){ + try { // try converting json string from url to json object + customData = new JSONObject(data.optString("customData")); + } catch (JSONException e){ + GNLog.getInstance().logError(TAG, "GoNative Registration JSONException:- " + e.getMessage(), e); + } + } + if(customData != null){ + registrationManager.setCustomData(customData); + } + } + registrationManager.sendToAllEndpoints(); + } + + @Override + public void runCustomNativeBridge(Map params) { + // execute code defined by the CustomCodeHandler + // call JsCustomCodeExecutor#setHandler to override this default handler + JSONObject data = JsCustomCodeExecutor.execute(params); + String callback = params.get("callback"); + if(callback != null && !callback.isEmpty()) { + final String js = LeanUtils.createJsForCallback(callback, data); + // run on main thread + Handler mainHandler = new Handler(getMainLooper()); + mainHandler.post(() -> runJavascript(js)); + } + } + + @Override + public void promptLocationService() { + getRuntimeGeolocationPermission(granted -> Log.d(TAG, "promptLocationService: " + granted)); + } + + @Override + public boolean isLocationServiceEnabled() { + + if (!isLocationPermissionGranted()) { + return false; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + LocationManager lm = getSystemService(LocationManager.class); + return lm.isLocationEnabled(); + } else { + // This is Deprecated in API 28 + int mode = Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); + return (mode != Settings.Secure.LOCATION_MODE_OFF); + } + } + + private boolean isLocationPermissionGranted() { + int checkFine = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION); + int checkCoarse = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION); + return checkFine == PackageManager.PERMISSION_GRANTED && checkCoarse == PackageManager.PERMISSION_GRANTED; + } + + @Override + public void setRestoreBrightnessOnNavigation(boolean restore) { + this.restoreBrightnessOnNavigation = restore; + } + + public boolean isRestoreBrightnessOnNavigation() { + return this.restoreBrightnessOnNavigation; + } + + + + public Object getJavascriptBridge() { + GoNativeApplication application = (GoNativeApplication)getApplication(); + return application.mBridge.getJavaScriptBridge(); + } + + @Override + public void closeCurrentWindow() { + if (!getGNWindowManager().isRoot(activityId)) { + this.finish(); + } + } + + @Override + public void openNewWindow(String url, String mode) { + if (TextUtils.isEmpty(url)) return; + + Uri uri = Uri.parse(url); + + // Same window + if ("internal".equals(mode)) { + loadUrl(url); + return; + } + + // External default browser + if ("external".equals(mode)) { + openExternalBrowser(uri); + return; + } + + // Chrome in-app custom tab + if ("appbrowser".equals(mode)) { + openAppBrowser(uri); + return; + } + + // Default + AppConfig appConfig = AppConfig.getInstance(this); + + // Check maxWindows conditions + if (appConfig.maxWindowsEnabled && appConfig.numWindows > 0 && getGNWindowManager().getWindowCount() >= appConfig.numWindows && onMaxWindowsReached(url)) + return; + + Intent intent = new Intent(this, MainActivity.class); + intent.putExtra("isRoot", false); + intent.putExtra("url", url); + intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true); + startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY); + } + + public void openExternalBrowser(Uri uri) { + if (uri == null) return; + try { + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + if (!TextUtils.isEmpty(getDefaultBrowserPackageName())) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setPackage(getDefaultBrowserPackageName()); + } + startActivity(intent); + } catch (Exception ex) { + if (ex instanceof ActivityNotFoundException) { + Toast.makeText(this, R.string.app_not_installed, Toast.LENGTH_LONG).show(); + GNLog.getInstance().logError(TAG, getString(R.string.app_not_installed), ex, GNLog.TYPE_TOAST_ERROR); + } else { + GNLog.getInstance().logError(TAG, "openExternalBrowser: launchError - uri: " + uri, ex); + } + } + } + + public void openAppBrowser(Uri uri) { + if (uri == null) return; + try { + CustomTabColorSchemeParams params = new CustomTabColorSchemeParams.Builder() + .setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary)) + .setSecondaryToolbarColor(ContextCompat.getColor(this, R.color.titleTextColor)) + .build(); + + CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder() + .setDefaultColorSchemeParams(params) + .build(); + customTabsIntent.intent.setData(uri); + appBrowserActivityLauncher.launch(customTabsIntent.intent); + } catch (Exception ex) { + if (ex instanceof ActivityNotFoundException) { + Toast.makeText(this, R.string.app_not_installed, Toast.LENGTH_LONG).show(); + GNLog.getInstance().logError(TAG, getString(R.string.app_not_installed), ex, GNLog.TYPE_TOAST_ERROR); + } else { + GNLog.getInstance().logError(TAG, "openAppBrowser: launchError - uri: " + uri, ex); + } + } + } + + @Override + public boolean onMaxWindowsReached(String url) { + AppConfig appConfig = AppConfig.getInstance(this); + GoNativeWindowManager windowManager = getGNWindowManager(); + + if (appConfig.autoClose && LeanUtils.urlsMatchIgnoreTrailing(url, appConfig.getInitialUrl())) { + + // Set this activity as new root + isRoot = true; + + windowManager.setAsNewRoot(activityId); + + // Reset URL levels + windowManager.setUrlLevels(activityId, -1, -1); + + // Reload activity as root + initialRootSetup(); + if (appConfig.showActionBar || appConfig.showNavigationMenu) { + setupProfilePicker(); + } + + showNavigationMenu(appConfig.showNavigationMenu); + + if (actionManager != null) { + actionManager.setupActionBar(isRoot); + actionManager.setupTitleDisplayForUrl(url); + } + + if (mDrawerToggle != null && appConfig.showNavigationMenu) { + mDrawerToggle.syncState(); + } + + windowManager.setIgnoreInterceptMaxWindows(activityId, true); + + // Send broadcast to close other activity + Intent intent = new Intent(MainActivity.BROADCAST_RECEIVER_ACTION_WEBVIEW_LIMIT_REACHED); + intent.putExtra(MainActivity.EXTRA_NEW_ROOT_URL, url); + LocalBroadcastManager.getInstance(this).sendBroadcast(intent); + + // Add listener when all excess windows are closed + windowManager.setOnExcessWindowClosedListener(() -> { + // Load new URL + mWebview.loadUrl(url); + // Remove listener + windowManager.setOnExcessWindowClosedListener(null); + }); + + return true; + } else { + + // Get excess window + String excessWindowId = windowManager.getExcessWindow(); + + // Send broadcast to close the excess window + Intent intent = new Intent(MainActivity.BROADCAST_RECEIVER_ACTION_WEBVIEW_LIMIT_REACHED); + intent.putExtra(MainActivity.EXTRA_EXCESS_WINDOW_ID, excessWindowId); + LocalBroadcastManager.getInstance(this).sendBroadcast(intent); + + // Remove from window list + windowManager.removeWindow(excessWindowId); + } + + return false; + } + + @Override + public void getKeyboardInfo(String callback) { + if (keyboardManager == null || TextUtils.isEmpty(callback)) return; + runJavascript(LeanUtils.createJsForCallback(callback, keyboardManager.getKeyboardData())); + } + + @Override + public void addKeyboardListener(String callback) { + if (keyboardManager == null) return; + keyboardManager.setCallback(callback); + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + finish(); + } + + public String getLaunchSource() { + return launchSource; + } + + private String getDefaultBrowserPackageName() { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com")); + ResolveInfo resolveInfo = getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY); + + if (resolveInfo != null && resolveInfo.activityInfo != null) { + return resolveInfo.activityInfo.packageName; + } + + return null; + } +} diff --git a/app/src/main/java/co/median/android/MySwipeRefreshLayout.java b/app/src/main/java/co/median/android/MySwipeRefreshLayout.java new file mode 100644 index 0000000..75b4479 --- /dev/null +++ b/app/src/main/java/co/median/android/MySwipeRefreshLayout.java @@ -0,0 +1,39 @@ +package co.median.android; + +import android.content.Context; +import android.util.AttributeSet; + +import co.median.android.widget.GoNativeSwipeRefreshLayout; + +/** + * Created by weiyin on 9/13/15. + * Copyright 2014 GoNative.io LLC + */ +public class MySwipeRefreshLayout extends GoNativeSwipeRefreshLayout { + private CanChildScrollUpCallback canChildScrollUpCallback; + + public interface CanChildScrollUpCallback { + boolean canSwipeRefreshChildScrollUp(); + } + + public MySwipeRefreshLayout(Context context) { + super(context); + } + + public MySwipeRefreshLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) { + this.canChildScrollUpCallback = canChildScrollUpCallback; + } + + @Override + public boolean canChildScrollUp() { + if (canChildScrollUpCallback != null) { + return canChildScrollUpCallback.canSwipeRefreshChildScrollUp(); + } else { + return super.canChildScrollUp(); + } + } +} diff --git a/app/src/main/java/co/median/android/ProfilePicker.java b/app/src/main/java/co/median/android/ProfilePicker.java new file mode 100644 index 0000000..b525153 --- /dev/null +++ b/app/src/main/java/co/median/android/ProfilePicker.java @@ -0,0 +1,129 @@ +package co.median.android; + +import androidx.annotation.NonNull; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.JavascriptInterface; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.TextView; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + +import co.median.median_core.GNLog; + +/** + * Created by weiyin on 5/9/14. + */ +public class ProfilePicker implements AdapterView.OnItemSelectedListener { + private static final String TAG = ProfilePicker.class.getName(); + + private MainActivity mainActivity; + private JSONArray json; + private ArrayList names; + private ArrayList links; + private int selectedIndex; + + private ArrayAdapter adapter; + private Spinner spinner; + private ProfileJsBridge profileJsBridge; + + public ProfilePicker(MainActivity mainActivity, Spinner spinner) { + this.mainActivity = mainActivity; + this.spinner = spinner; + this.names = new ArrayList<>(); + this.links = new ArrayList<>(); + this.spinner.setAdapter(getAdapter()); + this.spinner.setOnItemSelectedListener(this); + this.profileJsBridge = new ProfileJsBridge(); + } + + private void parseJson(String s){ + try { + json = new JSONArray(s); + this.names.clear(); + this.links.clear(); + + for (int i = 0; i < json.length(); i++) { + JSONObject item = json.getJSONObject(i); + + this.names.add(item.optString("name", "")); + this.links.add(item.optString("link", "")); + + if (item.optBoolean("selected", false)){ + selectedIndex = i; + } + } + + mainActivity.runOnUiThread(new Runnable() { + public void run() { + if (selectedIndex < ProfilePicker.this.names.size()) { + ProfilePicker.this.spinner.setSelection(selectedIndex); + } + if (ProfilePicker.this.json != null && + ProfilePicker.this.json.length() > 0) + ProfilePicker.this.spinner.setVisibility(View.VISIBLE); + else + ProfilePicker.this.spinner.setVisibility(View.GONE); + getAdapter().notifyDataSetChanged(); + } + }); + + } catch (JSONException e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + } + + private ArrayAdapter getAdapter(){ + if (adapter == null) { + + adapter = new ArrayAdapter(mainActivity, R.layout.profile_picker_dropdown, names) { + @NonNull + @Override + public View getView(int position, View convertView, @NonNull ViewGroup parent) { + TextView view = (TextView) super.getView(position, convertView, parent); + view.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); + return view; + } + + @Override + public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { + TextView view = (TextView) super.getDropDownView(position, convertView, parent); + view.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); + return view; + } + }; + } + + return adapter; + } + + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // only load if selection has changed + if (position != selectedIndex) { + mainActivity.loadUrl(links.get(position)); + mainActivity.closeDrawers(); + selectedIndex = position; + } + } + + public void onNothingSelected(AdapterView parent) { + // do nothing + } + + public ProfileJsBridge getProfileJsBridge() { + return profileJsBridge; + } + + public class ProfileJsBridge { + @JavascriptInterface + public void parseJson(String s) { + ProfilePicker.this.parseJson(s); + } + } +} diff --git a/app/src/main/java/co/median/android/RegistrationManager.java b/app/src/main/java/co/median/android/RegistrationManager.java new file mode 100644 index 0000000..9a69aac --- /dev/null +++ b/app/src/main/java/co/median/android/RegistrationManager.java @@ -0,0 +1,163 @@ +package co.median.android; + +import android.content.Context; +import android.os.AsyncTask; +import android.util.Log; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import co.median.median_core.GNLog; +import co.median.median_core.LeanUtils; + +/** + * Created by weiyin on 10/4/15. + */ +public class RegistrationManager { + private final static String TAG = RegistrationManager.class.getName(); + + private Context context; + private JSONObject customData; + private String lastUrl; + + private List registrationEndpoints; + + RegistrationManager(Context context) { + this.context = context; + this.registrationEndpoints = new LinkedList<>(); + } + + public void processConfig(JSONArray endpoints) { + registrationEndpoints.clear(); + + if (endpoints == null) return; + + for (int i = 0; i < endpoints.length(); i++) { + JSONObject endpoint = endpoints.optJSONObject(i); + if (endpoint == null) continue; + + String url = LeanUtils.optString(endpoint, "url"); + if (url == null) { + Log.w(TAG, "Invalid registration: endpoint url is null"); + continue; + } + + List urlRegexes = LeanUtils.createRegexArrayFromStrings(endpoint.opt("urlRegex")); + + RegistrationEndpoint registrationEndpoint = new RegistrationEndpoint(url, urlRegexes); + registrationEndpoints.add(registrationEndpoint); + } + } + + public void checkUrl(String url) { + this.lastUrl = url; + for (RegistrationEndpoint endpoint : registrationEndpoints) { + if (LeanUtils.stringMatchesAnyRegex(url, endpoint.urlRegexes)) { + endpoint.sendRegistrationInfo(); + } + } + } + + public void setCustomData(JSONObject customData) { + this.customData = customData; + registrationDataChanged(); + } + + public void sendToAllEndpoints() { + for (RegistrationEndpoint endpoint : registrationEndpoints) { + endpoint.sendRegistrationInfo(); + } + } + + private void registrationDataChanged() { + for (RegistrationEndpoint endpoint : registrationEndpoints) { + if (this.lastUrl != null && + LeanUtils.stringMatchesAnyRegex(this.lastUrl, endpoint.urlRegexes)) { + endpoint.sendRegistrationInfo(); + } + } + } + + public void subscriptionInfoChanged(){ + registrationDataChanged(); + } + + private class RegistrationEndpoint { + private String postUrl; + private List urlRegexes; + + RegistrationEndpoint(String postUrl, List urlRegexes) { + this.postUrl = postUrl; + this.urlRegexes = urlRegexes; + } + + void sendRegistrationInfo() { + new SendRegistrationTask(context, this, RegistrationManager.this).execute(); + } + } + + private static class SendRegistrationTask extends AsyncTask { + private RegistrationEndpoint registrationEndpoint; + private RegistrationManager registrationManager; + private Context context; + + SendRegistrationTask(Context context, RegistrationEndpoint registrationEndpoint, RegistrationManager registrationManager) { + this.registrationEndpoint = registrationEndpoint; + this.registrationManager = registrationManager; + this.context = context; + } + + @Override + protected Void doInBackground(Void... voids) { + Map toSend = new HashMap<>(); + + toSend.putAll(Installation.getInfo(registrationManager.context)); + + // Append provider info to Map toSend + if (((GoNativeApplication) context).getAnalyticsProviderInfo() != null) { + toSend.putAll(((GoNativeApplication) context).getAnalyticsProviderInfo()); + } + + if (registrationManager.customData != null) { + Iterator keys = registrationManager.customData.keys(); + while(keys.hasNext()) { + String key = keys.next(); + toSend.put("customData_" + key, registrationManager.customData.opt(key)); + } + } + + try { + JSONObject json = new JSONObject(toSend); + + URL url = new URL(registrationEndpoint.postUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); + writer.write(json.toString()); + writer.close(); + connection.connect(); + int result = connection.getResponseCode(); + + if (result < 200 || result > 299) { + Log.w(TAG, "Recevied status code " + result + " when posting to " + registrationEndpoint.postUrl); + } + } catch (Exception e) { + GNLog.getInstance().logError(TAG, "Error posting to " + registrationEndpoint.postUrl, e); + } + + return null; + } + } +} diff --git a/app/src/main/java/co/median/android/SegmentedController.java b/app/src/main/java/co/median/android/SegmentedController.java new file mode 100644 index 0000000..b8d62c4 --- /dev/null +++ b/app/src/main/java/co/median/android/SegmentedController.java @@ -0,0 +1,128 @@ +package co.median.android; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Spinner; + +import org.json.JSONObject; + +import java.util.ArrayList; + +import co.median.median_core.AppConfig; + +/** + * Created by weiyin on 12/20/15. + * Copyright 2014 GoNative.io LLC + */ +public class SegmentedController implements AdapterView.OnItemSelectedListener { + private MainActivity mainActivity; + private ArrayList labels; + private ArrayList urls; + private int selectedIndex; + + private ArrayAdapter adapter; + private Spinner spinner; + + SegmentedController(MainActivity mainActivity, Spinner spinner) { + this.mainActivity = mainActivity; + this.spinner = spinner; + + this.labels = new ArrayList<>(); + this.urls = new ArrayList<>(); + + this.spinner.setAdapter(getAdapter()); + this.spinner.setOnItemSelectedListener(this); + + BroadcastReceiver messageReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null || intent.getAction() == null) return; + + if (intent.getAction().equals(AppConfig.PROCESSED_SEGMENTED_CONTROL)) { + updateSegmentedControl(); + } + } + }; + LocalBroadcastManager.getInstance(this.mainActivity).registerReceiver( + messageReceiver, new IntentFilter(AppConfig.PROCESSED_SEGMENTED_CONTROL)); + + updateSegmentedControl(); + } + + private void updateSegmentedControl() { + this.labels.clear(); + this.urls.clear(); + this.selectedIndex = -1; + + AppConfig appConfig = AppConfig.getInstance(mainActivity); + if (appConfig.segmentedControl == null) return; + + for (int i = 0; i < appConfig.segmentedControl.size(); i++) { + JSONObject item = appConfig.segmentedControl.get(i); + + String label = item.optString("label", "Invalid"); + String url = item.optString("url", ""); + Boolean selected = item.optBoolean("selected"); + + this.labels.add(i, label); + this.urls.add(i, url); + if (selected) this.selectedIndex = i; + } + + mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + if (selectedIndex > -1) { + spinner.setSelection(selectedIndex); + } + + if (labels.size() > 0) { + spinner.setVisibility(View.VISIBLE); + } else { + spinner.setVisibility(View.GONE); + } + + adapter.notifyDataSetChanged(); + } + }); + + } + + private ArrayAdapter getAdapter() { + if (this.adapter != null) { + return this.adapter; + } + + ArrayAdapter adapter = new ArrayAdapter<>(mainActivity, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + this.adapter = adapter; + return adapter; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // only load if selection has changed + if (position != selectedIndex) { + String url = urls.get(position); + + if (url != null && url.length() > 0) { + mainActivity.loadUrl(url); + } + + mainActivity.closeDrawers(); + selectedIndex = position; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + // do nothing + } +} diff --git a/app/src/main/java/co/median/android/ShakeDialogFragment.java b/app/src/main/java/co/median/android/ShakeDialogFragment.java new file mode 100644 index 0000000..fba4697 --- /dev/null +++ b/app/src/main/java/co/median/android/ShakeDialogFragment.java @@ -0,0 +1,46 @@ +package co.median.android; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; + +import co.median.android.R; + +public class ShakeDialogFragment extends DialogFragment { + public interface ShakeDialogListener { + public void onClearCache(DialogFragment dialog); + } + + ShakeDialogListener listener; + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle(R.string.shake_to_clear_cache) + .setItems(R.array.device_shaken_options, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (i == 0) { + listener.onClearCache(ShakeDialogFragment.this); + } + } + }); + return builder.create(); + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + try { + listener = (ShakeDialogListener) context; + } catch (ClassCastException e) { + throw new ClassCastException(context.toString() + " must implement ShakeDialogListener"); + } + } +} diff --git a/app/src/main/java/co/median/android/TabManager.java b/app/src/main/java/co/median/android/TabManager.java new file mode 100644 index 0000000..aa07a70 --- /dev/null +++ b/app/src/main/java/co/median/android/TabManager.java @@ -0,0 +1,350 @@ +package co.median.android; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.ColorStateList; +import android.text.TextUtils; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.google.android.material.navigation.NavigationBarView; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; +import co.median.median_core.LeanUtils; +import io.gonative.android.icons.Icon; + +/** + * Created by Weiyin He on 9/22/14. + * Copyright 2014 GoNative.io LLC + */ +public class TabManager implements NavigationBarView.OnItemSelectedListener { + private static final String TAG = TabManager.class.getName(); + private static final int maxTabs = 5; + + private final MainActivity mainActivity; + private final BottomNavigationView bottomNav; + private final AppConfig appConfig; + + private String currentMenuId; + private String currentUrl; + private JSONArray tabs; + private Map tabMenus; + + private final int iconSize; + private final int iconColor; + + private final Map> tabRegexCache = new HashMap<>(); // regex for each tab to auto-select + private boolean useJavascript; // do not use tabs from config + + private boolean performAction = true; + + TabManager(MainActivity mainActivity, BottomNavigationView bottomNav) { + this.mainActivity = mainActivity; + this.bottomNav = bottomNav; + this.bottomNav.setOnItemSelectedListener(this); + this.appConfig = AppConfig.getInstance(this.mainActivity); + + iconSize = this.mainActivity.getResources().getInteger(R.integer.tabbar_icon_size); + iconColor = mainActivity.getResources().getColor(R.color.tabBarTextColor); + + bottomNav.setBackgroundColor(mainActivity.getResources().getColor(R.color.tabBarBackground)); + + ColorStateList iconColorStates = new ColorStateList( + new int[][]{ + new int[]{-android.R.attr.state_checked}, + new int[]{android.R.attr.state_checked} + }, + new int[]{ + mainActivity.getResources().getColor(R.color.tabBarTextColor), + mainActivity.getResources().getColor(R.color.tabBarIndicator) + }); + + bottomNav.setItemIconTintList(iconColorStates); + bottomNav.setItemTextColor(iconColorStates); + + BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction() != null && intent.getAction().equals(AppConfig.PROCESSED_TAB_NAVIGATION_MESSAGE)) { + currentMenuId = null; + initializeTabMenus(); + checkTabs(currentUrl); + } + } + }; + LocalBroadcastManager.getInstance(this.mainActivity) + .registerReceiver(broadcastReceiver, + new IntentFilter(AppConfig.PROCESSED_TAB_NAVIGATION_MESSAGE)); + + initializeTabMenus(); + } + + private void initializeTabMenus(){ + ArrayList regexes = appConfig.tabMenuRegexes; + ArrayList ids = appConfig.tabMenuIDs; + + if (regexes == null || ids == null) { + return; + } + + tabMenus = new HashMap<>(); + Map tabSelectionConfig = new HashMap<>(); + + for (int i = 0; i < ids.size(); i++) { + tabSelectionConfig.put(ids.get(i), regexes.get(i)); + } + + for (Map.Entry tabMenu : appConfig.tabMenus.entrySet()) { + TabMenu item = new TabMenu(); + item.tabs = tabMenu.getValue(); + item.urlRegex = tabSelectionConfig.get(tabMenu.getKey()); + tabMenus.put(tabMenu.getKey(), item); + } + } + + public void checkTabs(String url) { + this.currentUrl = url; + + if (this.mainActivity == null || url == null) { + return; + } + + if (this.useJavascript) { + autoSelectTab(url); + return; + } + + ArrayList regexes = appConfig.tabMenuRegexes; + ArrayList ids = appConfig.tabMenuIDs; + if (regexes == null || ids == null) { + showTabs(false); + return; + } + + String menuId = null; + + for (int i = 0; i < regexes.size(); i++) { + Pattern regex = regexes.get(i); + if (regex.matcher(url).matches()) { + menuId = ids.get(i); + break; + } + } + + setMenuID(menuId); + + if (menuId != null) autoSelectTab(url); + } + + + + private void setMenuID(String id){ + if (id == null) { + this.currentMenuId = null; + showTabs(false); + } + else if (this.currentMenuId == null || !this.currentMenuId.equals(id)) { + this.currentMenuId = id; + JSONArray tabs = AppConfig.getInstance(this.mainActivity).tabMenus.get(id); + setTabs(tabs); + showTabs(bottomNav.getMenu().size() != 0); + } + } + + private void setTabs(JSONArray tabs) { + this.tabs = tabs; + + int selectedNumber = -1; + bottomNav.getMenu().clear(); + if(tabs == null) return; + + for (int i = 0; i < tabs.length(); i++) { + if(i > (maxTabs-1)){ + GNLog.getInstance().logError(TAG, "Tab menu items list should not have more than 5 items"); + break; + } + + JSONObject item = tabs.optJSONObject(i); + if (item == null) continue; + + String label = item.optString("label"); + String icon = item.optString("icon"); + + // if no label, icon and url is provided, do not include + if(label.isEmpty() && icon.isEmpty() && item.optString("url").isEmpty()){ + continue; + } + + // set default drawable "Question Mark" when no icon provided + if (icon.isEmpty()) { + icon = "faw_question"; + GNLog.getInstance().logError(TAG, "All tabs must have icons."); + } + + bottomNav.getMenu().add(Menu.NONE, i, Menu.NONE, label).setIcon(new Icon(mainActivity, icon, iconSize, iconColor).getDrawable()); + + if (item.optBoolean("selected")) { + selectedNumber = i; + } + } + + if (selectedNumber > -1) { + selectTabNumber(selectedNumber, true); + } + } + + // regex used for auto tab selection + private List getRegexForTab(JSONObject tabConfig) { + if (tabConfig == null) return null; + + Object regex = tabConfig.opt("regex"); + if (regex == null) return null; + + return LeanUtils.createRegexArrayFromStrings(regex); + } + + private List getCachedRegexForTab(int position) { + if (tabs == null || position < 0 || position >= tabs.length()) return null; + + JSONObject tabConfig = tabs.optJSONObject(position); + if (tabConfig == null) return null; + + if (tabRegexCache.containsKey(tabConfig)) { + return tabRegexCache.get(tabConfig); + } else { + List regex = getRegexForTab(tabConfig); + tabRegexCache.put(tabConfig, regex); + return regex; + } + } + + public void autoSelectTab(String url) { + if (tabs == null) return; + + for (int i = 0; i < tabs.length(); i++) { + List patternList = getCachedRegexForTab(i); + if (patternList == null) continue; + + for(Pattern regex : patternList) { + if (regex.matcher(url).matches()) { + bottomNav.setSelectedItemId(i); + return; + } + } + } + } + + @SuppressWarnings("UnusedReturnValue") + public boolean selectTab(String url, String javascript) { + if (url == null) return false; + + if (javascript == null) javascript = ""; + + if (this.tabs != null) { + for (int i = 0; i < this.tabs.length(); i++) { + JSONObject entry = this.tabs.optJSONObject(i); + if (entry != null) { + String entryUrl = entry.optString("url"); + String entryJs = entry.optString("javascript"); + + if (url.equals(entryUrl) && javascript.equals(entryJs)) { + if (this.bottomNav != null) { + this.bottomNav.setSelectedItemId(i); + return true; + } + } + + } + } + } + + return false; + } + + public void setTabsWithJson(JSONObject tabsJson, int tabMenuId) { + if(tabsJson == null) return; + + this.useJavascript = true; + + JSONArray tabs = tabsJson.optJSONArray("items"); + if (tabs != null) setTabs(tabs); + + if(tabMenuId != -1){ + TabMenu tabMenu = tabMenus.get(Integer.toString(tabMenuId)); + if(tabMenu == null || tabs != null) return; + setTabs(tabMenu.tabs); + } + + Object enabled = tabsJson.opt("enabled"); + if (enabled instanceof Boolean) { + showTabs((Boolean) enabled); + } + } + + public void selectTabNumber(int tabNumber, boolean performAction) { + if (tabNumber < 0 || tabNumber >= bottomNav.getMenu().size()) { + return; + } + this.performAction = performAction; + this.bottomNav.setSelectedItemId(tabNumber); + } + + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + if (this.tabs != null) { + JSONObject entry = this.tabs.optJSONObject(item.getItemId()); + + String url = entry.optString("url"); + String javascript = entry.optString("javascript"); + + if (!performAction) { + performAction = true; + return true; + } + + if (!TextUtils.isEmpty(url)) { + if (!TextUtils.isEmpty(javascript)) mainActivity.loadUrlAndJavascript(url, javascript, true); + else mainActivity.loadUrl(url, true); + } + } + return true; + } + + public void showTabs(boolean show) { + mainActivity.runOnUiThread(() -> { + if (show) this.bottomNav.setVisibility(View.VISIBLE); + else this.bottomNav.setVisibility(View.GONE); + }); + } + + public void deselectTabs() { + Menu menu = bottomNav.getMenu(); + menu.setGroupCheckable(0, true, false); + for(int i = 0; i < menu.size(); i++) { + menu.getItem(i).setChecked(false); + } + menu.setGroupCheckable(0, true, true); + } + + private static class TabMenu { + Pattern urlRegex; + JSONArray tabs; + } +} diff --git a/app/src/main/java/co/median/android/UrlInspector.java b/app/src/main/java/co/median/android/UrlInspector.java new file mode 100644 index 0000000..212e530 --- /dev/null +++ b/app/src/main/java/co/median/android/UrlInspector.java @@ -0,0 +1,63 @@ +package co.median.android; + +import android.content.Context; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; + +/** + * Created by weiyin on 4/28/14. + */ +public class UrlInspector { + private static final String TAG = UrlInspector.class.getName(); + // singleton + private static UrlInspector instance = null; + + private Pattern userIdRegex = null; + + private String userId = null; + + + public static UrlInspector getInstance(){ + if (instance == null) { + instance = new UrlInspector(); + } + return instance; + } + + public void init(Context context) { + String regexString = AppConfig.getInstance(context).userIdRegex; + if (regexString != null && !regexString.isEmpty()) { + try { + userIdRegex = Pattern.compile(regexString); + } catch (PatternSyntaxException e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + } + } + + private UrlInspector() { + // prevent direct instantiation + } + + public void inspectUrl(String url) { + if (userIdRegex != null) { + Matcher matcher = userIdRegex.matcher(url); + if (matcher.groupCount() > 0 && matcher.find()) { + setUserId(matcher.group(1)); + } + } + } + + public String getUserId() { + return userId; + } + + private void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/app/src/main/java/co/median/android/UrlNavigation.java b/app/src/main/java/co/median/android/UrlNavigation.java new file mode 100644 index 0000000..1c65362 --- /dev/null +++ b/app/src/main/java/co/median/android/UrlNavigation.java @@ -0,0 +1,1033 @@ +package co.median.android; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.content.SharedPreferences; +import android.location.LocationManager; +import android.net.Uri; +import android.net.http.SslError; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Handler; +import android.os.Message; +import android.preference.PreferenceManager; +import android.provider.Settings; +import android.security.KeyChain; +import android.security.KeyChainAliasCallback; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; +import android.util.Pair; +import android.webkit.ClientCertRequest; +import android.webkit.CookieManager; +import android.webkit.WebResourceResponse; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.RequiresApi; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import co.median.median_core.AppConfig; +import co.median.median_core.GNLog; +import co.median.median_core.GoNativeWebviewInterface; +import co.median.median_core.LeanUtils; +import co.median.median_core.RegexRulesManager; +import co.median.median_core.Utils; + +enum WebviewLoadState { + STATE_UNKNOWN, + STATE_START_LOAD, // we have decided to load the url in this webview in shouldOverrideUrlLoading + STATE_PAGE_STARTED, // onPageStarted has been called + STATE_DONE // onPageFinished has been called +} + +public class UrlNavigation { + public static final String STARTED_LOADING_MESSAGE = "io.gonative.android.webview.started"; + public static final String FINISHED_LOADING_MESSAGE = "io.gonative.android.webview.finished"; + public static final String CLEAR_POOLS_MESSAGE = "io.gonative.android.webview.clearPools"; + + private static final String TAG = UrlNavigation.class.getName(); + + private static final String ASSET_URL = "file:///android_asset/"; + public static final String OFFLINE_PAGE_URL = "file:///android_asset/offline.html"; + public static final String OFFLINE_PAGE_URL_RAW = "file:///offline.html"; + + public static final int DEFAULT_HTML_SIZE = 10 * 1024; // 10 kilobytes + + private MainActivity mainActivity; + private String profilePickerExec; + private String gnProfilePickerExec; + private String currentWebviewUrl; + private String jsBridgeScript; + private HtmlIntercept htmlIntercept; + private Handler startLoadTimeout = new Handler(); + + private WebviewLoadState state = WebviewLoadState.STATE_UNKNOWN; + private boolean mVisitedLoginOrSignup = false; + private boolean finishOnExternalUrl = false; + private double connectionOfflineTime; + + private String interceptedRedirectUrl = ""; + private String CUSTOM_CSS_FILE = "customCSS.css"; + private String CUSTOM_JS_FILE = "customJS.js"; + private String ANDROID_CUSTOM_CSS_FILE = "androidCustomCSS.css"; + private String ANDROID_CUSTOM_JS_FILE = "androidCustomJS.js"; + + UrlNavigation(MainActivity activity) { + this.mainActivity = activity; + this.htmlIntercept = new HtmlIntercept(activity); + + AppConfig appConfig = AppConfig.getInstance(mainActivity); + + // profile picker + if (appConfig.profilePickerJS != null) { + this.profilePickerExec = "median_profile_picker.parseJson(eval(" + + LeanUtils.jsWrapString(appConfig.profilePickerJS) + + "))"; + + this.gnProfilePickerExec = "gonative_profile_picker.parseJson(eval(" + + LeanUtils.jsWrapString(appConfig.profilePickerJS) + + "))"; + } + + if (mainActivity.getIntent().getBooleanExtra(MainActivity.EXTRA_WEBVIEW_WINDOW_OPEN, false)) { + finishOnExternalUrl = true; + } + + connectionOfflineTime = appConfig.androidConnectionOfflineTime; + } + + private boolean isInternalUri(Uri uri) { + String scheme = uri.getScheme(); + if (scheme == null || (!scheme.equalsIgnoreCase("http") && !scheme.equalsIgnoreCase("https"))) { + return false; + } + + AppConfig appConfig = AppConfig.getInstance(mainActivity); + RegexRulesManager regexRulesManager = appConfig.regexRulesManager; + String urlString = uri.toString(); + + // first check regexes + if (!regexRulesManager.isEmpty()) { + return regexRulesManager.getMode(urlString).equals(RegexRulesManager.MODE_INTERNAL); + } + + String host = uri.getHost(); + String initialHost = appConfig.initialHost; + + return host != null && + (host.equals(initialHost) || host.endsWith("." + initialHost)); + } + + public boolean shouldOverrideUrlLoading(GoNativeWebviewInterface view, String url) { + return shouldOverrideUrlLoading(view, url, false, false); + } + + // noAction to skip stuff like opening url in external browser, higher nav levels, etc. + private boolean shouldOverrideUrlLoadingNoIntercept(final GoNativeWebviewInterface view, final String url, + @SuppressWarnings("SameParameterValue") final boolean noAction) { +// Log.d(TAG, "shouldOverrideUrl: " + url); + + // return if url is null (can happen if clicking refresh when there is no page loaded) + if (url == null) + return false; + + // return if loading from local assets + if (url.startsWith(ASSET_URL)) return false; + + if (url.startsWith("blob:")) return false; + + view.setCheckLoginSignup(true); + + Uri uri = Uri.parse(url); + + if (uri.getScheme() != null && uri.getScheme().equals("gonative-bridge")) { + if (noAction) return true; + + try { + String json = uri.getQueryParameter("json"); + + JSONArray parsedJson = new JSONArray(json); + for (int i = 0; i < parsedJson.length(); i++) { + JSONObject entry = parsedJson.optJSONObject(i); + if (entry == null) continue; + + String command = entry.optString("command"); + if (command.isEmpty()) continue; + + if (command.equals("pop")) { + if (mainActivity.isNotRoot()) mainActivity.finish(); + } else if (command.equals("clearPools")) { + LocalBroadcastManager.getInstance(mainActivity).sendBroadcast( + new Intent(UrlNavigation.CLEAR_POOLS_MESSAGE)); + } + } + } catch (Exception e) { + // do nothing + } + + return true; + } + + final AppConfig appConfig = AppConfig.getInstance(mainActivity); + // Check native bridge urls + if (("median".equals(uri.getScheme()) || "gonative".equals(uri.getScheme())) && currentWebviewUrl != null && + !LeanUtils.checkNativeBridgeUrls(currentWebviewUrl, mainActivity)) { + GNLog.getInstance().logError(TAG, "URL not authorized for native bridge: " + currentWebviewUrl); + return true; + } + + if ("median".equals(uri.getScheme()) || "gonative".equals(uri.getScheme())) { + ((GoNativeApplication) mainActivity.getApplication()).mBridge.handleJSBridgeFunctions(mainActivity, uri); + return true; + } + + // check redirects + if (appConfig.getRedirects() != null) { + String to = appConfig.getRedirects().get(url); + if (to == null) to = appConfig.getRedirects().get("*"); + if (to != null && !to.equals(url)) { + if (noAction) return true; + + final String destination = to; + mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mainActivity.loadUrl(destination); + } + }); + return true; + } + } + + if (!isInternalUri(uri)) { + if (noAction) return true; + + String mode = appConfig.regexRulesManager.getMode(uri.toString()); + if (mode.equals(RegexRulesManager.MODE_APP_BROWSER)) { + mainActivity.openAppBrowser(uri); + } else { + Log.d(TAG, "processing dynamic link: " + uri); + Intent intent = null; + // launch browser + try { + if ("intent".equals(uri.getScheme())) { + intent = Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME); + mainActivity.startActivity(intent); + } else if ("http".equals(uri.getScheme()) || "https".equals(uri.getScheme())) { + // forces this URL to be launched in this device's default browser, regardless of the app's deeplink + mainActivity.openExternalBrowser(uri); + } else { + intent = new Intent(Intent.ACTION_VIEW, uri); + mainActivity.startActivity(intent); + } + } catch (ActivityNotFoundException ex) { + // Try loading fallback url if available + if (intent != null) { + String fallbackUrl = intent.getStringExtra("browser_fallback_url"); + if (!TextUtils.isEmpty(fallbackUrl)) { + mainActivity.loadUrl(fallbackUrl); + } else { + Toast.makeText(mainActivity, R.string.app_not_installed, Toast.LENGTH_LONG).show(); + GNLog.getInstance().logError(TAG, mainActivity.getString(R.string.app_not_installed), ex, GNLog.TYPE_TOAST_ERROR); + } + } + } catch (URISyntaxException e) { + GNLog.getInstance().logError(TAG, e.getMessage(), e); + } + } + + // If this URL launched the app initially via deeplink action, + // load initialURL so the app does not show a blank page. + if (AppLinksActivity.LAUNCH_SOURCE_APP_LINKS.equals(mainActivity.getLaunchSource()) && getCurrentWebviewUrl() == null) { + mainActivity.loadUrl(appConfig.getInitialUrl()); + } + return true; + } + + // Starting here, we are going to load the request, but possibly in a + // different activity depending on the structured nav level + + if (!mainActivity.isRestoreBrightnessOnNavigation()) { + mainActivity.setBrightness(-1); + mainActivity.setRestoreBrightnessOnNavigation(false); + } + + if (appConfig.maxWindowsEnabled) { + + GoNativeWindowManager windowManager = mainActivity.getGNWindowManager(); + + // To prevent consecutive calls and handle MaxWindows correctly + // Checks for a flag indicating if the Activity was created from CreateNewWindow OR NavLevels + // and avoid triggering MaxWindows during this initial intercept + boolean ignoreInterceptMaxWindows = windowManager.isIgnoreInterceptMaxWindows(mainActivity.getActivityId()); + + if (ignoreInterceptMaxWindows) { + windowManager.setIgnoreInterceptMaxWindows(mainActivity.getActivityId(), false); + } else if (appConfig.numWindows > 0 && windowManager.getWindowCount() >= appConfig.numWindows) { + if (mainActivity.onMaxWindowsReached(url)) { + return true; + } + } + } + + int currentLevel = mainActivity.getUrlLevel(); + int newLevel = mainActivity.urlLevelForUrl(url); + if (currentLevel >= 0 && newLevel >= 0) { + if (newLevel > currentLevel) { + if (noAction) return true; + + // new activity + Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class); + intent.putExtra("isRoot", false); + intent.putExtra("url", url); + intent.putExtra("parentUrlLevel", currentLevel); + intent.putExtra("postLoadJavascript", mainActivity.postLoadJavascript); + + if (appConfig.maxWindowsEnabled) { + intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true); + } + + mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY); + + mainActivity.postLoadJavascript = null; + mainActivity.postLoadJavascriptForRefresh = null; + + return true; + } else if (newLevel < currentLevel && newLevel <= mainActivity.getParentUrlLevel()) { + if (noAction) return true; + + // pop activity + Intent returnIntent = new Intent(); + returnIntent.putExtra("url", url); + returnIntent.putExtra("urlLevel", newLevel); + returnIntent.putExtra("postLoadJavascript", mainActivity.postLoadJavascript); + mainActivity.setResult(Activity.RESULT_OK, returnIntent); + mainActivity.finish(); + return true; + } + } + + // Starting here, the request will be loaded in this activity. + if (newLevel >= 0) { + mainActivity.setUrlLevel(newLevel); + } + + final String newTitle = mainActivity.titleForUrl(url); + if (newTitle != null) { + if (!noAction) { + mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mainActivity.setTitle(newTitle); + } + }); + } + } + + // nav title image + if (!noAction) { + mainActivity.runOnUiThread(() -> + mainActivity.getActionManager().setupTitleDisplayForUrl(url) + ); + } + + // check to see if the webview exists in pool. + WebViewPool webViewPool = ((GoNativeApplication) mainActivity.getApplication()).getWebViewPool(); + Pair pair = webViewPool.webviewForUrl(url); + final GoNativeWebviewInterface poolWebview = pair.first; + WebViewPoolDisownPolicy poolDisownPolicy = pair.second; + + if (noAction && poolWebview != null) return true; + + if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Always) { + this.mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mainActivity.switchToWebview(poolWebview, true, false); + mainActivity.checkNavigationForPage(url); + } + }); + webViewPool.disownWebview(poolWebview); + LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.FINISHED_LOADING_MESSAGE)); + return true; + } + + if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Never) { + this.mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mainActivity.switchToWebview(poolWebview, true, false); + mainActivity.checkNavigationForPage(url); + } + }); + return true; + } + + if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Reload && + !LeanUtils.urlsMatchOnPath(url, this.currentWebviewUrl)) { + this.mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mainActivity.switchToWebview(poolWebview, true, false); + mainActivity.checkNavigationForPage(url); + } + }); + return true; + } + + if (this.mainActivity.isPoolWebview) { + // if we are here, either the policy is reload and we are reloading the page, or policy is never but we are going to a different page. So take ownership of the webview. + webViewPool.disownWebview(view); + this.mainActivity.isPoolWebview = false; + } + + return false; + } + + public boolean shouldOverrideUrlLoading(final GoNativeWebviewInterface view, String url, + @SuppressWarnings("unused") boolean isReload, boolean isRedirect) { + if (url == null) return false; + + boolean shouldOverride = shouldOverrideUrlLoadingNoIntercept(view, url, false); + if (shouldOverride) { + if (finishOnExternalUrl) { + mainActivity.finish(); + } + + // Check if intercepted URL request was a result of a server-side redirect. + // Redirect URLs triggers redundant onPageFinished() + if (isRedirect) { + interceptedRedirectUrl = url; + } + return true; + } else { + finishOnExternalUrl = false; + } + + // intercept html + this.htmlIntercept.setInterceptUrl(url); + mainActivity.hideWebview(); + state = WebviewLoadState.STATE_START_LOAD; + // 10 second (default) delay to get to onPageStarted or doUpdateVisitedHistory + if (!Double.isNaN(connectionOfflineTime) && !Double.isInfinite(connectionOfflineTime) && + connectionOfflineTime > 0) { + startLoadTimeout.postDelayed(new Runnable() { + @Override + public void run() { + AppConfig appConfig = AppConfig.getInstance(mainActivity); + String url = view.getUrl(); + if (appConfig.showOfflinePage && !OFFLINE_PAGE_URL.equals(url)) { + view.loadUrlDirect(OFFLINE_PAGE_URL); + } + } + }, (long) (connectionOfflineTime * 1000)); + } + + return false; + } + + public void onPageStarted(String url) { + // catch blank pages from htmlIntercept and cancel loading + if (url.equals(htmlIntercept.getRedirectedUrl())) { + mainActivity.goBack(); + htmlIntercept.setRedirectedUrl(null); + return; + } + + state = WebviewLoadState.STATE_PAGE_STARTED; + startLoadTimeout.removeCallbacksAndMessages(null); + htmlIntercept.setInterceptUrl(url); + + UrlInspector.getInstance().inspectUrl(url); + Uri uri = Uri.parse(url); + + // reload menu if internal url + if (AppConfig.getInstance(mainActivity).loginDetectionUrl != null && isInternalUri(uri)) { + mainActivity.updateMenu(); + } + + // check ready status + mainActivity.startCheckingReadyStatus(); + + mainActivity.checkPreNavigationForPage(url); + + // send broadcast message + LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.STARTED_LOADING_MESSAGE)); + + + // enable swipe refresh controller if offline page + if (OFFLINE_PAGE_URL.equals(url)) { + mainActivity.enableSwipeRefresh(); + } else { + mainActivity.restoreSwipRefreshDefault(); + } + } + + @SuppressWarnings("unused") + public void showWebViewImmediately() { + mainActivity.runOnUiThread(() -> mainActivity.showWebviewImmediately()); + } + + @SuppressLint("ApplySharedPref") + public void onPageFinished(GoNativeWebviewInterface view, String url) { + // Catch intercepted Redirect URL to + // prevent loading unnecessary components + if (interceptedRedirectUrl.equals(url)) { + interceptedRedirectUrl = ""; + return; + } + + Log.d(TAG, "onpagefinished " + url); + state = WebviewLoadState.STATE_DONE; + setCurrentWebviewUrl(url); + + AppConfig appConfig = AppConfig.getInstance(mainActivity); + if (url != null && appConfig.ignorePageFinishedRegexes != null) { + for (Pattern pattern : appConfig.ignorePageFinishedRegexes) { + if (pattern.matcher(url).matches()) return; + } + } + + mainActivity.runOnUiThread(() -> mainActivity.showWebview()); + + UrlInspector.getInstance().inspectUrl(url); + + Uri uri = Uri.parse(url); + if (isInternalUri(uri)) { + AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + CookieManager.getInstance().flush(); + } + }); + } + + // inject median library + if (appConfig.injectMedianJS) { + injectJSBridgeLibrary(currentWebviewUrl); + } + + // inject custom CSS and JS + injectCSSviaJavascript(); + injectJSviaJavascript(); + + if (appConfig.loginDetectionUrl != null) { + if (mVisitedLoginOrSignup) { + mainActivity.updateMenu(); + } + + mVisitedLoginOrSignup = LeanUtils.urlsMatchOnPath(url, appConfig.loginUrl) || + LeanUtils.urlsMatchOnPath(url, appConfig.signupUrl); + } + + // post-load javascript + if (appConfig.postLoadJavascript != null) { + view.runJavascript(appConfig.postLoadJavascript); + } + + // profile picker + if (this.profilePickerExec != null) { + view.runJavascript(this.profilePickerExec); + } + + if (this.gnProfilePickerExec != null) { + view.runJavascript(this.gnProfilePickerExec); + } + + // tabs + mainActivity.checkNavigationForPage(url); + + // post-load javascript + if (mainActivity.postLoadJavascript != null) { + String js = mainActivity.postLoadJavascript; + mainActivity.postLoadJavascript = null; + mainActivity.runJavascript(js); + } + + // send broadcast message + LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.FINISHED_LOADING_MESSAGE)); + + boolean doNativeBridge = true; + if (currentWebviewUrl != null) { + doNativeBridge = LeanUtils.checkNativeBridgeUrls(currentWebviewUrl, mainActivity); + } + + // send installation info + if (doNativeBridge) { + runGonativeDeviceInfo("median_device_info"); + runGonativeDeviceInfo("gonative_device_info"); + } + + ((GoNativeApplication) mainActivity.getApplication()).mBridge.onPageFinish(mainActivity, doNativeBridge); + } + + private void injectJSBridgeLibrary(String currentWebviewUrl) { + if(!LeanUtils.checkNativeBridgeUrls(currentWebviewUrl, mainActivity)) return; + + try { + if(jsBridgeScript == null) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + InputStream is = new BufferedInputStream(mainActivity.getAssets().open("GoNativeJSBridgeLibrary.js")); + IOUtils.copy(is, baos); + jsBridgeScript = baos.toString(); + } + mainActivity.runJavascript(jsBridgeScript); + ((GoNativeApplication) mainActivity.getApplication()).mBridge.injectJSLibraries(mainActivity); + // call the user created function that needs library access on page finished. + mainActivity.runJavascript(LeanUtils.createJsForCallback("median_library_ready", null)); + mainActivity.runJavascript(LeanUtils.createJsForCallback("gonative_library_ready", null)); + Log.d(TAG, "GoNative JSBridgeLibrary Injection Success"); + } catch (Exception e) { + Log.d(TAG, "GoNative JSBridgeLibrary Injection Error:- " + e.getMessage()); + } + } + + private void injectCSSviaJavascript() { + AppConfig appConfig = AppConfig.getInstance(mainActivity); + if (!appConfig.hasCustomCSS && !appConfig.hasAndroidCustomCSS) return; + + List filePaths = new ArrayList<>(); + // read customCSS.css file + if(appConfig.hasCustomCSS) { + filePaths.add(CUSTOM_CSS_FILE); + } + // read android customCSS.css file + if(appConfig.hasAndroidCustomCSS){ + filePaths.add(ANDROID_CUSTOM_CSS_FILE); + } + if(filePaths.size() == 0) return; + + // inject custom CSS + try { + String cssString = readAssetsToString(filePaths); + if(cssString.length() == 0) return; + String encoded = Base64.encodeToString(cssString.getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP); + String js = "(function() {" + + "var parent = document.getElementsByTagName('head').item(0);" + + "var style = document.createElement('style');" + + "style.type = 'text/css';" + + // Tell the browser to BASE64-decode the string into your script !!! + "style.innerHTML = window.atob('" + encoded + "');" + + "parent.appendChild(style)" + + "})()"; + mainActivity.runJavascript(js); + Log.d(TAG, "Custom CSS Injection Success"); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, "Error injecting customCSS via javascript", e); + } + } + + private void injectJSviaJavascript() { + AppConfig appConfig = AppConfig.getInstance(mainActivity); + if (!appConfig.hasCustomJS && !appConfig.hasAndroidCustomJS) return; + + List filePaths = new ArrayList<>(); + // read customJS file + if(appConfig.hasCustomJS){ + filePaths.add(CUSTOM_JS_FILE); + } + // read android customJS file + if(appConfig.hasAndroidCustomJS){ + filePaths.add(ANDROID_CUSTOM_JS_FILE); + } + if(filePaths.size() == 0) return; + + try { + String jsString = readAssetsToString(filePaths); + if(jsString.length() == 0) return; + String encoded = Base64.encodeToString(jsString.getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP); + String js = "javascript:(function() {" + + "var parent = document.getElementsByTagName('head').item(0);" + + "var script = document.createElement('script');" + + "script.type = 'text/javascript';" + + "script.innerHTML = window.atob('" + encoded + "');" + + "parent.appendChild(script)" + + "})()"; + mainActivity.runJavascript(js); + Log.d(TAG, "Custom JS Injection Success"); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, "Error injecting customJS via javascript", e); + } + } + + private String readAssetsToString(List paths) { + StringBuilder builder = new StringBuilder(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (String path : paths) { + try { + co.median.median_core.IOUtils.copy(new BufferedInputStream(mainActivity.getAssets().open(path)), baos); + builder.append(baos); + baos.reset(); + } catch (IOException ioe) { + Log.e(TAG, "Error reading " + path, ioe); + } + } + co.median.median_core.IOUtils.close(baos); + return builder.toString(); + } + + public void onFormResubmission(GoNativeWebviewInterface view, Message dontResend, Message resend) { + resend.sendToTarget(); + } + + private void runGonativeDeviceInfo(String callback) { + Map installationInfo = Installation.getInfo(mainActivity); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mainActivity); + if (!sharedPreferences.getBoolean("hasLaunched", false)) { + sharedPreferences.edit().putBoolean("hasLaunched", true).commit(); + installationInfo.put("isFirstLaunch", true); + } else { + installationInfo.put("isFirstLaunch", false); + } + + JSONObject jsonObject = new JSONObject(installationInfo); + String js = LeanUtils.createJsForCallback(callback, jsonObject); + mainActivity.runJavascript(js); + } + + public void doUpdateVisitedHistory(@SuppressWarnings("unused") GoNativeWebviewInterface view, String url, boolean isReload) { + if (state == WebviewLoadState.STATE_START_LOAD) { + state = WebviewLoadState.STATE_PAGE_STARTED; + startLoadTimeout.removeCallbacksAndMessages(null); + } + + if (!isReload && !url.equals(OFFLINE_PAGE_URL)) { + mainActivity.addToHistory(url); + } + } + + public void onReceivedError(final GoNativeWebviewInterface view, + @SuppressWarnings("unused") int errorCode, + String errorDescription, String failingUrl) { + if (errorDescription != null && errorDescription.contains("net::ERR_CACHE_MISS")) { + mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + view.reload(); + } + }); + return; + } + + boolean showingOfflinePage = false; + + // show offline page if not connected to internet + AppConfig appConfig = AppConfig.getInstance(this.mainActivity); + if (appConfig.showOfflinePage && + (state == WebviewLoadState.STATE_PAGE_STARTED || state == WebviewLoadState.STATE_START_LOAD)) { + + if (mainActivity.isDisconnected() || + (errorCode == WebViewClient.ERROR_HOST_LOOKUP && + failingUrl != null && + view.getUrl() != null && + failingUrl.equals(view.getUrl()))) { + + showingOfflinePage = true; + + mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + view.stopLoading(); + view.loadUrlDirect(OFFLINE_PAGE_URL); + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + view.loadUrlDirect(OFFLINE_PAGE_URL); + } + }, 100); + } + }); + } + } + + if (!showingOfflinePage) { + mainActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mainActivity.showWebview(); + } + }); + } + } + + public void onReceivedSslError(SslError error, String webviewUrl) { + int errorMessage; + switch (error.getPrimaryError()) { + case SslError.SSL_EXPIRED: + errorMessage = R.string.ssl_error_expired; + break; + case SslError.SSL_DATE_INVALID: + case SslError.SSL_IDMISMATCH: + case SslError.SSL_NOTYETVALID: + case SslError.SSL_UNTRUSTED: + errorMessage = R.string.ssl_error_cert; + break; + case SslError.SSL_INVALID: + default: + errorMessage = R.string.ssl_error_generic; + break; + } + + if(AppConfig.getInstance(mainActivity).sslToastErrorsEnabled) + Toast.makeText(mainActivity, errorMessage, Toast.LENGTH_LONG).show(); + String finalErrorMessage = mainActivity.getString(errorMessage) + " - Error url: " + error.getUrl() + " - Source page: " + webviewUrl; + GNLog.getInstance().logError(TAG, finalErrorMessage, new Exception(finalErrorMessage), GNLog.TYPE_TOAST_ERROR); + } + + @SuppressWarnings("unused") + public String getCurrentWebviewUrl() { + return currentWebviewUrl; + } + + public void setCurrentWebviewUrl(String currentWebviewUrl) { + this.currentWebviewUrl = currentWebviewUrl; + ((GoNativeApplication) mainActivity.getApplication()).mBridge.setCurrentWebviewUrl(currentWebviewUrl); + } + + public WebResourceResponse interceptHtml(LeanWebView view, String url) { +// Log.d(TAG, "intercept " + url); + return htmlIntercept.interceptHtml(view, url, this.currentWebviewUrl); + } + + @SuppressWarnings("UnusedReturnValue") + public boolean chooseFileUpload(String[] mimetypespec) { + return chooseFileUpload(mimetypespec, false); + } + + public boolean chooseFileUpload(final String[] mimetypespec, final boolean multiple) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + chooseFileUploadAfterPermission(mimetypespec, multiple); + } else { + List permissionToRequest = new ArrayList<>(); + permissionToRequest.add(Manifest.permission.READ_EXTERNAL_STORAGE); + permissionToRequest.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { + permissionToRequest.add(Manifest.permission.CAMERA); + } + mainActivity.getPermission(permissionToRequest.toArray(new String[0]), (permissions, grantResults) -> chooseFileUploadAfterPermission(mimetypespec, multiple)); + } + return true; + } + + @SuppressWarnings("UnusedReturnValue") + private boolean chooseFileUploadAfterPermission(String[] mimetypespec, boolean multiple) { + mainActivity.setDirectUploadImageUri(null); + + FileUploadIntentsCreator creator = new FileUploadIntentsCreator(mainActivity, mimetypespec, multiple); + + if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA) && (creator.canUploadImage() || creator.canUploadVideo())) { + mainActivity.getPermission(new String[]{Manifest.permission.CAMERA}, (permissions, grantResults) -> launchChooserIntent(creator)); + return true; + } + + return launchChooserIntent(creator); + } + + private boolean launchChooserIntent(FileUploadIntentsCreator creator) { + Intent intentToSend = creator.chooserIntent(); + mainActivity.setDirectUploadImageUri(creator.getCurrentCaptureUri()); + + try { + mainActivity.startActivityForResult(intentToSend, MainActivity.REQUEST_SELECT_FILE); + return true; + } catch (ActivityNotFoundException e) { + mainActivity.cancelFileUpload(); + Toast.makeText(mainActivity, R.string.cannot_open_file_chooser, Toast.LENGTH_LONG).show(); + return false; + } + } + + + public boolean openDirectCamera(final String[] mimetypespec, final boolean multiple) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { + mainActivity.getPermission(new String[]{Manifest.permission.CAMERA}, (permissions, grantResults) -> openDirectCameraAfterPermission(mimetypespec, multiple)); + } else { + openDirectCameraAfterPermission(mimetypespec, multiple); + } + } else { + + ArrayList permissionRequests = new ArrayList<>(); + permissionRequests.add(Manifest.permission.READ_EXTERNAL_STORAGE); + permissionRequests.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + + if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { + permissionRequests.add(Manifest.permission.CAMERA); + } + + mainActivity.getPermission(permissionRequests.toArray(new String[0]), (permissions, grantResults) -> openDirectCameraAfterPermission(mimetypespec, multiple)); + } + return true; + } + + /* + Directly opens camera if the mime types are images. If not, run existing default process + */ + @SuppressWarnings("UnusedReturnValue") + private boolean openDirectCameraAfterPermission(String[] mimetypespec, boolean multiple) { + + // Check and verify CAMERA permission so app will not crash when using cam + if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { + Toast.makeText(mainActivity, R.string.upload_camera_permission_denied, Toast.LENGTH_SHORT).show(); + mainActivity.cancelFileUpload(); + return false; + } + + mainActivity.setDirectUploadImageUri(null); + + FileUploadIntentsCreator creator = new FileUploadIntentsCreator(mainActivity, mimetypespec, multiple); + Intent intentToSend = creator.cameraIntent(); + mainActivity.setDirectUploadImageUri(creator.getCurrentCaptureUri()); + + try { + // Directly open the camera intent with the same Request Result value value + mainActivity.startActivityForResult(intentToSend, MainActivity.REQUEST_SELECT_FILE); + return true; + } catch (ActivityNotFoundException e) { + mainActivity.cancelFileUpload(); + Toast.makeText(mainActivity, R.string.cannot_open_file_chooser, Toast.LENGTH_LONG).show(); + } + + return false; + } + + @SuppressLint("SetJavaScriptEnabled") + public void createNewWindow(WebView webView, Message resultMsg) { + AppConfig appConfig = AppConfig.getInstance(mainActivity); + + if (appConfig.maxWindowsEnabled && appConfig.numWindows > 0 && mainActivity.getGNWindowManager().getWindowCount() >= appConfig.numWindows) { + // All of these just to get new url + WebView newWebView = new WebView(webView.getContext()); + WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; + transport.setWebView(newWebView); + resultMsg.sendToTarget(); + newWebView.setWebViewClient(new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) { + if (!mainActivity.onMaxWindowsReached(url)) { + Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class); + intent.putExtra("isRoot", false); + intent.putExtra("url", url); + intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true); + mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY); + } + } + }); + return; + } + createNewWindow(resultMsg, appConfig.maxWindowsEnabled); + } + + private void createNewWindow(Message resultMsg, boolean maxWindowsEnabled) { + ((GoNativeApplication) mainActivity.getApplication()).setWebviewMessage(resultMsg); + Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class); + intent.putExtra("isRoot", false); + intent.putExtra(MainActivity.EXTRA_WEBVIEW_WINDOW_OPEN, true); + + if (maxWindowsEnabled) { + intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true); + } + + // need to use startActivityForResult instead of startActivity because of singleTop launch mode + mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY); + } + + public boolean isLocationServiceEnabled() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + LocationManager lm = mainActivity.getSystemService(LocationManager.class); + return lm.isLocationEnabled(); + } else { + // This is Deprecated in API 28 + int mode = Settings.Secure.getInt(mainActivity.getContentResolver(), Settings.Secure.LOCATION_MODE, + Settings.Secure.LOCATION_MODE_OFF); + return (mode != Settings.Secure.LOCATION_MODE_OFF); + } + } + + protected void onDownloadStart() { + startLoadTimeout.removeCallbacksAndMessages(null); + state = WebviewLoadState.STATE_DONE; + } + + + private static class GetKeyTask extends AsyncTask> { + private Activity activity; + private ClientCertRequest request; + + public GetKeyTask(Activity activity, ClientCertRequest request) { + this.activity = activity; + this.request = request; + } + + @Override + protected Pair doInBackground(String... strings) { + String alias = strings[0]; + + try { + PrivateKey privateKey = KeyChain.getPrivateKey(activity, alias); + X509Certificate[] certificates = KeyChain.getCertificateChain(activity, alias); + return new Pair<>(privateKey, certificates); + } catch (Exception e) { + GNLog.getInstance().logError(TAG, "Error getting private key for alias " + alias, e); + return null; + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + protected void onPostExecute(Pair result) { + if (result != null && result.first != null & result.second != null) { + request.proceed(result.first, result.second); + } else { + request.ignore(); + } + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public void onReceivedClientCertRequest(String url, ClientCertRequest request) { + Uri uri = Uri.parse(url); + KeyChainAliasCallback callback = alias -> { + if (alias == null) { + request.ignore(); + return; + } + + new GetKeyTask(mainActivity, request).execute(alias); + }; + + KeyChain.choosePrivateKeyAlias(mainActivity, callback, request.getKeyTypes(), request.getPrincipals(), request.getHost(), + request.getPort(), null); + } + + // Cancels scheduled display of offline page after timeout + public void cancelLoadTimeout() { + if (startLoadTimeout == null && state != WebviewLoadState.STATE_START_LOAD) return; + startLoadTimeout.removeCallbacksAndMessages(null); + showWebViewImmediately(); + } +} diff --git a/app/src/main/java/co/median/android/WebViewPool.java b/app/src/main/java/co/median/android/WebViewPool.java new file mode 100644 index 0000000..842b811 --- /dev/null +++ b/app/src/main/java/co/median/android/WebViewPool.java @@ -0,0 +1,278 @@ +package co.median.android; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Point; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import android.util.Pair; +import android.view.Display; +import android.view.WindowManager; +import android.webkit.WebResourceResponse; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import co.median.median_core.AppConfig; +import co.median.median_core.GoNativeWebviewInterface; + +/** + * Created by Weiyin He on 9/3/14. + * Copyright 2014 GoNative.io LLC + */ + +public class WebViewPool { + public class WebViewPoolCallback { + @SuppressWarnings("unused") + public void onPageFinished(final GoNativeWebviewInterface webview, String url) { + WebViewPool pool = WebViewPool.this; + + pool.urlToWebview.put(pool.currentLoadingUrl, pool.currentLoadingWebview); + pool.currentLoadingUrl = null; + pool.currentLoadingWebview = null; + pool.isLoading = false; + pool.htmlIntercept.setInterceptUrl(null); + + pool.resumeLoading(); + } + + public WebResourceResponse interceptHtml(GoNativeWebviewInterface webview, String url) { + return htmlIntercept.interceptHtml(webview, url, null); + } + } + + private Activity context; + private HtmlIntercept htmlIntercept; + + private boolean isInitialized; + private Map urlToWebview; + private Map urlToDisownPolicy; + + private WebViewPoolCallback webViewPoolCallback = new WebViewPoolCallback(); + + private List> urlSets; + private Set urlsToLoad; + private GoNativeWebviewInterface currentLoadingWebview; + private String currentLoadingUrl; + private boolean isLoading; + private String lastUrlRequest; + private boolean isMainActivityLoading; + + public void init(Activity activity) { + if (this.isInitialized) return; + this.isInitialized = true; + + // webviews must be instantiated from activity context + this.context = activity; + this.htmlIntercept = new HtmlIntercept(activity); + + this.urlToWebview = new HashMap<>(); + this.urlToDisownPolicy = new HashMap<>(); + this.urlSets = new ArrayList<>(); + this.urlsToLoad = new HashSet<>(); + + // register for broadcast messages + BroadcastReceiver messageReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null || intent.getAction() == null) return; + + switch (intent.getAction()) { + case UrlNavigation.STARTED_LOADING_MESSAGE: { + WebViewPool pool = WebViewPool.this; + pool.isMainActivityLoading = true; + if (pool.currentLoadingWebview != null) { + // onReceive is always called on the main thread, so this is safe. + pool.currentLoadingWebview.stopLoading(); + pool.isLoading = false; + } + break; + } + case UrlNavigation.FINISHED_LOADING_MESSAGE: { + WebViewPool pool = WebViewPool.this; + pool.isMainActivityLoading = false; + pool.resumeLoading(); + break; + } + case AppConfig.PROCESSED_WEBVIEW_POOLS_MESSAGE: + processConfig(); + break; + case UrlNavigation.CLEAR_POOLS_MESSAGE: + WebViewPool.this.flushAll(); + break; + } + } + }; + LocalBroadcastManager.getInstance(this.context).registerReceiver( + messageReceiver, new IntentFilter(UrlNavigation.STARTED_LOADING_MESSAGE)); + LocalBroadcastManager.getInstance(this.context).registerReceiver( + messageReceiver, new IntentFilter(UrlNavigation.FINISHED_LOADING_MESSAGE)); + LocalBroadcastManager.getInstance(this.context).registerReceiver( + messageReceiver, new IntentFilter(UrlNavigation.CLEAR_POOLS_MESSAGE)); + LocalBroadcastManager.getInstance(this.context).registerReceiver( + messageReceiver, new IntentFilter(AppConfig.PROCESSED_WEBVIEW_POOLS_MESSAGE)); + + processConfig(); + } + + private void processConfig() { + JSONArray config = AppConfig.getInstance(this.context).webviewPools; + if (config == null) { + return; + } + + for (int i = 0; i < config.length(); i++) { + JSONObject entry = config.optJSONObject(i); + if (entry != null) { + JSONArray urls = entry.optJSONArray("urls"); + if (urls != null) { + HashSet urlSet = new HashSet<>(); + for (int j = 0; j < urls.length(); j++) { + if (urls.isNull(j)) continue; + String urlString = null; + WebViewPoolDisownPolicy policy = WebViewPoolDisownPolicy.defaultPolicy; + + Object urlEntry = urls.opt(j); + if (urlEntry instanceof String) urlString = (String)urlEntry; + + if (urlString == null && urlEntry instanceof JSONObject) { + urlString = ((JSONObject)urlEntry).optString("url"); + String policyString = AppConfig.optString((JSONObject)urlEntry, "disown"); + if (policyString != null) { + if (policyString.equalsIgnoreCase("reload")) + policy = WebViewPoolDisownPolicy.Reload; + else if (policyString.equalsIgnoreCase("never")) + policy = WebViewPoolDisownPolicy.Never; + else if (policyString.equalsIgnoreCase("always")) + policy = WebViewPoolDisownPolicy.Always; + } + } + + if (urlString != null) { + urlSet.add(urlString); + this.urlToDisownPolicy.put(urlString, policy); + } + } + + this.urlSets.add(urlSet); + } + + } + } + + // if config changed, we may have to load webviews corresponding to the previously requested url + if (this.lastUrlRequest != null) { + webviewForUrl(this.lastUrlRequest); + } + + resumeLoading(); + } + + private void resumeLoading() { + if (this.isMainActivityLoading || this.isLoading) return; + + if (this.currentLoadingWebview != null && this.currentLoadingUrl != null) { + context.runOnUiThread(new Runnable() { + @Override + public void run() { + currentLoadingWebview.loadUrl(currentLoadingUrl); + } + }); + this.isLoading = true; + return; + } + + if (!this.urlsToLoad.isEmpty()) { + final String urlString = this.urlsToLoad.iterator().next(); + this.currentLoadingUrl = urlString; + this.htmlIntercept.setInterceptUrl(urlString); + + context.runOnUiThread(new Runnable() { + @Override + public void run() { + LeanWebView webview = new LeanWebView(context); + currentLoadingWebview = webview; + urlsToLoad.remove(urlString); + WebViewSetup.setupWebview(webview, context); + + // size it before loading url + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (wm != null) { + Display display = wm.getDefaultDisplay(); + Point size = new Point(); + display.getSize(size); + webview.layout(0, 0, size.x, size.y); + } + + new PoolWebViewClient(webViewPoolCallback, webview); + + currentLoadingWebview = webview; + urlsToLoad.remove(urlString); + + currentLoadingWebview.loadUrl(urlString); + } + }); + } + } + + private void flushAll() { + if (this.currentLoadingWebview != null) this.currentLoadingWebview.stopLoading(); + this.isLoading = false; + this.currentLoadingWebview = null; + this.currentLoadingUrl = null; + this.lastUrlRequest = null; + this.urlToWebview.clear(); + } + + public void disownWebview(GoNativeWebviewInterface webview) { + Iterator it = this.urlToWebview.keySet().iterator(); + while(it.hasNext()) { + String key = it.next(); + if (this.urlToWebview.get(key) == webview) { + it.remove(); + this.urlsToLoad.add(key); + } + } + } + + public Pair webviewForUrl(String url) { + this.lastUrlRequest = url; + HashSet urlSet = urlSetForUrl(url); + if (urlSet.size() > 0) { + HashSet newUrls = new HashSet<> (urlSet); + if (this.currentLoadingUrl != null) { + newUrls.remove(this.currentLoadingUrl); + } + newUrls.removeAll(this.urlToWebview.keySet()); + + this.urlsToLoad.addAll(newUrls); + } + + GoNativeWebviewInterface webview = this.urlToWebview.get(url); + if (webview == null) return new Pair<>(null, null); + + WebViewPoolDisownPolicy policy = this.urlToDisownPolicy.get(url); + return new Pair<>(webview, policy); + } + + private HashSet urlSetForUrl(String url){ + HashSet result = new HashSet<>(); + for (Set set : this.urlSets) { + if (set.contains(url)) { + result.addAll(set); + } + } + return result; + } + +} diff --git a/app/src/main/java/co/median/android/WebViewPoolDisownPolicy.java b/app/src/main/java/co/median/android/WebViewPoolDisownPolicy.java new file mode 100644 index 0000000..e75b75b --- /dev/null +++ b/app/src/main/java/co/median/android/WebViewPoolDisownPolicy.java @@ -0,0 +1,10 @@ +package co.median.android; + +/** + * Created by weiyin on 9/3/14. + */ +public enum WebViewPoolDisownPolicy { + Always, Reload, Never; + + public static WebViewPoolDisownPolicy defaultPolicy = WebViewPoolDisownPolicy.Reload; +} diff --git a/app/src/main/java/co/median/android/files/CapturedImageSaver.kt b/app/src/main/java/co/median/android/files/CapturedImageSaver.kt new file mode 100644 index 0000000..2e19911 --- /dev/null +++ b/app/src/main/java/co/median/android/files/CapturedImageSaver.kt @@ -0,0 +1,46 @@ +package co.median.android.files + +import android.content.ContentResolver +import android.content.ContentValues +import android.content.Context +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.MediaStore +import androidx.core.content.FileProvider +import java.io.File +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + + +class CapturedImageSaver { + fun saveCapturedBitmap(context: Context, bitmapUri: Uri): Uri? { + val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) + val imageFileName = "IMG_$timeStamp.jpg" + + val resolver: ContentResolver = context.contentResolver + val currentUri = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + val contentValues = ContentValues() + contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, imageFileName) + contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/*") + contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) + resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) + } else { + val storageDir = Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_PICTURES) + val captureFile = File(storageDir, imageFileName) + FileProvider.getUriForFile(context, context.applicationContext.packageName + ".fileprovider", captureFile); + } + + currentUri?.let { + context.contentResolver.openOutputStream(it).use { output -> + context.contentResolver.openInputStream(bitmapUri).use { input -> + output?.write(input?.readBytes()) + } + } + } + + return currentUri + } +} \ No newline at end of file diff --git a/app/src/main/java/co/median/android/widget/CircleImageView.java b/app/src/main/java/co/median/android/widget/CircleImageView.java new file mode 100644 index 0000000..bd255c5 --- /dev/null +++ b/app/src/main/java/co/median/android/widget/CircleImageView.java @@ -0,0 +1,142 @@ +package co.median.android.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RadialGradient; +import android.graphics.Shader; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.OvalShape; +import android.view.View; +import android.view.animation.Animation; + +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewCompat; + +/** + * Private class created to work around issues with AnimationListeners being + * called before the animation is actually complete and support shadows on older + * platforms. + */ +class CircleImageView extends androidx.appcompat.widget.AppCompatImageView { + + private static final int KEY_SHADOW_COLOR = 0x1E000000; + private static final int FILL_SHADOW_COLOR = 0x3D000000; + // PX + private static final float X_OFFSET = 0f; + private static final float Y_OFFSET = 1.75f; + private static final float SHADOW_RADIUS = 3.5f; + private static final int SHADOW_ELEVATION = 4; + + private Animation.AnimationListener mListener; + int mShadowRadius; + + CircleImageView(Context context, int color) { + super(context); + final float density = getContext().getResources().getDisplayMetrics().density; + final int shadowYOffset = (int) (density * Y_OFFSET); + final int shadowXOffset = (int) (density * X_OFFSET); + + mShadowRadius = (int) (density * SHADOW_RADIUS); + + ShapeDrawable circle; + if (elevationSupported()) { + circle = new ShapeDrawable(new OvalShape()); + ViewCompat.setElevation(this, SHADOW_ELEVATION * density); + } else { + OvalShape oval = new CircleImageView.OvalShadow(mShadowRadius); + circle = new ShapeDrawable(oval); + setLayerType(View.LAYER_TYPE_SOFTWARE, circle.getPaint()); + circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset, shadowYOffset, + KEY_SHADOW_COLOR); + final int padding = mShadowRadius; + // set padding so the inner image sits correctly within the shadow. + setPadding(padding, padding, padding, padding); + } + circle.getPaint().setColor(color); + ViewCompat.setBackground(this, circle); + } + + private boolean elevationSupported() { + return android.os.Build.VERSION.SDK_INT >= 21; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (!elevationSupported()) { + setMeasuredDimension(getMeasuredWidth() + mShadowRadius * 2, getMeasuredHeight() + + mShadowRadius * 2); + } + } + + public void setAnimationListener(Animation.AnimationListener listener) { + mListener = listener; + } + + @Override + public void onAnimationStart() { + super.onAnimationStart(); + if (mListener != null) { + mListener.onAnimationStart(getAnimation()); + } + } + + @Override + public void onAnimationEnd() { + super.onAnimationEnd(); + if (mListener != null) { + mListener.onAnimationEnd(getAnimation()); + } + } + + /** + * Update the background color of the circle image view. + * + * @param colorRes Id of a color resource. + */ + public void setBackgroundColorRes(int colorRes) { + setBackgroundColor(ContextCompat.getColor(getContext(), colorRes)); + } + + @Override + public void setBackgroundColor(int color) { + if (getBackground() instanceof ShapeDrawable) { + ((ShapeDrawable) getBackground()).getPaint().setColor(color); + } + } + + private class OvalShadow extends OvalShape { + private RadialGradient mRadialGradient; + private Paint mShadowPaint; + + OvalShadow(int shadowRadius) { + super(); + mShadowPaint = new Paint(); + mShadowRadius = shadowRadius; + updateRadialGradient((int) rect().width()); + } + + @Override + protected void onResize(float width, float height) { + super.onResize(width, height); + updateRadialGradient((int) width); + } + + @Override + public void draw(Canvas canvas, Paint paint) { + final int viewWidth = CircleImageView.this.getWidth(); + final int viewHeight = CircleImageView.this.getHeight(); + canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2, mShadowPaint); + canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2 - mShadowRadius, paint); + } + + private void updateRadialGradient(int diameter) { + mRadialGradient = new RadialGradient(diameter / 2, diameter / 2, + mShadowRadius, new int[] { FILL_SHADOW_COLOR, Color.TRANSPARENT }, + null, Shader.TileMode.CLAMP); + mShadowPaint.setShader(mRadialGradient); + } + } +} diff --git a/app/src/main/java/co/median/android/widget/GoNativeDrawerLayout.java b/app/src/main/java/co/median/android/widget/GoNativeDrawerLayout.java new file mode 100644 index 0000000..cb30ba5 --- /dev/null +++ b/app/src/main/java/co/median/android/widget/GoNativeDrawerLayout.java @@ -0,0 +1,50 @@ +package co.median.android.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.drawerlayout.widget.DrawerLayout; + +public class GoNativeDrawerLayout extends DrawerLayout { + + private boolean disableTouch = false; + + public GoNativeDrawerLayout(@NonNull Context context) { + this(context, null); + } + + public GoNativeDrawerLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public GoNativeDrawerLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (disableTouch) { + Log.d("SWIPE", "GNDrawerLayout disabled touch"); + return false; + } + return super.onInterceptTouchEvent(ev); + } + + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (disableTouch) { + Log.d("SWIPE", "GNDrawerLayout disabled touch"); + return false; + } + return super.onTouchEvent(ev); + } + + public void setDisableTouch(boolean disableTouch){ + this.disableTouch = disableTouch; + } +} diff --git a/app/src/main/java/co/median/android/widget/GoNativeSwipeRefreshLayout.java b/app/src/main/java/co/median/android/widget/GoNativeSwipeRefreshLayout.java new file mode 100644 index 0000000..6c342a0 --- /dev/null +++ b/app/src/main/java/co/median/android/widget/GoNativeSwipeRefreshLayout.java @@ -0,0 +1,1222 @@ +package co.median.android.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Transformation; +import android.widget.AbsListView; +import android.widget.ListView; + +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.Px; +import androidx.annotation.VisibleForTesting; +import androidx.core.content.ContextCompat; +import androidx.core.view.NestedScrollingChild; +import androidx.core.view.NestedScrollingChildHelper; +import androidx.core.view.NestedScrollingParent; +import androidx.core.view.NestedScrollingParentHelper; +import androidx.core.view.ViewCompat; +import androidx.core.widget.ListViewCompat; +import androidx.swiperefreshlayout.widget.CircularProgressDrawable; + +import co.median.median_core.GNLog; + +/** + * The SwipeRefreshLayout should be used whenever the user can refresh the + * contents of a view via a vertical swipe gesture. The activity that + * instantiates this view should add an OnRefreshListener to be notified + * whenever the swipe to refresh gesture is completed. The SwipeRefreshLayout + * will notify the listener each and every time the gesture is completed again; + * the listener is responsible for correctly determining when to actually + * initiate a refresh of its content. If the listener determines there should + * not be a refresh, it must call setRefreshing(false) to cancel any visual + * indication of a refresh. If an activity wishes to show just the progress + * animation, it should call setRefreshing(true). To disable the gesture and + * progress animation, call setEnabled(false) on the view. + *

+ * This layout should be made the parent of the view that will be refreshed as a + * result of the gesture and can only support one direct child. This view will + * also be made the target of the gesture and will be forced to match both the + * width and the height supplied in this layout. The SwipeRefreshLayout does not + * provide accessibility events; instead, a menu item must be provided to allow + * refresh of the content wherever this gesture is used. + *

+ */ +public class GoNativeSwipeRefreshLayout extends ViewGroup implements NestedScrollingParent, + NestedScrollingChild { + // Maps to ProgressBar.Large style + public static final int LARGE = CircularProgressDrawable.LARGE; + // Maps to ProgressBar default style + public static final int DEFAULT = CircularProgressDrawable.DEFAULT; + + public static final int DEFAULT_SLINGSHOT_DISTANCE = -1; + + @VisibleForTesting + static final int CIRCLE_DIAMETER = 40; + @VisibleForTesting + static final int CIRCLE_DIAMETER_LARGE = 56; + + private static final String LOG_TAG = GoNativeSwipeRefreshLayout.class.getSimpleName(); + + private static final int MAX_ALPHA = 255; + private static final int STARTING_PROGRESS_ALPHA = (int) (.3f * MAX_ALPHA); + + private static final float DECELERATE_INTERPOLATION_FACTOR = 2f; + private static final int INVALID_POINTER = -1; + private static final float DRAG_RATE = .5f; + + // Max amount of circle that can be filled by progress during swipe gesture, + // where 1.0 is a full circle + private static final float MAX_PROGRESS_ANGLE = .8f; + + private static final int SCALE_DOWN_DURATION = 150; + + private static final int ALPHA_ANIMATION_DURATION = 300; + + private static final int ANIMATE_TO_TRIGGER_DURATION = 200; + + private static final int ANIMATE_TO_START_DURATION = 200; + + // Default background for the progress spinner + private static final int CIRCLE_BG_LIGHT = 0xFFFAFAFA; + // Default offset in dips from the top of the view to where the progress spinner should stop + private static final int DEFAULT_CIRCLE_TARGET = 64; + + private View mTarget; // the target of the gesture + GoNativeSwipeRefreshLayout.OnRefreshListener mListener; + boolean mRefreshing = false; + private int mTouchSlop; + private float mTotalDragDistance = -1; + + // If nested scrolling is enabled, the total amount that needed to be + // consumed by this as the nested scrolling parent is used in place of the + // overscroll determined by MOVE events in the onTouch handler + private float mTotalUnconsumed; + private final NestedScrollingParentHelper mNestedScrollingParentHelper; + private final NestedScrollingChildHelper mNestedScrollingChildHelper; + private final int[] mParentScrollConsumed = new int[2]; + private final int[] mParentOffsetInWindow = new int[2]; + private boolean mNestedScrollInProgress; + + private int mMediumAnimationDuration; + int mCurrentTargetOffsetTop; + + private float mInitialMotionY; + private float mInitialDownY; + private float mInitialDownX; + private boolean mIsBeingDragged; + private int mActivePointerId = INVALID_POINTER; + // Whether this item is scaled up rather than clipped + boolean mScale; + + // Target is returning to its start offset because it was cancelled or a + // refresh was triggered. + private boolean mReturningToStart; + private final DecelerateInterpolator mDecelerateInterpolator; + private static final int[] LAYOUT_ATTRS = new int[] { + android.R.attr.enabled + }; + + CircleImageView mCircleView; + private int mCircleViewIndex = -1; + + protected int mFrom; + + float mStartingScale; + + protected int mOriginalOffsetTop; + + int mSpinnerOffsetEnd; + + int mCustomSlingshotDistance; + + CircularProgressDrawable mProgress; + + private Animation mScaleAnimation; + + private Animation mScaleDownAnimation; + + private Animation mAlphaStartAnimation; + + private Animation mAlphaMaxAnimation; + + private Animation mScaleDownToStartAnimation; + + boolean mNotify; + + private int mCircleDiameter; + + // Whether the client has set a custom starting position; + boolean mUsingCustomStart; + + private GoNativeSwipeRefreshLayout.OnChildScrollUpCallback mChildScrollUpCallback; + + private Animation.AnimationListener mRefreshListener = new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + if (mRefreshing) { + // Make sure the progress view is fully visible + mProgress.setAlpha(MAX_ALPHA); + mProgress.start(); + if (mNotify) { + if (mListener != null) { + mListener.onRefresh(); + } + } + mCurrentTargetOffsetTop = mCircleView.getTop(); + } else { + reset(); + } + } + }; + + void reset() { + mCircleView.clearAnimation(); + mProgress.stop(); + mCircleView.setVisibility(View.GONE); + setColorViewAlpha(MAX_ALPHA); + // Return the circle to its start position + if (mScale) { + setAnimationProgress(0 /* animation complete and view is hidden */); + } else { + setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCurrentTargetOffsetTop); + } + mCurrentTargetOffsetTop = mCircleView.getTop(); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + if (!enabled) { + reset(); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + reset(); + } + + private void setColorViewAlpha(int targetAlpha) { + mCircleView.getBackground().setAlpha(targetAlpha); + mProgress.setAlpha(targetAlpha); + } + + /** + * The refresh indicator starting and resting position is always positioned + * near the top of the refreshing content. This position is a consistent + * location, but can be adjusted in either direction based on whether or not + * there is a toolbar or actionbar present. + *

+ * Note: Calling this will reset the position of the refresh indicator to + * start. + *

+ * + * @param scale Set to true if there is no view at a higher z-order than where the progress + * spinner is set to appear. Setting it to true will cause indicator to be scaled + * up rather than clipped. + * @param start The offset in pixels from the top of this view at which the + * progress spinner should appear. + * @param end The offset in pixels from the top of this view at which the + * progress spinner should come to rest after a successful swipe + * gesture. + */ + public void setProgressViewOffset(boolean scale, int start, int end) { + mScale = scale; + mOriginalOffsetTop = start; + mSpinnerOffsetEnd = end; + mUsingCustomStart = true; + reset(); + mRefreshing = false; + } + + /** + * @return The offset in pixels from the top of this view at which the progress spinner should + * appear. + */ + public int getProgressViewStartOffset() { + return mOriginalOffsetTop; + } + + /** + * @return The offset in pixels from the top of this view at which the progress spinner should + * come to rest after a successful swipe gesture. + */ + public int getProgressViewEndOffset() { + return mSpinnerOffsetEnd; + } + + /** + * The refresh indicator resting position is always positioned near the top + * of the refreshing content. This position is a consistent location, but + * can be adjusted in either direction based on whether or not there is a + * toolbar or actionbar present. + * + * @param scale Set to true if there is no view at a higher z-order than where the progress + * spinner is set to appear. Setting it to true will cause indicator to be scaled + * up rather than clipped. + * @param end The offset in pixels from the top of this view at which the + * progress spinner should come to rest after a successful swipe + * gesture. + */ + public void setProgressViewEndTarget(boolean scale, int end) { + mSpinnerOffsetEnd = end; + mScale = scale; + mCircleView.invalidate(); + } + + /** + * Sets a custom slingshot distance. + * + * @param slingshotDistance The distance in pixels that the refresh indicator can be pulled + * beyond its resting position. Use + * {@link #DEFAULT_SLINGSHOT_DISTANCE} to reset to the default value. + * + */ + public void setSlingshotDistance(@Px int slingshotDistance) { + mCustomSlingshotDistance = slingshotDistance; + } + + /** + * One of DEFAULT, or LARGE. + */ + public void setSize(int size) { + if (size != CircularProgressDrawable.LARGE && size != CircularProgressDrawable.DEFAULT) { + return; + } + final DisplayMetrics metrics = getResources().getDisplayMetrics(); + if (size == CircularProgressDrawable.LARGE) { + mCircleDiameter = (int) (CIRCLE_DIAMETER_LARGE * metrics.density); + } else { + mCircleDiameter = (int) (CIRCLE_DIAMETER * metrics.density); + } + // force the bounds of the progress circle inside the circle view to + // update by setting it to null before updating its size and then + // re-setting it + mCircleView.setImageDrawable(null); + mProgress.setStyle(size); + mCircleView.setImageDrawable(mProgress); + } + + /** + * Simple constructor to use when creating a SwipeRefreshLayout from code. + * + * @param context + */ + public GoNativeSwipeRefreshLayout(@NonNull Context context) { + this(context, null); + } + + /** + * Constructor that is called when inflating SwipeRefreshLayout from XML. + * + * @param context + * @param attrs + */ + public GoNativeSwipeRefreshLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + + mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + + mMediumAnimationDuration = getResources().getInteger( + android.R.integer.config_mediumAnimTime); + + setWillNotDraw(false); + mDecelerateInterpolator = new DecelerateInterpolator(DECELERATE_INTERPOLATION_FACTOR); + + final DisplayMetrics metrics = getResources().getDisplayMetrics(); + mCircleDiameter = (int) (CIRCLE_DIAMETER * metrics.density); + + createProgressView(); + setChildrenDrawingOrderEnabled(true); + // the absolute offset has to take into account that the circle starts at an offset + mSpinnerOffsetEnd = (int) (DEFAULT_CIRCLE_TARGET * metrics.density); + mTotalDragDistance = mSpinnerOffsetEnd; + mNestedScrollingParentHelper = new NestedScrollingParentHelper(this); + + mNestedScrollingChildHelper = new NestedScrollingChildHelper(this); + setNestedScrollingEnabled(true); + + mOriginalOffsetTop = mCurrentTargetOffsetTop = -mCircleDiameter; + moveToStart(1.0f); + + final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS); + setEnabled(a.getBoolean(0, true)); + a.recycle(); + } + + @Override + protected int getChildDrawingOrder(int childCount, int i) { + if (mCircleViewIndex < 0) { + return i; + } else if (i == childCount - 1) { + // Draw the selected child last + return mCircleViewIndex; + } else if (i >= mCircleViewIndex) { + // Move the children after the selected child earlier one + return i + 1; + } else { + // Keep the children before the selected child the same + return i; + } + } + + private void createProgressView() { + mCircleView = new CircleImageView(getContext(), CIRCLE_BG_LIGHT); + mProgress = new CircularProgressDrawable(getContext()); + mProgress.setStyle(CircularProgressDrawable.DEFAULT); + mCircleView.setImageDrawable(mProgress); + mCircleView.setVisibility(View.GONE); + addView(mCircleView); + } + + /** + * Set the listener to be notified when a refresh is triggered via the swipe + * gesture. + */ + public void setOnRefreshListener(@Nullable GoNativeSwipeRefreshLayout.OnRefreshListener listener) { + mListener = listener; + } + + /** + * Notify the widget that refresh state has changed. Do not call this when + * refresh is triggered by a swipe gesture. + * + * @param refreshing Whether or not the view should show refresh progress. + */ + public void setRefreshing(boolean refreshing) { + if (refreshing && mRefreshing != refreshing) { + // scale and show + mRefreshing = refreshing; + int endTarget = 0; + if (!mUsingCustomStart) { + endTarget = mSpinnerOffsetEnd + mOriginalOffsetTop; + } else { + endTarget = mSpinnerOffsetEnd; + } + setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop); + mNotify = false; + startScaleUpAnimation(mRefreshListener); + } else { + setRefreshing(refreshing, false /* notify */); + } + } + + private void startScaleUpAnimation(Animation.AnimationListener listener) { + mCircleView.setVisibility(View.VISIBLE); + mProgress.setAlpha(MAX_ALPHA); + mScaleAnimation = new Animation() { + @Override + public void applyTransformation(float interpolatedTime, Transformation t) { + setAnimationProgress(interpolatedTime); + } + }; + mScaleAnimation.setDuration(mMediumAnimationDuration); + if (listener != null) { + mCircleView.setAnimationListener(listener); + } + mCircleView.clearAnimation(); + mCircleView.startAnimation(mScaleAnimation); + } + + /** + * Pre API 11, this does an alpha animation. + * @param progress + */ + void setAnimationProgress(float progress) { + mCircleView.setScaleX(progress); + mCircleView.setScaleY(progress); + } + + private void setRefreshing(boolean refreshing, final boolean notify) { + if (mRefreshing != refreshing) { + mNotify = notify; + ensureTarget(); + mRefreshing = refreshing; + if (mRefreshing) { + animateOffsetToCorrectPosition(mCurrentTargetOffsetTop, mRefreshListener); + } else { + startScaleDownAnimation(mRefreshListener); + } + } + } + + void startScaleDownAnimation(Animation.AnimationListener listener) { + mScaleDownAnimation = new Animation() { + @Override + public void applyTransformation(float interpolatedTime, Transformation t) { + setAnimationProgress(1 - interpolatedTime); + } + }; + mScaleDownAnimation.setDuration(SCALE_DOWN_DURATION); + mCircleView.setAnimationListener(listener); + mCircleView.clearAnimation(); + mCircleView.startAnimation(mScaleDownAnimation); + } + + private void startProgressAlphaStartAnimation() { + mAlphaStartAnimation = startAlphaAnimation(mProgress.getAlpha(), STARTING_PROGRESS_ALPHA); + } + + private void startProgressAlphaMaxAnimation() { + mAlphaMaxAnimation = startAlphaAnimation(mProgress.getAlpha(), MAX_ALPHA); + } + + private Animation startAlphaAnimation(final int startingAlpha, final int endingAlpha) { + Animation alpha = new Animation() { + @Override + public void applyTransformation(float interpolatedTime, Transformation t) { + mProgress.setAlpha( + (int) (startingAlpha + ((endingAlpha - startingAlpha) * interpolatedTime))); + } + }; + alpha.setDuration(ALPHA_ANIMATION_DURATION); + // Clear out the previous animation listeners. + mCircleView.setAnimationListener(null); + mCircleView.clearAnimation(); + mCircleView.startAnimation(alpha); + return alpha; + } + + /** + * @deprecated Use {@link #setProgressBackgroundColorSchemeResource(int)} + */ + @Deprecated + public void setProgressBackgroundColor(int colorRes) { + setProgressBackgroundColorSchemeResource(colorRes); + } + + /** + * Set the background color of the progress spinner disc. + * + * @param colorRes Resource id of the color. + */ + public void setProgressBackgroundColorSchemeResource(@ColorRes int colorRes) { + setProgressBackgroundColorSchemeColor(ContextCompat.getColor(getContext(), colorRes)); + } + + /** + * Set the background color of the progress spinner disc. + * + * @param color + */ + public void setProgressBackgroundColorSchemeColor(@ColorInt int color) { + mCircleView.setBackgroundColor(color); + } + + /** + * @deprecated Use {@link #setColorSchemeResources(int...)} + */ + @Deprecated + public void setColorScheme(@ColorRes int... colors) { + setColorSchemeResources(colors); + } + + /** + * Set the color resources used in the progress animation from color resources. + * The first color will also be the color of the bar that grows in response + * to a user swipe gesture. + * + * @param colorResIds + */ + public void setColorSchemeResources(@ColorRes int... colorResIds) { + final Context context = getContext(); + int[] colorRes = new int[colorResIds.length]; + for (int i = 0; i < colorResIds.length; i++) { + colorRes[i] = ContextCompat.getColor(context, colorResIds[i]); + } + setColorSchemeColors(colorRes); + } + + /** + * Set the colors used in the progress animation. The first + * color will also be the color of the bar that grows in response to a user + * swipe gesture. + * + * @param colors + */ + public void setColorSchemeColors(@ColorInt int... colors) { + ensureTarget(); + mProgress.setColorSchemeColors(colors); + } + + /** + * @return Whether the SwipeRefreshWidget is actively showing refresh + * progress. + */ + public boolean isRefreshing() { + return mRefreshing; + } + + private void ensureTarget() { + // Don't bother getting the parent height if the parent hasn't been laid + // out yet. + if (mTarget == null) { + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (!child.equals(mCircleView)) { + mTarget = child; + break; + } + } + } + } + + /** + * Set the distance to trigger a sync in dips + * + * @param distance + */ + public void setDistanceToTriggerSync(int distance) { + mTotalDragDistance = distance; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + final int width = getMeasuredWidth(); + final int height = getMeasuredHeight(); + if (getChildCount() == 0) { + return; + } + if (mTarget == null) { + ensureTarget(); + } + if (mTarget == null) { + return; + } + final View child = mTarget; + final int childLeft = getPaddingLeft(); + final int childTop = getPaddingTop(); + final int childWidth = width - getPaddingLeft() - getPaddingRight(); + final int childHeight = height - getPaddingTop() - getPaddingBottom(); + child.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight); + int circleWidth = mCircleView.getMeasuredWidth(); + int circleHeight = mCircleView.getMeasuredHeight(); + mCircleView.layout((width / 2 - circleWidth / 2), mCurrentTargetOffsetTop, + (width / 2 + circleWidth / 2), mCurrentTargetOffsetTop + circleHeight); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (mTarget == null) { + ensureTarget(); + } + if (mTarget == null) { + return; + } + mTarget.measure(MeasureSpec.makeMeasureSpec( + getMeasuredWidth() - getPaddingLeft() - getPaddingRight(), + MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec( + getMeasuredHeight() - getPaddingTop() - getPaddingBottom(), MeasureSpec.EXACTLY)); + mCircleView.measure(MeasureSpec.makeMeasureSpec(mCircleDiameter, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(mCircleDiameter, MeasureSpec.EXACTLY)); + mCircleViewIndex = -1; + // Get the index of the circleview. + for (int index = 0; index < getChildCount(); index++) { + if (getChildAt(index) == mCircleView) { + mCircleViewIndex = index; + break; + } + } + } + + /** + * Get the diameter of the progress circle that is displayed as part of the + * swipe to refresh layout. + * + * @return Diameter in pixels of the progress circle view. + */ + public int getProgressCircleDiameter() { + return mCircleDiameter; + } + + /** + * @return Whether it is possible for the child view of this layout to + * scroll up. Override this if the child view is a custom view. + */ + public boolean canChildScrollUp() { + if (mChildScrollUpCallback != null) { + return mChildScrollUpCallback.canChildScrollUp(this, mTarget); + } + if (mTarget instanceof ListView) { + return ListViewCompat.canScrollList((ListView) mTarget, -1); + } + return mTarget.canScrollVertically(-1); + } + + /** + * Set a callback to override {@link GoNativeSwipeRefreshLayout#canChildScrollUp()} method. Non-null + * callback will return the value provided by the callback and ignore all internal logic. + * @param callback Callback that should be called when canChildScrollUp() is called. + */ + public void setOnChildScrollUpCallback(@Nullable GoNativeSwipeRefreshLayout.OnChildScrollUpCallback callback) { + mChildScrollUpCallback = callback; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + ensureTarget(); + + final int action = ev.getActionMasked(); + int pointerIndex; + + if (mReturningToStart && action == MotionEvent.ACTION_DOWN) { + mReturningToStart = false; + } + + if (!isEnabled() || mReturningToStart || canChildScrollUp() + || mRefreshing || mNestedScrollInProgress || ev.getPointerCount() > 1) { + // Fail fast if we're not in a state where a swipe is possible + return false; + } + + switch (action) { + case MotionEvent.ACTION_DOWN: + setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCircleView.getTop()); + mActivePointerId = ev.getPointerId(0); + mIsBeingDragged = false; + + pointerIndex = ev.findPointerIndex(mActivePointerId); + if (pointerIndex < 0) { + return false; + } + mInitialDownY = ev.getY(pointerIndex); + mInitialDownX = ev.getX(pointerIndex); + break; + + case MotionEvent.ACTION_MOVE: + if (mActivePointerId == INVALID_POINTER) { + GNLog.getInstance().logError(LOG_TAG, "Got ACTION_MOVE event but don't have an active pointer id."); + return false; + } + + pointerIndex = ev.findPointerIndex(mActivePointerId); + if (pointerIndex < 0) { + return false; + } + + // START: modification + + float diffX = ev.getX() - mInitialDownX; + float diffY = ev.getY() - mInitialDownY; + if (Math.abs(diffY) < Math.abs(diffX)) { + // horizontal scroll + break; + } + + // END: modification + + final float y = ev.getY(pointerIndex); + startDragging(y); + break; + + case MotionEvent.ACTION_POINTER_UP: + onSecondaryPointerUp(ev); + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mIsBeingDragged = false; + mActivePointerId = INVALID_POINTER; + break; + } + + return mIsBeingDragged; + } + + @Override + public void requestDisallowInterceptTouchEvent(boolean b) { + // if this is a List < L or another view that doesn't support nested + // scrolling, ignore this request so that the vertical scroll event + // isn't stolen + if ((android.os.Build.VERSION.SDK_INT < 21 && mTarget instanceof AbsListView) + || (mTarget != null && !ViewCompat.isNestedScrollingEnabled(mTarget))) { + // Nope. + } else { + super.requestDisallowInterceptTouchEvent(b); + } + } + + // NestedScrollingParent + + @Override + public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { + return isEnabled() && !mReturningToStart && !mRefreshing + && (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + + @Override + public void onNestedScrollAccepted(View child, View target, int axes) { + // Reset the counter of how much leftover scroll needs to be consumed. + mNestedScrollingParentHelper.onNestedScrollAccepted(child, target, axes); + // Dispatch up to the nested parent + startNestedScroll(axes & ViewCompat.SCROLL_AXIS_VERTICAL); + mTotalUnconsumed = 0; + mNestedScrollInProgress = true; + } + + @Override + public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { + // If we are in the middle of consuming, a scroll, then we want to move the spinner back up + // before allowing the list to scroll + if (dy > 0 && mTotalUnconsumed > 0) { + if (dy > mTotalUnconsumed) { + consumed[1] = dy - (int) mTotalUnconsumed; + mTotalUnconsumed = 0; + } else { + mTotalUnconsumed -= dy; + consumed[1] = dy; + } + moveSpinner(mTotalUnconsumed); + } + + // If a client layout is using a custom start position for the circle + // view, they mean to hide it again before scrolling the child view + // If we get back to mTotalUnconsumed == 0 and there is more to go, hide + // the circle so it isn't exposed if its blocking content is moved + if (mUsingCustomStart && dy > 0 && mTotalUnconsumed == 0 + && Math.abs(dy - consumed[1]) > 0) { + mCircleView.setVisibility(View.GONE); + } + + // Now let our nested parent consume the leftovers + final int[] parentConsumed = mParentScrollConsumed; + if (dispatchNestedPreScroll(dx - consumed[0], dy - consumed[1], parentConsumed, null)) { + consumed[0] += parentConsumed[0]; + consumed[1] += parentConsumed[1]; + } + } + + @Override + public int getNestedScrollAxes() { + return mNestedScrollingParentHelper.getNestedScrollAxes(); + } + + @Override + public void onStopNestedScroll(View target) { + mNestedScrollingParentHelper.onStopNestedScroll(target); + mNestedScrollInProgress = false; + // Finish the spinner for nested scrolling if we ever consumed any + // unconsumed nested scroll + if (mTotalUnconsumed > 0) { + finishSpinner(mTotalUnconsumed); + mTotalUnconsumed = 0; + } + // Dispatch up our nested parent + stopNestedScroll(); + } + + @Override + public void onNestedScroll(final View target, final int dxConsumed, final int dyConsumed, + final int dxUnconsumed, final int dyUnconsumed) { + // Dispatch up to the nested parent first + dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, + mParentOffsetInWindow); + + // This is a bit of a hack. Nested scrolling works from the bottom up, and as we are + // sometimes between two nested scrolling views, we need a way to be able to know when any + // nested scrolling parent has stopped handling events. We do that by using the + // 'offset in window 'functionality to see if we have been moved from the event. + // This is a decent indication of whether we should take over the event stream or not. + final int dy = dyUnconsumed + mParentOffsetInWindow[1]; + if (dy < 0 && !canChildScrollUp()) { + mTotalUnconsumed += Math.abs(dy); + moveSpinner(mTotalUnconsumed); + } + } + + // NestedScrollingChild + + @Override + public void setNestedScrollingEnabled(boolean enabled) { + mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled); + } + + @Override + public boolean isNestedScrollingEnabled() { + return mNestedScrollingChildHelper.isNestedScrollingEnabled(); + } + + @Override + public boolean startNestedScroll(int axes) { + return mNestedScrollingChildHelper.startNestedScroll(axes); + } + + @Override + public void stopNestedScroll() { + mNestedScrollingChildHelper.stopNestedScroll(); + } + + @Override + public boolean hasNestedScrollingParent() { + return mNestedScrollingChildHelper.hasNestedScrollingParent(); + } + + @Override + public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, + int dyUnconsumed, int[] offsetInWindow) { + return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, + dxUnconsumed, dyUnconsumed, offsetInWindow); + } + + @Override + public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { + return mNestedScrollingChildHelper.dispatchNestedPreScroll( + dx, dy, consumed, offsetInWindow); + } + + @Override + public boolean onNestedPreFling(View target, float velocityX, + float velocityY) { + return dispatchNestedPreFling(velocityX, velocityY); + } + + @Override + public boolean onNestedFling(View target, float velocityX, float velocityY, + boolean consumed) { + return dispatchNestedFling(velocityX, velocityY, consumed); + } + + @Override + public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { + return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); + } + + @Override + public boolean dispatchNestedPreFling(float velocityX, float velocityY) { + return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY); + } + + private boolean isAnimationRunning(Animation animation) { + return animation != null && animation.hasStarted() && !animation.hasEnded(); + } + + private void moveSpinner(float overscrollTop) { + mProgress.setArrowEnabled(true); + float originalDragPercent = overscrollTop / mTotalDragDistance; + + float dragPercent = Math.min(1f, Math.abs(originalDragPercent)); + float adjustedPercent = (float) Math.max(dragPercent - .4, 0) * 5 / 3; + float extraOS = Math.abs(overscrollTop) - mTotalDragDistance; + float slingshotDist = mCustomSlingshotDistance > 0 + ? mCustomSlingshotDistance + : (mUsingCustomStart + ? mSpinnerOffsetEnd - mOriginalOffsetTop + : mSpinnerOffsetEnd); + float tensionSlingshotPercent = Math.max(0, Math.min(extraOS, slingshotDist * 2) + / slingshotDist); + float tensionPercent = (float) ((tensionSlingshotPercent / 4) - Math.pow( + (tensionSlingshotPercent / 4), 2)) * 2f; + float extraMove = (slingshotDist) * tensionPercent * 2; + + int targetY = mOriginalOffsetTop + (int) ((slingshotDist * dragPercent) + extraMove); + // where 1.0f is a full circle + if (mCircleView.getVisibility() != View.VISIBLE) { + mCircleView.setVisibility(View.VISIBLE); + } + if (!mScale) { + mCircleView.setScaleX(1f); + mCircleView.setScaleY(1f); + } + + if (mScale) { + setAnimationProgress(Math.min(1f, overscrollTop / mTotalDragDistance)); + } + if (overscrollTop < mTotalDragDistance) { + if (mProgress.getAlpha() > STARTING_PROGRESS_ALPHA + && !isAnimationRunning(mAlphaStartAnimation)) { + // Animate the alpha + startProgressAlphaStartAnimation(); + } + } else { + if (mProgress.getAlpha() < MAX_ALPHA && !isAnimationRunning(mAlphaMaxAnimation)) { + // Animate the alpha + startProgressAlphaMaxAnimation(); + } + } + float strokeStart = adjustedPercent * .8f; + mProgress.setStartEndTrim(0f, Math.min(MAX_PROGRESS_ANGLE, strokeStart)); + mProgress.setArrowScale(Math.min(1f, adjustedPercent)); + + float rotation = (-0.25f + .4f * adjustedPercent + tensionPercent * 2) * .5f; + mProgress.setProgressRotation(rotation); + setTargetOffsetTopAndBottom(targetY - mCurrentTargetOffsetTop); + } + + private void finishSpinner(float overscrollTop) { + if (overscrollTop > mTotalDragDistance) { + setRefreshing(true, true /* notify */); + } else { + // cancel refresh + mRefreshing = false; + mProgress.setStartEndTrim(0f, 0f); + Animation.AnimationListener listener = null; + if (!mScale) { + listener = new Animation.AnimationListener() { + + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + if (!mScale) { + startScaleDownAnimation(null); + } + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + + }; + } + animateOffsetToStartPosition(mCurrentTargetOffsetTop, listener); + mProgress.setArrowEnabled(false); + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + final int action = ev.getActionMasked(); + int pointerIndex = -1; + + if (mReturningToStart && action == MotionEvent.ACTION_DOWN) { + mReturningToStart = false; + } + + if (!isEnabled() || mReturningToStart || canChildScrollUp() + || mRefreshing || mNestedScrollInProgress) { + // Fail fast if we're not in a state where a swipe is possible + return false; + } + + switch (action) { + case MotionEvent.ACTION_DOWN: + mActivePointerId = ev.getPointerId(0); + mIsBeingDragged = false; + break; + + case MotionEvent.ACTION_MOVE: { + pointerIndex = ev.findPointerIndex(mActivePointerId); + if (pointerIndex < 0) { + GNLog.getInstance().logError(LOG_TAG, "Got ACTION_MOVE event but have an invalid active pointer id."); + return false; + } + + // START: modification + + float diffX = ev.getX() - mInitialDownX; + float diffY = ev.getY() - mInitialDownY; + if (Math.abs(diffY) < Math.abs(diffX)) { + // horizontal scroll + break; + } + + // END: modification + + final float y = ev.getY(pointerIndex); + startDragging(y); + + if (mIsBeingDragged) { + final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE; + if (overscrollTop > 0) { + moveSpinner(overscrollTop); + } else { + return false; + } + } + break; + } + case MotionEvent.ACTION_POINTER_DOWN: { + pointerIndex = ev.getActionIndex(); + if (pointerIndex < 0) { + GNLog.getInstance().logError(LOG_TAG, + "Got ACTION_POINTER_DOWN event but have an invalid action index."); + return false; + } + mActivePointerId = ev.getPointerId(pointerIndex); + break; + } + + case MotionEvent.ACTION_POINTER_UP: + onSecondaryPointerUp(ev); + break; + + case MotionEvent.ACTION_UP: { + pointerIndex = ev.findPointerIndex(mActivePointerId); + if (pointerIndex < 0) { + GNLog.getInstance().logError(LOG_TAG, "Got ACTION_UP event but don't have an active pointer id."); + return false; + } + + if (mIsBeingDragged) { + final float y = ev.getY(pointerIndex); + final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE; + mIsBeingDragged = false; + finishSpinner(overscrollTop); + } + mActivePointerId = INVALID_POINTER; + return false; + } + case MotionEvent.ACTION_CANCEL: + return false; + } + + return true; + } + + private void startDragging(float y) { + final float yDiff = y - mInitialDownY; + if (yDiff > mTouchSlop && !mIsBeingDragged) { + mInitialMotionY = mInitialDownY + mTouchSlop; + mIsBeingDragged = true; + mProgress.setAlpha(STARTING_PROGRESS_ALPHA); + } + } + + private void animateOffsetToCorrectPosition(int from, Animation.AnimationListener listener) { + mFrom = from; + mAnimateToCorrectPosition.reset(); + mAnimateToCorrectPosition.setDuration(ANIMATE_TO_TRIGGER_DURATION); + mAnimateToCorrectPosition.setInterpolator(mDecelerateInterpolator); + if (listener != null) { + mCircleView.setAnimationListener(listener); + } + mCircleView.clearAnimation(); + mCircleView.startAnimation(mAnimateToCorrectPosition); + } + + private void animateOffsetToStartPosition(int from, Animation.AnimationListener listener) { + if (mScale) { + // Scale the item back down + startScaleDownReturnToStartAnimation(from, listener); + } else { + mFrom = from; + mAnimateToStartPosition.reset(); + mAnimateToStartPosition.setDuration(ANIMATE_TO_START_DURATION); + mAnimateToStartPosition.setInterpolator(mDecelerateInterpolator); + if (listener != null) { + mCircleView.setAnimationListener(listener); + } + mCircleView.clearAnimation(); + mCircleView.startAnimation(mAnimateToStartPosition); + } + } + + private final Animation mAnimateToCorrectPosition = new Animation() { + @Override + public void applyTransformation(float interpolatedTime, Transformation t) { + int targetTop = 0; + int endTarget = 0; + if (!mUsingCustomStart) { + endTarget = mSpinnerOffsetEnd - Math.abs(mOriginalOffsetTop); + } else { + endTarget = mSpinnerOffsetEnd; + } + targetTop = (mFrom + (int) ((endTarget - mFrom) * interpolatedTime)); + int offset = targetTop - mCircleView.getTop(); + setTargetOffsetTopAndBottom(offset); + mProgress.setArrowScale(1 - interpolatedTime); + } + }; + + void moveToStart(float interpolatedTime) { + int targetTop = 0; + targetTop = (mFrom + (int) ((mOriginalOffsetTop - mFrom) * interpolatedTime)); + int offset = targetTop - mCircleView.getTop(); + setTargetOffsetTopAndBottom(offset); + } + + private final Animation mAnimateToStartPosition = new Animation() { + @Override + public void applyTransformation(float interpolatedTime, Transformation t) { + moveToStart(interpolatedTime); + } + }; + + private void startScaleDownReturnToStartAnimation(int from, + Animation.AnimationListener listener) { + mFrom = from; + mStartingScale = mCircleView.getScaleX(); + mScaleDownToStartAnimation = new Animation() { + @Override + public void applyTransformation(float interpolatedTime, Transformation t) { + float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); + setAnimationProgress(targetScale); + moveToStart(interpolatedTime); + } + }; + mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); + if (listener != null) { + mCircleView.setAnimationListener(listener); + } + mCircleView.clearAnimation(); + mCircleView.startAnimation(mScaleDownToStartAnimation); + } + + void setTargetOffsetTopAndBottom(int offset) { + mCircleView.bringToFront(); + ViewCompat.offsetTopAndBottom(mCircleView, offset); + mCurrentTargetOffsetTop = mCircleView.getTop(); + } + + private void onSecondaryPointerUp(MotionEvent ev) { + final int pointerIndex = ev.getActionIndex(); + final int pointerId = ev.getPointerId(pointerIndex); + if (pointerId == mActivePointerId) { + // This was our active pointer going up. Choose a new + // active pointer and adjust accordingly. + final int newPointerIndex = pointerIndex == 0 ? 1 : 0; + mActivePointerId = ev.getPointerId(newPointerIndex); + } + } + + /** + * Classes that wish to be notified when the swipe gesture correctly + * triggers a refresh should implement this interface. + */ + public interface OnRefreshListener { + /** + * Called when a swipe gesture triggers a refresh. + */ + void onRefresh(); + } + + /** + * Classes that wish to override {@link GoNativeSwipeRefreshLayout#canChildScrollUp()} method + * behavior should implement this interface. + */ + public interface OnChildScrollUpCallback { + /** + * Callback that will be called when {@link GoNativeSwipeRefreshLayout#canChildScrollUp()} method + * is called to allow the implementer to override its behavior. + * + * @param parent SwipeRefreshLayout that this callback is overriding. + * @param child The child view of SwipeRefreshLayout. + * + * @return Whether it is possible for the child view of parent layout to scroll up. + */ + boolean canChildScrollUp(@NonNull GoNativeSwipeRefreshLayout parent, @Nullable View child); + } +} diff --git a/app/src/main/java/co/median/android/widget/HandleView.kt b/app/src/main/java/co/median/android/widget/HandleView.kt new file mode 100644 index 0000000..c497d04 --- /dev/null +++ b/app/src/main/java/co/median/android/widget/HandleView.kt @@ -0,0 +1,155 @@ +package co.median.android.widget + +import android.animation.ArgbEvaluator +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.widget.ImageView +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.core.content.res.ResourcesCompat +import co.median.android.R + +class HandleView : RelativeLayout { + private val iconView: ImageView + private val textView: TextView + + init { + inflate(context, R.layout.view_handle, this) + iconView = findViewById(R.id.icon) + textView = findViewById(R.id.text) + } + + @JvmOverloads + constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 + ) : super(context, attrs, defStyle) { + context.theme.obtainStyledAttributes(attrs, R.styleable.HandleView, 0, 0).apply { + val backgroundDrawable = getDrawable(R.styleable.HandleView_handleBackground) + ?: ResourcesCompat.getDrawable( + resources, + R.drawable.shape_rounded, + context.theme + ) + val iconDrawable = getDrawable(R.styleable.HandleView_iconDrawable) + val text = getString(R.styleable.HandleView_text) + val inactiveColor = getColor(R.styleable.HandleView_inactiveColor, inactiveColor) + val activeColor = getColor(R.styleable.HandleView_activeColor, activeColor) + initView(backgroundDrawable, iconDrawable, text, inactiveColor, activeColor) + } + } + + constructor( + context: Context, + backgroundDrawable: Drawable?, + iconDrawable: Drawable?, + text: String?, + @ColorInt inactiveColor: Int, + @ColorInt activeColor: Int, + ) : super(context, null, 0) { + initView(backgroundDrawable, iconDrawable, text, inactiveColor, activeColor) + } + + var maxTextWidth: Int = Int.MIN_VALUE + var inactiveColor: Int = Color.WHITE + var activeColor: Int = Color.WHITE + + fun initView( + backgroundDrawable: Drawable?, + iconDrawable: Drawable?, + text: String?, + @ColorInt inactiveColor: Int, + @ColorInt activeColor: Int + ) { + background = backgroundDrawable + iconView.setImageDrawable(iconDrawable) + setText(text) + textView.layoutParams.let { + it.width = 0 + textView.layoutParams = it + } + + this.inactiveColor = inactiveColor + this.activeColor = activeColor + iconView.setColorFilter(inactiveColor) + } + + fun setText(text: String?) { + textView.layoutParams.width = LayoutParams.WRAP_CONTENT + textView.text = text + textView.measure( + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED) + ) + maxTextWidth = textView.measuredWidth + textView.layoutParams.let { + it.width = 0 + textView.layoutParams = it + } + } + + fun animateShowText() { + if (textView.text.isEmpty()) { + return + } + if (textView.layoutParams.width != 0) { + textView.layoutParams.let { + it.width = 0 + textView.layoutParams = it + } + } + val animator = ValueAnimator.ofInt(0, maxTextWidth) + animator.addUpdateListener { anim -> + val value = anim.animatedValue as Int + textView.layoutParams.let { + it.width = value + textView.layoutParams = it + } + } + animator.duration = 300 + animator.start() + } + + fun animateHideText() { + if (textView.text.isEmpty()) { + return + } + val animator = ValueAnimator.ofInt(maxTextWidth, 0) + animator.duration = 300 + animator.addUpdateListener { anim -> + val value = anim.animatedValue as Int + val params = textView.layoutParams + params.width = value + textView.layoutParams = params + } + animator.start() + } + + fun animateActive() { + val animator = ValueAnimator.ofObject(ArgbEvaluator(), inactiveColor, activeColor) + animator.addUpdateListener { anim -> + val color = anim.animatedValue as Int + textView.setTextColor(color) + iconView.setColorFilter(color, PorterDuff.Mode.SRC_IN) + } + animator.duration = 100 + animator.start() + } + + fun animateInactive() { + val animator = ValueAnimator.ofObject(ArgbEvaluator(), activeColor, inactiveColor) + animator.addUpdateListener { anim -> + val color = anim.animatedValue as Int + textView.setTextColor(color) + iconView.setColorFilter(color, PorterDuff.Mode.SRC_IN) + } + animator.duration = 200 + animator.start() + } +} \ No newline at end of file diff --git a/app/src/main/java/co/median/android/widget/SwipeHistoryNavigationLayout.kt b/app/src/main/java/co/median/android/widget/SwipeHistoryNavigationLayout.kt new file mode 100644 index 0000000..23eaeea --- /dev/null +++ b/app/src/main/java/co/median/android/widget/SwipeHistoryNavigationLayout.kt @@ -0,0 +1,474 @@ +package co.median.android.widget; + +import android.animation.ObjectAnimator +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Canvas +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.util.DisplayMetrics +import android.view.Gravity +import android.view.MotionEvent +import android.view.View +import android.widget.EdgeEffect +import android.widget.FrameLayout +import androidx.core.content.res.ResourcesCompat +import androidx.core.view.ViewCompat +import co.median.android.R +import kotlin.math.abs +import kotlin.math.atan2 +import kotlin.math.max +import kotlin.math.min + +class SwipeHistoryNavigationLayout : FrameLayout { + private val leftHandleView: HandleView + private val rightHandleView: HandleView + private val rightEdgeEffect: EdgeEffect + + // Styleable properties + private val iconWidth: Float = resources.getDimension(R.dimen.handle_icon_size) + private val iconWidthInDp: Float = iconWidth / (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT) + private val backgroundDrawable: Drawable? + private val leftEdgeDrawable: Drawable? + private val rightEdgeDrawable: Drawable? + private val firstText: String + private val inactiveColor: Int + private var activeColor: Int + // end Styleable properties + + private var leftHandleFirstPos: Float = Float.NaN + private var rightHandleFirstPos: Float = Float.NaN + + /** + * Left edge touch detection width. + */ + private var leftEdgeWidth = Float.NaN + + /** + * Right edge touch detection width. + */ + private var rightEdgeWidth = Float.NaN + + /** + * Swipeable width. + */ + private var swipeableWidth = Float.NaN + + /** + * Percentage of screen edges to be judged. + */ + private var edgePer = 5 / 100f + + /** + * Ratio of swipeable width to screen width.. + */ + private var swipeablePer = 16 / 100f + + /** + * Swipe distance threshold before triggering. + */ + private var swipeTriggerThreshold = 80f + + /** + * Swipe distance threshold from edge to calculate diagonal motion. + */ + private var swipeEdgeThreshold = 30f + + private var firstTouchX: Int = Int.MIN_VALUE + private var isSwipingLeftEdge = false + private var isSwipingRightEdge = false + private var isTouchInProgress = false + + private var lastTouchX: Float = Float.NaN + private var oldDeltaX: Float = Float.NaN + private var deltaX: Float = Float.NaN + private var isSwipeReachesLimit = false + + private var pointX = 0f + private var pointY = 0f + private var inMotion = false + + @JvmOverloads + constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 + ) : super(context, attrs, defStyle) { + context.theme.obtainStyledAttributes(attrs, R.styleable.SwipeHistoryNavigationLayout, 0, 0) + .apply { + backgroundDrawable = + getDrawable(R.styleable.SwipeHistoryNavigationLayout_handleBackground) + leftEdgeDrawable = + getDrawable(R.styleable.SwipeHistoryNavigationLayout_leftHandleDrawable) + ?: ResourcesCompat.getDrawable( + resources, + R.drawable.ic_baseline_arrow_back_24, + context.theme + ) + rightEdgeDrawable = + getDrawable(R.styleable.SwipeHistoryNavigationLayout_rightHandleDrawable) + ?: ResourcesCompat.getDrawable( + resources, + R.drawable.ic_baseline_arrow_forward_24, + context.theme + ) + firstText = + getString(R.styleable.SwipeHistoryNavigationLayout_leftHandleLabel) ?: "" + inactiveColor = getColor( + R.styleable.SwipeHistoryNavigationLayout_inactiveColor, + ResourcesCompat.getColor(resources, R.color.swipe_nav_inactive, context.theme) + ) + activeColor = getColor( + R.styleable.SwipeHistoryNavigationLayout_activeColor, + ResourcesCompat.getColor(resources, R.color.swipe_nav_active, context.theme) + ) + } + + leftHandleView = HandleView( + context, + backgroundDrawable, + leftEdgeDrawable, + firstText, + inactiveColor, + activeColor + ) + rightHandleView = HandleView( + context, + backgroundDrawable, + rightEdgeDrawable, + "", + inactiveColor, + activeColor + ) + rightEdgeEffect = EdgeEffect(context) + setWillNotDraw(false) + } + + @SuppressLint("RtlHardcoded") + override fun onFinishInflate() { + super.onFinishInflate() + val leftParams = LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT, + Gravity.CENTER_VERTICAL or Gravity.LEFT + ) + addView(leftHandleView, leftParams) + addView( + rightHandleView, LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT, + Gravity.CENTER_VERTICAL + ) + ) + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + if (changed) { + leftHandleView.let { + leftHandleFirstPos = -iconWidth + it.translationX = leftHandleFirstPos + } + rightHandleView.let { + rightHandleFirstPos = width + iconWidth + it.translationX = rightHandleFirstPos + } + + leftEdgeWidth = width.toFloat() * edgePer + rightEdgeWidth = width - leftEdgeWidth + swipeableWidth = width.toFloat() * swipeablePer + } + } + + override fun isNestedScrollingEnabled(): Boolean { + return true + } + + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + if (!swipeNavListener.isSwipeEnabled()) { + return false + } + + when (ev?.action) { + MotionEvent.ACTION_DOWN -> { + inMotion = false + pointX = ev.x + pointY = ev.y + + if (isLeftEdge(ev.x) && swipeNavListener.canSwipeLeftEdge()) { + isSwipingLeftEdge = true + firstTouchX = ev.x.toInt() + leftEdgeGrabbed() + } else if (isRightEdge(ev.x) && swipeNavListener.canSwipeRightEdge()) { + isSwipingRightEdge = true + firstTouchX = width + rightEdgeGrabbed() + } + } + MotionEvent.ACTION_MOVE -> { + + val diffX = abs(pointX - ev.x) + val diffY = abs(pointY - ev.y) + + if (isTouchInProgress) { + return true + } + + return if ((isSwipingLeftEdge || isSwipingRightEdge) && ((diffX > swipeEdgeThreshold) || (diffY > swipeEdgeThreshold)) && !inMotion) { + inMotion = true + val angle = atan2(diffY, diffX) + if (angle > Math.PI/6) { + false + } else { + isTouchInProgress = true + parent.requestDisallowInterceptTouchEvent(true) + true + } + } else { + false + } + } + MotionEvent.ACTION_UP -> { + pointX = 0f + pointY = 0f + isSwipingLeftEdge = false + isSwipingRightEdge = false + if (isTouchInProgress) { + return true + } + } + } + + return super.onInterceptTouchEvent(ev) + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(ev: MotionEvent?): Boolean { + var needsInvalidate = false + when (ev?.action) { + MotionEvent.ACTION_MOVE -> { + lastTouchX = ev.x + oldDeltaX = deltaX + deltaX = abs(lastTouchX - firstTouchX) + + if (isSwipingLeftEdge && swipeNavListener.isSwipeEnabled() && (deltaX >= swipeEdgeThreshold)) { + moveLeftHandle() + } else if (isSwipingRightEdge && swipeNavListener.isSwipeEnabled() && (deltaX >= swipeEdgeThreshold)) { + if (swipeNavListener.canSwipeRightEdge()) { + moveRightHandle() + } else if (deltaX > oldDeltaX) { + val over = abs(deltaX - oldDeltaX) + rightEdgeEffect.onPull(over / width) + needsInvalidate = true + } + } + + if (deltaX > (swipeableWidth + swipeTriggerThreshold + iconWidthInDp)) { + if (!isSwipeReachesLimit) { + isSwipeReachesLimit = true + swipeReachesLimit() + } + } else { + if (isSwipeReachesLimit) { + isSwipeReachesLimit = false + leaveHandle() + } + } + } + MotionEvent.ACTION_UP -> { + needsInvalidate = releaseSwipe() + parent.requestDisallowInterceptTouchEvent(false) + } + } + + if (needsInvalidate) { + ViewCompat.postInvalidateOnAnimation(this); + } + + return super.onTouchEvent(ev) + } + + + private fun isLeftEdge(x: Float) = x <= leftEdgeWidth + private fun isRightEdge(x: Float) = x >= rightEdgeWidth + + private fun isTouchedEdge(ev: MotionEvent?): Boolean { + // Do not intercept the edges when edge swiping is disabled + + return ev?.action == MotionEvent.ACTION_DOWN && ( + (isLeftEdge(ev.x) && swipeNavListener.canSwipeLeftEdge()) + || (isRightEdge(ev.x) && swipeNavListener.canSwipeRightEdge())) + && swipeNavListener.isSwipeEnabled() + } + + private fun moveLeftHandle() { + leftHandleView.let { + val value = (deltaX - swipeEdgeThreshold) - firstTouchX - iconWidth + it.translationX = min(value, swipeableWidth - iconWidth) + } + } + + private fun moveRightHandle() { + rightHandleView.let { + val value = firstTouchX - (deltaX - swipeEdgeThreshold) + iconWidth / 2 + it.translationX = max(value, width - swipeableWidth) + } + } + + private fun leftEdgeGrabbed() { + leftHandleView.setText(swipeNavListener.getGoBackLabel()) + } + + private fun rightEdgeGrabbed() { + } + + private fun releaseSwipe(): Boolean { + rightEdgeEffect.onRelease() + + if (isSwipingLeftEdge) { + if (isSwipeReachesLimit) { + leaveHandle() + swipeNavListener.navigateBack() + } + leftHandleView.let { + val animator = ObjectAnimator.ofFloat( + it, + View.TRANSLATION_X, + it.translationX, + leftHandleFirstPos + ) + animator.duration = 400 + animator.start() + } + } else if (isSwipingRightEdge) { + if (isSwipeReachesLimit) { + leaveHandle() + swipeNavListener.navigateForward() + } + rightHandleView.let { + val animator = ObjectAnimator.ofFloat( + it, + View.TRANSLATION_X, + it.translationX, + rightHandleFirstPos + ) + animator.duration = 400 + animator.start() + } + } + isSwipingLeftEdge = false + isSwipingRightEdge = false + isSwipeReachesLimit = false + isTouchInProgress = false + return rightEdgeEffect.isFinished + } + + private fun swipeReachesLimit() { + if (isSwipingLeftEdge && swipeNavListener.canSwipeLeftEdge()) { + swipeNavListener.leftSwipeReachesLimit() + leftHandleView.animateActive() + leftHandleView.animateShowText() + } else if (isSwipingRightEdge && swipeNavListener.canSwipeRightEdge()) { + swipeNavListener.rightSwipeReachesLimit() + rightHandleView.animateActive() + rightHandleView.animateShowText() + } + } + + private fun leaveHandle() { + if (isSwipingLeftEdge) { + leftHandleView.animateInactive() + leftHandleView.animateHideText() + } else if (isSwipingRightEdge) { + rightHandleView.animateInactive() + rightHandleView.animateHideText() + } + } + + fun setActiveColor(color: Int) { + activeColor = color; + rightHandleView.activeColor = color; + leftHandleView.activeColor = color; + } + + override fun draw(canvas: Canvas) { + super.draw(canvas) + var needsInvalidate = false + if (overScrollMode == OVER_SCROLL_ALWAYS || overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS) { + if (!rightEdgeEffect.isFinished) { + canvas.let { + val restoreCount: Int = canvas.save() + val width: Int = width + val height: Int = height - paddingTop - paddingBottom + + canvas.rotate(90f) + canvas.translate(paddingTop.toFloat(), -width.toFloat()) + rightEdgeEffect.setSize(height, width) + needsInvalidate = needsInvalidate or rightEdgeEffect.draw(canvas) + canvas.restoreToCount(restoreCount) + } + + } + } else { + rightEdgeEffect.finish() + } + if (needsInvalidate) { + // Keep animating + ViewCompat.postInvalidateOnAnimation(this); + } + } + + var swipeNavListener: OnSwipeNavListener = object : OnSwipeNavListener { + override fun canSwipeLeftEdge(): Boolean = true + override fun canSwipeRightEdge(): Boolean = true + override fun getGoBackLabel(): String = "" + override fun navigateBack(): Boolean = true + override fun navigateForward(): Boolean = true + override fun leftSwipeReachesLimit() {} + override fun rightSwipeReachesLimit() {} + override fun isSwipeEnabled(): Boolean = true + } + + interface OnSwipeNavListener { + /** + * Return true if left-edge swipe is to be enabled. + */ + fun canSwipeLeftEdge(): Boolean + + /** + * Return true if right-edge swipe is to be enabled. + */ + fun canSwipeRightEdge(): Boolean + + /** + * Called when you grab the left edge. + * Text to be displayed when swiping to the limit. + */ + fun getGoBackLabel(): String + + /** + * Implement the page back operation. + */ + fun navigateBack(): Boolean + + /** + * Implement the page forward operation. + */ + fun navigateForward(): Boolean + + /** + * Called when the movement of the left-edge swipe reaches its limit. + */ + fun leftSwipeReachesLimit() + + /** + * Called when the movement of the right-edge swipe reaches its limit. + */ + fun rightSwipeReachesLimit() + + /** + * Return true if swipe edge to navigate is enabled + */ + fun isSwipeEnabled(): Boolean + } +} \ No newline at end of file diff --git a/app/src/main/java/co/median/android/widget/WebViewContainerView.java b/app/src/main/java/co/median/android/widget/WebViewContainerView.java new file mode 100644 index 0000000..61ebeee --- /dev/null +++ b/app/src/main/java/co/median/android/widget/WebViewContainerView.java @@ -0,0 +1,81 @@ +package co.median.android.widget; + +import android.app.Activity; +import android.content.Context; +import android.util.AttributeSet; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import co.median.android.LeanWebView; +import co.median.android.MainActivity; +import co.median.android.WebViewSetup; +import co.median.median_core.AppConfig; +import co.median.median_core.Bridge; +import co.median.median_core.GoNativeWebviewInterface; +import co.median.android.GoNativeApplication; + +public class WebViewContainerView extends FrameLayout { + + private ViewGroup webview; + private boolean isGecko = false; + + public WebViewContainerView(@NonNull Context context) { + super(context); + } + + public WebViewContainerView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initializeWebview(context); + } + + public WebViewContainerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initializeWebview(context); + } + + private void initializeWebview(Context context) { + AppConfig appConfig = AppConfig.getInstance(context); + + if (appConfig.geckoViewEnabled) { + try { + Class classGecko = Class.forName("co.median.plugins.android.gecko.GNGeckoView"); + Constructor consGecko = classGecko.getConstructor(Context.class); + webview = (ViewGroup) consGecko.newInstance(context); + this.isGecko = true; + } catch (Exception e) { + e.printStackTrace(); + } + } else { + webview = new LeanWebView(context); + } + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + webview.setLayoutParams(layoutParams); + this.addView(webview); + } + + public void setupWebview(MainActivity activity, boolean isRoot) { + if (isGecko) { + try { + Class geckoSetupClass = Class.forName("co.median.plugins.android.gecko.WebViewSetup"); + Method setupWebview = geckoSetupClass.getMethod("setupWebviewForActivity", Activity.class, GoNativeWebviewInterface.class, Bridge.class, boolean.class); + setupWebview.invoke(geckoSetupClass, activity, (GoNativeWebviewInterface) webview, ((GoNativeApplication) activity.getApplication()).mBridge, isRoot); + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + e.printStackTrace(); + } + } else { + WebViewSetup.setupWebviewForActivity(getWebview(), activity); + } + } + + public GoNativeWebviewInterface getWebview() { + return (GoNativeWebviewInterface) webview; + } + +} diff --git a/app/src/main/res/anim/fast_fade_out.xml b/app/src/main/res/anim/fast_fade_out.xml new file mode 100644 index 0000000..c1d89d7 --- /dev/null +++ b/app/src/main/res/anim/fast_fade_out.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/drawable-hdpi/drawer_shadow.9.png b/app/src/main/res/drawable-hdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..236bff558af07faa3921ba35e2515edf62d04bb9 GIT binary patch literal 161 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_chevron_down_light.png b/app/src/main/res/drawable-hdpi/ic_chevron_down_light.png new file mode 100644 index 0000000000000000000000000000000000000000..8f314184d1a1da4afb7862f76c9491fbcabf14ca GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAl?M2PxB_YVgUZO-2%xQMB|(0{ z3_N`N;!@J8TG~d=uHHVeDQT5WoA(?(b>Z5bhfkls`tt4j&)km9N=>f#tx_zXj#D|J!dAcjDMm%V1ogeerk2hib-?vn{ypbWEJgen9qwmKr}o)+12hh0jNyW1&W;U6f>JYD@<);T3K0RZcYVeS9` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_chevron_up_light.png b/app/src/main/res/drawable-hdpi/ic_chevron_up_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c48c2aaf26f8061acb027727d9c0cf331818e8 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAl?M2PxB_YVgUZO-2%xQMB|(0{ z3_N`N;!@J8TG~d=uHHVeDQT6>oA(?(b>Z5bhfklq`tt4j&)ba4!k zkUV>kQ^<*dq3z=RX&zo>sn2)+7c@R*lFR;K-nVleLeBLOnoFkD&5-Oqb4A=bed_IB z1sV+&Y+cRwEL6{!zch1x`Qqr>gk4#Ma~BkC{rJwnEy`8-j_uk$Qy%eLJ!YG}s2{vv y()Z4(&ZzNR-e-1Y_J*a_nS$3E?N~}z%&lVj(ahZ=U!Z*t6l$KXelF{r5}E+G4r7u4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_notification.png b/app/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbe8ba0f668e63e50f37fcf4e39e380291c2df5 GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBSkfJR9T^xl_H+M9WCikFQX@Rm ze0>?TfNTy1#`a7G79fieh^2s-fq{7eBLg##W(0{XV1mo4EMP{kK?=3_9{*urU`p_G zaSVyzd^^qGLo`sN{ptsQEywPfF1?cJvky2lU76~{t;iZEa@U2Mn`hD7bw^ugE3w3K zTnuY<(GtJt#KL;eNzn1GhoII}ftex^m&;S~V)TqZzdKXQAGL>B{`;Nc^FQZ4E_GAa z*H7Omed2DzZ{CV|;R4HqsszFw2&GRbl5kvn)m2@2E6*iXX@zSu1TU&6U6P4AC9ykMIXCnX~^M-1oSmvx?(lw*ia%fi1>N{0V1l z66$$E18;3SFObu2%CYG^i}gbOCuTmkl>#JoX9h4jT~9doX2IL1Yj<&8f9TTv`km8+ zvNaM}niA|kUmnhx+`Kw~^LL`>k>kmx*C%W0wK;ZV9oYDtEoFjIM3ctu#osr43*5uH zI`GuLo5k0R1k>hjJCVOl?vVIe=aPF)5kXIMt^P+P)T%U^eCz!@YX|em&r0>*!XKEk z-1KkyKGk5~p3?nILcKTmekX;BXD{8rFe`zJ&*7%{oZDVJ`{nqqCeA7iylT1DWFq@F zxfAO@-H(s_bNT~c&fCt*3V}y`0+@`qP5x2Y960Nh&P(+iX{NhgM~d!lJ?U+A;pghS z%LmR|rrzCt(%))AddL2>dhuxoZ6;rFwh&U+K4yGzv90~>ADWp*X7THO;CW)dd(-wv zNtez`uDoAF_d6c_I<-QV=dhg5t8~flnHRV}RbHIxH)oD_z+AoaFXyl^Pxzakd|Oj; m8I#fHg{ikqrhngm??C)2xn3!uv^_4MH0SB+=d#Wzp$PyE`8S>b literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..27cddedd6684217db1673d05e175ff7e44ccbdfc GIT binary patch literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP~vldPl&6WXWocH|NsBj z=w3bx=zaf^AirP+rK;V}e*JmAN3n7B-{ta6v0pz&Hkbd~8qLb0uyfZHQ=2>7f=^a8 zusw}QSYNq4$J|-CRreoC;AF|o7TYO#-D-&H%F z?8MY$U?`}TxJHzuB$lLFB^RXvDF!10BST#Sb6o?|5JO`tBQq-l18oBXAQ_h;5Qw57 cH$NpatrE8eeajVZff^V*UHx3vIVCg!0Fpi@zW@LL literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1e0668ba547bf8d23666ea0573b3f7d929fcbc03 GIT binary patch literal 900 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N&59fKQ04lmPdLLjV8&PkD0@7(@*IB|(0{3`$kI zpZ)ste2-$|>c7k7n_|Cyj%+Ufw>6rTMPcWzE2cJgxCNiAYG8XBld!&Wdycua_{wWM zd^hKO*>~`rgr$GUjyPrZjHnO6a*L!N|16bt$g?;LG@3EV+ubGLah}f}AcwQSBeIx* zfm;}a85w5HkpK#^mw5WRvcF(vW;N10b^k>>Q0SMZi(`m{NInrsY9OUf}p9%watb*BQ!g%m~7m6)O=@-^U`H2d6JEO<`jkc zs{T-%EdOa%*P{uV46MFyK6o!vh?u3$;(AuNY1gxxtn;679++qI?V-am=Zq7|4DLo# zb1bHL3p=S7S+<5nxA}>mdm?7v-n~uDYI;GbZa>q7T@x4IWc?jx{7z!$`>*n^{>Dk3 zuzkhvpUHDx|JUX0Gsgt$s;}2Sy7?)=LdL|-ZmY#UhJ9D44UB;(#K6?b)WFKbP}{)3%D`aCv%A|+H00)|WTsUjG#G{$8e18f wTN#)@G~8}8PXTJsfZI@#nVVW%l9*e7(1UKtrgbh?fqED`UHx3vIVCg!0LCK(N&o-= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_search_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_search_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..85bbd67b1b22cacc9f225d6827b9f9e3b30a2dba GIT binary patch literal 779 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP-0_%Pl&6WXWkG(|Ns9l ze^D?I=y=PLAirP+snD{TOe+@W{r_II@Nvw4YPa{#fk}^kcrBM>414iKy;|nB&M%vp z(=IEe@3@xR{y~7hfQfzkwyj&L?Gw|1hA<|1ySrHVaUKDM6K8=(WHAE+w=f7ZGR&GI z0Tg5}@$_|Nf6C6vE5&#qFmx?Y=&z@XV~B+0)q~+>O#uw97qgG{u~hfoI4V}#mHtoI zJF;`vga`SXw*TAVVl?$!itf=9Pq}Nfrk(obdi2?gp1l((KeKlH<~UrD)*%}N%& zGtSJ}v^8ceFVdQ I&MBb@081Vct^fc4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_search_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_search_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f77deb3f92f282af39c8ce7ca0a928956ff494 GIT binary patch literal 815 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4NziZfKQ04lmPb-LjV8&XL@vaFVOLpB|(0{3{s(G zHJMf{&intpYT@IU|I}{pp97N~{qR~Y#~AkFi+Z)pZJl2>GpAivO5brUxBY_ve*qKw z_HA3YRNE(}0}WwJ@^*Kz^5Z-L3MbA2kH}&M25w;xW@MN(M*=9wUgGKN%Kn0xnbk=1 z)cqIjK%u{$E{-7*l2;Fgmo)`2xL(XY+Q(Aed*i5BZCCm~VeiP!T@xPUZ`%HEhl|nF zb1Aw z|I>wQS1Xu;TUEJs$lg7Zux^9Om6GF)t%rgFuFo~%5t-ID>0QJFEgj}V`c%D1^_TTijD=_N{|Jb-W(59G)X>r9f9u~KcXC!w>95rT~ za7|e4LDH8VPwBt;@0;)F$X47vS_%vZ)e_f;l9a@fRIB8oR3OD*WME{XYhVmSAqJ*a zrUq6fhS~-ORt5%Bp55Jsq9HdwB{QuOp}{c3(Adh*+{(ZNqTzO%c?wX22Hb{{%-q!C clEmBsgdTKDHm!5H3e>~k>FVdQ&MBb@05AjmbN~PV literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_share_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_share_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..55c3f051a39dec197720f35873558cdb6aa26418 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#N0|TRGfKQ04oM+xBA{YYy z|Nl>ndm#=C&BT%*zhDNtJ>PcQME?B~F7)Z6U}9Wt4ddik%hMkOq!$1C9m-z$d9L`* zuU~dp`QJHaQe39_G-msRA8kAvl&`xMS>N>9sQL70(Y)*K0-AbW|Y zuPgggc2-^~#sh(&Yk_*$JY5_^BqYxs%(P}olwiAH9hoH5mN-Ko@DfkzX(8PcLYsWb z3jhDNPh7Wdd;aG=@s{lWU6$xey_Ijc_CSDnV`4^+#G9^ur)dj}*lt=(c-PNA}<=){zR4tLs5CNufYwaCec{7no|-2Mzy7@XvgZE-{Xa~F-qG_swr%4829j!tYeY#(Vo9o1 za#1RfVlXl=GSoFN*EKK=F*LR^GP5!;&^9mtl5r^lfhZbs^HVa@DsgMjw_NcSsDZ)L L)z4*}Q$iB}o7qSS literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f48872a0b24b20b32b58dbca794e5754cc89bbb9 GIT binary patch literal 984 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4FdzCW`IwKtCRruC?XgF|NsBbQ?H`7~zx zgdc4@8`sf3ub0kBh6FyU$g`D zuz9*ThDb=BJ(y|DlqkV=!8$TYs4a1ZK;R{w)YC$`CxkZnlokH}Z=bks-S+&?d*UtG z|GO;FmwGGTaP5Hr^Tx!C9*H+y{Z7*s7_r^7n9A94##1YJLd4~ew49dNbBjHcPdent zEffR;xL7%jaNxv9=4`c_QoSM=WedJp7JmJC^<~Zf2l{`Q3caJ}d2HLp0SqM764!{5l*E!$tK_0oAjM#0U}U0eU<^bd z2Bub~23979+6D$z1_o1}-Q9+wAvZrIGp!P#!7#+o*vin{%D@Do;dYyO3Q&Uv+=i0O f+|=Td#M}ae9&}4Kt#i2w)WhKE>gTe~DWM4fhdmgw literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/splash.png b/app/src/main/res/drawable-hdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..a54cc4b43f31175f0baee2c9de67554ffaa79e2e GIT binary patch literal 29843 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/drawer_shadow.9.png b/app/src/main/res/drawable-mdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe3a28d77c72094021013c6442560803b3d344c GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^96+qZ!3HFgEN0vWQY^(zo*^7SP{WbZ0pxQQctjR6 zFmQK*Fr)d&(`$i(2A(dCAr_~TfBgS%&&>BhUX5L;x$y=|hic;t)=0q~!&M0(2Uj#r iT+R^X@#lD(V-Z7IzK5^$Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUyL}ge> zW=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@1ONa40RR91 zB%lKT1ONa40RR91Bme*a04fgS`~Uz2l1W5CR9M5!SZi!kWf=bEn2Z4q*cj_}+6f!j zO;84#5gY_|1C*igLnInIK#z%+6jPAzPN;Rd@gnUH{q#!DiJprFP;Vq%Cl zrh*p+tmo49w07a~J*VArI_cI9*l6b@$1WGjSz<_C~W zH~hiGdxwnbDc1Kd;0V!#SkG8N4EZ4zx1%`gGnpX?5R>PCk4*vpK%yH7Y4|=e3IC|X z`jt==Y%5;Dzb8L|^WA1R4=OlldLCx88Af&=F4O12-6u2# z_Oc3C7q3V+{BAiXf!H=HoQKCPpsP?2h2}gAkEW!G&zU3H~hR+T+f&~X-`iLJ?GbcSRb||p#o`)m7Ej?yB|_I&B%E(mLrk6TZSHv{>?$wER5JHfQdYQqLSrC3 z^&;fmRhn>c5C<9X7kMgYnF;$cbKuNc4Cmn%NR(aLl3*ppE;hD+G(l4&J();z7Uh~?Vj;Inh&-TAb=RKZ z##^)so!TlCw5!*sZe-kZoRhL}{7@anh787!y*!q%-pp*xEr5N)j$1TR{~uQb%FMO{ z^+-xhK@}U`qq$j+wTHgQQQZh}%Dis9OGoC6Cg^SnUY+Y5whqeBjb+=APUg1s&~RB# zeM^{_4rfg>EQ8`S8|Yw7TZHTT>u|ZU7Oj;vUbwXX5N>SRscA26bK9wkf75gn+^7hA zr6})1CDvoBDA)?y%NsS}qLvUEkKY)B^=E7oZ%`ZR+tH_>4c;n2pGB`5d^E0Cr-5P49$18AspNswPK z11mcxkAR4ril)9<^s@EackDlQ_WZR6PhY+JD82nd4p3Q$r;B5VgyhJ3@jTL zf1l*Q_2*x8lYkSCz-$$_>mRc2aJ>1X+kY*a{gv;+$JbbMO}C%Y`gXznW|wtm^AisIK`njxgN@xNA<*Y?D literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_chevron_up_light.png b/app/src/main/res/drawable-mdpi/ic_chevron_up_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab27fd07e60db8ef07a88852e9a94317fd7924f GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V1Q4EE0Crxh*>G>1T;~qB*-tA zft8(;M?geQMN{7_dfEEz`;VPHf9=83SMNRwd89T1RfTxEIEF|_u07bv+n~U}a!^!I zp#IPL|4ybyB)ALO{)@zhe@LuaX};%_ pRoTx(F-Jz2GQWLP`D5u*e(~o$%!hsLG7>=k@^tlcS?83{1OOhMK{)^b literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_notification.png b/app/src/main/res/drawable-mdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..74efd408bd6365bf61c2c21013b3c22ffa99d104 GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6-osS%!O zzP=1vKsE;hV|yk83y{SK#8N=az`(qKk%1XVGlIkxFu`Rd7BC~&Acc=iOVkQB$4$?X)K^9&K=% zU3B+JlZN@H-K-IHO^NPT6uf_&4$Mo#Rj2Y#hpqd zzB%SB%VHLI-D+CFy3zc_`U(c6wHr9LD}?X=+1SEgc^qxpehR#XDxIvz&O_lY8t9&Amh7l;)u zc=cB8{6U5@huCL)^E3MKSh`>#|DFFgbEa7^Z(1inL literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_refresh_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_refresh_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..de3711b3d8b4c25c0e3b541b44b9e47ecefec5f6 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpu~g#pAc6$&%D8d{{R1P z_S8HY=r+BQAirP+!x^`J{xWFfob!*P>CpFHBX&09i4PuWe{Q}xy?=6_{tw;1>QD5Z zPB>t)i*@StB8GE{K%I<9-tI2?%2yNwfgH{PkH}&M25w;xW@MN(2NZzpC7!;n>`&QQ zd8HT+1ct5!3eEI%aSV}=+xE>gmrmg-OPq>M{``Oba7x$Ks=WN3OeG#m z(-zKzwt1MkR3uZ`9x}f$&XiLyON8v9Qy?!#DO<+)6 z%H(TwMB$`B^R^ztjN`UelKdBnmTP>RdipV^?7?EzrMot`o!`4@MgFwvXt6!^9}bK1 ziK=&h(9fUOT4Sc__Jv8VivNb*ygS}NN2->%MwFx^mZVxG7o`Fz1|tI_LtO)NT?5k) vLt`r=Gb;lFZ36=!8J8juh@v4kKP5A*61N6@%N1{d8W=oX{an^LB{Ts5Xpqb5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9feafa02f14c7aa012c900d7c776f689ca7afb38 GIT binary patch literal 671 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaADI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8=%C50G|+7DFN=mgZ}^j|1>?NMQuIw+EnOTiAPu+jf4iuW{>Eak7 zA-VV9ZLvlN2G$G7QZJptRhBpvo&5R#{Na?YtyOvXJ()^8mZmM732pOIH$UYl_bXY$ zYHQE2xI%NM(#4HC{T9rSo^(O&i_n&!eU8FkE_(fBJe$Cvx|GS+=!n8ef#z*Jh8f3g ztt9y`6fM{IIQ8^nPT7OStV?%oa67+u(~A6Q)zM;m>^~e9fueHWZ)$I$D zTowNfy?J-MfsRxyag8WRNi0dVN-jzTQVd20Mkcxj#y}KeU}|M*U}a*cZD3$!U@+y` z-EAlua`RI%(<%`f3_}c!tqjer3``&zZnv4I05xd9Z79jiO)V}-%q>9ZLAPYnI+v?J OJq(_%elF{r5}E)V5xn#O literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_search_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_search_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..48b1504521b03ca1b22145f27e9b16a557b70079 GIT binary patch literal 600 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkphQK0Pl&6WXCD30|Ns9p zZ?8TBbc0$+kY6x^^V(N`*Eq1uo%y9oj!C}ytBI+7?P|pr%zu<#)~z!CX0zhK{d;#K zFFslf)WMkK?e3zk%fCVy$l)yTh%9Dc;1&j9Muu5)Kmo*F;_2(k{*;}SSBmjKVCY() z&@@jM#}En0wFfm&`@f*B*6f5-Pjf%wipMvSkws zyXNQFcS0A=JSb{VpAep9_i)Dtw$+cg`zA20PGfdIV!dXXtc;@Qnt9AJhTIYPbq{s~ zO}|m=?pKg{CG_sM_Y;lzCiPr9o>z40R36bq!2I42`Xf%&ZIyv<(b^ jWL%0sAc}_E{FKbJO57UsEmyn+YGCkm^>bP0l+XkK0?oh4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_search_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_search_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..aefa2bd0bab5458384d2ceee341c31548791f897 GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaADI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8=yo*fKQ04lmIvV(f|Mdoj1G*1-e14B*-tA!Flbg zziS*==Fa?5CC4OR{nfi&y%pwKi=7sn6@$+ZVPg_;aR zSP!%}@YFfGq=d{owEMrHuGZ{?R8Mn1@t8vzJ?no=Ub1Bq3%lm$*>^%0&O9h;P@fQ< zW%qE$2e#FZxceqBtxjWhKVrRRnyieX=$d)VGKSm{`E?I=1WmtD>+V;OdL{JkxAzl` z`6l&TJLCHB!OyH+4~-Kau6nRIOscWp$b?Bgbq8n7ksKy{!8xzl!-RQ+cQH5V09~kB z;u=wsl30>zm0Xkxq!^40j7)S5jDaY`z|_jrz{+rYrez+lR=yW3DSL8JIvc+-@^Z0cy~I+fb63n_66wm|K9*gKo*DbuL$ddKf%i{an^LB{Ts5 Di?y`# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_share_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_share_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2078080fa9010ab6ca33321482e2190037ff2d GIT binary patch literal 695 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 G3jcp1vI?~T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-hdpi/ic_actionbar.png b/app/src/main/res/drawable-night-hdpi/ic_actionbar.png new file mode 100644 index 0000000000000000000000000000000000000000..166cd9abfd6adc4fbc7632f40ecb8fe34fed776b GIT binary patch literal 6755 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-mdpi/ic_actionbar.png b/app/src/main/res/drawable-night-mdpi/ic_actionbar.png new file mode 100644 index 0000000000000000000000000000000000000000..606741d1078c657b0afafe0b2f1adf5f26d8c8c5 GIT binary patch literal 3973 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 H&GG*Q3_E1y literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-mdpi/splash.png b/app/src/main/res/drawable-night-mdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb038ee1a98d1d536016147ab6ee5a275792258 GIT binary patch literal 15626 zcmeHu^;cAF)HdA>l0%mw-3yFdaRwX8&CqP3(BUV>aeuIXF?)dMEhXY&**tVVl z{@~bXs4Am9{`)CxFH1v1lkHSje)0Ch;^E4^p{;uU4zhZs0-N>f9bOzGBpEMx2=V>f z(YL?(h^%a>dkLNPY*DO*K+xJ;~uD=xnH0 z9e3Y5l}QsEawS4W{(qnUu>jIFD@Gm-=`~2zra;u{UV6ZF=3_QD23|pcGgyAXFrw#R>=|V_s%6WGlos!zfdvn@6)i3&Al6WiN~(byu{$ zZ_!f>;aVjhb+V#@VP}ML-&pal_xjTgVLYo+onbTNoy4Kz&HS~ym9xGD_+HU zz(OV8bjsYYBv&0NvfiIikOrf9E5(v-ykGYS>l}>nA>T`WyyuC1GIZusRb|X^ay)b! zN^V5}OY-oy0^P_#-v+-nR2%7iqo`0*HRXdwwBCzs>UvBn@L?M4Y!*#qW$r=s4WbKT z*=;^1t*>RF|LlvYmn;2G?*da_F+~3MWCPWS{>Xju90l^lz^+>shzOC$=uR%2J{>en zXHr0OAPr6_4u$HPm+Xo@9PV`DKH%So$>+9}i7FrEbUSp>K1ex)NqZ(0RJ%J;-Pce} zl1{9b33Y4)j3aq+U&%+2J>~|Iygiv=+Pxu+IU>1!4*3!a{h%K7Y-Mdj>DJk#w`i&^ zCyRxf<}GrfBrc?Mc?02_>QJ<+!QKMJ3XPqWD;84V%eo2 zahV&WD2*h2j+Vb+h<{b=MC|_oxHa$kUB^>)rWEamUf~)nQRss|H8DNY zXN+5Gx*$o?jS8s?o0J&)6XNFRF!hVvAYFpJnD-~`5+jm-VIaH-9d0!3qED|m)o zA3Nmm8l8{rEbEP8d~8rD)#U%b{2qMf=;!gISXvbcdRDkCvf26&Bymp3+;{8MxFjp2AUCAXe0vPtW5;6IOiPY3CrixrbHL>v_Y2 z=5}^RQLn3AjK#H1buOWE?4IfjE7!;`UY zM+bCZ9wDj`AJ5AxaJtJ3T`%+=-Fcr#Pdx5b@5!M)9l;t5mwzQsj9o9wf{T@+ZKD#6 z=S>MKdhwq`T!&@ReaNHX@+vC_Wy&EZ?Ox0S@0T~Q$(ZAb#3JHQpJo$Ah;Ks0EFOVW zO-7$0Gkb8bthvQb|8EN1yF1roSN)G{CZcMXX^{!!g0DlT)J)`sfZN1s*KjF~_C2-t z!bvOW<4Bt?(MK$bPeBAc+wLCDH5GluoW+@G(+n{W!Gtt8Sle`(?ieDbg}cKb4ULhY z(|($t0hb?FR?JOOx5-8bO@4mq2eAfYT@*T#AnO5FD59KSq`jsX-NEmGz7~`s8KZV@ zLTLOQ7w}BHmFYMVCt4SfY%L+UnxO~3kJv(p_U}7UXJ!m-dj~zK*vko||+~QY{J#soql-4@+f54AV{hk_Nlr&bfNEhwRVrHE;7h zn7FKe{}|k^eR2OhJc2+;j_zX=hR^wVLUMAN=ItwC2P2E=O))oZcivZ>rN2m!FyL|H z%r6(v!m;e?VCCu|UV?c8hm1BMM%|SjN_E&|6Zfn4A$eti?a?bM{T(L#?nh)6vsttZ z@crpBUOv9mF?;m?&}Edr|F%z#)c}dhv!&|1K<6vS?L}U4FIa@5IJyy{_8;)F`4F>7 zq~pKcL6e5ojz=5R3LS}_Ga3kYy0%vQbp7bNTVoRodw>6|j*gBS$qkG_aq?;>J+9)! z-ad)cWG!IDw+_Y-+MW}%?l-AcRf?0-nCbcm75uikco~K3__v{V^tIVXHA%cjdsKG; zj90%dI6sY!QW=|>*}3|DR_?LPciNmU8N05ZFV@oN<}FCUFp-zSC8Hm;Qn0tDPh%J~ zj$cveJ7iwx=ZAYf7+E_O9(v-cDu+PT>pNbxF4(x*eU6I4-l3tUrK4jdQZg~K{3pS>eQZ z0z1WaFmuk_Ed0)BW0}(#K0aQXvot@(NHIeXKke_?-*Chq7H-Mi`j z^8?lIGa+EL>4SaNAuWp02{O&3J3o#<-1&6B5U(1OyI4}_${`)7YO2fq$jVS0PiLH# zk=_P5Oi2)hvF}T7OGN#j^+NHOh6#w0+)D)UZjO~X0f*}aOsp#142G<#vecwk^ax@3>5W9x{M zk0jPHtW;{NL|<`4b@ttL&^wE{g3ELUpI4e(5i+s^?uhlIq@o2xP=|ks?9qeoibq@G zio!{}t$_r7(gf|VtFw!J%8uK=&w(}ZdQ-%8xoi@}1C72J@g7eTD{o!>+t+ zp@ouKf^yq|9tdVDLkX|JvdPAvZ}<@v@lk&SYTNDrV=NoQ)kj42zv_6nJz$_A6bO^! zWvG8fsb?rTqFNf7q0_Sw1V?qthub7sl`0C#BJM;zj&0_|J-G|S3uR=!N_ukd&Zlc3 z4*Wh{ajUSKdIfCG`U8|z=F~19XHvY($#R8+}{?Hma ztP?6Uf3H-0$>-|C{7o!3FjVVnZrHR>aXRr@L5X*du1AJVky??im7`;Mu zVvD&pPe#u4fJ#m21$&F3KSVBT+Lw@c^SgD1czKcQ=z?mlqvPVLTt=WRfU&JJ*?gfZ zon$YLmlAF}IyNC<{xoIS4h%Weo-%jM_IF{)GdIYSH2vZREi+_FSiS}I4h^ip zvaqw0nbL!5vaeR7kH8JQ`2gB!9f?)>;|*LpoAPCQE(m+zwHMbBwCo}xRxF8IS?%vw z?Mf#tS}6_GyxXTUTe5jxrd%yiW6CM~LJ_c+yL;7i4rUidjPmzMoAb&C(EnOLD?%Bq zHv&t;2TQ~sPpMPEsyv|r1kd(cpMK|o`VWjXcv?SF;Ws*kA6zb4S63H=+|JxO_oo=P zb7)F$Xy(5KX(-S2>xzENxGM_HNFKGJK<@^^ev`NREr|)W;bQXAM}uw)bK0M`=d9t2 z9%g&=ey%ME=H`R$M=8#t!#dkHJBFP$P-wodnfDwTNv-SP7^-6KRUq573a~ZQ=TJUu zadb>; z!yx-0S`$9RI1|{7vdt1YShYgho4f%}4XTKGen=ktNYK`z^kdb=_d{e0(%;_Re(&Ib z9S87w^5wcAF37%#e772dmMS z{Q96H#wOC42F47Z<`IqM2Xt^?W}){>@l>l)$==^*!tCtq92EGAUC%Q3*cu&uG?nXI zoK-h?Apnv~?hEsRJy`VEYgAE>H%my;k5SJyt7meg$d7$!&N4x%6|SP^>o%Y4rOf^f8^ zx@7aVf^om9a|MRS%$wuJbAhIN5>KFX)E+F&U%F8=;OMu2Ml>`uwY5KKm!VsNK7`rw z9Zh&KUGFxN1f(tjDNnA|IdO{xPe@4#D@yhSYx4d`&nx1#TCMtyC>g1Up;d3^5}Ba; zm$aYo)xNS2wI)TiMfqO-W9fD7ENn#C-g{)d2iM7eVM-HvQ5t86p^CtV?#0YQ`PkPeUQ36Tp#19*S_Eme7tOoex}c#eW5ZK~AguAy)Vtk;dvTRhMC^rpL75S+ zu&k^mTWaBqvtMIhfO?Mqq9$2Nbn|rH&>>JpEt(G;uksF5aPdFtL+6f^)!xc;1T;kR zrF&IUHyO*#?|WNgjBZJ8tUX5eDcq~x5h=GbnVLz7LJAV9wMKSsZiywYu^C>0tc{EM#nn6dgbHixmQ!~M zw^t=WT!OGv^lBjM}A%WG2%>Jt=Q1O-V z;p_~Xd%(KGjO&y%MCryAKkaZ=Tx>Xx1ww7u-j{LZb+F`V#A^Gp^n99^pHE0k?3Hk8 z*G5zCB9~2$_@I%A$Jc~Kq<|lhMavoVFbb*a^>BGF0r89(Y*vX_8vO+h z=Sw~L8tC&10H*WHw79#wsOm>#=S}A0m4NH<@iZ->mv@4kcg&Vcg*9tO`*hxYLwf=U zO2hz(b>+a#4Q;%J2336j`0r!tj*%5{a!$5!nbYq^8B2PKBliSK;kD$z!dPjPx*nUe zjVSD%I-gY#acAcT1IfIeEiOEokAgz4i3h<>F$$;+Qq<8Jba3%6kHaNB*fZ3#R8e=- z_O_1s#^_;QI#Vz&LIty}PW8e$asB4=RQHRW-Q8zY1bNwxC!CNrFNWU))JqFS23x)R zE$on4e+CbXAv;0a60B)`sABknzx=VDHLwyS0aGOlU`486A5Z}pu@;qg&Q zN=oL>2^re}V7`M^k?q(5B-~|8TpZ0(ToJhqja9C}?%R%usgZYx0dccg-TBL}-Nfs4uOpNRI>N-;%z4Et4rsnUP-WDH$wzvfQW$g5<1$(rY3*nCid4iacOCk z&=05Kmknb4*~GNWSBcqNgF;zEu!{cY$IPj7Iln9{dF!iZi|Td6@nCs5@Eng0Yhe;c z!d&ZTQ}#0XJIw@6KJYtoq(6aU3oZ#p%>DsqE+57Cm?BRU&`v_GytvCwdp<9TSjPf| zGPi)$4A!4W+t@LFFjp-lDY<@e@p-P=qPDU1*C~=t&r;xp^+&75P&&qFyH867 zzGj!Ro(?q1E;;j;d~Ytf;BYuEFR$R@jN&s4ZO`wNwKFq{>YR|XBC1Jm((h}uU=|HQ znZ#$>O0+f_?=9Q)q!MN3R>TWI9F(wH@^B;@m%=b-Qu~?wlBp?(k#WjZ+^NCjEzcA1 zYtE~Y_xz?>v~(P~IRje*Lig*h9B zB%N1XCbKcWMCWS)uL$vn`UZK`q;S(RhS`tAoZn^~n?cGd-jjS{wYM8Ge4jw%Wl{N~ zrA58`?dI7T#cmK@qp2GSDarie;^y8~sMPI|FX&3Zhm9!;F9xeiu~~H$3nrV z;Y20r;6dx}=t~26dB~{eUxO(e-bLTt`ClREbn<1bJv~!c@Ep+s|Fw^qv4kMKpP!~2 z^?Chu0N=C6>>sik!B}r@pVK+-}G(hViRbes0SRl2daDMMPjtOTqFB)Au(D zz59Os<&pVH(O^<365crL-Dm-aT8G@r48 z-($WGyeR!G>wlF{HjytRDLLO_^dYH)YEC&5u2&B>r(GK@CB}!o0%` z!0~x`jKD7V50aSQ9phNK@TKz&Yn>&Rq+FO_pJsw}sSm6hU6bu+@3luz@b#3?)eO&7 zKTr2Col?88{l{1K_6~GROk8+D6;qVF74-|O#Zz=ITx59t6#$n+NtzJ>F#H9ps_rOd z0@3XNstvb8=y5}+K1eadk;>f7>J^&3XP2Re=B^_az!y-MnwsVoWjm z@5SZDy2G9P&sHS}A}1n^HQXkC4$-Z!xxTKgV5n)=Xr19I7&%2Oh4nQ}B3uFdWda=dH$acFO+gy_t8em>;+>xxp7)UTit(af1 z?gn}&yNOGP8=IQK5hz4us5Uw!f463@koSj|x{JLQ78FFJx0OvQG51$S5CX>tAMz@b z{-caw(!cQX}(Z)XIF1yX(d{zvtBD=I85ztv!oHMymi}EO-f4iS`Y^ zFE92&$}SdksZ5r+*u5o%@Je$;KPM5f)kl3SI6L&X$JG5G;69kvQKcj6@s>I_S19GM zOgERcpnxrB4BW9pF{mv|V{Q;af_0=pK~XgoK_MP(Q1~AXF%+t ze*9Wp<=^&34s3p|P#v~`adPN{yFL#up+wA9RdYEt03{Qv1)r8VDnH+pX(=6TksN4i z+iDN*lncxSKac&WY3`bKn4o1~U{@8 zdq-ZN{W)kZApk>|Apz0qUj@@_VdeNkSF6$m)t#f8e}QIrGPziyaaa-J5!}{cor_=*LM7ZFLE$S4y-Wt4mC|H>e8F!3K zN+e7H<`fAj&t693tJ!#xAl@?udPd4gUll1xYYK`b?H@#~2Rt6N<&r>*2RkgdZ=q3z z-aU$?nW#ThEoMmoo2RXHft{qqW-+x>tUpo|o55TbnsNQx{MMcVe{>zqx^_L#R(Uo# zf39i$;`{SLg`i#cM?#j!2YF2>g@}~)=lzZE0o~){B>z%LUfv2UL>t`}iwd8PlLHfr zHUyNJIscoLQ(RbBm^S8DCEf#N!~lSb#B?eA zX@GQ(7PvyYpHl`~mIS;G@N#oaUbr!nuFJQp)dQ(qSzQT46x3xx5y57&2cJi9LCnl+ zh_)9$>t#sx=qT)DWSDOE2@NYYUcXx3*H%knUpE91*Wl5q}IW?lI9GFS`Frdw6KlF=vMiVWywi zb{}Lmp3Ra{PAZ9xA^Po)yHt-58{XzL5yUNZW4+Fz)Y-H@H8qV)aB+7vuWUEKZc$`N zL#0(p9RC^Pr-H3umc?32l_YUH-5U5Dph2(EvahF{daNl}0pjI_e9XZy9JLvKc<2V8 zE&9Y9_6w|z0Cv?O4ss66xoPa2x$UV^t3lWA;2iIkcNHlH9)n-iDUE_u~EMoT?a z9;uQQ!ix%BC+5>rfPD@%z&!lU)M5?5_7gyfwrm;(qyiS`UD!Ai|{a}4ZWbzU2Pke}EYyPw+``$52qcCFeCu00Vu+jQ@J z{R_WDsTbh$h0LGckU$0|F_LN!eQlMwK#mukV)baP-iSc4`Bj1mF*L0|o*?zZZP006 zLATduNscav7AtSgkLg8l=A7Y46P~7RK!2_ht$Onp=>yi_bfxkN2p|Y6iV5YU;7zj+ zXQJScVJD$^w9f7IJ=TC7_A?g1NqCxHFOys*(FLzWt|`_mJi z>SExP7*paZczc~8dBJsqBq`RSI?X8CmRDhX?eTt1L|%NrBjnDM-$hI?+D^7zNGF^P zKLFnyM>Nz2X7|a8OXsAYQnQq%ttFoC(0U~1^e56h8F@QzUJ|t=)74?t?|%5nzfsve zC^svMj*E+XVP$3e?CewQfgE8c%P`T+_CA|AfLPdDGfJ^oxpKOJy;sV`n$w@rR3l(e zQ(>xGxl$zbJBO%h3YfQ$1>eb)rj$tJS-IPN9`0l)dN_VyoHc(GR)$WC8&~9TEP}VF3U*0M{=pE`Kqou+D?0#9n^L zE{QJ5thi=z1o4Gpm_Wn3k?*PYsqDR}^kHnYj02MEg)i${_YL>^)1O>Za^WnxA-c&? zrvfn7=$ff7yZdZe%aWxEgd4c-#@nDjf1wR)k0_DD5ahA4fZ;|l!4T`k!uMx3#q?>rr{|98^dp)m)ILAeJ*@|2+jJ9#N@4gfTD0 zsMZ~q5>4j(im-b%5e)4e!5Udty9Mjg^ z=k7{*e=49H;vcsp)4V(7GdDDc-XJ|S&OfyyKD@7f*77VPGczkYds8RmmQru)?j)yB&02Y>dQ;SxkpgF^Odqh6U?@EYyq_|Z5)y> z{s4>!C9i`2ud_2@1=I;9&F-$*z}=Io0kNrL=a=77pg-T@@*R^|vWT9Br!F^p@JWl} zWr_jBJ20tWo@Dm=QQuY({b=gByEJ1^Id|>fIR)`6s9NbU(5`XGQLdibIDvJqTI9>Ybb<PEkuFU&xK9wjq}?5oEhyhSr8Y7%`_kE2AV}n;DCb^S&m^Ji z{FkDr4~Q9(4*KqkD=Ygmm;g1XXlK22D!${*NQp zn{o-f;aEB}c=l(_EL|DDpciImGHL5a;vQ!C+YsiW`jKAV5idg<*gA=^@vH*h=kH?p>v;?u|(z-)^6UuZ za6m0#Wlt|6jJRerGX{{2ub9fGYf1rg1vy}-ye{5|ucJ*jdLb+$(!1G%QBqO@(EGel z{RJ_$t4(K;vb6jEo)u#6QO%;W+WmmV35CabX>!4zlUr26!CxL8iY0oHIsRt!78%mF#w6`eDy9#IJ*dgOQ3O@skzT<}K)It41 zALM6Saos&YmT^*dqEw^t0G`z-KSC1+;{B2D5YAIJ>FC|y(iFtv0F1gj8E50?VDUWc z5lW+@qq@A*bhNZxeM|oD0H|?LFBJ$6I`H0r16rs*n-Bel%=9sIbR0pgYJ!#*#7B^; z+UmJlhuu6m+~cz3sJrK_EAPzW^;~Y^qXg!>z6$RT2@6RNpir_RA|e;pm*~2^wMsdc z&0(L~y*fl&E@1!Vtdz_>Q5?qV9%8W;(h(HL8RG)jkGuQl%lrO6D`)QedN0r7C)_kY z$nkku<{e3IgT;ID3hvrLmepynJo`e4-kwdie~gWfPg-4_$Unl6coCQfz=xLi&dXAu zyi}9PX593Y_@hHCrLaNGZ9%#H@ja=47M$JP>mPSRW8bjgYrS;S>5`;RW_MIr39tSZ zKRbQkf-F0n{-x2Yh?4n6)^5fLyzlX}Kd_O`2?>cvNWkLhm7DYN0<=t@tUjjL?Lw(0 zlA|z8&;;e4X|l%n3nypMUJ@T^+;t@Pxzia|-%YeBNiO5bGiTRUuBc&5QBM!_x;^xFVC6+3A{)D}u0$)VsV0#}OCG3gSe;z!b8pAL=HGf-Rz%9P@9P=O438ENG^@1f0r1^M}C%Ji;ozv+aB znWB9a=pLqU)~;Jk`u)HZod>m2W+h=O3M`Afsq+eKc?DM9LAhVI-*-HYSW0#_ub*v( zp93w5_^wg3kc4>O@29t!I_USYem2rXLifhu`_IDnL0p<-hm3%#ZJRxz0Ycl*K9$Ia zCzw{k@o-%ZR%y(~!p!DWaOShLiBi{x<2$ttpuZ<_F} zCAzmqyEGirjvJO(?p~X^ihALy&gYqjN3kj0WBvoCA~GWbJ6xGFJbt_L>^5n!m}~=h z`(-Xoe#m}(MTOTpt?BQ{db&bAMlEyCN_NkA0KvqBf?<-^^}BX!3{6Ys?q%K$kB)($ z`_I5=q}ssX<{{>|9Q4ky(d5+kSI%I-;cEEeWLE3&g&k~E>qmX_kav;d+Br9rSng`yaTAFe~j+hj3?7~?jv~RX4x_^Tz zyV0+bpQ8>sAD%y=CLTwxuEZ-P!cTZ&F_sfou&b8`zc>3#W**vlS%-~0qD%)KMnZ}p zu2>?bEU?@z`v9TLv6~M^`=5#uQNF(_{K72{)3O9UO>Cq3dp4{AT2h9FkhJD!@fe1> z3clJJEN)iqHd7P*ekcn-yWR;_PDxfaM9zMll{4e{Yd(`EEI$i$UvuJp)Q_~34=Y#a zU(^y8pG96Rc_4e49~4{62EbzwOE=1#?n%-MjPjec)~2vvpTX|yDRaGDPvtlc8ddJM zIMGsfJBFGGiK#Z4#afw!3tPgL5^ZBhK5T!-qx$bOXbWA6SsRa744tc~cF0k7) z#JoZxD6K$7_O}=uGr$#QYk3sCiWsMo25Lop~$ zmjZk5!6o2&{6+PEiR=Uf^CwxUexURPkpPl4)CoNV4Bj1VvACtM#fz&Cz~V?@MEZBo3bbJNlA+yK;{Co>Mw7~ z$EVB(h(9+vifE|`JY>T7sULon8~-lZaw(t#vA_gw36kDYG=;>Puk;+IZ=6w>VJ#~i zdXOo4WLPfPnzat_h8r8Ks_6uYD)51_m@c$vI*L(pVRf~PP>yJ2*?zB138nB* zL2oQ>hvrMSKa{y0lq*b|-z*4>Ffsk(-*Ik* ztj``oNGhp8?@-~eJh@K|IJUjLy!`ya5)!H*AqrfpZ^6J!#y2vN{q`@>h(J2V?UbiE z!&5puO4!DW@O@ePAfnvfBLrMrqxsy~>@G+L15oU64(Zsa#5gUArmT`R?sm=xl)e?ci0h)8!vBTgR3>`TjN$_3I)>b zo&2)|I&VKt)e42P6cWF!`Mhb~IZ>^!QfqV$Q7q(W6ZfN>7pH~HpWM|pX_ z(#l1c+dl&oNPWa9KL1C-h+yc2f-qiO%8?})A|r9C)X46-jn(!;yS_z>QRkLtZ@L+6TlGiB})Zz5o=Y+1? zv?f}bASXgnQ#*DLZre>;BLcoQw9_0_xmRNGc^rrw+&R??Kl zFX!OO;~LT;d$`pIkD@bKAWCnrot>Qp#&`kG3n>*90KPM!&u^ljF(N1IX%Az;`W2~X zybmCc?Qw{ow+xQ+B5w>pcOx7VubPSkUksdGTyLX3s|$zipSu~N_plTSrMH_+rCNVr`c_#<-pt(|rNk2bz{ zLFcJiXWS!II$_n!S;KGzL$g3W+2{lX^qwe9(O15mX`kamZyHnjX&3xn`BRf*DZXU_deK_kEMVH z`+|L|hb(98pT;;1f9Q*lh<{HQG+f}Hg*LW`{$74y?kSj(>mvrr|E!^W09c~|mB6w|XE=BSP^;m0J|m|(gJN&(3BD-V z-~H~C1bH;1At4(h%~C^;|MB5)S#*S^4beVP;RH+ zTx*RJtvX~EfR}(gvCi^S&J_EG8;CeM^fD`-bQG`E>l+@%|M$de&^tcW^pYk6Qm!!d zm(=QlT5PKk$NKwFhV{a!KDWcEhs?EU*$QuYOS^V~{!%x6QY+t}Twr9N6cN#s8usHnm?RSy6wUjp<-k0X#2n9Y02)(? z=#9YaxSK8jloMY~Ds2*qR^0U~4O%1>uEXF}OXFps_%AcmYL*u`F25ZNlo94J&~PMA z#6cgqofW?8{#8F|tLYD^6HB5%uhYr&f2gob6QFi%tH2hW+ubwQ%34Luuj6Sd$~f0G zG>jcXuVut%=Yq9bBkW7Mk^NEtnAK}rk-|09_<0~ne+vI4kOm}s!909S2li3_C*R&- zfQ;cVZQ3_qndp~dPF4uYvZy$17q~aEMmUqW`uZWh82gol;3P1WUVF1u$Xs$^PF^`t zOf3ls+G_7E+KO>r7~qOaq%j1X6)>R!O!=%4QTsJ4zlTm&!i(ZTi0qsU^8DRFc|S431te`h+s* zlW^wHsoI4C4*GI@=E0Fp^|Y>cr%j}`O0?JQYJD_~FNx%6?bT0`zxZo^n)>hurOV!1 z@m0uBL+{h95QZJz)0AS6F$pREf4P-<>a^op%89Yl+G;Y3r~W_43}xCFtXIs_z5O}> zSw~6gL2mVW;gkSs})g&e@;h{>rYwss6 zwpTe!ix-q$kzYT4C8?K24{pa=`gw{cZ-s&JCJ+3G?)wt?ZC{UKh(b3(iCagFwA(?5 z9^vkqjUn7cCKwH`XY~5x{)Veqvk#9vU9yltBIAcAJaZvO|CM1frPb#76Y%)jWlO8` zp52hm5an4U$2kWr2Mc1E&;zCQun2_Q*Bk+BT=QT?j2~X#uhQ&5BQH_Z9Zbn2>_mDF zLC7o9g8~x+#sL|9OKe>VC7fPCR(-Dmc!gEayvW6sl=I-46ONK}zQxdnWViRnZ8mw; z%9|i?<&z+nR`?*4&2YCounAUCNCF>ZVzmoTAtxHHf(PDlKMy$sO8Os$y2|AsCz(&Q zIGZQAED38>Yed`EjN2V98sCnh?_PjJ%OxXM{c=hD^H(o}Z_DW(2}_ehhpPk|&F{rq zC#GY5KK~$6Qw_C_G~eZ!YMF?U*Z8MnXKsR<)`FB`t;%42ty zCo%H|#f0#?7ZT2qY6HuFba5W=642RiLYb6+w~p?OIWGtc=~ti`*<)Oe0Q%`d>qf~^ zypHcqxHl4oG@a^$)nV2bBA=3<_sq$L;Gz_6cGpQBq=p4eNrQuuvn@~s$%H5~-=WKi zZ8|}MFH@gmmJ2HUccr0QD9jVfut%Cl&`&@!N(ImdU9Bop)RxZI!VhIU4{kd?g=iP> z-n+4TLu6|5wwI5>+38HsId;b^Qs+kRymO-|4|RpRp?IsQh;99#UU8Vti?S!@y6Zzh9u4p)m9rEw7*PxLw^1)?>v#qoM2}n z9yp>|E72pp*P2z8Gc@64F0tf?N%f2E|33d~0q^IJ3Ll=E^+xx2%>sv;(bQjQD_6a= G3jcp1vI?~T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-xhdpi/ic_actionbar.png b/app/src/main/res/drawable-night-xhdpi/ic_actionbar.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e05086596519a5619aaa33f1f61bcbd1ba0b1c GIT binary patch literal 9428 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-xhdpi/splash.png b/app/src/main/res/drawable-night-xhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc195fb244e742cb474435c3c5afd1e34ebb267 GIT binary patch literal 46283 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-xxhdpi/splash.png b/app/src/main/res/drawable-night-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..93403241e02670b7aa0a4439ad1824e5d0ba0b38 GIT binary patch literal 86311 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-xxxhdpi/splash.png b/app/src/main/res/drawable-night-xxxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..54fdc80d3b86a392f54f1ea2767962120e32854d GIT binary patch literal 131477 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⪼sG%>sU2Hn?+eSc|FU1=S>9K=z8FpJ6jwDf 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 F2>^8yH@N@+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_actionbar.png b/app/src/main/res/drawable-xhdpi/ic_actionbar.png new file mode 100644 index 0000000000000000000000000000000000000000..67daf3295a791742ef3716a5242a8286b75299d8 GIT binary patch literal 3757 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_chevron_down_light.png b/app/src/main/res/drawable-xhdpi/ic_chevron_down_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a03c27d02e9d110beb80763aed717517fdf1c656 GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy(*k@#T!Hi;1XkQEak7A^G-Tr;rl^1IvZCL0%;4wq)zF7`7h|j!Zeg(9=h_JJYD@< J);T3K0RTO9fd2ph literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_chevron_up_light.png b/app/src/main/res/drawable-xhdpi/ic_chevron_up_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0c737f39c9bd7ed01bc2c7c6fdac5b0965d4207d GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyGXs1=T!Hl91j@2mQ-LlsDhcun zW?*DuW@YE%GRhg zzxF&iwhpL!gQtsQh=k-*($7@hbp9`Y`jT*;lM{8~VxOj?L+9-umu?2toc^SFo6qhB=TT$E%ZpXa z?tS5#5-J)L8^{;CM?yw3k9B32x208u)I3dZX31nvOa6(Hu^Qb*^Gr!!D5vi#ePpj;+H)+>9}hDY=z?~*N@*n%$t-hQ)JEZW)dh)JYD@< J);T3K0RZ^ie1`x4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_notification.png b/app/src/main/res/drawable-xhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8aa09c79b2fa6af4e5a7ceafd0868712d8915e GIT binary patch literal 989 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 MboFyt=akR{0P50Ky8r+H literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_search_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_search_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7e4e69eddad0ab7b2ddc16c8421432234cf9df GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s3dtTpz6=aiY77hwEes65fI!*~yJLqf^>#GI?Nxrt{`0rW zv-n*N*1Ehm4^EM(sjsf9s;w+3ttkKVJ?k#eT*f4CcNgD=424u6hqJ&VvY3H^TNs2H z8D`Cq01C2~c>21szhGu&HPSqF|3y1cPk^V3V~B+0+k=_rPL2%6AKI6CU-Kx_Qc>}~ zwn;6r{{H{ZGc1q4yfSCz>u-mw&o8cDEG_N7bg{*+_WG`Iic8!q5v}@HBivw{=#;}ZZidE}@-JRCp*A5qoOzY# z0|&-rhmA`V+a*eW_A+}H$uRQ%T-uOo+1Duib7`ZfrC+1*PuByhWPBgQ)Cq1-a~Iw* zAzmtC`eUITlj7NKOn5AH;)FhT&Z$D?El#>tJe;y587CQan!7R<4eAhNldYxpey;JX6_oUZ}d$o4Tg}I;nx?z{s zJKo2!$`#H0y-z-S|NnQzd{2Gy@|4P%i-5tcTH+c}l9E`GYL#4+3Zxi}42(>44UB;( z#K6?b)WFKbP}{)3%D`aCv%A|+H00)|WTsUjG#G{$8e18fTN#)@G~8}8PXTJsfZI@# gnVVW%l9*e7(1UKtrgbh?fqED`UHx3vIVCg!035V5IRF3v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..87790f1ed3f28e9c91a5c6898175332b759822b9 GIT binary patch literal 1087 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)pT}UnMXwSj}Ky5HFasE6|34fiWP!C&X3GGj9}8D+K=k z|F1N!(gYajc_l%9!3>;b7k^(U;gG+6RrcCt_QG>#etiFC^YNt2vYeVPtO0lb&N?rt zx$BSt+lf!dviT=Gj$mX;dDYBST4c3eQSQ=`e=Z*iSc+$hzBBr2mcKwkYW^+n{XE)7O>#DLX5#6yt%w(6vB4v7RoDArg{L4~9qIN|0cC!0vfq(Xob7 zhofs<=UBYfDCD2BwRD@-+OFR}|F^5{++$ZX<-P5;@4f#Wm#Ae)r0MW2yygEz^_7Cq z%ICY;xP=V0dM9jHsiHV>(Iu8nk*VheGV&H);##}SgxToAhJ9O%51dnqaaWIxy=(jB z=3b7g*Zt2Q2!CSK{PyRJb}z`EnG~siP|*b(~+nx8F7AuJo_G#}`f>i;|eob}#m5;#FG~Fa8j%2?i@|oDMDd z#L}rWHQi&%$~_KGroE3-6!yRTJUO_ zQmvAUQh^kMk%5t+u7SC(foX`Lv6YdTm4Sh_fdP<=OA!b}(U6;;l9^VCTZ6vkinl-w N44$rjF6*2UngA+^jl2K= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2a8a1e6deb0c60bb1dfb619e7f77798068d70b GIT binary patch literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s3dtTpz6=aiY77hwEes65fIr1LTdgk@8h4hs>MC~*~Q!WJVAAftLM$- zE5zqHK0JMDuHB;bTbo&cHZvx9ySwCvawIkaIh+L^k;M!Q+`=Ht$S`Y;1W=H@#M9T6 z{RJ~KtC8lZ`!CvodSX3Y977}|pB@a4zLg-s_JG~RyY6v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/splash.png b/app/src/main/res/drawable-xhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc195fb244e742cb474435c3c5afd1e34ebb267 GIT binary patch literal 46283 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_actionbar.png b/app/src/main/res/drawable-xxhdpi/ic_actionbar.png new file mode 100644 index 0000000000000000000000000000000000000000..08eb08ad396f9950340dd9824d87db0f4217b6e4 GIT binary patch literal 6737 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_chevron_down_light.png b/app/src/main/res/drawable-xxhdpi/ic_chevron_down_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d12e68df87bb0d8ff275bba2e39f2dc65a1455e7 GIT binary patch literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sZv%WnT!Hk+0eNQEZUcSmR}$nG z%)rRR!pgxdDJ7$zqN=W`rLALVW^QR^V{7N?9S|H6lbo58n^#uX*4{m9;i8S3HXpxu z>GGAEw{G9P_wdo}Aba4!kkbHYEGq^EP zg6+cTNt?X6H%*=!6jR;TxmUXK??UvQPF8`!k z)N0N8C&x{v-6_=z$+0*Q_R#4r@5LoS#Sa<6d%c7o&0O^GVB9>mqrxpqT`qn~;?M71 zlydNr>%>K`5A(%OUsTa3THLru{J=Da{zVDLq=M%y`rp9IU)!~ZQ@Tg8YrVm>mi-z= zZaIc2&qMYpM|9Q%&rIjNG4&6<_}PnB@7{m-`1#BCA3uNn{`2?W64R5b85kIqJY5_^BqZM+%noKulwf;s zJ5tFtaE*u4Q=f>CL({(f`~P44vz_&^!pvp+-j*JG_#=LK?=#Ih#al|zfik*liXHhM zdwf)!nkeJ$$(JFiQrNQETyJmeqXk#k!)ullG?+b`wUI6QrKIalA4BiMZr>(%MKW-y zO+BykZI|(iGoSSiOr0NW_-=#yxh0>bwio?(J$fc_Is4?ULhjRR9go%=FbjV<`;J<8s_-)rIV4bDExSNu}U64|R!*7Z#zOQ2RuU+|4!<-$wt7O#sIRyOVRn-%k7 z-oc`aiqeiZILuC*vz+Giwu)gJ)7LT%zT@$~7(a2xuAC8fb~`AgdAjtKW!1smZGhhQaKf*|{o0p|h+P05}LhKwn69<&A&obNu)hFmfKmv7L#UZ+it#B3Wyya0PO z1)7=;((yK2F%8JI|H5mZ%&J53!{9Uc7sA>u20jO;LpU7Bq&O7T4_3g15Jjp(M9gY9 zq&E6&f1WvkC}uAF=u?!gOKunHrC46K=mr?t-pPzW6fgmH8w&AjzCq_3IdK~N25S1I zrd}YD9txkrKbiu9n&ebJEho+bw$(MBAm5t|7@b;yNUkru3%`Ml9m8o{PMq;<{}nOF z8OA@HN`XjhHXM#vkUCtJN*~XOGnj1=E2=f8P8=$D26jfR#4~;y`~7p`^kRFTr$6lO z`qT(S#_}$I0@uQ3Zx|;rI)80pd!1oim}XgeEv=DdZ&(WQd5>eaabB)g!+u?yfcVZ* z;}w0I1g69HF^drQ%P?Opfc=+2?xSo?RvO2uF^jg%#81OlAQx|OO>P$^tI4xJ9O534 zzZ0XlKNK?IAXp2s#+!s4AxM|&6!vAQqXpuc+=}?E5vlJC1tOv@ol#|uQxOS?$Fi-M>TymO*e6>tEi}G@;al)Q?zY{-rhdT{k!;`we*eV zM)GoyjmPT}qg|fe z*%3BSgmH2YSe!GMp|G$=RSSvUzu`2*`H22P*jC+qC26BN(@`ZKN#lhYeXqk^D1@yk zi5Py9Qf2I7gZpV{um0q1aW~mu0kSKY=NdFlC^)3b}mNm`40)-TWo>k z>b%fq{iusBv0@9P%OUBuvKHuX)cOJBc^?}SzcV(DCZ9ANLGrz^3|;|wo@WzWfhZYR)znJQ$=Dam_*(Z6EK-=jv9?kU0GHfmE2fsC= z-CZWk+789(1d?@W`3pfPW9;+r1zZBJtqT<-t%In>E6{n`#@OVG-(w)p7qvp(-m;06 z8Xu}q1(GK(rpHZ=7;=+53%-GgapRTLp8`~YdU82QuNBR0Oy$0^_xa0)mDoB~b(8wLIck*-fr TOT7_V00000NkvXXu0mjfWch%2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_refresh_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_refresh_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2d35b2cd91b7ed44bda47b1021f46145ca673f GIT binary patch literal 1419 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAifOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>LFnC zKX^80O^q~Q6404)|4%~Z5)0ck|F)?dPGl_k{ld`cU!D6oJlSO!9Vj>B-@~c7hDb=hJ@`C6D3F2eLAcA7x8XR1`Dw{%+C z=`%XfS-bDmTb*~TGkUjEe7F27=JU->O-=tD0yi!`^0Fv<-X){s`-)OND%p!p4LuVO z`qo*>eqz6ryKeD|(ytyLCvOnTxR80`@(%f+2`W0Krok(hir#Lz!={}pH_M_xfFrP> zwX9e3TwlQv@fS8F7Bx>af)^cknv(F&qTFTou8Gf%oRmvzT4~nnxwrO&kmXSxgUe4A zF8Qt;{^kqAp}M0cSM*rob^>?xE&)>v*E0#BGYXzjh4h{*;c~{EANBcQw>^+ zHwan#KV%Adr5W4O>Mio0!guT0W%tIg>qf=oH6T?Moe>*)A9n@w4_v#W$6iz z*p|*VDD1wJJ7cG@_rfwhukyztG2atbO}zA1O~c1GxQe0pGry*;P1C}6u3r7g8w_49 z-13Em?bdV+-6@AJ1^0TMpQn7f+eqzb`^5ItcOCm;9A`}pmzumK^hs)Dve(PkTX%NN zbV$m`eZw2f7B+GD_SYs4tJ?Q$-M9Qwd;g8*pZ=RoOoHxq?$x|?VPnC}Q!>*kacj`GT=5pDfx*+& K&t;ucLK6TQaSY%9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..40b3dc65155609b454e6e7b3c25b433ebd5eec8d GIT binary patch literal 1455 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0249b370fbc25085a7ee0ac5de152139fc34b649 GIT binary patch literal 1310 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAifOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>@Ck91^UNDX^bCRj z|Nnb>KiLY5n5vQ>zhDMNuO;_>{k*%_L;KVTP3JG49gn#$yz}Gtt=nv63w&JFw;kc@ z`J|Tg;^cdK%hOL|R1Qfl`q#$8Ua>*h@0y#&jt>Pa{C$6Ci5^vDN_lB??nzV&_j<*v zF8L*_H$1m=@xFVWa6rktyWCe`|K3!=y2j)){k#0D<7e-T`*<*ci_H$`3dSUFcb97a zOI!Z{Ih+L^k;M!Q+`=Ht$S`Y;1W=H@#M9T6{V6*uuN32fz|ge}3`{(pE{-7*l5Y>b z3>ONNVS7;CP{>&5))L5ZeS=PJ;Ayd9M&p=Un-?A3ax~_GndsNQuOFYVmD&6G<-cda z>hsy3|KkqRkl83LHG7tzkBQq-)jozO*=sv<1-h+lj`ljA==#{h(&BVwi?f=KuaJ>o zR?vivD?ch+cI;)J>6dkB!ikuI6(^k*te$Ll*WlV^@BMZ&UhU7gtZ&X>d~NCJ5VrLj z^vXrk+S*pe?9RKp!*gjqgPWV%@rcKFclEA%mvZXcrJH#YlKUSA?X2c6`W_sjCg+e> z)OG5MkDS_?0E?t@msz(0LuYJ_{9N!(u*W4ir0X+xw|B@dxx+rI5AS-Z9x~6adEp9Y z`}aS&B{n5}ss71z%;`&H9dDz7=}z-X50@1)8+v?!4rR--IbjmCnP;Y2)}8ID9wwKc z->vr8a^d}9n=?maf0@?AG;TDTUOK;R<(hSo2BQ7}KmQz!ie75;L-g3K$(rZ=QlkU6 zema|WHlm27@ynN>lWWrjJi=#r{jz2{xn_6BGBv>yCtgTozq!e@%1mtX?C6tkje2-_ zgCnD2G~Qa+JbaUukoEAm(A4>^*Hlj#g#EbcxIc;W*`xh0w=;Lz_g;C*H9_Kj@rs-6 zKGS9~pU4RcZagDqDtba?<;><^7t(=AMYY5=q9i4;B-JXpC>2OC7#SED z>Kd5q8kmL{8e18eSs55;8yEn|xD<)wdnt>-nUX^y1`ud&|>LV^j`F zF8bHT!(OpL+3%X0#*PmKEc|_cXNewFWlDKzbnZ!13-@}(t1kH^tT#Njbn(7>o^U|P zyt~|2VE^7!!MeueGyS{#tK(JkjD8u%kyrGb>(5)qq zB?2y5(rh1vAmFe_ua7VJoxu^UHtFg4O4s z1%}Sp8u_{4onVhka!A)_?r!gpUvh_iRv+H=QaxmzUGu^f&i3zra!YJV`cnOq>zLD* z$U5Fe1Jj-6l^!lDW;XQr0v*bhWplzLXfw}DwX8eaRXt2DKfhb;vE{=1!!~D*#{M#` ziD}$uHobIy+sZZTA`L|S1AhKF8Wp|N=!fXBTaz`<`=v$)ZvAvN?QBF5OXHU>K_}Oy z3wVUj^7>`XbaKt^kY#FuCr-SO$bNH^X_cASuzC0-{o)lj+kK|ZVm^@*6x?`5%vAJ* z%F3C|XUt67CumyRJYFI1wA&_`KWHY4zvVgSH8Cl7Ke91tynRyfC_}$Lf$KN>)Khm7 z?a%%F{EtbE``EUJFE6A6lZtAIYeY#(Vo9o1a#1RfVlXl=GSM|K2BHuHQ!7&gD-%O) z0|P4qgDKDMZbQ+Ko1c=IR*BGH7-DE_WoT|?U;@!_yUjcWs6hj6LrG?CYH>+oZUI6M Wx+R;|xm*S6VeoYIb6Mw<&;$U%b*-5I literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/splash.png b/app/src/main/res/drawable-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..93403241e02670b7aa0a4439ad1824e5d0ba0b38 GIT binary patch literal 86311 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 Zk2xSiH>ZW~-zHF<<>~6@vd$@?2>@~Tg604K literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_refresh_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_refresh_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1de5043ce70c80ac24d24efa4ef1ede02cae94a3 GIT binary patch literal 1738 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#B(j9#r85lP9bN@+X1@aY=J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+080~2F_Pl&6WXWl3pu_5sP z|NlOht+#-wWMxT^UoeAQSo`|(&%XU_3zcqQw4He8W}l^C`Q0MEMxo9xADftR-@Qs! zKXE`I{%Z*Hq}FEkrEbb>yv_wHUM^wT_S)Eb#^>wn9&-v*zwiIaB|Ph2>ovEVwvxAle4oA@)zsoU*PVD`K6!pV(0xu^S1`v zGPv#8^=ILnO;gMkuT&9XRdcNi{t%>eXs=Ad+bc#r7i&+6{o2@d8|Y}pByV?@Rr}b& z_W?Pa1s;*b3=G`DAk4@xYmNj^kiEpy*OmP#J1eggMphnL93Syq8}s<%FB5p#ciAS^RGc1zfu_w|`? z%f*e}z5C6#=l;9O2OleJyDCNJTpEgD{VP{I?c%cr}*Z8 z6aE(F)#qYnX{}%3vW|gs`Ko83mxFva2t_ifJoM3!S-AEmw~0j4AAXt09UVbiO9h(# zaQM~ioWYf~?~uFWKmJ#*q*r8gvbktFL?#;+|CrV`{phMkUpsGn64jnPWARQ^FWHcz z;fCJXH?vYMU)xf9R_Fc&2G@mKWvLH& z)3*JX!SA(i?XtvdDYJdIkJ$tW-ts%#Cy-P6CPi<>4cEhYC#D#Qi>Oquye-w_GNp2X zf>*4+lu+Qa=9pC8)^%qmbZlaH@+}~ot5bp7ab3GpHP^Q$6ULQ$uY5fiHz7@7Yrj)A zdk$*`SI}?GDF?$Eo+%VJ?7F%^cmeAPnI#XJW$o8GJQHYLy5Zq+)e|zy1lmmP*E*(2 zx26`H6y!48q2jcVOE1z#k#D-pQh|2wzQ7et-c=e$9!z>H;&(t*UGvL9)#Vy<+Pu#N zSa45Q@z$8r?7eUK1qSxI1qE_Nt|C>z0oUSvA2L1B3o7S4Wwo-~@n9;~@pTS?o2DPC zT=8P@J1r5@0CNV>m0?`X_D&~f330tG)OfjMoeeMR=I24*g|CG01#UNES@|pbN^E}1 zB1WlO3XAV9c&ISt>ZJ=}O>3vkHhI&sYgeg>hQeA7PuQ!7Yg!oAB!3ilseIqmnEOTQCboW*jVIJQL2axPf& zwES7dujHe5?d8q>UH$)}@aRj$XFDSMIWM%We8H*q;-#@xM^DnBfB)Kp&i_BElA-_X z^0f;LYMPZ9J=2a^3D4M5a@2cPm89PT;mWVSe9epB>PsC||61@R_w#P$wXw|;zqz(A zPQQ2fF(|FF+c6j|{P^)jVEqnY)=({RjVMV;EJ?LWE=mPb3`Pby9U+6D$dGA>0R5Jf|7eoAIqC2kG+mMh)@H86O(`njxgN@xNA+sd2e literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..942eec938ce20a3c72ac9733ec2000e75060cc50 GIT binary patch literal 1774 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!Sl0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|OIdfKQ04lmPcA8nGep|NsBKRaQ@csbpnIkY6x^ zTv+@1^UuEhZ3~rdV6>fh=VqU!VENr5zDA+WFCUwja^Jm5RzGn-A^vL!^Q6{h_N8vh zY`o3|D_$;P+4kDlddBDL>mG9oRKM^4$t67NU+fJ%7u7X96335D-JCJ)O`&;S_f>KK z`sMdNJw4(+uVR_+bCa{P5Aql5=3n6Mi20?T^J3@yMf0}?+%mZB+4X1PoJ~{A7Ozwh zVO4Xj3;qzKbZD{XE)7O>#1v4|Nk>;uUFWQ00{*R}NV~B+0+k@Yoh0__>9$aq{GznkA$Klk* zoON)4XNbd;Fb*$~i?gf(?^JJn)FS5o`aoD_cI=k0JMZf=-nR z3k? zbqfmQid;pif&;F_`#xlPq8C)odCF>Kx8uQ7uH)+*0yj-RRJr2C;&)mirUB**qASC= zn(duV&JyB!Td47J$vPWe*3Hj@z6)Oo;S1bu#GnalRxHyaDK5=Y`oaJ1w=4tt}j9zm0Xkxq!^40j7)S5jDaY`z|_jrz{+rYrez+lR=yW3DS zL8JIvc+-@^Z0cy~I+fb63n_66wm|K9*gKo*DbuL$ddKf%i L{an^LB{Ts55eh%6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e23aed4e72bc5995d85fa1a4c47f148b23f8ca GIT binary patch literal 1534 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#B(j9#r85lP9bN@+X1@aY=J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+0817ll&Pl&6WXWl3p*bw;t z|NjQRy&0gWDhcunX3)r(zVF`KUwhS!`ky@RGhp;Pam>f;%qbI&sedP3yr63P{++e= z_ir9|B8Awd-L?9&#KLkZ=cR2bJI}L!O-z~i!qE8TE3dSpyY;%4KfFC-O0>x9pPyn5 z%)D>2;(?mh4*lfJLq9w_PRoZjomFh?I?`~sroOtawyLtCysV(Gw5X(bw$PnpK({a^ zdAqwb3hi3=56Iyx@Q5sCVBi)8VMc~ob0mO*>?NMQuIx|QS$U-x4+Ms;Wnf^s;_2cT zA|d(q;Lq?NM+vqE;-WoXhL?j@YIty+%=_&$drHP`@1<{l@0-<{@%s1j>o29>sq!0~ zeevgl<@ZVfu2!f2jUL|F(I(gK$#t*G%T}zG-Ey=9&}VWUqLnZ(y=!Upe(IYxZsS$mH)1dWKWZ^Q#tB zw?!)N7N7RW`o-sOZ{2&D*=>Ja(u}YynXymVeWTAGiQ41b8w?Mu5>^j9zEWqk-(jcx zNvCECUJ14FR^2IfY?oP}2UZvQy0~gGvthG@Y_Fx$5@Rjwg4?Ck9`eC7(E!Rjo+r&RFr?aH_h& zwwb4HT1a*H1Xi*X*LrF_{}mAaUPLsXMQq!KtPL$za&~D~gKxaJ?{>d}<@BB0#qT5K z!h$k??dg`hvZGSlGyaXGPU@yLf_seu=je#2bze_Ui#%P;81295Pq==f>f~i^w-#4$ zYOj2p^XlqrnW^R*f-L5yIN!U?bYPYFhTu18%x!)I_G5jF-EokZL$A^P2-`o14cV-Za=`)ER9OBO;f3ScE9`RE=HErCfY|kDz z&1|&XvEjf0o0y1%1w7(fJX0PzwKlTu2uMs|)YCBvXyoqZ33+fxs5bt=5uvI21u32N zHLb??f7~v&_|p4_Z+YDx7Yz}v);m8~_lVArdz<$LSfnzjmbgZgq$HN4S|t~y0x1R~ z10zFS19M#i(-1>rDj;VhqUA&-b`~ID^_xEoecOr$@rrovrv&6!3 zDd(kaDm%}!e@#r8_`=Zmz|)u4$Qo7v*Ll8)(-vT%tJps zJ5I}oHl0;$>^jnLxTe0kuC}VOqP(o2u(YV8c(%};V?ehsCV9KNGz#rn_YcV7Ebxdd zW?n^55z@# zybLb~t<><~I+^#|Y4((i-QG*z{@ypMHRJW~<=0M{h@Jl$RiwT0ULNN< zx_#5iT+KBnzR6zkNZ-I@&AxK#UDoW|?2*ae9rO&Roaa|9s&0!^-Yq`uk@btu-`=|S zGPB$Mx}+IlSu$gvvinA#KN7Xaxi=UdSS73;czmVKYQMuy`IAn~6uc5@K*ZO*J&{Go5r$`1EJ z##}c6l2JE!-q8C8?!3BV*wXp0ygToN7^;YzsN_Nn0glSsx1=X%n;RFWU#SK ziGA&B5%YvaQxr^UN%7q1G{@T+md1XhXwrBhs zOP$nBYXtWi1w?=o9VzR^9{jo(wN_O{pj8IeS?YBF)O>CNBnH}4qyApJ^jb@+jGA!JY)Dl@LSN* z)sGJcU%t2XMeocY7Sm@EKRCpnN&a8~5j^6jcxu|XQ`w$9aGKd@xnskD12!=c2@80{ zwRomHbZTv6-4T$Oz^JEV6wt`s%@gwAkWg*>gCjyy^$Suu>uXw#@Bg@6ZtnC}Q!>*k5gH6b42`V}&8-YfAR2DBnWq3XXuxeK$;?eHE=kNS YKzopr0P5%jaR2}S literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ab5e09150fd18051c395377047d06382c1bc94 GIT binary patch literal 1677 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#B(j9#r85lP9bN@+X1@aY=J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081LKBZpy11W~(#P zg{77p)MpG=uHE;t%I}V%tj3Pm5WZfg(wLP^yPrPXDA&%j^wTkuFtHD;9oIb;&D*@? z{?@`9oyEsZOKy5iN_FqzT`lzdmY_@b!sXXwT&pX^>Vd9hO!9VjS$zD~dnq7?v%n*= zn1O*?7=#%aX3dcR3bL1Y`ns||WoPA;VmuHSx|V@~>9(hfV~B+0+k>y8C#TA=f6zB7 zxtHL>c|6U++-0KgS{CmaoK0zZ{!3efFUmY+^fj5aoN0Llo1wN3EC2odCi*u^@1B41 zeb27?Jw@~RPo1)p5fz`9waxZY`9%U>|Rx8VEB^eBBa}X= z%52SFcs20m&3Vh*tF-UbZ0(hM_>^JSuE{!G`R^Mi-;?!>vfh7e&AQn8IXCD2Ec-am zw;*U^x%}EM|Cld)z59KO5<9=+b$#RIiFWw~VSCn{ok;iR@hWYgi-7UDxmuJ14Xj%I#XU?^AjuuwOgO+uLRsCnQu=1~; z*xdd=E6P8V4Zr)%ny&2FG_Ut0Zm8U?1)Z`ayZ2!K#ZQC_< z%N^W(7azY<+VizszMF}4hxVQ2Q-3_aUmE;nMIBeVGQaVbf7U03&bK{WxBT{n>raX` zW=JewubFY8E$Pc=Caq74IZypssAAzZQLQqV0}MD^ug-a_YGPY^?E9Wqt*ah-POJDTb!wjf#mA}oU-rH< zuQ_hQmsH1d#rOOfpY|XPZEfMd{05JlKPD!%+5uC(YKdz^NlIc#s#S7PDv)9@GB7gK zH89sTFby#@wlXraGBD6KFaVNqDFT5g8glbfGSez?YtXk`@fN6o!PC{xWt~$(69C?R Bg;oFn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b786dbb99ecc64dd88a7a26b1de92f5ba43dbfef GIT binary patch literal 1713 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⪼sG%>sU2Hn?+eSc|FU1=S>9K=z8FpJ6jwDf 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 bI=BDzZB36((%0OVIsS3j3^P6 + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml new file mode 100644 index 0000000..c9d2255 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml new file mode 100644 index 0000000..8efc968 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_go_back.xml b/app/src/main/res/drawable/ic_go_back.xml new file mode 100644 index 0000000..c276722 --- /dev/null +++ b/app/src/main/res/drawable/ic_go_back.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_go_forward.xml b/app/src/main/res/drawable/ic_go_forward.xml new file mode 100644 index 0000000..307409f --- /dev/null +++ b/app/src/main/res/drawable/ic_go_forward.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_stat_onesignal_default.xml b/app/src/main/res/drawable/ic_stat_onesignal_default.xml new file mode 100644 index 0000000..dbd375d --- /dev/null +++ b/app/src/main/res/drawable/ic_stat_onesignal_default.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/shape_rounded.xml b/app/src/main/res/drawable/shape_rounded.xml new file mode 100644 index 0000000..74c2ddb --- /dev/null +++ b/app/src/main/res/drawable/shape_rounded.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/actionbar_title.xml b/app/src/main/res/layout/actionbar_title.xml new file mode 100644 index 0000000..8f4571e --- /dev/null +++ b/app/src/main/res/layout/actionbar_title.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gonative.xml b/app/src/main/res/layout/activity_gonative.xml new file mode 100644 index 0000000..eaa69a2 --- /dev/null +++ b/app/src/main/res/layout/activity_gonative.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/button_menu.xml b/app/src/main/res/layout/button_menu.xml new file mode 100644 index 0000000..78a671b --- /dev/null +++ b/app/src/main/res/layout/button_menu.xml @@ -0,0 +1,13 @@ + + +