From 2a74fd2c304b571ab5ae349ffc3b7f06c5b4daf7 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Fri, 5 Dec 2025 18:19:49 +0800 Subject: [PATCH] clone https://gitea.winboll.cc/Studio/WinBoLL_Bck20251205_175044_440.git and fix build.gradle file maven key settings. --- .github/workflows/android.yml | 87 ++ .gitignore | 101 ++ .gitmodules | 3 + .idea/.gitignore | 3 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/deploymentTargetDropDown.xml | 10 + .idea/migrations.xml | 10 + .idea/misc.xml | 10 + .winboll/Readme.txt | 18 + .winboll/bashCheckGitCommitStatus.sh | 32 + .winboll/bashCommitAppPublishBuildFlagInfo.sh | 17 + .winboll/bashCommitLibReleaseBuildFlagInfo.sh | 48 + .winboll/bashPublishAPKAddTag.sh | 166 +++ .winboll/bashPublishDebugAPKAddTag.sh | 166 +++ .winboll/bashPublishLIBAddTag.sh | 14 + .winboll/winboll_app_build.gradle | 325 ++++++ .winboll/winboll_lib_build.gradle | 211 ++++ .winboll/winboll_lint_build.gradle | 50 + GenKeyStore/gen_debug_keystore.sh | 49 + LICENSE | 201 ++++ README.md | 156 +++ aes/.gitignore | 1 + aes/README.md | 35 + aes/app_update_description.txt | 1 + aes/build.gradle | 51 + aes/build.properties | 8 + aes/proguard-rules.pro | 137 +++ aes/src/beta/AndroidManifest.xml | 12 + aes/src/beta/res/values/strings.xml | 6 + aes/src/main/AndroidManifest.xml | 42 + .../cc/winboll/studio/aes/AboutActivity.java | 93 ++ .../main/java/cc/winboll/studio/aes/App.java | 33 + .../cc/winboll/studio/aes/MainActivity.java | 201 ++++ .../winboll/studio/aes/SettingsActivity.java | 38 + .../aes/TestActivityManagerActivity.java | 33 + .../winboll/studio/aes/WinBoLLActivity.java | 60 ++ aes/src/main/res/layout/activity_about.xml | 22 + aes/src/main/res/layout/activity_settings.xml | 12 + .../layout/activity_testactivitymanager.xml | 15 + aes/src/main/res/menu/toolbar_main.xml | 38 + aes/src/main/res/values/colors.xml | 7 + aes/src/main/res/values/strings.xml | 6 + aes/src/main/res/values/styles.xml | 5 + .../main/res/xml/network_security_config.xml | 6 + aes/src/stage/AndroidManifest.xml | 12 + aes/src/stage/res/values/strings.xml | 6 + androiddemo/.gitignore | 1 + androiddemo/app_update_description.txt | 1 + androiddemo/build.gradle | 72 ++ androiddemo/build.properties | 8 + androiddemo/proguard-rules.pro | 21 + androiddemo/src/beta/AndroidManifest.xml | 12 + androiddemo/src/beta/res/values/strings.xml | 7 + androiddemo/src/main/AndroidManifest.xml | 39 + .../cc/winboll/studio/androiddemo/App.java | 334 ++++++ .../studio/androiddemo/MainActivity.java | 25 + .../src/main/res/drawable/ic_launcher.png | Bin 0 -> 9250 bytes .../src/main/res/layout/activity_main.xml | 37 + .../src/main/res/values-v21/styles.xml | 9 + androiddemo/src/main/res/values/colors.xml | 6 + androiddemo/src/main/res/values/strings.xml | 4 + androiddemo/src/main/res/values/styles.xml | 5 + androiddemo/src/stage/AndroidManifest.xml | 12 + androiddemo/src/stage/res/values/strings.xml | 6 + androidxdemo/.gitignore | 1 + androidxdemo/app_update_description.txt | 1 + androidxdemo/build.gradle | 73 ++ androidxdemo/build.properties | 8 + androidxdemo/proguard-rules.pro | 21 + androidxdemo/src/beta/AndroidManifest.xml | 12 + androidxdemo/src/beta/res/values/strings.xml | 6 + androidxdemo/src/main/AndroidManifest.xml | 37 + .../cc/winboll/studio/androidxdemo/App.java | 345 ++++++ .../studio/androidxdemo/MainActivity.java | 31 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../src/main/res/layout/activity_main.xml | 51 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes androidxdemo/src/main/res/values/colors.xml | 6 + androidxdemo/src/main/res/values/strings.xml | 4 + androidxdemo/src/main/res/values/styles.xml | 11 + androidxdemo/src/stage/AndroidManifest.xml | 12 + androidxdemo/src/stage/res/values/strings.xml | 6 + appbase/.gitignore | 1 + appbase/app_update_description.txt | 1 + appbase/build.gradle | 52 + appbase/build.properties | 8 + appbase/proguard-rules.pro | 126 +++ appbase/src/beta/AndroidManifest.xml | 15 + appbase/src/beta/res/values/strings.xml | 6 + appbase/src/main/AndroidManifest.xml | 41 + .../java/cc/winboll/studio/appbase/App.java | 40 + .../winboll/studio/appbase/MainActivity.java | 140 +++ .../src/main/res/drawable/btn_light_blue.xml | 7 + appbase/src/main/res/layout/activity_main.xml | 67 ++ appbase/src/main/res/menu/toolbar_main.xml | 8 + appbase/src/main/res/values/colors.xml | 7 + appbase/src/main/res/values/strings.xml | 4 + appbase/src/main/res/values/styles.xml | 14 + appbase/src/stage/AndroidManifest.xml | 12 + appbase/src/stage/res/values/strings.xml | 6 + apputils/README.md | 35 + apputils/app_update_description.txt | 1 + apputils/build.gradle | 49 + apputils/build.properties | 8 + apputils/proguard-rules.pro | 17 + apputils/src/beta/AndroidManifest.xml | 13 + apputils/src/beta/res/values/strings.xml | 6 + apputils/src/main/AndroidManifest.xml | 48 + .../java/cc/winboll/studio/apputils/App.java | 20 + .../studio/apputils/AssetsHtmlActivity.java | 135 +++ .../winboll/studio/apputils/MainActivity.java | 311 ++++++ .../studio/apputils/QRCodeDecodeActivity.java | 436 ++++++++ .../studio/apputils/QRGeneratorActivity.java | 97 ++ .../apputils/TestBBMorseCodeActivity.java | 20 + .../studio/apputils/WinBoLLActivity.java | 14 + .../src/main/res/drawable/ic_launcher.xml | 11 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../res/drawable/ic_launcher_foreground.xml | 10 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../main/res/layout/activity_assetshtml.xml | 21 + .../src/main/res/layout/activity_main.xml | 60 ++ .../main/res/layout/activity_qrcodedecode.xml | 43 + .../main/res/layout/activity_qrgenerator.xml | 45 + .../res/layout/activity_testbbmorsecode.xml | 9 + .../activity_teststringtoqrcodeview.xml | 28 + .../main/res/layout/activity_testwinboll.xml | 17 + apputils/src/main/res/menu/toolbar_main.xml | 13 + .../src/main/res/menu/toolbar_testwinboll.xml | 9 + apputils/src/main/res/values/colors.xml | 7 + apputils/src/main/res/values/strings.xml | 6 + apputils/src/main/res/values/styles.xml | 14 + apputils/src/main/res/xml/studio_provider.xml | 25 + apputils/src/stage/AndroidManifest.xml | 12 + apputils/src/stage/res/values/strings.xml | 6 + autoinstaller/README.md | 35 + autoinstaller/app_update_description.txt | 1 + autoinstaller/build.gradle | 73 ++ autoinstaller/build.properties | 8 + autoinstaller/proguard-rules.pro | 17 + autoinstaller/src/beta/AndroidManifest.xml | 22 + autoinstaller/src/beta/res/values/strings.xml | 6 + autoinstaller/src/main/AndroidManifest.xml | 90 ++ .../cc/winboll/studio/autoinstaller/App.java | 32 + .../autoinstaller/AppBaseTileService.java | 12 + .../studio/autoinstaller/FileListener.java | 80 ++ .../studio/autoinstaller/MainActivity.java | 378 +++++++ .../studio/autoinstaller/models/APKModel.java | 75 ++ .../autoinstaller/models/AppConfigs.java | 180 ++++ .../autoinstaller/models/MainServiceBean.java | 67 ++ .../autoinstaller/receivers/MainReceiver.java | 40 + .../services/AssistantService.java | 110 ++ .../autoinstaller/services/MainService.java | 290 +++++ .../studio/autoinstaller/utils/FileUtil.java | 47 + .../autoinstaller/utils/NotificationUtil.java | 83 ++ .../autoinstaller/utils/PackageUtil.java | 48 + .../autoinstaller/utils/ServiceUtil.java | 35 + .../views/ListViewForScrollView.java | 77 ++ .../src/main/res/drawable/ic_android.xml | 11 + .../src/main/res/drawable/ic_cloud.xml | 11 + .../main/res/drawable/ic_cloud_outline.xml | 11 + .../src/main/res/drawable/ic_launcher.xml | 11 + .../res/drawable/ic_launcher_background.xml | 171 +++ .../res/drawable/ic_launcher_foreground.xml | 11 + .../src/main/res/drawable/ic_winboll.xml | 11 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../activity_installcompletedfollowup.xml | 13 + .../src/main/res/layout/activity_main.xml | 142 +++ .../src/main/res/layout/installitem.xml | 15 + .../src/main/res/layout/toast_custom_view.xml | 38 + autoinstaller/src/main/res/values/attrs.xml | 9 + autoinstaller/src/main/res/values/colors.xml | 11 + autoinstaller/src/main/res/values/strings.xml | 4 + autoinstaller/src/main/res/values/styles.xml | 13 + .../src/main/res/xml/provider_paths.xml | 26 + autoinstaller/src/stage/AndroidManifest.xml | 22 + .../src/stage/res/values/strings.xml | 6 + build.gradle | 113 ++ contacts/README.md | 40 + contacts/app_update_description.txt | 1 + contacts/build.gradle | 87 ++ contacts/build.properties | 8 + contacts/proguard-rules.pro | 17 + contacts/src/beta/AndroidManifest.xml | 13 + contacts/src/beta/res/values/strings.xml | 6 + contacts/src/main/AndroidManifest.xml | 196 ++++ .../studio/contacts/ActivityStack.java | 59 ++ .../java/cc/winboll/studio/contacts/App.java | 37 + .../winboll/studio/contacts/MainActivity.java | 354 +++++++ .../contacts/activities/AboutActivity.java | 92 ++ .../contacts/activities/CallActivity.java | 119 +++ .../contacts/activities/DialerActivity.java | 40 + .../contacts/activities/SettingsActivity.java | 344 ++++++ .../contacts/activities/UnitTestActivity.java | 94 ++ .../contacts/activities/WinBollActivity.java | 60 ++ .../contacts/adapters/CallLogAdapter.java | 137 +++ .../contacts/adapters/ContactAdapter.java | 131 +++ .../contacts/adapters/ImagePagerAdapter.java | 14 + .../adapters/PhoneConnectRuleAdapter.java | 261 +++++ .../studio/contacts/beans/CallLogModel.java | 36 + .../studio/contacts/beans/ContactModel.java | 102 ++ .../contacts/beans/MainServiceBean.java | 68 ++ .../contacts/beans/PhoneConnectRuleModel.java | 114 ++ .../studio/contacts/beans/RingTongBean.java | 74 ++ .../studio/contacts/beans/SettingsModel.java | 157 +++ .../studio/contacts/bobulltoon/TomCat.java | 260 +++++ .../cc/winboll/studio/contacts/dun/Rules.java | 228 ++++ .../contacts/fragments/CallLogFragment.java | 171 +++ .../contacts/fragments/ContactsFragment.java | 354 +++++++ .../contacts/fragments/LogFragment.java | 61 ++ .../contacts/handlers/MainServiceHandler.java | 38 + .../listenphonecall/CallListenerService.java | 211 ++++ .../phonecallui/PhoneCallActivity.java | 161 +++ .../phonecallui/PhoneCallManager.java | 62 ++ .../phonecallui/PhoneCallService.java | 215 ++++ .../contacts/receivers/MainReceiver.java | 45 + .../contacts/services/AssistantService.java | 137 +++ .../studio/contacts/services/MainService.java | 325 ++++++ .../contacts/threads/MainServiceThread.java | 73 ++ .../contacts/utils/AppGoToSettingsUtil.java | 270 +++++ .../studio/contacts/utils/ContactUtils.java | 215 ++++ .../contacts/utils/EditTextIntUtils.java | 24 + .../studio/contacts/utils/IntUtils.java | 37 + .../studio/contacts/utils/PhoneUtils.java | 27 + .../studio/contacts/utils/RegexPPiUtils.java | 32 + .../studio/contacts/views/DuInfoTextView.java | 68 ++ .../studio/contacts/views/LeftScrollView.java | 220 ++++ .../studio/contacts/views/ScrollDoView.java | 14 + .../contacts/widgets/APPStatusWidget.java | 75 ++ .../widgets/APPStatusWidgetClickListener.java | 32 + contacts/src/main/res/drawable/ic_call.xml | 11 + .../src/main/res/drawable/ic_launcher.xml | 11 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../main/res/drawable/ic_launcher_disable.xml | 11 + .../res/drawable/ic_launcher_foreground.xml | 10 + .../ic_launcher_foreground_disable.xml | 10 + .../main/res/drawable/ic_phone_call_in.xml | 9 + .../main/res/drawable/ic_phone_call_out.xml | 9 + .../main/res/drawable/ic_phone_hang_up.xml | 9 + .../main/res/drawable/ic_phone_pick_up.xml | 30 + .../res/drawable/recycler_view_border.xml | 9 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../src/main/res/layout/activity_about.xml | 21 + .../src/main/res/layout/activity_call.xml | 28 + .../src/main/res/layout/activity_dialer.xml | 22 + .../src/main/res/layout/activity_main.xml | 37 + .../main/res/layout/activity_phone_call.xml | 98 ++ .../src/main/res/layout/activity_settings.xml | 341 ++++++ .../src/main/res/layout/activity_unittest.xml | 60 ++ .../src/main/res/layout/fragment_call_log.xml | 15 + .../src/main/res/layout/fragment_contacts.xml | 36 + contacts/src/main/res/layout/fragment_log.xml | 12 + .../src/main/res/layout/item_call_log.xml | 78 ++ contacts/src/main/res/layout/item_contact.xml | 68 ++ .../src/main/res/layout/view_left_scroll.xml | 52 + .../src/main/res/layout/view_phone_call.xml | 33 + .../res/layout/view_phone_connect_rule.xml | 44 + .../layout/view_phone_connect_rule_simple.xml | 16 + ...view_phone_connect_rule_simple_content.xml | 35 + contacts/src/main/res/layout/view_toast.xml | 32 + .../src/main/res/layout/widget_layout.xml | 15 + .../res/menu/toolbar_calllog_phonenumber.xml | 12 + .../res/menu/toolbar_contact_phonenumber.xml | 12 + contacts/src/main/res/menu/toolbar_main.xml | 8 + contacts/src/main/res/values/colors.xml | 13 + contacts/src/main/res/values/strings.xml | 7 + contacts/src/main/res/values/styles.xml | 17 + .../main/res/xml/appwidget_provider_info.xml | 8 + .../main/res/xml/network_security_config.xml | 9 + contacts/src/main/res/xml/studio_provider.xml | 25 + contacts/src/stage/AndroidManifest.xml | 12 + contacts/src/stage/res/values/strings.xml | 6 + gradle.properties-android-demo | 21 + gradle.properties-androidx-demo | 21 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++ jc/README.md | 3 + jc/app_update_description.txt | 1 + jc/build.gradle | 65 ++ jc/build.properties | 8 + jc/proguard-rules.pro | 17 + jc/src/beta/AndroidManifest.xml | 12 + jc/src/beta/res/values/strings.xml | 6 + jc/src/main/AndroidManifest.xml | 47 + .../main/java/cc/winboll/studio/jc/App.java | 19 + .../cc/winboll/studio/jc/MainActivity.java | 234 ++++ jc/src/main/res/drawable/ic_launcher.xml | 10 + .../res/drawable/ic_launcher_background.xml | 170 +++ jc/src/main/res/drawable/ic_launcher_beta.xml | 11 + .../res/drawable/ic_launcher_foreground.xml | 10 + jc/src/main/res/drawable/shape_gradient.xml | 10 + jc/src/main/res/layout/activity_main.xml | 85 ++ jc/src/main/res/layout/view_toast.xml | 32 + jc/src/main/res/menu/toolbar_about.xml | 9 + jc/src/main/res/menu/toolbar_main.xml | 7 + jc/src/main/res/values/colors.xml | 10 + jc/src/main/res/values/strings.xml | 6 + jc/src/main/res/values/styles.xml | 5 + jc/src/stage/AndroidManifest.xml | 12 + jc/src/stage/res/values/strings.xml | 6 + jcndk/AndroidManifest.xml | 45 + jcndk/META-INF/ANDROID.RSA | Bin 0 -> 1714 bytes jcndk/META-INF/ANDROID.SF | 26 + jcndk/META-INF/MANIFEST.MF | 25 + jcndk/README.md | 3 + jcndk/assets/switch2bash.sh | 7 + jcndk/jni/Android.mk | 27 + jcndk/jni/Application.mk | 3 + jcndk/jni/hello-jni.cpp | 32 + jcndk/libs/armeabi-v7a/libhello-jni.so | Bin 0 -> 13864 bytes jcndk/libs/x86/libhello-jni.so | Bin 0 -> 5200 bytes jcndk/obj/local/armeabi-v7a/libhello-jni.so | Bin 0 -> 147156 bytes .../armeabi-v7a/objs/hello-jni/hello-jni.o | Bin 0 -> 55272 bytes .../armeabi-v7a/objs/hello-jni/hello-jni.o.d | 7 + jcndk/obj/local/x86/libhello-jni.so | Bin 0 -> 53284 bytes .../obj/local/x86/objs/hello-jni/hello-jni.o | Bin 0 -> 54512 bytes .../local/x86/objs/hello-jni/hello-jni.o.d | 7 + jcndk/project.properties | 13 + jcndk/res/layout/view_main.xml | 47 + jcndk/res/values/strings.xml | 4 + .../cc/winboll/studio/jcndk/FileUtils.java | 56 + .../src/cc/winboll/studio/jcndk/HelloJni.java | 265 +++++ .../studio/jcndk/services/JCMainService.java | 45 + libaes/.gitignore | 1 + libaes/build.gradle | 71 ++ libaes/build.properties | 8 + libaes/libs/colorpicker-20180319.jar | Bin 0 -> 12740 bytes libaes/proguard-rules.pro | 17 + libaes/src/main/AndroidManifest.xml | 66 ++ .../studio/libaes/DrawerMenuDataAdapter.java | 207 ++++ .../studio/libaes/ImagePagerAdapter.java | 75 ++ .../activitys/DrawerFragmentActivity.java | 401 +++++++ .../libaes/dialogs/LocalFileSelectDialog.java | 204 ++++ .../libaes/dialogs/StoragePathDialog.java | 57 + .../libaes/dialogs/YesNoAlertDialog.java | 60 ++ .../winboll/studio/libaes/enums/ADsMode.java | 31 + .../libaes/interfaces/IWinBoLLActivity.java | 18 + .../studio/libaes/models/AESThemeBean.java | 138 +++ .../winboll/studio/libaes/models/APPInfo.java | 169 +++ .../studio/libaes/models/DrawerMenuBean.java | 35 + .../models/WinBoLLClientServiceBean.java | 78 ++ .../unittests/SecondaryLibraryActivity.java | 62 ++ .../unittests/SecondaryLibraryFragment.java | 25 + .../libaes/unittests/TestAButtonFragment.java | 37 + .../TestASupportToolbarActivity.java | 42 + .../unittests/TestAToolbarActivity.java | 28 + .../unittests/TestDrawerFragmentActivity.java | 124 +++ .../unittests/TestViewPageFragment.java | 226 ++++ .../studio/libaes/utils/AESThemeUtil.java | 195 ++++ .../studio/libaes/utils/AppVersionUtils.java | 162 +++ .../studio/libaes/utils/MimoUtils.java | 33 + .../utils/MyActivityLifecycleCallbacks.java | 97 ++ .../studio/libaes/utils/PrefUtils.java | 33 + .../studio/libaes/utils/ScreenUtil.java | 64 ++ .../libaes/utils/WinBoLLActivityManager.java | 292 +++++ .../winboll/studio/libaes/views/AButton.java | 28 + .../cc/winboll/studio/libaes/views/ACard.java | 45 + .../libaes/views/ADrawerMenuListView.java | 19 + .../studio/libaes/views/ADsBannerView.java | 498 +++++++++ .../studio/libaes/views/ADsControlView.java | 484 +++++++++ .../studio/libaes/views/AOHPCTCSeekBar.java | 108 ++ .../studio/libaes/views/AOHPCTSCard.java | 43 + .../studio/libaes/views/ASupportToolbar.java | 89 ++ .../studio/libaes/views/ATickProgressBar.java | 55 + .../winboll/studio/libaes/views/AToolbar.java | 92 ++ .../studio/libaes/views/AboutView.java | 379 +++++++ .../res/anim/normal_dialog_enter_center.xml | 35 + .../res/anim/normal_dialog_enter_corner.xml | 15 + .../res/anim/normal_dialog_exit_center.xml | 35 + .../res/anim/normal_dialog_exit_corner.xml | 14 + .../main/res/drawable/acard_frame_main.xml | 62 ++ .../src/main/res/drawable/atoolbar_frame.xml | 62 ++ libaes/src/main/res/drawable/bg_shadow.xml | 41 + libaes/src/main/res/drawable/btn_style.xml | 7 + .../src/main/res/drawable/default_shape.xml | 27 + .../res/drawable/ic_arrow_left_right_bold.xml | 11 + .../drawable/ic_arrow_up_circle_outline.xml | 11 + libaes/src/main/res/drawable/ic_call.xml | 11 + .../main/res/drawable/ic_dev_connected.xml | 11 + .../main/res/drawable/ic_dev_disconnected.xml | 11 + libaes/src/main/res/drawable/ic_email.xml | 11 + .../src/main/res/drawable/ic_email_alert.xml | 11 + libaes/src/main/res/drawable/ic_launcher.xml | 13 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../res/drawable/ic_launcher_foreground.xml | 10 + libaes/src/main/res/drawable/ic_winboll.xml | 13 + .../src/main/res/drawable/ic_winbollbeta.xml | 11 + libaes/src/main/res/drawable/ohpcts_frame.xml | 43 + .../src/main/res/drawable/pressed_shape.xml | 22 + .../src/main/res/drawable/shape_gradient.xml | 10 + libaes/src/main/res/drawable/toast_frame.xml | 7 + libaes/src/main/res/drawable/view_border.xml | 8 + libaes/src/main/res/drawable/winboll_help.xml | 27 + libaes/src/main/res/drawable/winboll_logo.xml | 48 + .../src/main/res/drawable/winboll_point.xml | 20 + libaes/src/main/res/layout/activity_about.xml | 11 + .../src/main/res/layout/activity_drawer.xml | 57 + .../res/layout/activity_drawerfragment.xml | 65 ++ .../res/layout/activity_secondarylibrary.xml | 15 + .../layout/activity_test_aboutfragment.xml | 15 + .../layout/activity_testasupporttoolbar.xml | 15 + .../main/res/layout/activity_testatoolbar.xml | 15 + .../main/res/layout/dialog_storagepath.xml | 43 + .../src/main/res/layout/fragment_abutton.xml | 20 + .../res/layout/fragment_secondarylibrary.xml | 15 + libaes/src/main/res/layout/fragment_test1.xml | 15 + libaes/src/main/res/layout/fragment_test2.xml | 15 + .../src/main/res/layout/fragment_viewpage.xml | 60 ++ .../main/res/layout/listview_drawermenu.xml | 28 + libaes/src/main/res/layout/view_adsbanner.xml | 15 + .../src/main/res/layout/view_adscontrol.xml | 46 + libaes/src/main/res/layout/viewpage_acard.xml | 18 + .../main/res/layout/viewpage_aohpctccard.xml | 18 + .../main/res/layout/viewpage_aohpctcsb.xml | 35 + .../res/layout/viewpage_atickprogressbar.xml | 22 + libaes/src/main/res/menu/toolbar_apptheme.xml | 26 + .../src/main/res/menu/toolbar_drawerbase.xml | 18 + .../res/menu/toolbar_secondarylibrary.xml | 9 + .../main/res/menu/toolbar_studio_debug.xml | 35 + libaes/src/main/res/values-zh/string.xml | 16 + libaes/src/main/res/values/attrs.xml | 75 ++ libaes/src/main/res/values/colors.xml | 45 + libaes/src/main/res/values/dimens.xml | 16 + libaes/src/main/res/values/strings.xml | 21 + libaes/src/main/res/values/styles.xml | 247 +++++ libaes/src/main/res/xml/file_provider.xml | 5 + .../main/res/xml/network_security_config.xml | 16 + libappbase/.gitignore | 1 + libappbase/build.gradle | 28 + libappbase/build.properties | 8 + libappbase/proguard-rules.pro | 17 + libappbase/src/main/AndroidManifest.xml | 33 + .../winboll/studio/libappbase/APPModel.java | 138 +++ .../winboll/studio/libappbase/BaseBean.java | 436 ++++++++ .../studio/libappbase/CrashHandler.java | 550 ++++++++++ .../studio/libappbase/GlobalApplication.java | 174 +++ .../libappbase/GlobalCrashActivity.java | 186 ++++ .../libappbase/GlobalCrashReportView.java | 309 ++++++ .../studio/libappbase/HorizontalListView.java | 240 +++++ .../studio/libappbase/LogActivity.java | 65 ++ .../winboll/studio/libappbase/LogUtils.java | 637 +++++++++++ .../studio/libappbase/LogUtilsBean.java | 131 +++ .../libappbase/LogUtilsClassTAGBean.java | 161 +++ .../cc/winboll/studio/libappbase/LogView.java | 654 ++++++++++++ .../studio/libappbase/LogViewThread.java | 140 +++ .../winboll/studio/libappbase/ToastUtils.java | 257 +++++ .../studio/libappbase/UTF8FileUtils.java | 86 ++ .../src/main/res/drawable/bg_border.xml | 8 + .../src/main/res/drawable/bg_border_round.xml | 13 + .../src/main/res/drawable/bg_toolbar_log.xml | 41 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../src/main/res/drawable/ic_winboll.xml | 13 + .../src/main/res/drawable/ic_winboll_beta.xml | 11 + .../src/main/res/drawable/ic_winboll_logo.xml | 48 + .../main/res/layout/activity_globalcrash.xml | 15 + .../src/main/res/layout/activity_log.xml | 14 + .../src/main/res/layout/item_logtag.xml | 22 + .../res/layout/view_globalcrashreport.xml | 35 + libappbase/src/main/res/layout/view_log.xml | 138 +++ libappbase/src/main/res/values/array.xml | 11 + libappbase/src/main/res/values/attrs.xml | 15 + libappbase/src/main/res/values/colors.xml | 7 + libappbase/src/main/res/values/dimens.xml | 9 + libappbase/src/main/res/values/strings.xml | 6 + libappbase/src/main/res/values/styles.xml | 15 + libapputils/.gitignore | 1 + libapputils/build.gradle | 40 + libapputils/build.properties | 8 + libapputils/proguard-rules.pro | 17 + libapputils/src/main/AndroidManifest.xml | 29 + .../assets/winboll/studio/html/index.html | 12 + .../winboll/studio/html/javascript_test.html | 241 +++++ .../main/assets/winboll/studio/png/apple.png | Bin 0 -> 38511 bytes .../studio/libapputils/git/IAPPFiles.java | 59 ++ .../studio/libapputils/utils/AppUtils.java | 29 + .../libapputils/utils/BBMorseCodeUtils.java | 179 ++++ .../studio/libapputils/utils/FileUtils.java | 241 +++++ .../studio/libapputils/utils/MD5Utils.java | 37 + .../studio/libapputils/utils/PrefUtils.java | 33 + .../libapputils/utils/QRCodeGenerator.java | 58 + .../libapputils/utils/RegexPPiUtils.java | 32 + .../libapputils/utils/ServiceUtils.java | 36 + .../studio/libapputils/utils/UriUtils.java | 130 +++ .../libapputils/views/SimpleWebView.java | 38 + .../libapputils/views/StringToQrCodeView.java | 66 ++ .../src/main/res/drawable/bg_shadow.xml | 41 + .../main/res/drawable/ic_dev_connected.xml | 11 + .../main/res/drawable/ic_dev_disconnected.xml | 11 + .../src/main/res/drawable/ic_email.xml | 11 + .../src/main/res/drawable/ic_email_alert.xml | 11 + .../src/main/res/drawable/ic_launcher.xml | 13 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../res/drawable/ic_launcher_foreground.xml | 10 + .../src/main/res/drawable/ic_winboll.xml | 13 + .../src/main/res/drawable/ic_winbollbeta.xml | 11 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../src/main/res/drawable/view_border.xml | 8 + .../src/main/res/drawable/winboll_help.xml | 27 + .../src/main/res/drawable/winboll_logo.xml | 48 + .../src/main/res/drawable/winboll_point.xml | 20 + .../src/main/res/layout/activity_library.xml | 11 + .../src/main/res/layout/activity_log.xml | 17 + .../src/main/res/layout/activity_unittest.xml | 31 + libapputils/src/main/res/layout/view_ads.xml | 14 + .../main/res/layout/view_string2qrcode.xml | 29 + .../main/res/menu/toolbar_studio_debug.xml | 35 + .../res/menu/toolbar_winboll_shared_about.xml | 8 + .../res/menu/toolbar_winboll_shared_main.xml | 12 + .../src/main/res/values-v21/styles.xml | 5 + libapputils/src/main/res/values/array.xml | 11 + libapputils/src/main/res/values/attrs.xml | 14 + libapputils/src/main/res/values/colors.xml | 6 + libapputils/src/main/res/values/strings.xml | 11 + libapputils/src/main/res/values/styles.xml | 5 + .../main/res/xml/network_security_config.xml | 6 + libjc/.classpath | 6 + libjc/.gitignore | 1 + libjc/.project | 17 + libjc/README.md | 4 + libjc/build.gradle | 33 + libjc/build.properties | 8 + libjc/jcc/.classpath | 6 + libjc/jcc/.gitignore | 1 + libjc/jcc/.project | 17 + libjc/jcc/MANIFEST.MF | 3 + libjc/jcc/bash_build_jar.sh | 40 + libjc/jcc/src/Main.java | 10 + libjc/jcc/test_jar.sh | 26 + libjc/proguard-rules.pro | 17 + libjc/src/main/AndroidManifest.xml | 14 + .../winboll/studio/libjc/JCCommandThread.java | 160 +++ .../winboll/studio/libjc/JCErrorStream.java | 84 ++ .../winboll/studio/libjc/JCErrorThread.java | 22 + .../cc/winboll/studio/libjc/JCMainThread.java | 101 ++ .../winboll/studio/libjc/JCOutputStream.java | 84 ++ .../winboll/studio/libjc/JCOutputThread.java | 22 + .../java/cc/winboll/studio/libjc/Main.java | 136 +++ .../cc/winboll/studio/libjc/TestClassA.java | 35 + .../cc/winboll/studio/libjc/TestClassB.java | 37 + .../winboll/studio/libjc/bean/BaseBean.java | 278 +++++ .../studio/libjc/cmd/ListJarClassHasMain.java | 75 ++ .../studio/libjc/net/JCSocketClient.java | 196 ++++ .../studio/libjc/net/JCSocketServer.java | 204 ++++ .../winboll/studio/libjc/net/MesaageBean.java | 88 ++ .../studio/libjc/task/TermuxUniteTask.java | 5 + .../studio/libjc/util/ConsoleUtils.java | 36 + .../winboll/studio/libjc/util/FileUtils.java | 81 ++ .../winboll/studio/libjc/util/LogUtils.java | 93 ++ .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 9397 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 5237 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 14383 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 19388 bytes libjc/src/main/res/layout/library.xml | 11 + libjc/src/main/res/values-v21/styles.xml | 5 + libjc/src/main/res/values/strings.xml | 7 + libjc/src/main/res/values/styles.xml | 5 + local.properties-demo | 8 + midiplayer/.gitignore | 1 + midiplayer/README.md | 34 + midiplayer/app_update_description.txt | 0 midiplayer/build.gradle | 73 ++ midiplayer/build.properties | 8 + midiplayer/proguard-rules.pro | 21 + midiplayer/src/beta/AndroidManifest.xml | 12 + midiplayer/src/beta/res/values/strings.xml | 6 + midiplayer/src/main/AndroidManifest.xml | 50 + .../main/assets/midi/SuperMarioBrothers.mid | Bin 0 -> 10498 bytes .../midi/Twinkle Twinkle Little Star.mid | Bin 0 -> 4162 bytes .../cc/winboll/studio/midiplayer/App.java | 345 ++++++ .../studio/midiplayer/AssetMidiCopier.java | 137 +++ .../studio/midiplayer/MainActivity.java | 78 ++ .../winboll/studio/midiplayer/MidiParser.java | 420 ++++++++ .../winboll/studio/midiplayer/MidiPlayer.java | 655 ++++++++++++ .../studio/midiplayer/MidiPlayerActivity.java | 437 ++++++++ .../winboll/studio/midiplayer/MidiTrack.java | 78 ++ .../studio/midiplayer/SoundFontManager.java | 59 ++ .../studio/midiplayer/WinBoLLActivity.java | 60 ++ .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../src/main/res/layout/activity_main.xml | 57 + .../main/res/layout/activity_midi_player.xml | 91 ++ midiplayer/src/main/res/layout/item_track.xml | 37 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes midiplayer/src/main/res/values/colors.xml | 6 + midiplayer/src/main/res/values/strings.xml | 4 + midiplayer/src/main/res/values/styles.xml | 11 + midiplayer/src/stage/AndroidManifest.xml | 12 + midiplayer/src/stage/res/values/strings.xml | 6 + mj/app_update_description.txt | 1 + mj/build.gradle | 64 ++ mj/build.properties | 8 + mj/proguard-rules.pro | 17 + mj/src/beta/AndroidManifest.xml | 15 + mj/src/beta/res/values/strings.xml | 6 + mj/src/main/AndroidManifest.xml | 39 + .../main/java/cc/winboll/studio/mj/App.java | 19 + .../cc/winboll/studio/mj/MainActivity.java | 87 ++ .../studio/mj/activities/AboutActivity.java | 62 ++ mj/src/main/res/drawable/ic_launcher.xml | 11 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../res/drawable/ic_launcher_foreground.xml | 10 + mj/src/main/res/drawable/shape_gradient.xml | 10 + mj/src/main/res/layout/activity_about.xml | 24 + mj/src/main/res/layout/activity_main.xml | 29 + mj/src/main/res/layout/view_toast.xml | 32 + mj/src/main/res/menu/toolbar_about.xml | 9 + mj/src/main/res/menu/toolbar_main.xml | 7 + mj/src/main/res/values/colors.xml | 10 + mj/src/main/res/values/strings.xml | 6 + mj/src/main/res/values/styles.xml | 3 + mj/src/stage/AndroidManifest.xml | 12 + mj/src/stage/res/values/strings.xml | 6 + mymessagemanager/.gitignore | 1 + mymessagemanager/README.md | 45 + mymessagemanager/app_update_description.txt | 1 + mymessagemanager/build.gradle | 72 ++ mymessagemanager/build.properties | 8 + mymessagemanager/proguard-rules.pro | 17 + mymessagemanager/src/beta/AndroidManifest.xml | 23 + .../src/beta/res/values-zh/strings.xml | 6 + .../src/beta/res/values/strings.xml | 6 + mymessagemanager/src/main/AndroidManifest.xml | 227 ++++ .../SMSAcceptRuleBean_List.json | 7 + .../TTSPlayRuleBean_List.json | 38 + .../winboll/studio/mymessagemanager/App.java | 46 + .../activitys/AboutActivity.java | 91 ++ .../activitys/AppSettingsActivity.java | 115 ++ .../activitys/BaseActivity.java | 114 ++ .../activitys/ComposeSMSActivity.java | 365 +++++++ .../activitys/MainActivity.java | 323 ++++++ .../activitys/SMSActivity.java | 272 +++++ .../activitys/SMSReceiveRuleActivity.java | 232 ++++ .../activitys/SMSRecycleActivity.java | 92 ++ .../activitys/SharedJSONReceiveActivity.java | 139 +++ .../activitys/TTSPlayRuleActivity.java | 188 ++++ .../activitys/WinBoLLActivity.java | 60 ++ .../adapters/PhoneArrayAdapter.java | 115 ++ .../adapters/SMSAcceptRuleArrayAdapter.java | 229 ++++ .../adapters/SMSArrayAdapter.java | 214 ++++ .../adapters/SMSRecycleAdapter.java | 290 +++++ .../TTSRuleBeanRecyclerViewAdapter.java | 193 ++++ .../mymessagemanager/beans/AppConfigBean.java | 184 ++++ .../beans/AppConfigBean_V1.java | 88 ++ .../mymessagemanager/beans/ContractsBean.java | 29 + .../beans/MessageNotificationBean.java | 53 + .../mymessagemanager/beans/PhoneBean.java | 39 + .../beans/SMSAcceptRuleBean.java | 121 +++ .../beans/SMSAcceptRuleBean_V1.java | 50 + .../mymessagemanager/beans/SMSBean.java | 272 +++++ .../beans/SMSRecycleBean.java | 127 +++ .../beans/TTSPlayRuleBean.java | 147 +++ .../beans/TTSPlayRuleBean_V1.java | 281 +++++ .../beans/TTSSpeakTextBean.java | 24 + .../dialogs/YesNoAlertDialog.java | 59 ++ .../receivers/MainReceiver.java | 43 + .../receivers/SMSRecevier.java | 109 ++ .../services/AssistantService.java | 96 ++ .../services/DefaultSMSManagerService.java | 21 + .../services/MainService.java | 150 +++ .../services/TTSPlayService.java | 42 + .../unittest/AddressUtils_Test.java | 28 + .../unittest/SMSRecevier_Test.java | 56 + .../unittest/UnitTestActivity.java | 36 + .../mymessagemanager/utils/AddressUtils.java | 20 + .../mymessagemanager/utils/AppConfigUtil.java | 55 + .../utils/AppConfigUtil_V1.java | 170 +++ .../utils/AppGoToSettingsUtil.java | 270 +++++ .../mymessagemanager/utils/FileUtil.java | 113 ++ .../utils/NotificationHelper.java | 202 ++++ .../utils/NotificationUtil.java | 168 +++ .../utils/NotificationUtil_Bck.java | 168 +++ .../utils/PermissionUtil.java | 204 ++++ .../mymessagemanager/utils/PhoneUtil.java | 240 +++++ .../utils/SMSReceiveRuleUtil.java | 304 ++++++ .../utils/SMSRecycleUtil.java | 33 + .../mymessagemanager/utils/SMSUtil.java | 387 +++++++ .../mymessagemanager/utils/ServiceUtil.java | 34 + .../utils/TTSPlayRuleUtil.java | 429 ++++++++ .../utils/TextToSpeechUtil.java | 186 ++++ .../mymessagemanager/utils/ThemeUtil.java | 47 + .../mymessagemanager/utils/UnitAreaUtils.java | 53 + .../mymessagemanager/utils/UriUtil.java | 131 +++ .../UserVisionSystemProtectModeUtil.java | 53 + .../mymessagemanager/utils/ViewUtil.java | 20 + .../views/BottomPositionFixedScrollView.java | 125 +++ .../views/ConfirmSwitchView.java | 76 ++ .../views/DateAgoTextView.java | 32 + .../views/PhoneListViewForScrollView.java | 65 ++ .../SMSAcceptRuleListViewForScrollView.java | 33 + .../views/SMSListViewForScrollView.java | 73 ++ .../mymessagemanager/views/SMSView.java | 78 ++ .../views/TTSRuleListViewForScrollView.java | 82 ++ .../mymessagemanager/views/TTSRuleView.java | 48 + .../src/main/res/anim/slow_fade_in.xml | 7 + .../src/main/res/drawable/bg_frame.xml | 41 + .../src/main/res/drawable/bg_frame_black.xml | 41 + .../src/main/res/drawable/bg_frame_white.xml | 41 + .../src/main/res/drawable/cursor_pointer.xml | 20 + .../src/main/res/drawable/ic_launcher.xml | 11 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../ic_launcher_background_golden.xml | 170 +++ .../drawable/ic_launcher_background_sky.xml | 170 +++ .../res/drawable/ic_launcher_foreground.xml | 10 + .../src/main/res/drawable/ic_message.xml | 20 + .../res/drawable/listview_item_selector.xml | 9 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../src/main/res/drawable/speaker.xml | 11 + .../src/main/res/layout/activity_about.xml | 21 + .../main/res/layout/activity_appsettings.xml | 254 +++++ .../main/res/layout/activity_composesms.xml | 112 ++ .../src/main/res/layout/activity_main.xml | 76 ++ .../res/layout/activity_sharedjsonreceive.xml | 29 + .../src/main/res/layout/activity_sms.xml | 49 + .../layout/activity_smsacceptrulesetting.xml | 82 ++ .../main/res/layout/activity_smsrecycle.xml | 32 + .../main/res/layout/activity_ttsplayrule.xml | 164 +++ .../src/main/res/layout/activity_unittest.xml | 44 + .../src/main/res/layout/item_ttsplayrule.xml | 66 ++ .../res/layout/item_ttsplayrule_simple.xml | 66 ++ .../main/res/layout/listview_contracts.xml | 21 + .../src/main/res/layout/listview_phone.xml | 22 + .../src/main/res/layout/listview_sms.xml | 38 + .../main/res/layout/listview_sms_part1.xml | 54 + .../res/layout/listview_smsacceptrule.xml | 89 ++ .../layout/listview_smsacceptrule_simple.xml | 50 + .../main/res/layout/listview_smsrecycle.xml | 84 ++ .../res/layout/listview_smsrecycle_simple.xml | 34 + .../main/res/layout/listview_ttsplayrule.xml | 30 + .../layout/listview_ttsplayrule_simple.xml | 25 + .../src/main/res/layout/remoteview.xml | 39 + .../src/main/res/layout/toast_custom_view.xml | 38 + .../src/main/res/layout/toolbar_sendsms.xml | 15 + .../src/main/res/layout/view_smssend.xml | 16 + .../main/res/layout/view_smssend_part1.xml | 34 + .../src/main/res/layout/view_tts_back.xml | 43 + .../src/main/res/menu/toolbar_about.xml | 6 + .../src/main/res/menu/toolbar_item_sms.xml | 23 + .../main/res/menu/toolbar_item_smsrecycle.xml | 9 + .../src/main/res/menu/toolbar_main.xml | 20 + .../src/main/res/menu/toolbar_main2.xml | 26 + .../src/main/res/menu/toolbar_rule.xml | 16 + .../res/menu/toolbar_smsacceptrulebean.xml | 10 + .../src/main/res/menu/toolbar_smsrecycle.xml | 9 + .../src/main/res/menu/toolbar_ttsrule.xml | 8 + .../src/main/res/values-zh/strings.xml | 46 + .../src/main/res/values/attrs.xml | 12 + .../src/main/res/values/colors.xml | 34 + .../src/main/res/values/dimens.xml | 4 + .../src/main/res/values/strings.xml | 52 + .../src/main/res/values/themes.xml | 90 ++ .../src/main/res/xml/file_provider.xml | 25 + .../main/res/xml/network_security_config.xml | 6 + .../src/stage/AndroidManifest.xml | 22 + .../src/stage/res/values/strings.xml | 6 + numtable/.gitignore | 1 + numtable/README.md | 34 + numtable/app_update_description.txt | 1 + numtable/build.gradle | 73 ++ numtable/build.properties | 8 + numtable/proguard-rules.pro | 21 + numtable/src/beta/AndroidManifest.xml | 14 + numtable/src/beta/res/values/strings.xml | 6 + numtable/src/main/AndroidManifest.xml | 40 + .../java/cc/winboll/studio/numtable/App.java | 345 ++++++ .../winboll/studio/numtable/MainActivity.java | 130 +++ .../drawable-v24/ic_launcher_foreground.xml | 34 + .../src/main/res/drawable/ic_launcher.xml | 13 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../main/res/drawable/ic_launcher_beta.xml | 11 + .../src/main/res/drawable/ic_point_left.xml | 20 + .../src/main/res/drawable/ic_point_right.xml | 20 + .../src/main/res/layout/activity_main.xml | 81 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes numtable/src/main/res/values/colors.xml | 6 + numtable/src/main/res/values/strings.xml | 4 + numtable/src/main/res/values/styles.xml | 11 + numtable/src/stage/AndroidManifest.xml | 12 + numtable/src/stage/res/values/strings.xml | 6 + ollama/.gitignore | 1 + ollama/app_update_description.txt | 1 + ollama/build.gradle | 73 ++ ollama/build.properties | 8 + ollama/proguard-rules.pro | 21 + ollama/src/beta/AndroidManifest.xml | 12 + ollama/src/beta/res/values/strings.xml | 7 + ollama/src/main/AndroidManifest.xml | 41 + .../java/cc/winboll/studio/ollama/App.java | 334 ++++++ .../winboll/studio/ollama/MainActivity.java | 88 ++ .../winboll/studio/ollama/OllamaClient.java | 223 ++++ .../ollama/OllamaResponseFormatter.java | 72 ++ ollama/src/main/res/drawable/ic_launcher.png | Bin 0 -> 9250 bytes ollama/src/main/res/layout/activity_main.xml | 69 ++ ollama/src/main/res/values-v21/styles.xml | 9 + ollama/src/main/res/values/colors.xml | 6 + ollama/src/main/res/values/strings.xml | 4 + ollama/src/main/res/values/styles.xml | 5 + .../main/res/xml/network_security_config.xml | 6 + ollama/src/stage/AndroidManifest.xml | 12 + ollama/src/stage/res/values/strings.xml | 6 + positions/.gitignore | 1 + positions/README.md | 35 + positions/app_update_description.txt | 1 + positions/build.gradle | 78 ++ positions/build.properties | 8 + positions/proguard-rules.pro | 21 + positions/src/beta/AndroidManifest.xml | 14 + positions/src/beta/res/values-zh/strings.xml | 5 + positions/src/beta/res/values/strings.xml | 7 + positions/src/beta/res/xml/shortcutsmain.xml | 19 + positions/src/beta/res/xml/shortcutsplus.xml | 19 + positions/src/main/AndroidManifest.xml | 162 +++ .../java/cc/winboll/studio/positions/App.java | 360 +++++++ .../cc/winboll/studio/positions/AppLevel.java | 43 + .../studio/positions/MainActivity.java | 293 ++++++ .../studio/positions/MainActivityLaojun.java | 22 + .../winboll/studio/positions/PointLevel.java | 43 + .../activities/LocationActivity.java | 461 ++++++++ .../activities/ShortcutActionActivity.java | 61 ++ .../positions/activities/WinBoLLActivity.java | 117 ++ .../positions/adapters/PositionAdapter.java | 809 ++++++++++++++ .../positions/models/AppConfigsModel.java | 88 ++ .../positions/models/PositionModel.java | 219 ++++ .../positions/models/PositionTaskModel.java | 207 ++++ .../receivers/MotionStatusReceiver.java | 361 +++++++ .../positions/services/AssistantService.java | 101 ++ .../services/DistanceRefreshService.java | 433 ++++++++ .../positions/services/MainService.java | 996 ++++++++++++++++++ .../studio/positions/utils/APPPlusUtils.java | 194 ++++ .../positions/utils/ActivityAliasUtils.java | 148 +++ .../positions/utils/AppConfigsUtil.java | 86 ++ .../studio/positions/utils/DensityUtils.java | 45 + .../utils/DistanceCalculatorUtil.java | 246 +++++ .../positions/utils/JsonShareHandler.java | 241 +++++ .../positions/utils/LocalMotionDetector.java | 168 +++ .../utils/MyActivityLifecycleCallbacks.java | 105 ++ .../positions/utils/NotificationUtil.java | 193 ++++ .../studio/positions/utils/ServiceUtil.java | 69 ++ .../positions/views/DateTimePickerPopup.java | 254 +++++ .../studio/positions/views/HourglassView.java | 282 +++++ .../positions/views/PositionTaskListView.java | 766 ++++++++++++++ .../res/anim/popup_date_time_picker_in.xml | 12 + .../res/anim/popup_date_time_picker_out.xml | 12 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../src/main/res/drawable/bg_bingo_dot.xml | 8 + .../src/main/res/drawable/bg_dialog_round.xml | 13 + .../src/main/res/drawable/bg_task_item.xml | 20 + .../src/main/res/drawable/btn_cancel_bg.xml | 18 + .../src/main/res/drawable/btn_confirm_bg.xml | 18 + .../src/main/res/drawable/btn_delete_bg.xml | 16 + .../main/res/drawable/btn_dialog_cancel.xml | 13 + .../main/res/drawable/btn_dialog_confirm.xml | 9 + .../main/res/drawable/circle_button_bg.xml | 21 + .../src/main/res/drawable/edittext_bg.xml | 18 + .../src/main/res/drawable/ic_launcher.xml | 10 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../main/res/drawable/ic_launcher_beta.xml | 11 + .../src/main/res/drawable/ic_positions.png | Bin 0 -> 2294344 bytes .../main/res/drawable/ic_positions_plus.png | Bin 0 -> 48680 bytes .../src/main/res/drawable/item_bg_edit.xml | 26 + .../src/main/res/drawable/item_bg_simple.xml | 26 + .../main/res/drawable/item_position_bg.xml | 18 + .../src/main/res/layout/activity_location.xml | 67 ++ .../src/main/res/layout/activity_main.xml | 39 + .../res/layout/dialog_date_time_picker.xml | 74 ++ .../main/res/layout/dialog_edit_position.xml | 41 + .../src/main/res/layout/dialog_edit_task.xml | 129 +++ .../main/res/layout/item_position_edit.xml | 178 ++++ .../main/res/layout/item_position_empty.xml | 16 + .../main/res/layout/item_position_simple.xml | 55 + .../res/layout/item_position_task_edit.xml | 184 ++++ .../res/layout/item_position_task_simple.xml | 77 ++ .../src/main/res/layout/item_task_content.xml | 110 ++ .../src/main/res/layout/item_task_empty.xml | 18 + .../res/layout/view_position_task_list.xml | 16 + .../src/main/res/menu/menu_item_edit.xml | 9 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes positions/src/main/res/values-zh/strings.xml | 9 + positions/src/main/res/values/colors.xml | 39 + positions/src/main/res/values/strings.xml | 8 + positions/src/main/res/values/styles.xml | 17 + positions/src/main/res/xml/file_paths.xml | 6 + positions/src/main/res/xml/shortcutsmain.xml | 19 + positions/src/main/res/xml/shortcutsplus.xml | 19 + positions/src/stage/AndroidManifest.xml | 12 + positions/src/stage/res/values/strings.xml | 6 + powerbell/.gitignore | 1 + powerbell/README.md | 112 ++ powerbell/app_update_description.txt | 1 + powerbell/build.gradle | 85 ++ powerbell/build.properties | 8 + powerbell/proguard-rules.pro | 143 +++ powerbell/src/beta/AndroidManifest.xml | 12 + powerbell/src/beta/res/values-zh/string.xml | 7 + powerbell/src/beta/res/values/strings.xml | 6 + .../src/beta/res/xml/shortcutsmaincn1.xml | 46 + .../src/beta/res/xml/shortcutsmaincn2.xml | 46 + .../src/beta/res/xml/shortcutsmainen1.xml | 46 + powerbell/src/main/AndroidManifest.xml | 235 +++++ .../java/cc/winboll/studio/powerbell/App.java | 97 ++ .../studio/powerbell/MainActivity.java | 621 +++++++++++ .../powerbell/activities/AboutActivity.java | 65 ++ .../activities/BackgroundPictureActivity.java | 659 ++++++++++++ .../activities/BatteryReportActivity.java | 516 +++++++++ .../activities/ClearRecordActivity.java | 98 ++ .../activities/PixelPickerActivity.java | 258 +++++ .../activities/ShortcutActionActivity.java | 49 + .../powerbell/activities/WinBoLLActivity.java | 125 +++ .../powerbell/adapters/BatteryAdapter.java | 61 ++ .../studio/powerbell/beans/AppConfigBean.java | 130 +++ .../beans/BackgroundPictureBean.java | 99 ++ .../studio/powerbell/beans/BatteryData.java | 26 + .../powerbell/beans/BatteryInfoBean.java | 75 ++ .../beans/ControlCenterServiceBean.java | 63 ++ .../powerbell/beans/NotificationMessage.java | 40 + .../BackgroundPicturePreviewDialog.java | 140 +++ .../dialogs/NetworkBackgroundDialog.java | 291 +++++ .../powerbell/dialogs/YesNoAlertDialog.java | 59 ++ .../powerbell/fragments/MainViewFragment.java | 359 +++++++ .../handlers/ControlCenterServiceHandler.java | 36 + .../ControlCenterServiceReceiver.java | 87 ++ .../receivers/GlobalApplicationReceiver.java | 66 ++ .../powerbell/receivers/MainReceiver.java | 43 + .../powerbell/services/AssistantService.java | 105 ++ .../services/ControlCenterService.java | 314 ++++++ .../powerbell/threads/RemindThread.java | 197 ++++ .../unittest/BackgroundViewTestFragment.java | 48 + .../unittest/MainUnitTestActivity.java | 39 + .../studio/powerbell/utils/APPPlusUtils.java | 164 +++ .../studio/powerbell/utils/AppCacheUtils.java | 85 ++ .../powerbell/utils/AppConfigUtils.java | 203 ++++ .../utils/BackgroundPictureUtils.java | 64 ++ .../studio/powerbell/utils/BatteryUtils.java | 28 + .../studio/powerbell/utils/DateUtils.java | 16 + .../studio/powerbell/utils/FileUtils.java | 176 ++++ .../powerbell/utils/ImageDownloader.java | 294 ++++++ .../studio/powerbell/utils/ImageUtils.java | 53 + .../studio/powerbell/utils/MimoUtils.java | 33 + .../powerbell/utils/NotificationHelper.java | 151 +++ .../powerbell/utils/NotificationUtils2.java | 247 +++++ .../studio/powerbell/utils/PictureUtils.java | 207 ++++ .../studio/powerbell/utils/ServiceUtils.java | 30 + .../studio/powerbell/utils/StringUtils.java | 114 ++ .../studio/powerbell/utils/UriUtil.java | 145 +++ .../powerbell/views/BackgroundView.java | 374 +++++++ .../powerbell/views/BatteryDrawable.java | 80 ++ .../powerbell/views/VerticalSeekBar.java | 96 ++ powerbell/src/main/res/drawable/bg_frame.xml | 41 + .../src/main/res/drawable/blank10x10.png | Bin 0 -> 100 bytes powerbell/src/main/res/drawable/charge.png | Bin 0 -> 642 bytes .../src/main/res/drawable/cursor_pointer.xml | 20 + .../main/res/drawable/default_background.xml | 170 +++ .../src/main/res/drawable/divider_line.xml | 7 + .../src/main/res/drawable/ic_launcher.xml | 27 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../main/res/drawable/ic_launcher_beta.xml | 11 + powerbell/src/main/res/drawable/usege.png | Bin 0 -> 434 bytes powerbell/src/main/res/drawable/xiaobai.png | Bin 0 -> 20165 bytes .../src/main/res/layout/activity_about.xml | 31 + .../res/layout/activity_backgroundpicture.xml | 140 +++ .../res/layout/activity_battery_report.xml | 30 + .../main/res/layout/activity_clearrecord.xml | 94 ++ .../src/main/res/layout/activity_main.xml | 40 + .../main/res/layout/activity_mainunittest.xml | 15 + .../main/res/layout/activity_pixelpicker.xml | 54 + .../main/res/layout/activity_unbelievable.xml | 23 + .../main/res/layout/custom_notification.xml | 11 + .../layout/custom_notification_expanded.xml | 17 + .../dialog_backgroundpicturepreview.xml | 57 + .../res/layout/dialog_networkbackground.xml | 93 ++ .../src/main/res/layout/dialog_pixel.xml | 32 + .../src/main/res/layout/fragment_mainview.xml | 218 ++++ .../layout/fragment_test_backgroundview.xml | 23 + .../main/res/layout/item_battery_report.xml | 34 + .../res/layout/view_remindnotification.xml | 48 + .../res/layout/view_servicenotification.xml | 39 + powerbell/src/main/res/menu/toolbar_main.xml | 15 + .../src/main/res/menu/toolbar_unittest.xml | 12 + powerbell/src/main/res/values-zh/strings.xml | 22 + powerbell/src/main/res/values/attrs.xml | 3 + powerbell/src/main/res/values/colors.xml | 66 ++ powerbell/src/main/res/values/dimens.xml | 8 + powerbell/src/main/res/values/strings.xml | 33 + powerbell/src/main/res/values/styles.xml | 29 + powerbell/src/main/res/xml/file_provider.xml | 28 + .../src/main/res/xml/shortcutsmaincn1.xml | 46 + .../src/main/res/xml/shortcutsmaincn2.xml | 46 + .../src/main/res/xml/shortcutsmainen1.xml | 46 + powerbell/src/stage/AndroidManifest.xml | 10 + powerbell/src/stage/res/values/strings.xml | 6 + regexputils/.gitignore | 1 + regexputils/README.md | 34 + regexputils/app_update_description.txt | 1 + regexputils/build.gradle | 49 + regexputils/build.properties | 8 + regexputils/proguard-rules.pro | 17 + regexputils/src/beta/AndroidManifest.xml | 14 + .../src/beta/res/values-zh/strings.xml | 6 + regexputils/src/beta/res/values/strings.xml | 6 + regexputils/src/main/AndroidManifest.xml | 39 + .../cc/winboll/studio/regexputils/App.java | 11 + .../studio/regexputils/MainActivity.java | 446 ++++++++ .../studio/regexputils/RegExpUtils.java | 13 + .../studio/regexputils/URLEditText.java | 83 ++ .../regexputils/develop/CrashHandler.java | 237 +++++ .../regexputils/develop/LogListener.java | 95 ++ .../studio/regexputils/develop/LogUtils.java | 74 ++ .../studio/regexputils/develop/LogView.java | 91 ++ .../regexputils/develop/WinBollBase.java | 31 + .../src/main/res/drawable/bg_shadow.xml | 41 + .../src/main/res/drawable/ic_launcher.xml | 10 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../main/res/drawable/ic_launcher_beta.xml | 11 + .../src/main/res/drawable/ic_regexputils.png | Bin 0 -> 13051 bytes .../src/main/res/layout/activity_main.xml | 200 ++++ .../src/main/res/values-v21/styles.xml | 9 + .../src/main/res/values-zh/strings.xml | 14 + regexputils/src/main/res/values/colors.xml | 10 + regexputils/src/main/res/values/strings.xml | 16 + regexputils/src/main/res/values/styles.xml | 41 + regexputils/src/stage/AndroidManifest.xml | 12 + regexputils/src/stage/res/values/strings.xml | 6 + settings.gradle-demo | 79 ++ timestamp/.gitignore | 1 + timestamp/README.md | 8 + timestamp/app_update_description.txt | 1 + timestamp/build.gradle | 72 ++ timestamp/build.properties | 8 + timestamp/proguard-rules.pro | 21 + timestamp/src/beta/AndroidManifest.xml | 15 + timestamp/src/beta/res/values/strings.xml | 6 + timestamp/src/main/AndroidManifest.xml | 67 ++ .../java/cc/winboll/studio/timestamp/App.java | 349 ++++++ .../studio/timestamp/AssistantService.java | 113 ++ .../studio/timestamp/MainActivity.java | 121 +++ .../winboll/studio/timestamp/MainService.java | 229 ++++ .../timestamp/models/AppConfigsModel.java | 98 ++ .../receivers/ButtonClickReceiver.java | 38 + .../timestamp/receivers/MainReceiver.java | 40 + .../timestamp/utils/AppConfigsUtil.java | 58 + .../timestamp/utils/AudioPlayerMP3Util.java | 71 ++ .../timestamp/utils/AudioPlayerUriUtil.java | 69 ++ .../studio/timestamp/utils/ClipboardUtil.java | 37 + .../studio/timestamp/utils/FileUtil.java | 47 + .../timestamp/utils/NotificationHelper.java | 200 ++++ .../studio/timestamp/utils/ServiceUtil.java | 35 + .../studio/timestamp/utils/TimeStampUtil.java | 75 ++ .../studio/timestamp/views/TimeStampView.java | 99 ++ .../res/drawable/ic_launcher_background.xml | 170 +++ .../main/res/drawable/ic_launcher_beta.xml | 15 + .../main/res/drawable/ic_launcher_stage.xml | 10 + .../src/main/res/drawable/ic_timestamp.png | Bin 0 -> 10189 bytes .../src/main/res/layout/activity_main.xml | 180 ++++ .../res/layout/custom_notification_layout.xml | 25 + timestamp/src/main/res/raw/diweiyi.mp3 | Bin 0 -> 32772 bytes timestamp/src/main/res/values/colors.xml | 6 + timestamp/src/main/res/values/strings.xml | 5 + timestamp/src/main/res/values/styles.xml | 11 + timestamp/src/stage/AndroidManifest.xml | 15 + timestamp/src/stage/res/values/strings.xml | 6 + watchoutputinstaller/.gitignore | 1 + .../app_update_description.txt | 1 + watchoutputinstaller/build.gradle | 70 ++ watchoutputinstaller/build.properties | 8 + watchoutputinstaller/proguard-rules.pro | 17 + .../src/beta/AndroidManifest.xml | 22 + .../src/beta/res/values/strings.xml | 6 + .../src/main/AndroidManifest.xml | 73 ++ .../studio/watchoutputinstaller/App.java | 31 + .../watchoutputinstaller/FileListener.java | 80 ++ .../watchoutputinstaller/MainActivity.java | 312 ++++++ .../beans/AppConfigs.java | 145 +++ .../receivers/MainReceiver.java | 40 + .../services/AssistantService.java | 110 ++ .../services/MainService.java | 248 +++++ .../watchoutputinstaller/utils/FileUtil.java | 47 + .../utils/NotificationUtil.java | 82 ++ .../utils/PackageUtil.java | 30 + .../utils/ServiceUtil.java | 35 + .../views/ListViewForScrollView.java | 77 ++ .../src/main/res/drawable/ic_launcher.xml | 11 + .../res/drawable/ic_launcher_background.xml | 171 +++ .../res/drawable/ic_launcher_foreground.xml | 11 + .../src/main/res/drawable/ic_winboll.xml | 11 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../activity_installcompletedfollowup.xml | 13 + .../src/main/res/layout/activity_main.xml | 142 +++ .../src/main/res/layout/installitem.xml | 15 + .../src/main/res/layout/toast_custom_view.xml | 38 + .../src/main/res/values/attrs.xml | 9 + .../src/main/res/values/colors.xml | 11 + .../src/main/res/values/strings.xml | 3 + .../src/main/res/values/themes.xml | 14 + .../src/main/res/xml/provider_paths.xml | 26 + .../src/stage/AndroidManifest.xml | 22 + .../src/stage/res/values/strings.xml | 6 + webpagesources/.gitignore | 1 + webpagesources/README.md | 34 + webpagesources/app_update_description.txt | 1 + webpagesources/build.gradle | 76 ++ webpagesources/build.properties | 8 + webpagesources/proguard-rules.pro | 21 + webpagesources/src/beta/AndroidManifest.xml | 25 + .../src/beta/res/values/strings.xml | 6 + webpagesources/src/main/AndroidManifest.xml | 109 ++ .../cc/winboll/studio/webpagesources/App.java | 345 ++++++ .../studio/webpagesources/MainActivity.java | 214 ++++ .../activities/AboutActivity.java | 53 + .../common/AuthLoginDialog.java | 197 ++++ .../common/AuthenticationUtils.java | 133 +++ .../common/BaseDownLoadThread.java | 242 +++++ .../webpagesources/common/BaseWebView.java | 392 +++++++ .../studio/webpagesources/common/JS.java | 28 + .../webpagesources/common/JSConsole.java | 34 + .../fragment/SourcesFragment.java | 111 ++ .../webpagesources/fragment/WebFragment.java | 132 +++ .../handler/SourcesFragmentHandler.java | 36 + .../models/AuthenticationBean.java | 125 +++ .../thread/LinkDownLoadThread.java | 25 + .../studio/webpagesources/util/SSLUtil.java | 79 ++ .../studio/webpagesources/util/UIUtil.java | 18 + .../view/ItemLongClickedPopWindow.java | 86 ++ .../webpagesources/view/StatusBarView.java | 79 ++ .../webpagesources/view/URLAddressView.java | 481 +++++++++ .../drawable-v24/ic_launcher_foreground.xml | 34 + .../src/main/res/drawable/bg_shadow.xml | 41 + .../main/res/drawable/ic_code_block_html.xml | 11 + .../src/main/res/drawable/ic_favorite.xml | 11 + .../main/res/drawable/ic_favorite_outline.xml | 11 + .../res/drawable/ic_file_edit_outline.xml | 11 + .../main/res/drawable/ic_form_dropdown.xml | 11 + .../src/main/res/drawable/ic_launcher.xml | 11 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../res/drawable/ic_launcher_foreground.xml | 10 + .../ic_launcher_foreground_web_white.xml | 10 + .../src/main/res/drawable/ic_web.xml | 11 + .../src/main/res/drawable/ic_web_white.xml | 10 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../src/main/res/layout/activity_about.xml | 31 + .../src/main/res/layout/activity_main.xml | 40 + .../src/main/res/layout/dialog_login_auth.xml | 42 + .../src/main/res/layout/fragment_sources.xml | 21 + .../src/main/res/layout/fragment_web.xml | 58 + .../res/layout/list_item_longclicked_img.xml | 33 + .../src/main/res/layout/listview_authinfo.xml | 22 + .../src/main/res/layout/view_popurllist.xml | 20 + .../src/main/res/layout/view_statusbar.xml | 24 + .../src/main/res/layout/view_toast.xml | 32 + .../src/main/res/layout/view_urladdress.xml | 31 + .../src/main/res/menu/toolbar_about.xml | 11 + .../src/main/res/menu/toolbar_authinfo.xml | 9 + .../src/main/res/menu/toolbar_main.xml | 30 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes .../src/main/res/raw/globalsign_ca.cer | 37 + webpagesources/src/main/res/values/attrs.xml | 5 + webpagesources/src/main/res/values/colors.xml | 15 + .../src/main/res/values/strings.xml | 5 + webpagesources/src/main/res/values/styles.xml | 35 + .../src/main/res/xml/file_provider.xml | 25 + .../main/res/xml/network_security_config.xml | 21 + webpagesources/src/stage/AndroidManifest.xml | 22 + .../src/stage/res/values/strings.xml | 6 + winboll-shared/.gitignore | 1 + winboll-shared/build.gradle | 46 + winboll-shared/build.properties | 8 + winboll-shared/proguard-rules.pro | 17 + winboll-shared/src/main/AndroidManifest.xml | 51 + .../assets/winboll/studio/html/index.html | 241 +++++ .../java/cc/winboll/studio/intent/action.java | 13 + .../shared/activities/AboutActivity.java | 87 ++ .../shared/activities/HelpActivity.java | 139 +++ .../cc/winboll/studio/shared/ads/ADsView.java | 240 +++++ .../studio/shared/app/AppVersionUtils.java | 153 +++ .../winboll/studio/shared/app/BaseBean.java | 284 +++++ .../studio/shared/app/CrashHandler.java | 215 ++++ .../winboll/studio/shared/app/FileUtils.java | 150 +++ .../app/MyActivityLifecycleCallbacks.java | 101 ++ .../studio/shared/app/WinBollActivity.java | 468 ++++++++ .../shared/app/WinBollActivityManager.java | 315 ++++++ .../studio/shared/app/WinBollApplication.java | 88 ++ .../winboll/studio/shared/bean/DebugBean.java | 75 ++ .../winboll/studio/shared/git/IAPPFiles.java | 60 ++ .../studio/shared/log/LogActivity.java | 65 ++ .../winboll/studio/shared/log/LogUtils.java | 370 +++++++ .../studio/shared/log/LogUtilsBean.java | 71 ++ .../shared/log/LogUtilsClassTAGBean.java | 88 ++ .../cc/winboll/studio/shared/log/LogView.java | 386 +++++++ .../studio/shared/log/LogViewThread.java | 79 ++ .../shared/service/AssistantService.java | 95 ++ .../service/EWUIStatusIconDrawable.java | 35 + .../service/IWinBollClientServiceBinder.java | 17 + .../shared/service/WinBollClientService.java | 193 ++++ .../service/WinBollClientServiceBean.java | 77 ++ .../studio/shared/service/WinBollMail.java | 22 + .../winboll/studio/shared/util/FileUtils.java | 123 +++ .../winboll/studio/shared/util/MD5Utils.java | 37 + .../winboll/studio/shared/util/PrefUtils.java | 33 + .../studio/shared/util/ServiceUtils.java | 36 + .../winboll/studio/shared/util/UriUtils.java | 130 +++ .../winboll/studio/shared/view/AboutView.java | 345 ++++++ .../studio/shared/view/SimpleWebView.java | 38 + .../shared/view/StringToQrCodeView.java | 107 ++ .../shared/view/WinBollServiceStatusView.java | 347 ++++++ .../studio/shared/view/YesNoAlertDialog.java | 59 ++ .../studio/unittest/UnitTestActivity.java | 114 ++ .../src/main/res/drawable/bg_shadow.xml | 41 + .../main/res/drawable/ic_dev_connected.xml | 11 + .../main/res/drawable/ic_dev_disconnected.xml | 11 + .../src/main/res/drawable/ic_email.xml | 11 + .../src/main/res/drawable/ic_email_alert.xml | 11 + .../src/main/res/drawable/ic_launcher.xml | 13 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../res/drawable/ic_launcher_foreground.xml | 10 + .../src/main/res/drawable/ic_winboll.xml | 13 + .../src/main/res/drawable/ic_winbollbeta.xml | 11 + .../src/main/res/drawable/shape_gradient.xml | 10 + .../src/main/res/drawable/view_border.xml | 8 + .../src/main/res/drawable/winboll_help.xml | 27 + .../src/main/res/drawable/winboll_logo.xml | 48 + .../src/main/res/layout/activity_about.xml | 25 + .../src/main/res/layout/activity_help.xml | 21 + .../src/main/res/layout/activity_library.xml | 11 + .../src/main/res/layout/activity_log.xml | 17 + .../src/main/res/layout/activity_unittest.xml | 31 + .../src/main/res/layout/view_about_dev.xml | 64 ++ .../src/main/res/layout/view_about_www.xml | 23 + .../src/main/res/layout/view_ads.xml | 14 + .../src/main/res/layout/view_log.xml | 121 +++ .../src/main/res/layout/view_logtag.xml | 32 + .../main/res/layout/view_string2qrcode.xml | 29 + .../src/main/res/layout/view_toast.xml | 32 + .../main/res/menu/toolbar_studio_debug.xml | 33 + .../res/menu/toolbar_winboll_shared_about.xml | 8 + .../res/menu/toolbar_winboll_shared_main.xml | 12 + .../src/main/res/values-v21/styles.xml | 5 + winboll-shared/src/main/res/values/array.xml | 11 + winboll-shared/src/main/res/values/attrs.xml | 11 + winboll-shared/src/main/res/values/colors.xml | 10 + .../src/main/res/values/strings.xml | 11 + winboll-shared/src/main/res/values/styles.xml | 17 + .../main/res/xml/network_security_config.xml | 6 + winboll.properties-demo | 13 + winboll/app_update_description.txt | 1 + winboll/build.gradle | 88 ++ winboll/build.properties | 8 + winboll/proguard-rules.pro | 137 +++ winboll/src/beta/AndroidManifest.xml | 14 + winboll/src/beta/res/values-zh/strings.xml | 3 + winboll/src/beta/res/values/strings.xml | 8 + winboll/src/beta/res/xml/shortcutsmaincn1.xml | 46 + winboll/src/beta/res/xml/shortcutsmaincn2.xml | 46 + winboll/src/beta/res/xml/shortcutsmainen1.xml | 46 + winboll/src/main/AndroidManifest.xml | 281 +++++ .../java/cc/winboll/studio/winboll/App.java | 364 +++++++ .../studio/winboll/AssistantService.java | 97 ++ .../winboll/studio/winboll/CustomToolbar.java | 53 + .../winboll/EWUIStatusIconDrawable.java | 35 + .../winboll/studio/winboll/MainActivity.java | 114 ++ .../winboll/studio/winboll/MyTileService.java | 80 ++ .../cc/winboll/studio/winboll/WinBoLL.java | 40 + .../studio/winboll/WinBoLLClientService.java | 21 + .../winboll/WinBoLLServiceStatusView.java | 38 + .../winboll/activities/AboutActivity.java | 103 ++ .../winboll/activities/LogonActivity.java | 150 +++ .../winboll/activities/New2Activity.java | 65 ++ .../winboll/activities/NewActivity.java | 77 ++ .../activities/ShortcutActionActivity.java | 50 + .../winboll/activities/WinBoLLActivity.java | 47 + .../activities/WinBoLLUnitTestActivity.java | 172 +++ .../winboll/activities/YunActivity.java | 126 +++ .../winboll/fragments/BrowserFragment.java | 228 ++++ .../winboll/fragments/MainFragment.java | 35 + .../winboll/handlers/MainServiceHandler.java | 38 + .../winboll/models/MainServiceBean.java | 67 ++ .../studio/winboll/models/ResponseData.java | 53 + .../models/TestDemoBindServiceBean.java | 67 ++ .../winboll/models/TestDemoServiceBean.java | 68 ++ .../studio/winboll/models/UserInfoModel.java | 92 ++ .../studio/winboll/models/WinBoLLModel.java | 92 ++ .../winboll/models/WinBoLLNewsBean.java | 71 ++ .../receivers/APPNewsWidgetClickListener.java | 36 + .../winboll/receivers/MainReceiver.java | 117 ++ .../receivers/MyBroadcastReceiver.java | 29 + .../winboll/services/AssistantService.java | 136 +++ .../studio/winboll/services/MainService.java | 316 ++++++ .../winboll/services/TestDemoBindService.java | 179 ++++ .../winboll/services/TestDemoService.java | 156 +++ .../cc/winboll/studio/winboll/sos/SOS.java | 59 ++ .../studio/winboll/sos/SOSCenterService.java | 182 ++++ .../winboll/sos/SOSCenterServiceModel.java | 69 ++ .../winboll/sos/SOSCenterServiceReceiver.java | 29 + .../winboll/studio/winboll/sos/SOSObject.java | 86 ++ .../winboll/threads/MainServiceThread.java | 54 + .../studio/winboll/utils/APPPlusUtils.java | 163 +++ .../studio/winboll/utils/RSAUtils.java | 222 ++++ .../studio/winboll/utils/ServiceUtils.java | 35 + .../studio/winboll/utils/TermuxUtils.java | 33 + .../studio/winboll/utils/YunUtils.java | 282 +++++ .../studio/winboll/views/WinBoLLView.java | 232 ++++ .../studio/winboll/widgets/APPNewsWidget.java | 185 ++++ .../studio/winboll/widgets/StatusWidget.java | 59 ++ .../widgets/StatusWidgetClickListener.java | 33 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../src/main/res/drawable/bg_browser_top.xml | 7 + winboll/src/main/res/drawable/bg_edittext.xml | 7 + winboll/src/main/res/drawable/bg_shadow.xml | 41 + winboll/src/main/res/drawable/ic_cloud.xml | 11 + .../main/res/drawable/ic_cloud_outline.xml | 11 + .../main/res/drawable/ic_dev_connected.xml | 11 + .../main/res/drawable/ic_dev_disconnected.xml | 11 + winboll/src/main/res/drawable/ic_email.xml | 11 + .../src/main/res/drawable/ic_email_alert.xml | 11 + winboll/src/main/res/drawable/ic_iw.xml | 35 + winboll/src/main/res/drawable/ic_launcher.xml | 13 + .../res/drawable/ic_launcher_background.xml | 170 +++ .../main/res/drawable/ic_launcher_beta.xml | 13 + .../main/res/drawable/ic_launcher_disable.xml | 13 + .../res/drawable/ic_launcher_foreground.xml | 10 + .../ic_launcher_foreground_disable.xml | 10 + .../main/res/drawable/ic_launcher_stage.jpg | Bin 0 -> 3139 bytes winboll/src/main/res/drawable/ic_miapp.png | Bin 0 -> 21452 bytes .../src/main/res/drawable/ic_winboll_help.xml | 27 + .../res/drawable/ic_winboll_jindouyun1.png | Bin 0 -> 2301748 bytes .../res/drawable/ic_winboll_jindouyun2.png | Bin 0 -> 2282594 bytes .../src/main/res/drawable/ic_winboll_log.xml | 41 + .../src/main/res/drawable/ic_winboll_logo.xml | 48 + .../main/res/drawable/ic_winboll_point.xml | 20 + .../main/res/drawable/progress_bar_style.xml | 8 + .../src/main/res/drawable/shape_gradient.xml | 10 + winboll/src/main/res/drawable/view_border.xml | 8 + .../src/main/res/layout/activity_about.xml | 11 + .../src/main/res/layout/activity_logon.xml | 68 ++ winboll/src/main/res/layout/activity_main.xml | 46 + winboll/src/main/res/layout/activity_new.xml | 43 + winboll/src/main/res/layout/activity_new2.xml | 43 + .../res/layout/activity_winbollunittest.xml | 215 ++++ winboll/src/main/res/layout/activity_yun.xml | 63 ++ .../src/main/res/layout/fragment_browser.xml | 96 ++ winboll/src/main/res/layout/fragment_main.xml | 24 + winboll/src/main/res/layout/view_toolbar.xml | 29 + winboll/src/main/res/layout/widget_news.xml | 51 + winboll/src/main/res/layout/widget_status.xml | 15 + winboll/src/main/res/menu/toolbar_main.xml | 7 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes winboll/src/main/res/values-zh/strings.xml | 3 + winboll/src/main/res/values/attrs.xml | 9 + winboll/src/main/res/values/colors.xml | 6 + winboll/src/main/res/values/strings.xml | 13 + winboll/src/main/res/values/styles.xml | 10 + .../main/res/xml/network_security_config.xml | 15 + winboll/src/main/res/xml/shortcutsmaincn1.xml | 46 + winboll/src/main/res/xml/shortcutsmaincn2.xml | 46 + winboll/src/main/res/xml/shortcutsmainen1.xml | 46 + .../main/res/xml/widget_provider_info_sos.xml | 7 + .../res/xml/widget_provider_info_status.xml | 8 + winboll/src/stage/AndroidManifest.xml | 12 + winboll/src/stage/res/values/strings.xml | 6 + wvmapp/.gitignore | 1 + wvmapp/build.gradle | 58 + wvmapp/build.properties | 8 + wvmapp/proguard-rules.pro | 17 + wvmapp/src/main/AndroidManifest.xml | 22 + .../java/cc/winboll/studio/wvmapp/App.java | 14 + .../winboll/studio/wvmapp/MainActivity.java | 14 + .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 9397 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 5237 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 14383 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 19388 bytes wvmapp/src/main/res/layout/main.xml | 11 + wvmapp/src/main/res/values-v21/styles.xml | 5 + wvmapp/src/main/res/values/strings.xml | 7 + wvmapp/src/main/res/values/styles.xml | 5 + 1439 files changed, 94814 insertions(+) create mode 100644 .github/workflows/android.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .winboll/Readme.txt create mode 100644 .winboll/bashCheckGitCommitStatus.sh create mode 100644 .winboll/bashCommitAppPublishBuildFlagInfo.sh create mode 100644 .winboll/bashCommitLibReleaseBuildFlagInfo.sh create mode 100644 .winboll/bashPublishAPKAddTag.sh create mode 100644 .winboll/bashPublishDebugAPKAddTag.sh create mode 100644 .winboll/bashPublishLIBAddTag.sh create mode 100644 .winboll/winboll_app_build.gradle create mode 100644 .winboll/winboll_lib_build.gradle create mode 100644 .winboll/winboll_lint_build.gradle create mode 100644 GenKeyStore/gen_debug_keystore.sh create mode 100644 LICENSE create mode 100644 README.md create mode 100644 aes/.gitignore create mode 100644 aes/README.md create mode 100644 aes/app_update_description.txt create mode 100644 aes/build.gradle create mode 100644 aes/build.properties create mode 100644 aes/proguard-rules.pro create mode 100644 aes/src/beta/AndroidManifest.xml create mode 100644 aes/src/beta/res/values/strings.xml create mode 100644 aes/src/main/AndroidManifest.xml create mode 100644 aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java create mode 100644 aes/src/main/java/cc/winboll/studio/aes/App.java create mode 100644 aes/src/main/java/cc/winboll/studio/aes/MainActivity.java create mode 100644 aes/src/main/java/cc/winboll/studio/aes/SettingsActivity.java create mode 100644 aes/src/main/java/cc/winboll/studio/aes/TestActivityManagerActivity.java create mode 100644 aes/src/main/java/cc/winboll/studio/aes/WinBoLLActivity.java create mode 100644 aes/src/main/res/layout/activity_about.xml create mode 100644 aes/src/main/res/layout/activity_settings.xml create mode 100644 aes/src/main/res/layout/activity_testactivitymanager.xml create mode 100644 aes/src/main/res/menu/toolbar_main.xml create mode 100644 aes/src/main/res/values/colors.xml create mode 100644 aes/src/main/res/values/strings.xml create mode 100644 aes/src/main/res/values/styles.xml create mode 100644 aes/src/main/res/xml/network_security_config.xml create mode 100644 aes/src/stage/AndroidManifest.xml create mode 100644 aes/src/stage/res/values/strings.xml create mode 100644 androiddemo/.gitignore create mode 100644 androiddemo/app_update_description.txt create mode 100644 androiddemo/build.gradle create mode 100644 androiddemo/build.properties create mode 100644 androiddemo/proguard-rules.pro create mode 100644 androiddemo/src/beta/AndroidManifest.xml create mode 100644 androiddemo/src/beta/res/values/strings.xml create mode 100644 androiddemo/src/main/AndroidManifest.xml create mode 100644 androiddemo/src/main/java/cc/winboll/studio/androiddemo/App.java create mode 100644 androiddemo/src/main/java/cc/winboll/studio/androiddemo/MainActivity.java create mode 100644 androiddemo/src/main/res/drawable/ic_launcher.png create mode 100644 androiddemo/src/main/res/layout/activity_main.xml create mode 100644 androiddemo/src/main/res/values-v21/styles.xml create mode 100644 androiddemo/src/main/res/values/colors.xml create mode 100644 androiddemo/src/main/res/values/strings.xml create mode 100644 androiddemo/src/main/res/values/styles.xml create mode 100644 androiddemo/src/stage/AndroidManifest.xml create mode 100644 androiddemo/src/stage/res/values/strings.xml create mode 100644 androidxdemo/.gitignore create mode 100644 androidxdemo/app_update_description.txt create mode 100644 androidxdemo/build.gradle create mode 100644 androidxdemo/build.properties create mode 100644 androidxdemo/proguard-rules.pro create mode 100644 androidxdemo/src/beta/AndroidManifest.xml create mode 100644 androidxdemo/src/beta/res/values/strings.xml create mode 100644 androidxdemo/src/main/AndroidManifest.xml create mode 100644 androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/App.java create mode 100644 androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java create mode 100644 androidxdemo/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 androidxdemo/src/main/res/drawable/ic_launcher_background.xml create mode 100644 androidxdemo/src/main/res/layout/activity_main.xml create mode 100644 androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 androidxdemo/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 androidxdemo/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 androidxdemo/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 androidxdemo/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 androidxdemo/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 androidxdemo/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 androidxdemo/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 androidxdemo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 androidxdemo/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 androidxdemo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 androidxdemo/src/main/res/values/colors.xml create mode 100644 androidxdemo/src/main/res/values/strings.xml create mode 100644 androidxdemo/src/main/res/values/styles.xml create mode 100644 androidxdemo/src/stage/AndroidManifest.xml create mode 100644 androidxdemo/src/stage/res/values/strings.xml create mode 100644 appbase/.gitignore create mode 100644 appbase/app_update_description.txt create mode 100644 appbase/build.gradle create mode 100644 appbase/build.properties create mode 100644 appbase/proguard-rules.pro create mode 100644 appbase/src/beta/AndroidManifest.xml create mode 100644 appbase/src/beta/res/values/strings.xml create mode 100644 appbase/src/main/AndroidManifest.xml create mode 100644 appbase/src/main/java/cc/winboll/studio/appbase/App.java create mode 100644 appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java create mode 100644 appbase/src/main/res/drawable/btn_light_blue.xml create mode 100644 appbase/src/main/res/layout/activity_main.xml create mode 100644 appbase/src/main/res/menu/toolbar_main.xml create mode 100644 appbase/src/main/res/values/colors.xml create mode 100644 appbase/src/main/res/values/strings.xml create mode 100644 appbase/src/main/res/values/styles.xml create mode 100644 appbase/src/stage/AndroidManifest.xml create mode 100644 appbase/src/stage/res/values/strings.xml create mode 100644 apputils/README.md create mode 100644 apputils/app_update_description.txt create mode 100644 apputils/build.gradle create mode 100644 apputils/build.properties create mode 100644 apputils/proguard-rules.pro create mode 100644 apputils/src/beta/AndroidManifest.xml create mode 100644 apputils/src/beta/res/values/strings.xml create mode 100644 apputils/src/main/AndroidManifest.xml create mode 100644 apputils/src/main/java/cc/winboll/studio/apputils/App.java create mode 100644 apputils/src/main/java/cc/winboll/studio/apputils/AssetsHtmlActivity.java create mode 100644 apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java create mode 100644 apputils/src/main/java/cc/winboll/studio/apputils/QRCodeDecodeActivity.java create mode 100644 apputils/src/main/java/cc/winboll/studio/apputils/QRGeneratorActivity.java create mode 100644 apputils/src/main/java/cc/winboll/studio/apputils/TestBBMorseCodeActivity.java create mode 100644 apputils/src/main/java/cc/winboll/studio/apputils/WinBoLLActivity.java create mode 100644 apputils/src/main/res/drawable/ic_launcher.xml create mode 100644 apputils/src/main/res/drawable/ic_launcher_background.xml create mode 100644 apputils/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 apputils/src/main/res/drawable/shape_gradient.xml create mode 100644 apputils/src/main/res/layout/activity_assetshtml.xml create mode 100644 apputils/src/main/res/layout/activity_main.xml create mode 100644 apputils/src/main/res/layout/activity_qrcodedecode.xml create mode 100644 apputils/src/main/res/layout/activity_qrgenerator.xml create mode 100644 apputils/src/main/res/layout/activity_testbbmorsecode.xml create mode 100644 apputils/src/main/res/layout/activity_teststringtoqrcodeview.xml create mode 100644 apputils/src/main/res/layout/activity_testwinboll.xml create mode 100644 apputils/src/main/res/menu/toolbar_main.xml create mode 100644 apputils/src/main/res/menu/toolbar_testwinboll.xml create mode 100644 apputils/src/main/res/values/colors.xml create mode 100644 apputils/src/main/res/values/strings.xml create mode 100644 apputils/src/main/res/values/styles.xml create mode 100644 apputils/src/main/res/xml/studio_provider.xml create mode 100644 apputils/src/stage/AndroidManifest.xml create mode 100644 apputils/src/stage/res/values/strings.xml create mode 100644 autoinstaller/README.md create mode 100644 autoinstaller/app_update_description.txt create mode 100644 autoinstaller/build.gradle create mode 100644 autoinstaller/build.properties create mode 100644 autoinstaller/proguard-rules.pro create mode 100644 autoinstaller/src/beta/AndroidManifest.xml create mode 100644 autoinstaller/src/beta/res/values/strings.xml create mode 100644 autoinstaller/src/main/AndroidManifest.xml create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/App.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/AppBaseTileService.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/FileListener.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/MainActivity.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/models/APKModel.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/models/AppConfigs.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/models/MainServiceBean.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/receivers/MainReceiver.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/services/AssistantService.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/services/MainService.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/utils/FileUtil.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/utils/NotificationUtil.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/utils/PackageUtil.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/utils/ServiceUtil.java create mode 100644 autoinstaller/src/main/java/cc/winboll/studio/autoinstaller/views/ListViewForScrollView.java create mode 100644 autoinstaller/src/main/res/drawable/ic_android.xml create mode 100644 autoinstaller/src/main/res/drawable/ic_cloud.xml create mode 100644 autoinstaller/src/main/res/drawable/ic_cloud_outline.xml create mode 100644 autoinstaller/src/main/res/drawable/ic_launcher.xml create mode 100644 autoinstaller/src/main/res/drawable/ic_launcher_background.xml create mode 100644 autoinstaller/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 autoinstaller/src/main/res/drawable/ic_winboll.xml create mode 100644 autoinstaller/src/main/res/drawable/shape_gradient.xml create mode 100644 autoinstaller/src/main/res/layout/activity_installcompletedfollowup.xml create mode 100644 autoinstaller/src/main/res/layout/activity_main.xml create mode 100644 autoinstaller/src/main/res/layout/installitem.xml create mode 100644 autoinstaller/src/main/res/layout/toast_custom_view.xml create mode 100644 autoinstaller/src/main/res/values/attrs.xml create mode 100644 autoinstaller/src/main/res/values/colors.xml create mode 100644 autoinstaller/src/main/res/values/strings.xml create mode 100644 autoinstaller/src/main/res/values/styles.xml create mode 100644 autoinstaller/src/main/res/xml/provider_paths.xml create mode 100644 autoinstaller/src/stage/AndroidManifest.xml create mode 100644 autoinstaller/src/stage/res/values/strings.xml create mode 100644 build.gradle create mode 100644 contacts/README.md create mode 100644 contacts/app_update_description.txt create mode 100644 contacts/build.gradle create mode 100644 contacts/build.properties create mode 100644 contacts/proguard-rules.pro create mode 100644 contacts/src/beta/AndroidManifest.xml create mode 100644 contacts/src/beta/res/values/strings.xml create mode 100644 contacts/src/main/AndroidManifest.xml create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/ActivityStack.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/App.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/activities/AboutActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/activities/CallActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/activities/DialerActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/activities/UnitTestActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/activities/WinBollActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/adapters/ImagePagerAdapter.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/adapters/PhoneConnectRuleAdapter.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/CallLogModel.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/ContactModel.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/MainServiceBean.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/PhoneConnectRuleModel.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/SettingsModel.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/bobulltoon/TomCat.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/dun/Rules.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallLogFragment.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/fragments/ContactsFragment.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/fragments/LogFragment.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/handlers/MainServiceHandler.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/listenphonecall/CallListenerService.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallActivity.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallManager.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/services/AssistantService.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/threads/MainServiceThread.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/utils/AppGoToSettingsUtil.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/utils/ContactUtils.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/utils/EditTextIntUtils.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/utils/IntUtils.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/utils/PhoneUtils.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/utils/RegexPPiUtils.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/views/DuInfoTextView.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/views/LeftScrollView.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/views/ScrollDoView.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/widgets/APPStatusWidget.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/widgets/APPStatusWidgetClickListener.java create mode 100644 contacts/src/main/res/drawable/ic_call.xml create mode 100644 contacts/src/main/res/drawable/ic_launcher.xml create mode 100644 contacts/src/main/res/drawable/ic_launcher_background.xml create mode 100644 contacts/src/main/res/drawable/ic_launcher_disable.xml create mode 100644 contacts/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 contacts/src/main/res/drawable/ic_launcher_foreground_disable.xml create mode 100644 contacts/src/main/res/drawable/ic_phone_call_in.xml create mode 100644 contacts/src/main/res/drawable/ic_phone_call_out.xml create mode 100644 contacts/src/main/res/drawable/ic_phone_hang_up.xml create mode 100644 contacts/src/main/res/drawable/ic_phone_pick_up.xml create mode 100644 contacts/src/main/res/drawable/recycler_view_border.xml create mode 100644 contacts/src/main/res/drawable/shape_gradient.xml create mode 100644 contacts/src/main/res/layout/activity_about.xml create mode 100644 contacts/src/main/res/layout/activity_call.xml create mode 100644 contacts/src/main/res/layout/activity_dialer.xml create mode 100644 contacts/src/main/res/layout/activity_main.xml create mode 100644 contacts/src/main/res/layout/activity_phone_call.xml create mode 100644 contacts/src/main/res/layout/activity_settings.xml create mode 100644 contacts/src/main/res/layout/activity_unittest.xml create mode 100644 contacts/src/main/res/layout/fragment_call_log.xml create mode 100644 contacts/src/main/res/layout/fragment_contacts.xml create mode 100644 contacts/src/main/res/layout/fragment_log.xml create mode 100644 contacts/src/main/res/layout/item_call_log.xml create mode 100644 contacts/src/main/res/layout/item_contact.xml create mode 100644 contacts/src/main/res/layout/view_left_scroll.xml create mode 100644 contacts/src/main/res/layout/view_phone_call.xml create mode 100644 contacts/src/main/res/layout/view_phone_connect_rule.xml create mode 100644 contacts/src/main/res/layout/view_phone_connect_rule_simple.xml create mode 100644 contacts/src/main/res/layout/view_phone_connect_rule_simple_content.xml create mode 100644 contacts/src/main/res/layout/view_toast.xml create mode 100644 contacts/src/main/res/layout/widget_layout.xml create mode 100644 contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml create mode 100644 contacts/src/main/res/menu/toolbar_contact_phonenumber.xml create mode 100644 contacts/src/main/res/menu/toolbar_main.xml create mode 100644 contacts/src/main/res/values/colors.xml create mode 100644 contacts/src/main/res/values/strings.xml create mode 100644 contacts/src/main/res/values/styles.xml create mode 100644 contacts/src/main/res/xml/appwidget_provider_info.xml create mode 100644 contacts/src/main/res/xml/network_security_config.xml create mode 100644 contacts/src/main/res/xml/studio_provider.xml create mode 100644 contacts/src/stage/AndroidManifest.xml create mode 100644 contacts/src/stage/res/values/strings.xml create mode 100644 gradle.properties-android-demo create mode 100644 gradle.properties-androidx-demo create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 jc/README.md create mode 100644 jc/app_update_description.txt create mode 100644 jc/build.gradle create mode 100644 jc/build.properties create mode 100644 jc/proguard-rules.pro create mode 100644 jc/src/beta/AndroidManifest.xml create mode 100644 jc/src/beta/res/values/strings.xml create mode 100644 jc/src/main/AndroidManifest.xml create mode 100644 jc/src/main/java/cc/winboll/studio/jc/App.java create mode 100644 jc/src/main/java/cc/winboll/studio/jc/MainActivity.java create mode 100644 jc/src/main/res/drawable/ic_launcher.xml create mode 100644 jc/src/main/res/drawable/ic_launcher_background.xml create mode 100644 jc/src/main/res/drawable/ic_launcher_beta.xml create mode 100644 jc/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 jc/src/main/res/drawable/shape_gradient.xml create mode 100644 jc/src/main/res/layout/activity_main.xml create mode 100644 jc/src/main/res/layout/view_toast.xml create mode 100644 jc/src/main/res/menu/toolbar_about.xml create mode 100644 jc/src/main/res/menu/toolbar_main.xml create mode 100644 jc/src/main/res/values/colors.xml create mode 100644 jc/src/main/res/values/strings.xml create mode 100644 jc/src/main/res/values/styles.xml create mode 100644 jc/src/stage/AndroidManifest.xml create mode 100644 jc/src/stage/res/values/strings.xml create mode 100644 jcndk/AndroidManifest.xml create mode 100644 jcndk/META-INF/ANDROID.RSA create mode 100644 jcndk/META-INF/ANDROID.SF create mode 100644 jcndk/META-INF/MANIFEST.MF create mode 100644 jcndk/README.md create mode 100644 jcndk/assets/switch2bash.sh create mode 100644 jcndk/jni/Android.mk create mode 100644 jcndk/jni/Application.mk create mode 100644 jcndk/jni/hello-jni.cpp create mode 100644 jcndk/libs/armeabi-v7a/libhello-jni.so create mode 100644 jcndk/libs/x86/libhello-jni.so create mode 100644 jcndk/obj/local/armeabi-v7a/libhello-jni.so create mode 100644 jcndk/obj/local/armeabi-v7a/objs/hello-jni/hello-jni.o create mode 100644 jcndk/obj/local/armeabi-v7a/objs/hello-jni/hello-jni.o.d create mode 100644 jcndk/obj/local/x86/libhello-jni.so create mode 100644 jcndk/obj/local/x86/objs/hello-jni/hello-jni.o create mode 100644 jcndk/obj/local/x86/objs/hello-jni/hello-jni.o.d create mode 100644 jcndk/project.properties create mode 100644 jcndk/res/layout/view_main.xml create mode 100644 jcndk/res/values/strings.xml create mode 100644 jcndk/src/cc/winboll/studio/jcndk/FileUtils.java create mode 100644 jcndk/src/cc/winboll/studio/jcndk/HelloJni.java create mode 100644 jcndk/src/cc/winboll/studio/jcndk/services/JCMainService.java create mode 100644 libaes/.gitignore create mode 100644 libaes/build.gradle create mode 100644 libaes/build.properties create mode 100644 libaes/libs/colorpicker-20180319.jar create mode 100644 libaes/proguard-rules.pro create mode 100644 libaes/src/main/AndroidManifest.xml create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/DrawerMenuDataAdapter.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/ImagePagerAdapter.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/activitys/DrawerFragmentActivity.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/dialogs/LocalFileSelectDialog.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/dialogs/StoragePathDialog.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/dialogs/YesNoAlertDialog.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/enums/ADsMode.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/interfaces/IWinBoLLActivity.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/models/AESThemeBean.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/models/APPInfo.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/models/DrawerMenuBean.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/models/WinBoLLClientServiceBean.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/unittests/SecondaryLibraryActivity.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/unittests/SecondaryLibraryFragment.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestAButtonFragment.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestASupportToolbarActivity.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestAToolbarActivity.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestDrawerFragmentActivity.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestViewPageFragment.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/utils/AESThemeUtil.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/utils/AppVersionUtils.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/utils/MimoUtils.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/utils/MyActivityLifecycleCallbacks.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/utils/PrefUtils.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/utils/ScreenUtil.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/utils/WinBoLLActivityManager.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/AButton.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/ACard.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/ADrawerMenuListView.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/ADsBannerView.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/ADsControlView.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/AOHPCTCSeekBar.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/AOHPCTSCard.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/ASupportToolbar.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/ATickProgressBar.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/AToolbar.java create mode 100644 libaes/src/main/java/cc/winboll/studio/libaes/views/AboutView.java create mode 100644 libaes/src/main/res/anim/normal_dialog_enter_center.xml create mode 100644 libaes/src/main/res/anim/normal_dialog_enter_corner.xml create mode 100644 libaes/src/main/res/anim/normal_dialog_exit_center.xml create mode 100644 libaes/src/main/res/anim/normal_dialog_exit_corner.xml create mode 100644 libaes/src/main/res/drawable/acard_frame_main.xml create mode 100644 libaes/src/main/res/drawable/atoolbar_frame.xml create mode 100644 libaes/src/main/res/drawable/bg_shadow.xml create mode 100644 libaes/src/main/res/drawable/btn_style.xml create mode 100644 libaes/src/main/res/drawable/default_shape.xml create mode 100644 libaes/src/main/res/drawable/ic_arrow_left_right_bold.xml create mode 100644 libaes/src/main/res/drawable/ic_arrow_up_circle_outline.xml create mode 100644 libaes/src/main/res/drawable/ic_call.xml create mode 100644 libaes/src/main/res/drawable/ic_dev_connected.xml create mode 100644 libaes/src/main/res/drawable/ic_dev_disconnected.xml create mode 100644 libaes/src/main/res/drawable/ic_email.xml create mode 100644 libaes/src/main/res/drawable/ic_email_alert.xml create mode 100644 libaes/src/main/res/drawable/ic_launcher.xml create mode 100644 libaes/src/main/res/drawable/ic_launcher_background.xml create mode 100644 libaes/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 libaes/src/main/res/drawable/ic_winboll.xml create mode 100644 libaes/src/main/res/drawable/ic_winbollbeta.xml create mode 100644 libaes/src/main/res/drawable/ohpcts_frame.xml create mode 100644 libaes/src/main/res/drawable/pressed_shape.xml create mode 100644 libaes/src/main/res/drawable/shape_gradient.xml create mode 100644 libaes/src/main/res/drawable/toast_frame.xml create mode 100644 libaes/src/main/res/drawable/view_border.xml create mode 100644 libaes/src/main/res/drawable/winboll_help.xml create mode 100644 libaes/src/main/res/drawable/winboll_logo.xml create mode 100644 libaes/src/main/res/drawable/winboll_point.xml create mode 100644 libaes/src/main/res/layout/activity_about.xml create mode 100644 libaes/src/main/res/layout/activity_drawer.xml create mode 100644 libaes/src/main/res/layout/activity_drawerfragment.xml create mode 100644 libaes/src/main/res/layout/activity_secondarylibrary.xml create mode 100644 libaes/src/main/res/layout/activity_test_aboutfragment.xml create mode 100644 libaes/src/main/res/layout/activity_testasupporttoolbar.xml create mode 100644 libaes/src/main/res/layout/activity_testatoolbar.xml create mode 100644 libaes/src/main/res/layout/dialog_storagepath.xml create mode 100644 libaes/src/main/res/layout/fragment_abutton.xml create mode 100644 libaes/src/main/res/layout/fragment_secondarylibrary.xml create mode 100644 libaes/src/main/res/layout/fragment_test1.xml create mode 100644 libaes/src/main/res/layout/fragment_test2.xml create mode 100644 libaes/src/main/res/layout/fragment_viewpage.xml create mode 100644 libaes/src/main/res/layout/listview_drawermenu.xml create mode 100644 libaes/src/main/res/layout/view_adsbanner.xml create mode 100644 libaes/src/main/res/layout/view_adscontrol.xml create mode 100644 libaes/src/main/res/layout/viewpage_acard.xml create mode 100644 libaes/src/main/res/layout/viewpage_aohpctccard.xml create mode 100644 libaes/src/main/res/layout/viewpage_aohpctcsb.xml create mode 100644 libaes/src/main/res/layout/viewpage_atickprogressbar.xml create mode 100644 libaes/src/main/res/menu/toolbar_apptheme.xml create mode 100644 libaes/src/main/res/menu/toolbar_drawerbase.xml create mode 100644 libaes/src/main/res/menu/toolbar_secondarylibrary.xml create mode 100644 libaes/src/main/res/menu/toolbar_studio_debug.xml create mode 100644 libaes/src/main/res/values-zh/string.xml create mode 100644 libaes/src/main/res/values/attrs.xml create mode 100644 libaes/src/main/res/values/colors.xml create mode 100644 libaes/src/main/res/values/dimens.xml create mode 100644 libaes/src/main/res/values/strings.xml create mode 100644 libaes/src/main/res/values/styles.xml create mode 100644 libaes/src/main/res/xml/file_provider.xml create mode 100644 libaes/src/main/res/xml/network_security_config.xml create mode 100644 libappbase/.gitignore create mode 100644 libappbase/build.gradle create mode 100644 libappbase/build.properties create mode 100644 libappbase/proguard-rules.pro create mode 100644 libappbase/src/main/AndroidManifest.xml create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/APPModel.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/BaseBean.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/CrashHandler.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalCrashActivity.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalCrashReportView.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/HorizontalListView.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/LogActivity.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsBean.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsClassTAGBean.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/LogView.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/LogViewThread.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/ToastUtils.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/UTF8FileUtils.java create mode 100644 libappbase/src/main/res/drawable/bg_border.xml create mode 100644 libappbase/src/main/res/drawable/bg_border_round.xml create mode 100644 libappbase/src/main/res/drawable/bg_toolbar_log.xml create mode 100644 libappbase/src/main/res/drawable/ic_launcher_background.xml create mode 100644 libappbase/src/main/res/drawable/ic_winboll.xml create mode 100644 libappbase/src/main/res/drawable/ic_winboll_beta.xml create mode 100644 libappbase/src/main/res/drawable/ic_winboll_logo.xml create mode 100644 libappbase/src/main/res/layout/activity_globalcrash.xml create mode 100644 libappbase/src/main/res/layout/activity_log.xml create mode 100644 libappbase/src/main/res/layout/item_logtag.xml create mode 100644 libappbase/src/main/res/layout/view_globalcrashreport.xml create mode 100644 libappbase/src/main/res/layout/view_log.xml create mode 100644 libappbase/src/main/res/values/array.xml create mode 100644 libappbase/src/main/res/values/attrs.xml create mode 100644 libappbase/src/main/res/values/colors.xml create mode 100644 libappbase/src/main/res/values/dimens.xml create mode 100644 libappbase/src/main/res/values/strings.xml create mode 100644 libappbase/src/main/res/values/styles.xml create mode 100644 libapputils/.gitignore create mode 100644 libapputils/build.gradle create mode 100644 libapputils/build.properties create mode 100644 libapputils/proguard-rules.pro create mode 100644 libapputils/src/main/AndroidManifest.xml create mode 100644 libapputils/src/main/assets/winboll/studio/html/index.html create mode 100644 libapputils/src/main/assets/winboll/studio/html/javascript_test.html create mode 100644 libapputils/src/main/assets/winboll/studio/png/apple.png create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/git/IAPPFiles.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/AppUtils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/BBMorseCodeUtils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/FileUtils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/MD5Utils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/PrefUtils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/QRCodeGenerator.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/RegexPPiUtils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/ServiceUtils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/utils/UriUtils.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/views/SimpleWebView.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/views/StringToQrCodeView.java create mode 100644 libapputils/src/main/res/drawable/bg_shadow.xml create mode 100644 libapputils/src/main/res/drawable/ic_dev_connected.xml create mode 100644 libapputils/src/main/res/drawable/ic_dev_disconnected.xml create mode 100644 libapputils/src/main/res/drawable/ic_email.xml create mode 100644 libapputils/src/main/res/drawable/ic_email_alert.xml create mode 100644 libapputils/src/main/res/drawable/ic_launcher.xml create mode 100644 libapputils/src/main/res/drawable/ic_launcher_background.xml create mode 100644 libapputils/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 libapputils/src/main/res/drawable/ic_winboll.xml create mode 100644 libapputils/src/main/res/drawable/ic_winbollbeta.xml create mode 100644 libapputils/src/main/res/drawable/shape_gradient.xml create mode 100644 libapputils/src/main/res/drawable/view_border.xml create mode 100644 libapputils/src/main/res/drawable/winboll_help.xml create mode 100644 libapputils/src/main/res/drawable/winboll_logo.xml create mode 100644 libapputils/src/main/res/drawable/winboll_point.xml create mode 100644 libapputils/src/main/res/layout/activity_library.xml create mode 100644 libapputils/src/main/res/layout/activity_log.xml create mode 100644 libapputils/src/main/res/layout/activity_unittest.xml create mode 100644 libapputils/src/main/res/layout/view_ads.xml create mode 100644 libapputils/src/main/res/layout/view_string2qrcode.xml create mode 100644 libapputils/src/main/res/menu/toolbar_studio_debug.xml create mode 100644 libapputils/src/main/res/menu/toolbar_winboll_shared_about.xml create mode 100644 libapputils/src/main/res/menu/toolbar_winboll_shared_main.xml create mode 100644 libapputils/src/main/res/values-v21/styles.xml create mode 100644 libapputils/src/main/res/values/array.xml create mode 100644 libapputils/src/main/res/values/attrs.xml create mode 100644 libapputils/src/main/res/values/colors.xml create mode 100644 libapputils/src/main/res/values/strings.xml create mode 100644 libapputils/src/main/res/values/styles.xml create mode 100644 libapputils/src/main/res/xml/network_security_config.xml create mode 100644 libjc/.classpath create mode 100644 libjc/.gitignore create mode 100644 libjc/.project create mode 100644 libjc/README.md create mode 100644 libjc/build.gradle create mode 100644 libjc/build.properties create mode 100644 libjc/jcc/.classpath create mode 100644 libjc/jcc/.gitignore create mode 100644 libjc/jcc/.project create mode 100644 libjc/jcc/MANIFEST.MF create mode 100644 libjc/jcc/bash_build_jar.sh create mode 100644 libjc/jcc/src/Main.java create mode 100644 libjc/jcc/test_jar.sh create mode 100644 libjc/proguard-rules.pro create mode 100644 libjc/src/main/AndroidManifest.xml create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/JCCommandThread.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/JCErrorStream.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/JCErrorThread.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/JCMainThread.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/JCOutputStream.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/JCOutputThread.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/Main.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/TestClassA.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/TestClassB.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/bean/BaseBean.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/cmd/ListJarClassHasMain.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/net/JCSocketClient.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/net/JCSocketServer.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/net/MesaageBean.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/task/TermuxUniteTask.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/util/ConsoleUtils.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/util/FileUtils.java create mode 100644 libjc/src/main/java/cc/winboll/studio/libjc/util/LogUtils.java create mode 100644 libjc/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 libjc/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 libjc/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 libjc/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 libjc/src/main/res/layout/library.xml create mode 100644 libjc/src/main/res/values-v21/styles.xml create mode 100644 libjc/src/main/res/values/strings.xml create mode 100644 libjc/src/main/res/values/styles.xml create mode 100644 local.properties-demo create mode 100644 midiplayer/.gitignore create mode 100644 midiplayer/README.md create mode 100644 midiplayer/app_update_description.txt create mode 100644 midiplayer/build.gradle create mode 100644 midiplayer/build.properties create mode 100644 midiplayer/proguard-rules.pro create mode 100644 midiplayer/src/beta/AndroidManifest.xml create mode 100644 midiplayer/src/beta/res/values/strings.xml create mode 100644 midiplayer/src/main/AndroidManifest.xml create mode 100644 midiplayer/src/main/assets/midi/SuperMarioBrothers.mid create mode 100644 midiplayer/src/main/assets/midi/Twinkle Twinkle Little Star.mid create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/App.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/AssetMidiCopier.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/MainActivity.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/MidiParser.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/MidiPlayer.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/MidiPlayerActivity.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/MidiTrack.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/SoundFontManager.java create mode 100644 midiplayer/src/main/java/cc/winboll/studio/midiplayer/WinBoLLActivity.java create mode 100644 midiplayer/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 midiplayer/src/main/res/drawable/ic_launcher_background.xml create mode 100644 midiplayer/src/main/res/layout/activity_main.xml create mode 100644 midiplayer/src/main/res/layout/activity_midi_player.xml create mode 100644 midiplayer/src/main/res/layout/item_track.xml create mode 100644 midiplayer/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 midiplayer/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 midiplayer/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 midiplayer/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 midiplayer/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 midiplayer/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 midiplayer/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 midiplayer/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 midiplayer/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 midiplayer/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 midiplayer/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 midiplayer/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 midiplayer/src/main/res/values/colors.xml create mode 100644 midiplayer/src/main/res/values/strings.xml create mode 100644 midiplayer/src/main/res/values/styles.xml create mode 100644 midiplayer/src/stage/AndroidManifest.xml create mode 100644 midiplayer/src/stage/res/values/strings.xml create mode 100644 mj/app_update_description.txt create mode 100644 mj/build.gradle create mode 100644 mj/build.properties create mode 100644 mj/proguard-rules.pro create mode 100644 mj/src/beta/AndroidManifest.xml create mode 100644 mj/src/beta/res/values/strings.xml create mode 100644 mj/src/main/AndroidManifest.xml create mode 100644 mj/src/main/java/cc/winboll/studio/mj/App.java create mode 100644 mj/src/main/java/cc/winboll/studio/mj/MainActivity.java create mode 100644 mj/src/main/java/cc/winboll/studio/mj/activities/AboutActivity.java create mode 100644 mj/src/main/res/drawable/ic_launcher.xml create mode 100644 mj/src/main/res/drawable/ic_launcher_background.xml create mode 100644 mj/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 mj/src/main/res/drawable/shape_gradient.xml create mode 100644 mj/src/main/res/layout/activity_about.xml create mode 100644 mj/src/main/res/layout/activity_main.xml create mode 100644 mj/src/main/res/layout/view_toast.xml create mode 100644 mj/src/main/res/menu/toolbar_about.xml create mode 100644 mj/src/main/res/menu/toolbar_main.xml create mode 100644 mj/src/main/res/values/colors.xml create mode 100644 mj/src/main/res/values/strings.xml create mode 100644 mj/src/main/res/values/styles.xml create mode 100644 mj/src/stage/AndroidManifest.xml create mode 100644 mj/src/stage/res/values/strings.xml create mode 100644 mymessagemanager/.gitignore create mode 100644 mymessagemanager/README.md create mode 100644 mymessagemanager/app_update_description.txt create mode 100644 mymessagemanager/build.gradle create mode 100644 mymessagemanager/build.properties create mode 100644 mymessagemanager/proguard-rules.pro create mode 100644 mymessagemanager/src/beta/AndroidManifest.xml create mode 100644 mymessagemanager/src/beta/res/values-zh/strings.xml create mode 100644 mymessagemanager/src/beta/res/values/strings.xml create mode 100644 mymessagemanager/src/main/AndroidManifest.xml create mode 100644 mymessagemanager/src/main/assets/GlobalApplication/SMSAcceptRuleBean_List.json create mode 100644 mymessagemanager/src/main/assets/GlobalApplication/TTSPlayRuleBean_List.json create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/App.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AboutActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AppSettingsActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/BaseActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/MainActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSReceiveRuleActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycleActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SharedJSONReceiveActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/TTSPlayRuleActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/WinBoLLActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/PhoneArrayAdapter.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSAcceptRuleArrayAdapter.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSArrayAdapter.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycleAdapter.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/TTSRuleBeanRecyclerViewAdapter.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/AppConfigBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/AppConfigBean_V1.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/ContractsBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/MessageNotificationBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/PhoneBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/SMSAcceptRuleBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/SMSAcceptRuleBean_V1.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/SMSBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/SMSRecycleBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/TTSPlayRuleBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/TTSPlayRuleBean_V1.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/TTSSpeakTextBean.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/dialogs/YesNoAlertDialog.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/receivers/MainReceiver.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/receivers/SMSRecevier.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/AssistantService.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/DefaultSMSManagerService.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/TTSPlayService.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/AddressUtils_Test.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/SMSRecevier_Test.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/UnitTestActivity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/AddressUtils.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/AppConfigUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/AppConfigUtil_V1.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/AppGoToSettingsUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/FileUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationHelper.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil_Bck.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PermissionUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSReceiveRuleUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSRecycleUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/ServiceUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TTSPlayRuleUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TextToSpeechUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/ThemeUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UnitAreaUtils.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UriUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UserVisionSystemProtectModeUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/ViewUtil.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/BottomPositionFixedScrollView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ConfirmSwitchView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/DateAgoTextView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/PhoneListViewForScrollView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/SMSAcceptRuleListViewForScrollView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/SMSListViewForScrollView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/SMSView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/TTSRuleListViewForScrollView.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/TTSRuleView.java create mode 100644 mymessagemanager/src/main/res/anim/slow_fade_in.xml create mode 100644 mymessagemanager/src/main/res/drawable/bg_frame.xml create mode 100644 mymessagemanager/src/main/res/drawable/bg_frame_black.xml create mode 100644 mymessagemanager/src/main/res/drawable/bg_frame_white.xml create mode 100644 mymessagemanager/src/main/res/drawable/cursor_pointer.xml create mode 100644 mymessagemanager/src/main/res/drawable/ic_launcher.xml create mode 100644 mymessagemanager/src/main/res/drawable/ic_launcher_background.xml create mode 100644 mymessagemanager/src/main/res/drawable/ic_launcher_background_golden.xml create mode 100644 mymessagemanager/src/main/res/drawable/ic_launcher_background_sky.xml create mode 100644 mymessagemanager/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 mymessagemanager/src/main/res/drawable/ic_message.xml create mode 100644 mymessagemanager/src/main/res/drawable/listview_item_selector.xml create mode 100644 mymessagemanager/src/main/res/drawable/shape_gradient.xml create mode 100644 mymessagemanager/src/main/res/drawable/speaker.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_about.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_appsettings.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_composesms.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_main.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_sharedjsonreceive.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_sms.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_smsacceptrulesetting.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_smsrecycle.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_ttsplayrule.xml create mode 100644 mymessagemanager/src/main/res/layout/activity_unittest.xml create mode 100644 mymessagemanager/src/main/res/layout/item_ttsplayrule.xml create mode 100644 mymessagemanager/src/main/res/layout/item_ttsplayrule_simple.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_contracts.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_phone.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_sms.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_sms_part1.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_smsacceptrule.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_smsacceptrule_simple.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_smsrecycle.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_smsrecycle_simple.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_ttsplayrule.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_ttsplayrule_simple.xml create mode 100644 mymessagemanager/src/main/res/layout/remoteview.xml create mode 100644 mymessagemanager/src/main/res/layout/toast_custom_view.xml create mode 100644 mymessagemanager/src/main/res/layout/toolbar_sendsms.xml create mode 100644 mymessagemanager/src/main/res/layout/view_smssend.xml create mode 100644 mymessagemanager/src/main/res/layout/view_smssend_part1.xml create mode 100644 mymessagemanager/src/main/res/layout/view_tts_back.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_about.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_item_sms.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_item_smsrecycle.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_main.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_main2.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_rule.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_smsacceptrulebean.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_smsrecycle.xml create mode 100644 mymessagemanager/src/main/res/menu/toolbar_ttsrule.xml create mode 100644 mymessagemanager/src/main/res/values-zh/strings.xml create mode 100644 mymessagemanager/src/main/res/values/attrs.xml create mode 100644 mymessagemanager/src/main/res/values/colors.xml create mode 100644 mymessagemanager/src/main/res/values/dimens.xml create mode 100644 mymessagemanager/src/main/res/values/strings.xml create mode 100644 mymessagemanager/src/main/res/values/themes.xml create mode 100644 mymessagemanager/src/main/res/xml/file_provider.xml create mode 100644 mymessagemanager/src/main/res/xml/network_security_config.xml create mode 100644 mymessagemanager/src/stage/AndroidManifest.xml create mode 100644 mymessagemanager/src/stage/res/values/strings.xml create mode 100644 numtable/.gitignore create mode 100644 numtable/README.md create mode 100644 numtable/app_update_description.txt create mode 100644 numtable/build.gradle create mode 100644 numtable/build.properties create mode 100644 numtable/proguard-rules.pro create mode 100644 numtable/src/beta/AndroidManifest.xml create mode 100644 numtable/src/beta/res/values/strings.xml create mode 100644 numtable/src/main/AndroidManifest.xml create mode 100644 numtable/src/main/java/cc/winboll/studio/numtable/App.java create mode 100644 numtable/src/main/java/cc/winboll/studio/numtable/MainActivity.java create mode 100644 numtable/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 numtable/src/main/res/drawable/ic_launcher.xml create mode 100644 numtable/src/main/res/drawable/ic_launcher_background.xml create mode 100644 numtable/src/main/res/drawable/ic_launcher_beta.xml create mode 100644 numtable/src/main/res/drawable/ic_point_left.xml create mode 100644 numtable/src/main/res/drawable/ic_point_right.xml create mode 100644 numtable/src/main/res/layout/activity_main.xml create mode 100644 numtable/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 numtable/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 numtable/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 numtable/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 numtable/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 numtable/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 numtable/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 numtable/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 numtable/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 numtable/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 numtable/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 numtable/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 numtable/src/main/res/values/colors.xml create mode 100644 numtable/src/main/res/values/strings.xml create mode 100644 numtable/src/main/res/values/styles.xml create mode 100644 numtable/src/stage/AndroidManifest.xml create mode 100644 numtable/src/stage/res/values/strings.xml create mode 100644 ollama/.gitignore create mode 100644 ollama/app_update_description.txt create mode 100644 ollama/build.gradle create mode 100644 ollama/build.properties create mode 100644 ollama/proguard-rules.pro create mode 100644 ollama/src/beta/AndroidManifest.xml create mode 100644 ollama/src/beta/res/values/strings.xml create mode 100644 ollama/src/main/AndroidManifest.xml create mode 100644 ollama/src/main/java/cc/winboll/studio/ollama/App.java create mode 100644 ollama/src/main/java/cc/winboll/studio/ollama/MainActivity.java create mode 100644 ollama/src/main/java/cc/winboll/studio/ollama/OllamaClient.java create mode 100644 ollama/src/main/java/cc/winboll/studio/ollama/OllamaResponseFormatter.java create mode 100644 ollama/src/main/res/drawable/ic_launcher.png create mode 100644 ollama/src/main/res/layout/activity_main.xml create mode 100644 ollama/src/main/res/values-v21/styles.xml create mode 100644 ollama/src/main/res/values/colors.xml create mode 100644 ollama/src/main/res/values/strings.xml create mode 100644 ollama/src/main/res/values/styles.xml create mode 100644 ollama/src/main/res/xml/network_security_config.xml create mode 100644 ollama/src/stage/AndroidManifest.xml create mode 100644 ollama/src/stage/res/values/strings.xml create mode 100644 positions/.gitignore create mode 100644 positions/README.md create mode 100644 positions/app_update_description.txt create mode 100644 positions/build.gradle create mode 100644 positions/build.properties create mode 100644 positions/proguard-rules.pro create mode 100644 positions/src/beta/AndroidManifest.xml create mode 100644 positions/src/beta/res/values-zh/strings.xml create mode 100644 positions/src/beta/res/values/strings.xml create mode 100644 positions/src/beta/res/xml/shortcutsmain.xml create mode 100644 positions/src/beta/res/xml/shortcutsplus.xml create mode 100644 positions/src/main/AndroidManifest.xml create mode 100644 positions/src/main/java/cc/winboll/studio/positions/App.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/AppLevel.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/MainActivity.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/MainActivityLaojun.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/PointLevel.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/activities/LocationActivity.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/activities/ShortcutActionActivity.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/activities/WinBoLLActivity.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/adapters/PositionAdapter.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/models/AppConfigsModel.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/models/PositionModel.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/models/PositionTaskModel.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/receivers/MotionStatusReceiver.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/services/AssistantService.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/services/DistanceRefreshService.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/services/MainService.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/APPPlusUtils.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/ActivityAliasUtils.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/AppConfigsUtil.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/DensityUtils.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/DistanceCalculatorUtil.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/JsonShareHandler.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/LocalMotionDetector.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/MyActivityLifecycleCallbacks.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/NotificationUtil.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/ServiceUtil.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/views/DateTimePickerPopup.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/views/HourglassView.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/views/PositionTaskListView.java create mode 100644 positions/src/main/res/anim/popup_date_time_picker_in.xml create mode 100644 positions/src/main/res/anim/popup_date_time_picker_out.xml create mode 100644 positions/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 positions/src/main/res/drawable/bg_bingo_dot.xml create mode 100644 positions/src/main/res/drawable/bg_dialog_round.xml create mode 100644 positions/src/main/res/drawable/bg_task_item.xml create mode 100644 positions/src/main/res/drawable/btn_cancel_bg.xml create mode 100644 positions/src/main/res/drawable/btn_confirm_bg.xml create mode 100644 positions/src/main/res/drawable/btn_delete_bg.xml create mode 100644 positions/src/main/res/drawable/btn_dialog_cancel.xml create mode 100644 positions/src/main/res/drawable/btn_dialog_confirm.xml create mode 100644 positions/src/main/res/drawable/circle_button_bg.xml create mode 100644 positions/src/main/res/drawable/edittext_bg.xml create mode 100644 positions/src/main/res/drawable/ic_launcher.xml create mode 100644 positions/src/main/res/drawable/ic_launcher_background.xml create mode 100644 positions/src/main/res/drawable/ic_launcher_beta.xml create mode 100644 positions/src/main/res/drawable/ic_positions.png create mode 100644 positions/src/main/res/drawable/ic_positions_plus.png create mode 100644 positions/src/main/res/drawable/item_bg_edit.xml create mode 100644 positions/src/main/res/drawable/item_bg_simple.xml create mode 100644 positions/src/main/res/drawable/item_position_bg.xml create mode 100644 positions/src/main/res/layout/activity_location.xml create mode 100644 positions/src/main/res/layout/activity_main.xml create mode 100644 positions/src/main/res/layout/dialog_date_time_picker.xml create mode 100644 positions/src/main/res/layout/dialog_edit_position.xml create mode 100644 positions/src/main/res/layout/dialog_edit_task.xml create mode 100644 positions/src/main/res/layout/item_position_edit.xml create mode 100644 positions/src/main/res/layout/item_position_empty.xml create mode 100644 positions/src/main/res/layout/item_position_simple.xml create mode 100644 positions/src/main/res/layout/item_position_task_edit.xml create mode 100644 positions/src/main/res/layout/item_position_task_simple.xml create mode 100644 positions/src/main/res/layout/item_task_content.xml create mode 100644 positions/src/main/res/layout/item_task_empty.xml create mode 100644 positions/src/main/res/layout/view_position_task_list.xml create mode 100644 positions/src/main/res/menu/menu_item_edit.xml create mode 100644 positions/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 positions/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 positions/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 positions/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 positions/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 positions/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 positions/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 positions/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 positions/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 positions/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 positions/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 positions/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 positions/src/main/res/values-zh/strings.xml create mode 100644 positions/src/main/res/values/colors.xml create mode 100644 positions/src/main/res/values/strings.xml create mode 100644 positions/src/main/res/values/styles.xml create mode 100644 positions/src/main/res/xml/file_paths.xml create mode 100644 positions/src/main/res/xml/shortcutsmain.xml create mode 100644 positions/src/main/res/xml/shortcutsplus.xml create mode 100644 positions/src/stage/AndroidManifest.xml create mode 100644 positions/src/stage/res/values/strings.xml create mode 100644 powerbell/.gitignore create mode 100644 powerbell/README.md create mode 100644 powerbell/app_update_description.txt create mode 100644 powerbell/build.gradle create mode 100644 powerbell/build.properties create mode 100644 powerbell/proguard-rules.pro create mode 100644 powerbell/src/beta/AndroidManifest.xml create mode 100644 powerbell/src/beta/res/values-zh/string.xml create mode 100644 powerbell/src/beta/res/values/strings.xml create mode 100644 powerbell/src/beta/res/xml/shortcutsmaincn1.xml create mode 100644 powerbell/src/beta/res/xml/shortcutsmaincn2.xml create mode 100644 powerbell/src/beta/res/xml/shortcutsmainen1.xml create mode 100644 powerbell/src/main/AndroidManifest.xml create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/App.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReportActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/PixelPickerActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ShortcutActionActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/WinBoLLActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/adapters/BatteryAdapter.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/beans/AppConfigBean.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BackgroundPictureBean.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryData.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryInfoBean.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/beans/ControlCenterServiceBean.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/beans/NotificationMessage.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/dialogs/BackgroundPicturePreviewDialog.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/dialogs/NetworkBackgroundDialog.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/dialogs/YesNoAlertDialog.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/fragments/MainViewFragment.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/handlers/ControlCenterServiceHandler.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/MainReceiver.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/services/AssistantService.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/threads/RemindThread.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/unittest/BackgroundViewTestFragment.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/unittest/MainUnitTestActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/APPPlusUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppCacheUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/BackgroundPictureUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/BatteryUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/DateUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/FileUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/ImageDownloader.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/ImageUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/MimoUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationHelper.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationUtils2.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/PictureUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/ServiceUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/StringUtils.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/UriUtil.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/views/BackgroundView.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/views/BatteryDrawable.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/views/VerticalSeekBar.java create mode 100644 powerbell/src/main/res/drawable/bg_frame.xml create mode 100644 powerbell/src/main/res/drawable/blank10x10.png create mode 100644 powerbell/src/main/res/drawable/charge.png create mode 100644 powerbell/src/main/res/drawable/cursor_pointer.xml create mode 100644 powerbell/src/main/res/drawable/default_background.xml create mode 100644 powerbell/src/main/res/drawable/divider_line.xml create mode 100644 powerbell/src/main/res/drawable/ic_launcher.xml create mode 100644 powerbell/src/main/res/drawable/ic_launcher_background.xml create mode 100644 powerbell/src/main/res/drawable/ic_launcher_beta.xml create mode 100644 powerbell/src/main/res/drawable/usege.png create mode 100644 powerbell/src/main/res/drawable/xiaobai.png create mode 100644 powerbell/src/main/res/layout/activity_about.xml create mode 100644 powerbell/src/main/res/layout/activity_backgroundpicture.xml create mode 100644 powerbell/src/main/res/layout/activity_battery_report.xml create mode 100644 powerbell/src/main/res/layout/activity_clearrecord.xml create mode 100644 powerbell/src/main/res/layout/activity_main.xml create mode 100644 powerbell/src/main/res/layout/activity_mainunittest.xml create mode 100644 powerbell/src/main/res/layout/activity_pixelpicker.xml create mode 100644 powerbell/src/main/res/layout/activity_unbelievable.xml create mode 100644 powerbell/src/main/res/layout/custom_notification.xml create mode 100644 powerbell/src/main/res/layout/custom_notification_expanded.xml create mode 100644 powerbell/src/main/res/layout/dialog_backgroundpicturepreview.xml create mode 100644 powerbell/src/main/res/layout/dialog_networkbackground.xml create mode 100644 powerbell/src/main/res/layout/dialog_pixel.xml create mode 100644 powerbell/src/main/res/layout/fragment_mainview.xml create mode 100644 powerbell/src/main/res/layout/fragment_test_backgroundview.xml create mode 100644 powerbell/src/main/res/layout/item_battery_report.xml create mode 100644 powerbell/src/main/res/layout/view_remindnotification.xml create mode 100644 powerbell/src/main/res/layout/view_servicenotification.xml create mode 100644 powerbell/src/main/res/menu/toolbar_main.xml create mode 100644 powerbell/src/main/res/menu/toolbar_unittest.xml create mode 100644 powerbell/src/main/res/values-zh/strings.xml create mode 100644 powerbell/src/main/res/values/attrs.xml create mode 100644 powerbell/src/main/res/values/colors.xml create mode 100644 powerbell/src/main/res/values/dimens.xml create mode 100644 powerbell/src/main/res/values/strings.xml create mode 100644 powerbell/src/main/res/values/styles.xml create mode 100644 powerbell/src/main/res/xml/file_provider.xml create mode 100644 powerbell/src/main/res/xml/shortcutsmaincn1.xml create mode 100644 powerbell/src/main/res/xml/shortcutsmaincn2.xml create mode 100644 powerbell/src/main/res/xml/shortcutsmainen1.xml create mode 100644 powerbell/src/stage/AndroidManifest.xml create mode 100644 powerbell/src/stage/res/values/strings.xml create mode 100644 regexputils/.gitignore create mode 100644 regexputils/README.md create mode 100644 regexputils/app_update_description.txt create mode 100644 regexputils/build.gradle create mode 100644 regexputils/build.properties create mode 100644 regexputils/proguard-rules.pro create mode 100644 regexputils/src/beta/AndroidManifest.xml create mode 100644 regexputils/src/beta/res/values-zh/strings.xml create mode 100644 regexputils/src/beta/res/values/strings.xml create mode 100644 regexputils/src/main/AndroidManifest.xml create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/App.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/MainActivity.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/RegExpUtils.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/URLEditText.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/develop/CrashHandler.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/develop/LogListener.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/develop/LogUtils.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/develop/LogView.java create mode 100644 regexputils/src/main/java/cc/winboll/studio/regexputils/develop/WinBollBase.java create mode 100644 regexputils/src/main/res/drawable/bg_shadow.xml create mode 100644 regexputils/src/main/res/drawable/ic_launcher.xml create mode 100644 regexputils/src/main/res/drawable/ic_launcher_background.xml create mode 100644 regexputils/src/main/res/drawable/ic_launcher_beta.xml create mode 100644 regexputils/src/main/res/drawable/ic_regexputils.png create mode 100644 regexputils/src/main/res/layout/activity_main.xml create mode 100644 regexputils/src/main/res/values-v21/styles.xml create mode 100644 regexputils/src/main/res/values-zh/strings.xml create mode 100644 regexputils/src/main/res/values/colors.xml create mode 100644 regexputils/src/main/res/values/strings.xml create mode 100644 regexputils/src/main/res/values/styles.xml create mode 100644 regexputils/src/stage/AndroidManifest.xml create mode 100644 regexputils/src/stage/res/values/strings.xml create mode 100644 settings.gradle-demo create mode 100644 timestamp/.gitignore create mode 100644 timestamp/README.md create mode 100644 timestamp/app_update_description.txt create mode 100644 timestamp/build.gradle create mode 100644 timestamp/build.properties create mode 100644 timestamp/proguard-rules.pro create mode 100644 timestamp/src/beta/AndroidManifest.xml create mode 100644 timestamp/src/beta/res/values/strings.xml create mode 100644 timestamp/src/main/AndroidManifest.xml create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/App.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/AssistantService.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/models/AppConfigsModel.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/receivers/ButtonClickReceiver.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/receivers/MainReceiver.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/AppConfigsUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/AudioPlayerMP3Util.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/AudioPlayerUriUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/ClipboardUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/FileUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/ServiceUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/TimeStampUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/views/TimeStampView.java create mode 100644 timestamp/src/main/res/drawable/ic_launcher_background.xml create mode 100644 timestamp/src/main/res/drawable/ic_launcher_beta.xml create mode 100644 timestamp/src/main/res/drawable/ic_launcher_stage.xml create mode 100644 timestamp/src/main/res/drawable/ic_timestamp.png create mode 100644 timestamp/src/main/res/layout/activity_main.xml create mode 100644 timestamp/src/main/res/layout/custom_notification_layout.xml create mode 100644 timestamp/src/main/res/raw/diweiyi.mp3 create mode 100644 timestamp/src/main/res/values/colors.xml create mode 100644 timestamp/src/main/res/values/strings.xml create mode 100644 timestamp/src/main/res/values/styles.xml create mode 100644 timestamp/src/stage/AndroidManifest.xml create mode 100644 timestamp/src/stage/res/values/strings.xml create mode 100644 watchoutputinstaller/.gitignore create mode 100644 watchoutputinstaller/app_update_description.txt create mode 100644 watchoutputinstaller/build.gradle create mode 100644 watchoutputinstaller/build.properties create mode 100644 watchoutputinstaller/proguard-rules.pro create mode 100644 watchoutputinstaller/src/beta/AndroidManifest.xml create mode 100644 watchoutputinstaller/src/beta/res/values/strings.xml create mode 100644 watchoutputinstaller/src/main/AndroidManifest.xml create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/App.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/FileListener.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/MainActivity.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/beans/AppConfigs.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/receivers/MainReceiver.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/services/AssistantService.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/services/MainService.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/utils/FileUtil.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/utils/NotificationUtil.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/utils/PackageUtil.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/utils/ServiceUtil.java create mode 100644 watchoutputinstaller/src/main/java/cc/winboll/studio/watchoutputinstaller/views/ListViewForScrollView.java create mode 100644 watchoutputinstaller/src/main/res/drawable/ic_launcher.xml create mode 100644 watchoutputinstaller/src/main/res/drawable/ic_launcher_background.xml create mode 100644 watchoutputinstaller/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 watchoutputinstaller/src/main/res/drawable/ic_winboll.xml create mode 100644 watchoutputinstaller/src/main/res/drawable/shape_gradient.xml create mode 100644 watchoutputinstaller/src/main/res/layout/activity_installcompletedfollowup.xml create mode 100644 watchoutputinstaller/src/main/res/layout/activity_main.xml create mode 100644 watchoutputinstaller/src/main/res/layout/installitem.xml create mode 100644 watchoutputinstaller/src/main/res/layout/toast_custom_view.xml create mode 100644 watchoutputinstaller/src/main/res/values/attrs.xml create mode 100644 watchoutputinstaller/src/main/res/values/colors.xml create mode 100644 watchoutputinstaller/src/main/res/values/strings.xml create mode 100644 watchoutputinstaller/src/main/res/values/themes.xml create mode 100644 watchoutputinstaller/src/main/res/xml/provider_paths.xml create mode 100644 watchoutputinstaller/src/stage/AndroidManifest.xml create mode 100644 watchoutputinstaller/src/stage/res/values/strings.xml create mode 100644 webpagesources/.gitignore create mode 100644 webpagesources/README.md create mode 100644 webpagesources/app_update_description.txt create mode 100644 webpagesources/build.gradle create mode 100644 webpagesources/build.properties create mode 100644 webpagesources/proguard-rules.pro create mode 100644 webpagesources/src/beta/AndroidManifest.xml create mode 100644 webpagesources/src/beta/res/values/strings.xml create mode 100644 webpagesources/src/main/AndroidManifest.xml create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/App.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/MainActivity.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/activities/AboutActivity.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/common/AuthLoginDialog.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/common/AuthenticationUtils.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/common/BaseDownLoadThread.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/common/BaseWebView.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/common/JS.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/common/JSConsole.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/fragment/SourcesFragment.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/fragment/WebFragment.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/handler/SourcesFragmentHandler.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/models/AuthenticationBean.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/thread/LinkDownLoadThread.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/util/SSLUtil.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/util/UIUtil.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/view/ItemLongClickedPopWindow.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/view/StatusBarView.java create mode 100644 webpagesources/src/main/java/cc/winboll/studio/webpagesources/view/URLAddressView.java create mode 100644 webpagesources/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 webpagesources/src/main/res/drawable/bg_shadow.xml create mode 100644 webpagesources/src/main/res/drawable/ic_code_block_html.xml create mode 100644 webpagesources/src/main/res/drawable/ic_favorite.xml create mode 100644 webpagesources/src/main/res/drawable/ic_favorite_outline.xml create mode 100644 webpagesources/src/main/res/drawable/ic_file_edit_outline.xml create mode 100644 webpagesources/src/main/res/drawable/ic_form_dropdown.xml create mode 100644 webpagesources/src/main/res/drawable/ic_launcher.xml create mode 100644 webpagesources/src/main/res/drawable/ic_launcher_background.xml create mode 100644 webpagesources/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 webpagesources/src/main/res/drawable/ic_launcher_foreground_web_white.xml create mode 100644 webpagesources/src/main/res/drawable/ic_web.xml create mode 100644 webpagesources/src/main/res/drawable/ic_web_white.xml create mode 100644 webpagesources/src/main/res/drawable/shape_gradient.xml create mode 100644 webpagesources/src/main/res/layout/activity_about.xml create mode 100644 webpagesources/src/main/res/layout/activity_main.xml create mode 100644 webpagesources/src/main/res/layout/dialog_login_auth.xml create mode 100644 webpagesources/src/main/res/layout/fragment_sources.xml create mode 100644 webpagesources/src/main/res/layout/fragment_web.xml create mode 100644 webpagesources/src/main/res/layout/list_item_longclicked_img.xml create mode 100644 webpagesources/src/main/res/layout/listview_authinfo.xml create mode 100644 webpagesources/src/main/res/layout/view_popurllist.xml create mode 100644 webpagesources/src/main/res/layout/view_statusbar.xml create mode 100644 webpagesources/src/main/res/layout/view_toast.xml create mode 100644 webpagesources/src/main/res/layout/view_urladdress.xml create mode 100644 webpagesources/src/main/res/menu/toolbar_about.xml create mode 100644 webpagesources/src/main/res/menu/toolbar_authinfo.xml create mode 100644 webpagesources/src/main/res/menu/toolbar_main.xml create mode 100644 webpagesources/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 webpagesources/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 webpagesources/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 webpagesources/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 webpagesources/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 webpagesources/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 webpagesources/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 webpagesources/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 webpagesources/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 webpagesources/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 webpagesources/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 webpagesources/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 webpagesources/src/main/res/raw/globalsign_ca.cer create mode 100644 webpagesources/src/main/res/values/attrs.xml create mode 100644 webpagesources/src/main/res/values/colors.xml create mode 100644 webpagesources/src/main/res/values/strings.xml create mode 100644 webpagesources/src/main/res/values/styles.xml create mode 100644 webpagesources/src/main/res/xml/file_provider.xml create mode 100644 webpagesources/src/main/res/xml/network_security_config.xml create mode 100644 webpagesources/src/stage/AndroidManifest.xml create mode 100644 webpagesources/src/stage/res/values/strings.xml create mode 100644 winboll-shared/.gitignore create mode 100644 winboll-shared/build.gradle create mode 100644 winboll-shared/build.properties create mode 100644 winboll-shared/proguard-rules.pro create mode 100644 winboll-shared/src/main/AndroidManifest.xml create mode 100644 winboll-shared/src/main/assets/winboll/studio/html/index.html create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/intent/action.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/activities/AboutActivity.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/activities/HelpActivity.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/ads/ADsView.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/AppVersionUtils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/BaseBean.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/CrashHandler.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/FileUtils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/MyActivityLifecycleCallbacks.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/WinBollActivity.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/WinBollActivityManager.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/app/WinBollApplication.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/bean/DebugBean.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/git/IAPPFiles.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/log/LogActivity.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/log/LogUtils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/log/LogUtilsBean.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/log/LogUtilsClassTAGBean.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/log/LogView.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/log/LogViewThread.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/service/AssistantService.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/service/EWUIStatusIconDrawable.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/service/IWinBollClientServiceBinder.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/service/WinBollClientService.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/service/WinBollClientServiceBean.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/service/WinBollMail.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/util/FileUtils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/util/MD5Utils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/util/PrefUtils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/util/ServiceUtils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/util/UriUtils.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/view/AboutView.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/view/SimpleWebView.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/view/StringToQrCodeView.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/view/WinBollServiceStatusView.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/shared/view/YesNoAlertDialog.java create mode 100644 winboll-shared/src/main/java/cc/winboll/studio/unittest/UnitTestActivity.java create mode 100644 winboll-shared/src/main/res/drawable/bg_shadow.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_dev_connected.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_dev_disconnected.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_email.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_email_alert.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_launcher.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_launcher_background.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_winboll.xml create mode 100644 winboll-shared/src/main/res/drawable/ic_winbollbeta.xml create mode 100644 winboll-shared/src/main/res/drawable/shape_gradient.xml create mode 100644 winboll-shared/src/main/res/drawable/view_border.xml create mode 100644 winboll-shared/src/main/res/drawable/winboll_help.xml create mode 100644 winboll-shared/src/main/res/drawable/winboll_logo.xml create mode 100644 winboll-shared/src/main/res/layout/activity_about.xml create mode 100644 winboll-shared/src/main/res/layout/activity_help.xml create mode 100644 winboll-shared/src/main/res/layout/activity_library.xml create mode 100644 winboll-shared/src/main/res/layout/activity_log.xml create mode 100644 winboll-shared/src/main/res/layout/activity_unittest.xml create mode 100644 winboll-shared/src/main/res/layout/view_about_dev.xml create mode 100644 winboll-shared/src/main/res/layout/view_about_www.xml create mode 100644 winboll-shared/src/main/res/layout/view_ads.xml create mode 100644 winboll-shared/src/main/res/layout/view_log.xml create mode 100644 winboll-shared/src/main/res/layout/view_logtag.xml create mode 100644 winboll-shared/src/main/res/layout/view_string2qrcode.xml create mode 100644 winboll-shared/src/main/res/layout/view_toast.xml create mode 100644 winboll-shared/src/main/res/menu/toolbar_studio_debug.xml create mode 100644 winboll-shared/src/main/res/menu/toolbar_winboll_shared_about.xml create mode 100644 winboll-shared/src/main/res/menu/toolbar_winboll_shared_main.xml create mode 100644 winboll-shared/src/main/res/values-v21/styles.xml create mode 100644 winboll-shared/src/main/res/values/array.xml create mode 100644 winboll-shared/src/main/res/values/attrs.xml create mode 100644 winboll-shared/src/main/res/values/colors.xml create mode 100644 winboll-shared/src/main/res/values/strings.xml create mode 100644 winboll-shared/src/main/res/values/styles.xml create mode 100644 winboll-shared/src/main/res/xml/network_security_config.xml create mode 100644 winboll.properties-demo create mode 100644 winboll/app_update_description.txt create mode 100644 winboll/build.gradle create mode 100644 winboll/build.properties create mode 100644 winboll/proguard-rules.pro create mode 100644 winboll/src/beta/AndroidManifest.xml create mode 100644 winboll/src/beta/res/values-zh/strings.xml create mode 100644 winboll/src/beta/res/values/strings.xml create mode 100644 winboll/src/beta/res/xml/shortcutsmaincn1.xml create mode 100644 winboll/src/beta/res/xml/shortcutsmaincn2.xml create mode 100644 winboll/src/beta/res/xml/shortcutsmainen1.xml create mode 100644 winboll/src/main/AndroidManifest.xml create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/App.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/AssistantService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/CustomToolbar.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/EWUIStatusIconDrawable.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/MainActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/MyTileService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/WinBoLL.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/WinBoLLClientService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/WinBoLLServiceStatusView.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/AboutActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/LogonActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/New2Activity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/NewActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/ShortcutActionActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/WinBoLLActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/WinBoLLUnitTestActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/activities/YunActivity.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/fragments/BrowserFragment.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/fragments/MainFragment.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/handlers/MainServiceHandler.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/models/MainServiceBean.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/models/ResponseData.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/models/TestDemoBindServiceBean.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/models/TestDemoServiceBean.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/models/UserInfoModel.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/models/WinBoLLModel.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/models/WinBoLLNewsBean.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/receivers/APPNewsWidgetClickListener.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/receivers/MainReceiver.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/receivers/MyBroadcastReceiver.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/services/AssistantService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/services/MainService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/services/TestDemoBindService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/services/TestDemoService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/sos/SOS.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/sos/SOSCenterService.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/sos/SOSCenterServiceModel.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/sos/SOSCenterServiceReceiver.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/sos/SOSObject.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/threads/MainServiceThread.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/utils/APPPlusUtils.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/utils/RSAUtils.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/utils/ServiceUtils.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/utils/TermuxUtils.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/utils/YunUtils.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/views/WinBoLLView.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/widgets/APPNewsWidget.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/widgets/StatusWidget.java create mode 100644 winboll/src/main/java/cc/winboll/studio/winboll/widgets/StatusWidgetClickListener.java create mode 100644 winboll/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 winboll/src/main/res/drawable/bg_browser_top.xml create mode 100644 winboll/src/main/res/drawable/bg_edittext.xml create mode 100644 winboll/src/main/res/drawable/bg_shadow.xml create mode 100644 winboll/src/main/res/drawable/ic_cloud.xml create mode 100644 winboll/src/main/res/drawable/ic_cloud_outline.xml create mode 100644 winboll/src/main/res/drawable/ic_dev_connected.xml create mode 100644 winboll/src/main/res/drawable/ic_dev_disconnected.xml create mode 100644 winboll/src/main/res/drawable/ic_email.xml create mode 100644 winboll/src/main/res/drawable/ic_email_alert.xml create mode 100644 winboll/src/main/res/drawable/ic_iw.xml create mode 100644 winboll/src/main/res/drawable/ic_launcher.xml create mode 100644 winboll/src/main/res/drawable/ic_launcher_background.xml create mode 100644 winboll/src/main/res/drawable/ic_launcher_beta.xml create mode 100644 winboll/src/main/res/drawable/ic_launcher_disable.xml create mode 100644 winboll/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 winboll/src/main/res/drawable/ic_launcher_foreground_disable.xml create mode 100644 winboll/src/main/res/drawable/ic_launcher_stage.jpg create mode 100644 winboll/src/main/res/drawable/ic_miapp.png create mode 100644 winboll/src/main/res/drawable/ic_winboll_help.xml create mode 100644 winboll/src/main/res/drawable/ic_winboll_jindouyun1.png create mode 100644 winboll/src/main/res/drawable/ic_winboll_jindouyun2.png create mode 100644 winboll/src/main/res/drawable/ic_winboll_log.xml create mode 100644 winboll/src/main/res/drawable/ic_winboll_logo.xml create mode 100644 winboll/src/main/res/drawable/ic_winboll_point.xml create mode 100644 winboll/src/main/res/drawable/progress_bar_style.xml create mode 100644 winboll/src/main/res/drawable/shape_gradient.xml create mode 100644 winboll/src/main/res/drawable/view_border.xml create mode 100644 winboll/src/main/res/layout/activity_about.xml create mode 100644 winboll/src/main/res/layout/activity_logon.xml create mode 100644 winboll/src/main/res/layout/activity_main.xml create mode 100644 winboll/src/main/res/layout/activity_new.xml create mode 100644 winboll/src/main/res/layout/activity_new2.xml create mode 100644 winboll/src/main/res/layout/activity_winbollunittest.xml create mode 100644 winboll/src/main/res/layout/activity_yun.xml create mode 100644 winboll/src/main/res/layout/fragment_browser.xml create mode 100644 winboll/src/main/res/layout/fragment_main.xml create mode 100644 winboll/src/main/res/layout/view_toolbar.xml create mode 100644 winboll/src/main/res/layout/widget_news.xml create mode 100644 winboll/src/main/res/layout/widget_status.xml create mode 100644 winboll/src/main/res/menu/toolbar_main.xml create mode 100644 winboll/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 winboll/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 winboll/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 winboll/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 winboll/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 winboll/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 winboll/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 winboll/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 winboll/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 winboll/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 winboll/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 winboll/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 winboll/src/main/res/values-zh/strings.xml create mode 100644 winboll/src/main/res/values/attrs.xml create mode 100644 winboll/src/main/res/values/colors.xml create mode 100644 winboll/src/main/res/values/strings.xml create mode 100644 winboll/src/main/res/values/styles.xml create mode 100644 winboll/src/main/res/xml/network_security_config.xml create mode 100644 winboll/src/main/res/xml/shortcutsmaincn1.xml create mode 100644 winboll/src/main/res/xml/shortcutsmaincn2.xml create mode 100644 winboll/src/main/res/xml/shortcutsmainen1.xml create mode 100644 winboll/src/main/res/xml/widget_provider_info_sos.xml create mode 100644 winboll/src/main/res/xml/widget_provider_info_status.xml create mode 100644 winboll/src/stage/AndroidManifest.xml create mode 100644 winboll/src/stage/res/values/strings.xml create mode 100644 wvmapp/.gitignore create mode 100644 wvmapp/build.gradle create mode 100644 wvmapp/build.properties create mode 100644 wvmapp/proguard-rules.pro create mode 100644 wvmapp/src/main/AndroidManifest.xml create mode 100644 wvmapp/src/main/java/cc/winboll/studio/wvmapp/App.java create mode 100644 wvmapp/src/main/java/cc/winboll/studio/wvmapp/MainActivity.java create mode 100644 wvmapp/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 wvmapp/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 wvmapp/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 wvmapp/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 wvmapp/src/main/res/layout/main.xml create mode 100644 wvmapp/src/main/res/values-v21/styles.xml create mode 100644 wvmapp/src/main/res/values/strings.xml create mode 100644 wvmapp/src/main/res/values/styles.xml diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000..b25cbb5 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,87 @@ +name: Android CI + +# 触发器 +on: + push: + tags: + - *-beta + pull_request: + tags: + - *-beta + +jobs: + build: + + runs-on: ubuntu-latest + + # 设置 JDK 环境 + steps: + - uses: actions/checkout@v3 + - name: set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + # 获取应用打包秘钥库 + - name: Checkout Android Keystore + uses: actions/checkout@v3 + with: + repository: zhangsken/keystore # 存储应用打包用的 keystore 的仓库(格式:用户名/仓库名) + token: ${{ secrets.APP_SECRET_TOKEN_1 }} # 连接仓库的 token , 需要单独配置 + path: keystore # 仓库的根目录名 + + # 打包 Stage Release 版本应用 + - name: Build with Gradle + run: bash ./gradlew assembleBetaRelease + # 创建release + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.APP_SECRET_TOKEN_1 }} + # GitHub 会自动创建 GITHUB_TOKEN 密码以在工作流程中使用。 + # 您可以使用 GITHUB_TOKEN 在工作流程运行中进行身份验证。 + # 当您启用 GitHub Actions 时,GitHub 在您的仓库中安装 GitHub 应用程序。 + # GITHUB_TOKEN 密码是一种 GitHub 应用程序 安装访问令牌。 + # 您可以使用安装访问令牌代表仓库中安装的 GitHub 应用程序 进行身份验证。 + # 令牌的权限仅限于包含您的工作流程的仓库。 更多信息请参阅“GITHUB_TOKEN 的权限”。 + # 在每个作业开始之前, GitHub 将为作业提取安装访问令牌。 令牌在作业完成后过期。 + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: false + + # 获取 APK 版本号 + - name: Get Version Name + uses: actions/github-script@v3 + id: get-version + with: + script: | + const str=process.env.GITHUB_REF; + return str.substring(str.indexOf("v")); + result-encoding: string + # 上传至 Release 的资源 + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.APP_SECRET_TOKEN_1 }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} # 上传网址,无需改动 + #asset_path: app/build/outputs/apk/release/app-release.apk # 上传路径(Release) + asset_path: app/build/outputs/apk/beta/release/app-beta-release.apk # 上传路径(WinBoll Stage Release) + asset_name: WinBoll-${{steps.get-version.outputs.result}}0.apk # 资源名 + asset_content_type: application/vnd.android.package-archiv # 资源类型 + + # 存档打包的文件 + - name: Archive production artifacts + uses: actions/upload-artifact@v2 + with: + name: build + path: app/build/outputs # 将打包之后的文件全部上传(里面会有混淆的 map 文件) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..110c6f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,101 @@ +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +*.jks +*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +# Android Profiling +*.hprof + +# 忽略 Lint 输出文件 +lint-results.xml +lint-results.html + +## 忽略 AndroidIDE 临时文件夹 +.androidide + +## 忽略模块应用编译配置 +/settings.gradle +/gradle.properties +/winboll.properties +/local.properties diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c97416e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libjc/jcc/libs"] + path = libjc/jcc/libs + url = https://gitea.winboll.cc/Studio/APP_libjc_jcc_libs.git diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..3553804 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +appbase \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..ed59606 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.winboll/Readme.txt b/.winboll/Readme.txt new file mode 100644 index 0000000..f618520 --- /dev/null +++ b/.winboll/Readme.txt @@ -0,0 +1,18 @@ +## WinBoLL 主机编译事项提醒 + +## 类库类型源码发布 +# 类库发布使用以下面命令 +git pull && bash .winboll/bashPublishLIBAddTag.sh <类库模块文件夹名称> + +## 纯应用类型源码发布 +# 应用发布使用以下命令 +git pull && bash .winboll/bashPublishAPKAddTag.sh <应用模块文件夹名称> + +## 编译时提问。Add Github Workflows Tag? (yes/No) +回答yes: 将会添加一个 GitHub 工作流标签 + GitHub 仓库会执行以该标签为标志的编译工作流。 +回答No(默认): 就忽略 GitHub 标签,忽略 GitHub 工作流调用。 + +## Github Workflows 工作流设置注意事项 +应用名称改变时需要修改.github/workflows/android.yml文件设置, +在第79行:asset_name: 处有应用包名称设置。 diff --git a/.winboll/bashCheckGitCommitStatus.sh b/.winboll/bashCheckGitCommitStatus.sh new file mode 100644 index 0000000..1adb83c --- /dev/null +++ b/.winboll/bashCheckGitCommitStatus.sh @@ -0,0 +1,32 @@ +#!/usr/bin/bash + +# 使用 `-z` 命令检查变量是否为空 +if [ -z "$1" ] || [ -z "$2" ]; then + echo "Script parameter error: $0" + exit 2 +fi + +# 进入项目根目录 +cd ${1} +echo -e "Work dir : \n"`pwd` + +git config --global --add safe.directory "${1}" +echo "Current dir : "`pwd` +versionName=${2} + +## 设置要检查的标签 +tag="v"${versionName} + +## 如果Git已经提交了所有代码就执行标签检查操作 +if [[ -n $(git diff --stat) ]] +then + echo 'Source is no commit git completely, tag action cancel.' + exit 1 +else + echo "Git status is clean." + if [ "$(git tag -l ${tag})" == "${tag}" ]; then + echo "Tag ${tag} exist." + exit 2 + fi + echo "${0}: Git tag is checked OK: (${tag})" +fi diff --git a/.winboll/bashCommitAppPublishBuildFlagInfo.sh b/.winboll/bashCommitAppPublishBuildFlagInfo.sh new file mode 100644 index 0000000..791e58c --- /dev/null +++ b/.winboll/bashCommitAppPublishBuildFlagInfo.sh @@ -0,0 +1,17 @@ +#!/usr/bin/bash +## 提交新的 APK 编译配置标志信息,并推送到Git仓库。 + +# 使用 `-z` 命令检查变量是否为空 +if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ]; then + echo "$0 Script parameter error." + echo "(Script Demo : [ bashCommitAppPublishBuildFlagInfo.sh ])" + exit 2 +fi + +# 进入项目根目录 +cd ${1} +echo -e "Work dir : \n"`pwd` + +git add . +git commit -m "<$4>APK ${2} ${3} Publish." +git push origin && git push origin --tags diff --git a/.winboll/bashCommitLibReleaseBuildFlagInfo.sh b/.winboll/bashCommitLibReleaseBuildFlagInfo.sh new file mode 100644 index 0000000..d92f320 --- /dev/null +++ b/.winboll/bashCommitLibReleaseBuildFlagInfo.sh @@ -0,0 +1,48 @@ +#!/usr/bin/bash +## 提交新的 Library 编译配置标志信息,并推送到Git仓库。 + +# 检查是否指定了将要发布的类库名称 +# 使用 `-z` 命令检查变量是否为空 +if [ -z "$1" ]; then + echo "Library name error: $0" + exit 2 +fi + +## 开始执行脚本 +echo -e "Current dir : \n"`pwd` +# 检查当前目录是否是项目根目录 +if [[ -e $1/build.properties ]]; then + echo "The $1/build.properties file exists." + echo -e "Work dir correctly." +else + echo "The $1/build.properties file does not exist." + echo "尝试进入根目录" + # 进入项目根目录 + cd .. +fi +## 本脚本需要在项目根目录下执行 +echo -e "Current dir : \n"`pwd` +# 检查当前目录是否是项目根目录 +if [[ -e $1/build.properties ]]; then + echo "The $1/build.properties file exists." + echo -e "Work dir correctly." +else + echo "The $1/build.properties file does not exist." + echo -e "Work dir error." + exit 1 +fi + +# 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。 +# 如果文件中有 publishVersion 这一项, +# 使用grep找到包含"publishVersion="的那一行,然后用awk提取其后的值 +PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}') +echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >" +## 设新的 WinBoLL 标签 +# 脚本调试时使用 +#tag="v7.6.4-test1" +# 正式设置标签时使用 +#tag="v"${PUBLISH_VERSION} + +git add . +git commit -m "<$1>Library Release ${PUBLISH_VERSION}" +git push origin && git push origin --tags diff --git a/.winboll/bashPublishAPKAddTag.sh b/.winboll/bashPublishAPKAddTag.sh new file mode 100644 index 0000000..d210d28 --- /dev/null +++ b/.winboll/bashPublishAPKAddTag.sh @@ -0,0 +1,166 @@ +#!/usr/bin/bash + +# 检查是否指定了将要发布的应用名称 +# 使用 `-z` 命令检查变量是否为空 +if [ -z "$1" ]; then + echo "No APP name specified : $0" + exit 2 +fi + +## 定义相关函数 +## 检查 Git 源码是否完全提交了,完全提交就返回0 +function checkGitSources { + #local input="$1" + #echo "The string is: $input" + git config --global --add safe.directory `pwd` + if [[ -n $(git diff --stat) ]] + then + local result="Source is no commit completely." + echo $result + # 脚本调试时使用 + #return 0 + # 正式检查源码时使用 + return 1 + fi + local result="Git Source Check OK." + echo $result + return 0 +} + +function askAddWorkflowsTag { + read answer + if [[ $answer =~ ^[Yy]$ ]]; then + #echo "You chose yes." + return 1 + else + #echo "You chose no." + return 0 + fi +} + +function addWinBoLLTag { + # 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。 + # 如果文件中有 publishVersion 这一项, + # 使用grep找到包含"publishVersion="的那一行,然后用awk提取其后的值 + PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}') + echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >" + ## 设新的 WinBoLL 标签 + # 脚本调试时使用 + #tag="projectname-v7.6.4-test1" + # 正式设置标签时使用 + tag=$1"-v"${PUBLISH_VERSION} + echo "< WinBoLL Tag To: $tag >"; + # 检查是否已经添加了 WinBoLL Tag + if [ "$(git tag -l ${tag})" == "${tag}" ]; then + echo -e "< WinBoLL Tag ${tag} exist! >" + return 1 # WinBoLL标签重复 + fi + # 添加WinBoLL标签 + git tag -a ${tag} -F $1/app_update_description.txt + return 0 +} + +function addWorkflowsTag { + # 就读取脚本 .winboll/winboll_app_build.gradle 生成的 baseBetaVersion。 + # 如果文件中有 baseBetaVersion 这一项, + # 使用grep找到包含"baseBetaVersion="的那一行,然后用awk提取其后的值 + BASE_BETA_VERSION=$(grep -o "baseBetaVersion=.*" $1/build.properties | awk -F '=' '{print $2}') + echo "< $1/build.properties baseBetaVersion : ${BASE_BETA_VERSION} >" + ## 设新的 workflows 标签 + # 脚本调试时使用 + #tag="projectname-v7.6.4-beta" + # 正式设置标签时使用 + tag=$1"-v"${BASE_BETA_VERSION}-beta + echo "< Workflows Tag To: $tag >"; + # 检查是否已经添加了工作流 Tag + if [ "$(git tag -l ${tag})" == "${tag}" ]; then + echo -e "< Github Workflows Tag ${tag} exist! >" + return 1 # 工作流标签重复 + fi + # 添加工作流标签 + git tag -a ${tag} -F $1/app_update_description.txt + return 0 +} + +## 开始执行脚本 +echo -e "Current dir : \n"`pwd` +# 检查当前目录是否是项目根目录 +if [[ -e $1/build.properties ]]; then + echo "The $1/build.properties file exists." + echo -e "Work dir correctly." +else + echo "The $1/build.properties file does not exist." + echo "尝试进入根目录" + # 进入项目根目录 + cd .. +fi +## 本脚本需要在项目根目录下执行 +echo -e "Current dir : \n"`pwd` +# 检查当前目录是否是项目根目录 +if [[ -e $1/build.properties ]]; then + echo "The $1/build.properties file exists." + echo -e "Work dir correctly." +else + echo "The $1/build.properties file does not exist." + echo -e "Work dir error." + exit 1 +fi + +# 检查源码状态 +result=$(checkGitSources) +if [[ $? -eq 0 ]]; then + echo $result + # 如果Git已经提交了所有代码就执行标签和应用发布操作 + + # 预先询问是否添加工作流标签 + #echo "Add Github Workflows Tag? (yes/No)" + #result=$(askAddWorkflowsTag) + #nAskAddWorkflowsTag=$? + #echo $result + + # 发布应用 + echo "Publishing WinBoLL APK ..." + # 脚本调试时使用 + #bash gradlew :$1:assembleBetaDebug + # 正式发布 + bash gradlew :$1:assembleStageRelease + echo "Publishing WinBoLL APK OK." + + # 添加 WinBoLL 标签 + result=$(addWinBoLLTag $1) + echo $result + if [[ $? -eq 0 ]]; then + echo $result + # WinBoLL 标签添加成功 + else + echo -e "${0}: addWinBoLLTag $1\n${result}\nAdd WinBoLL tag cancel." + exit 1 # addWinBoLLTag 异常 + fi + + # 添加 GitHub 工作流标签 + #if [[ $nAskAddWorkflowsTag -eq 1 ]]; then + # 如果用户选择添加工作流标签 + #result=$(addWorkflowsTag $1) + #if [[ $? -eq 0 ]]; then + # echo $result + # 工作流标签添加成功 + #else + #echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel." + #exit 1 # addWorkflowsTag 异常 + #fi + #fi + + ## 清理更新描述文件内容 + echo "" > $1/app_update_description.txt + + # 设置新版本开发参数配置 + # 提交配置 + git add . + git commit -m "<$1>Start New Stage Version." + echo "Push sources to git repositories ..." + # 推送源码到所有仓库 + git push origin && git push origin --tags +else + echo -e "${0}: checkGitSources\n${result}\nShell cancel." + exit 1 # checkGitSources 异常 +fi diff --git a/.winboll/bashPublishDebugAPKAddTag.sh b/.winboll/bashPublishDebugAPKAddTag.sh new file mode 100644 index 0000000..0deb526 --- /dev/null +++ b/.winboll/bashPublishDebugAPKAddTag.sh @@ -0,0 +1,166 @@ +#!/usr/bin/bash + +# 检查是否指定了将要发布的调试版应用名称 +# 使用 `-z` 命令检查变量是否为空 +if [ -z "$1" ]; then + echo "No APP name specified : $0" + exit 2 +fi + +## 定义相关函数 +## 检查 Git 源码是否完全提交了,完全提交就返回0 +function checkGitSources { + #local input="$1" + #echo "The string is: $input" + git config --global --add safe.directory `pwd` + if [[ -n $(git diff --stat) ]] + then + local result="Source is no commit completely." + echo $result + # 脚本调试时使用 + #return 0 + # 正式检查源码时使用 + return 1 + fi + local result="Git Source Check OK." + echo $result + return 0 +} + +function askAddWorkflowsTag { + read answer + if [[ $answer =~ ^[Yy]$ ]]; then + #echo "You chose yes." + return 1 + else + #echo "You chose no." + return 0 + fi +} + +function addWinBoLLTag { + # 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。 + # 如果文件中有 publishVersion 这一项, + # 使用grep找到包含"publishVersion="的那一行,然后用awk提取其后的值 + PUBLISH_VERSION=$(grep -o "publishVersion=.*" $1/build.properties | awk -F '=' '{print $2}') + echo "< $1/build.properties publishVersion : ${PUBLISH_VERSION} >" + ## 设新的 WinBoLL 标签 + # 脚本调试时使用 + #tag="v7.6.4-test1" + # 正式调试版设置标签时使用 + tag=$1"-v"${PUBLISH_VERSION}"-debug" + echo "< WinBoLL Tag To: $tag >"; + # 检查是否已经添加了 WinBoLL Tag + if [ "$(git tag -l ${tag})" == "${tag}" ]; then + echo -e "< WinBoLL Tag ${tag} exist! >" + return 1 # WinBoLL标签重复 + fi + # 添加WinBoLL标签 + git tag -a ${tag} -F $1/app_update_description.txt + return 0 +} + +function addWorkflowsTag { + # 就读取脚本 .winboll/winboll_app_build.gradle 生成的 baseBetaVersion。 + # 如果文件中有 baseBetaVersion 这一项, + # 使用grep找到包含"baseBetaVersion="的那一行,然后用awk提取其后的值 + BASE_BETA_VERSION=$(grep -o "baseBetaVersion=.*" $1/build.properties | awk -F '=' '{print $2}') + echo "< $1/build.properties baseBetaVersion : ${BASE_BETA_VERSION} >" + ## 设新的 workflows 标签 + # 脚本调试时使用 + #tag="v7.6.4-beta" + # 正式设置标签时使用 + tag=$1"-"v"${BASE_BETA_VERSION}-beta-debug + echo "< Workflows Tag To: $tag >"; + # 检查是否已经添加了工作流 Tag + if [ "$(git tag -l ${tag})" == "${tag}" ]; then + echo -e "< Github Workflows Tag ${tag} exist! >" + return 1 # 工作流标签重复 + fi + # 添加工作流标签 + git tag -a ${tag} -F $1/app_update_description.txt + return 0 +} + +## 开始执行脚本 +echo -e "Current dir : \n"`pwd` +# 检查当前目录是否是项目根目录 +if [[ -e $1/build.properties ]]; then + echo "The $1/build.properties file exists." + echo -e "Work dir correctly." +else + echo "The $1/build.properties file does not exist." + echo "尝试进入根目录" + # 进入项目根目录 + cd .. +fi +## 本脚本需要在项目根目录下执行 +echo -e "Current dir : \n"`pwd` +# 检查当前目录是否是项目根目录 +if [[ -e $1/build.properties ]]; then + echo "The $1/build.properties file exists." + echo -e "Work dir correctly." +else + echo "The $1/build.properties file does not exist." + echo -e "Work dir error." + exit 1 +fi + +# 检查源码状态 +result=$(checkGitSources) +if [[ $? -eq 0 ]]; then + echo $result + # 如果Git已经提交了所有代码就执行标签和应用发布操作 + + # 预先询问是否添加工作流标签 + echo "Add Github Workflows Tag? (yes/no)" + result=$(askAddWorkflowsTag) + nAskAddWorkflowsTag=$? + echo $result + + # 发布应用 + echo "Publishing WinBoLL Debug APK ..." + # 脚本调试时使用 + #bash gradlew :$1:assembleBetaDebug + # 正式发布调试版 + bash gradlew :$1:assembleStageDebug + echo "Publishing WinBoLL Debug APK OK." + + # 添加 WinBoLL 标签 + result=$(addWinBoLLTag $1) + echo $result + if [[ $? -eq 0 ]]; then + echo $result + # WinBoLL 标签添加成功 + else + echo -e "${0}: addWinBoLLTag $1\n${result}\nAdd WinBoLL tag cancel." + exit 1 # addWinBoLLTag 异常 + fi + + # 添加 GitHub 工作流标签 + if [[ $nAskAddWorkflowsTag -eq 1 ]]; then + # 如果用户选择添加工作流标签 + result=$(addWorkflowsTag $1) + if [[ $? -eq 0 ]]; then + echo $result + # 工作流标签添加成功 + else + echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel." + exit 1 # addWorkflowsTag 异常 + fi + fi + + ## 清理更新描述文件内容 + echo "" > $1/app_update_description.txt + + # 设置新版本开发参数配置 + # 提交配置 + git add . + git commit -m "<$1>Start New Stage Debug Version." + echo "Push sources to git repositories ..." + # 推送源码到所有仓库 + git push origin && git push origin --tags +else + echo -e "${0}: checkGitSources\n${result}\nShell cancel." + exit 1 # checkGitSources 异常 +fi diff --git a/.winboll/bashPublishLIBAddTag.sh b/.winboll/bashPublishLIBAddTag.sh new file mode 100644 index 0000000..7ab6a3a --- /dev/null +++ b/.winboll/bashPublishLIBAddTag.sh @@ -0,0 +1,14 @@ +#!/usr/bin/bash + +# 检查是否指定了将要发布的类库名称 +# 使用 `-z` 命令检查变量是否为空 +if [ -z "$1" ]; then + echo "No Library name specified : $0" + exit 2 +fi + +## 正式发布使用 +git pull && bash gradlew :$1:publishReleasePublicationToWinBoLLReleaseRepository && bash .winboll/bashCommitLibReleaseBuildFlagInfo.sh $1 + +## 调试使用 +#bash gradlew :$1:publishSnapshotWinBoLLPublicationToWinBoLLSnapshotRepository && bash .winboll/bashCommitLibReleaseBuildFlagInfo.sh $1 diff --git a/.winboll/winboll_app_build.gradle b/.winboll/winboll_app_build.gradle new file mode 100644 index 0000000..54b28ba --- /dev/null +++ b/.winboll/winboll_app_build.gradle @@ -0,0 +1,325 @@ +// WinBoLL 应用签名配置 +// + +android { + def winbollProps = new Properties() + def winbollPropsFile = rootProject.file("${winbollFilePath}") + assert(winbollPropsFile.exists()) + winbollProps.load(new FileInputStream(winbollPropsFile)) + + // 读取秘钥配置文件 + // + def keyProps = new Properties() + def keyPropsFile = rootProject.file("${keyPropsFilePath}") + //println 'Test keystore path' + //println 'KeyProsFile :' + Boolean.toString(keyPropsFile.exists()) + //assert(false) + assert(keyPropsFile.exists()) + keyProps.load(new FileInputStream(keyPropsFile)) + + // 配置签名 + signingConfigs { + winboll { + assert(keyProps['keyAlias'] != null && keyProps['keyPassword'] != null && keyProps['storeFile'] != null && keyProps['storePassword'] != null) + keyAlias keyProps['keyAlias'] + keyPassword keyProps['keyPassword'] + storeFile keyProps['storeFile'] ? file(keyProps['storeFile']) : null + storePassword keyProps['storePassword'] + } + } + buildTypes { + debug { + signingConfig signingConfigs.winboll + } + release { + signingConfig signingConfigs.winboll + minifyEnabled true // 开启混淆(核心开关) + shrinkResources true // 可选:移除无用资源(进一步减小体积) + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), // 官方默认规则(优化版) + 'proguard-rules.pro' // 自定义规则文件 + } + + } + + flavorDimensions "WinBoLLApp" + productFlavors { + beta { + // 检查编译标志位配置 + assert (winbollBuildProps['buildCount'] != null) + dimension "WinBoLLApp" + applicationIdSuffix ".beta" + LocalDateTime localDateTimeNow = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); + versionNameSuffix "-beta" + winbollBuildProps['buildCount'] + "_" + localDateTimeNow.format('mmss') + } + stage { + dimension "WinBoLLApp" + } + } + + // 应用包输出配置 + // + android.applicationVariants.all { variant -> + // + // GitHub 应用包输出配置 + // 1. 配置 Beta Release 版应用包输出 + // 注意 :GitHub 打包使用 android.yml 的 "bash ./gradlew assembleBetaRelease" 命令 + // + if(variant.flavorName == "beta" && variant.buildType.name == "release") { + /* 后期管理预留代码 */ + /* 暂时没有需要的 GitHub 应用包输出配置 */ + /* GitHub 部分代码忽略 */ + } + + // + // WinBoLL 应用包输出配置 + // 1. 配置 Stage Release 版应用包输出 + // 2. 配置 Beta Debug 版应用包输出 + // + if((variant.flavorName == "beta" && variant.buildType.name == "debug") + || (variant.flavorName == "beta" && variant.buildType.name == "release") + || (variant.flavorName == "stage" && variant.buildType.name == "debug") + || (variant.flavorName == "stage" && variant.buildType.name == "release")) { + println "Project root directory: " + project.rootDir.toString() + println "Project root directory name : " + project.rootDir.name + def outputPath="${project.projectDir.absolutePath}/build/outputs/apk/${variant.buildType.name}" + //def outputFileName="${rootProject.name}_${versionName}.apk" + def outputFileName=project.rootDir.name + "_${versionName}.apk" + + // 创建 WinBoLL Studio 发布接口文件夹 + File fWinBoLLStudioDir = file("/sdcard/WinBoLLStudio/APKs"); + if(!fWinBoLLStudioDir.exists()) { + //fWinBoLLStudioDir.mkdirs(); + // 如果没有发布接口文件就不用进行APK发布和源码管理操作 + // 当前编译环境不是 WinBoLL 主机, 以下将忽略APK发布和源码管理操作。 + println 'The current compilation environment is not in WinBoLL host, and the following APK publishing and source management operations will be ignore.' + } else { + /// WINBOLL 主机的 APK 发布和源码管理操作 /// + variant.getAssembleProvider().get().doFirst { + /* 后期管理预留代码 */ + } //doFirst { + + // 编译输出后处理文件部分 + // + variant.getAssembleProvider().get().doLast { + variant.outputs.forEach{ file-> + // 如果正在调试,就拷贝到 WinBoLL 备份管理文件夹 + // + if(variant.flavorName == "beta"&&variant.buildType.name == "debug"){ + //File outBuildBckDir = new File(fWinBoLLStudioDir, "/${rootProject.name}/${variant.buildType.name}") + File outBuildBckDir = new File(fWinBoLLStudioDir, "/" + project.rootDir.name + "/${variant.buildType.name}") + // 创建目标路径目录 + if(!outBuildBckDir.exists()) { + outBuildBckDir.mkdirs(); + println "Output Folder Created.(WinBoLLStudio) : " + outBuildBckDir.getAbsolutePath() + } + if(outBuildBckDir.exists()) { + copy{ + from file.outputFile + into outBuildBckDir + rename { + String fileName -> "${outputFileName}" + } + println "Output APK (WinBoLLStudio): " + outBuildBckDir.getAbsolutePath() + "/${outputFileName}" + } + // 检查编译标志位配置 + assert (winbollBuildProps['buildCount'] != null) + assert (winbollBuildProps['libraryProject'] != null) + //构建计数增加 + int buildCount = Integer.parseInt(winbollBuildProps['buildCount']) + 1; + // 设置编译计数 + winbollBuildProps.setProperty("buildCount", Integer.toString(buildCount)); + + //保存编译标志配置 + FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) + winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); + fos.close(); + println "\n\n>>> Project build.properties saved.\n\n"; + + if(winbollBuildProps['libraryProject'] != "") { + // 如果应用 build.properties 文件设置了类库模块项目文件名 + // 就拷贝一份新的编译标志配置到类库项目文件夹 + File libraryProjectBuildPropsFile = new File("$RootProjectDir/" + winbollBuildProps['libraryProject'] + "/build.properties") + assert(winbollBuildPropsFile.exists()) + assert(libraryProjectBuildPropsFile.exists()) + java.nio.file.Path sourceFilePath = winbollBuildPropsFile.toPath(); + java.nio.file.Path targetFilePath = libraryProjectBuildPropsFile.toPath(); + // 使用copyTo()方法复制文件,如果目标文件存在会被覆盖,可选参数可以选择不覆盖 + java.nio.file.Files.copy(sourceFilePath, targetFilePath, java.nio.file.StandardCopyOption.REPLACE_EXISTING); + + println "\n\n>>> Library Project build.properties saved.\n\n"; + } + } + } + + // 如果正在发布,就拷贝到 WinBoLL 标签管理文件夹,和处理 Git 仓库管理任务。 + // + if(variant.flavorName == "stage"&&variant.buildType.name == "release"){ + // 发布 APK 文件 + // + // 截取版本号的版本字段为短版本名 + String szVersionName = "${versionName}" + String[] szlistTemp = szVersionName.split("-") + String szShortVersionName = szlistTemp[0] + //String szCommonTagAPKName = "${rootProject.name}_" + szShortVersionName + ".apk" + String szCommonTagAPKName = project.rootDir.name + "_" + szShortVersionName + ".apk" + println "CommonTagAPKName is : " + szCommonTagAPKName + + //File outTagDir = new File(fWinBoLLStudioDir, "/${rootProject.name}/tag/") + File outTagDir = new File(fWinBoLLStudioDir, "/" + project.rootDir.name + "/tag/") + // 创建目标路径目录 + if(!outTagDir.exists()) { + outTagDir.mkdirs(); + println "Output Folder Created.(Tags) : " + outTagDir.getAbsolutePath() + } + + if(outTagDir.exists()) { + File targetAPK = new File(outTagDir, "${szCommonTagAPKName}") + if(targetAPK.exists()) { + // 标签版本APK文件已经存在,构建拷贝任务停止 + assert (!targetAPK.exists()) + // 可选择删除并继续输出APK文件 + //delete targetAPK + } + // 复制一个备份 + copy{ + from file.outputFile + into outTagDir + rename { + String fileName -> "${outputFileName}" + } + println "Output APK (Tags): "+ outTagDir.getAbsolutePath() + "/${outputFileName}" + } + // 复制一个并重命名为短版本名 + copy{ + from file.outputFile + into outTagDir + rename { + String fileName -> "${szCommonTagAPKName}" + } + println "Output APK (Tags): "+ outTagDir.getAbsolutePath() + "/${szCommonTagAPKName}" + } + // 检查编译标志位配置 + assert (winbollBuildProps['stageCount'] != null) + assert (winbollBuildProps['publishVersion'] != null) + assert (winbollBuildProps['buildCount'] != null) + assert (winbollBuildProps['baseVersion'] != null) + assert (winbollBuildProps['baseBetaVersion'] != null) + assert (winbollBuildProps['libraryProject'] != null) + + // 设置类库的默认版本名 + winbollBuildProps.setProperty("publishVersion", "${versionName}"); + // Stage 发布计数增加 + int stageCount = Integer.parseInt(winbollBuildProps['stageCount']) + 1; + winbollBuildProps.setProperty("stageCount", Integer.toString(stageCount)); + // 设置类库的默认Beta版本名 + winbollBuildProps.setProperty("baseBetaVersion", winbollBuildProps['baseVersion'] + "." + Integer.toString(stageCount)); + // 构建计数重置 + winbollBuildProps.setProperty("buildCount", "0"); + + //保存编译标志配置 + FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) + winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); + fos.close(); + + if(winbollBuildProps['libraryProject'] != "") { + // 如果应用 build.properties 文件设置了类库模块项目文件名 + // 就拷贝一份新的编译标志配置到类库项目文件夹 + File libraryProjectBuildPropsFile = new File("$RootProjectDir/" + winbollBuildProps['libraryProject'] + "/build.properties") + assert(winbollBuildPropsFile.exists()) + assert(libraryProjectBuildPropsFile.exists()) + java.nio.file.Path sourceFilePath = winbollBuildPropsFile.toPath(); + java.nio.file.Path targetFilePath = libraryProjectBuildPropsFile.toPath(); + // 使用copyTo()方法复制文件,如果目标文件存在会被覆盖,可选参数可以选择不覆盖 + java.nio.file.Files.copy(sourceFilePath, targetFilePath, java.nio.file.StandardCopyOption.REPLACE_EXISTING); + } + + // 提交新的编译标志配置 + println 'exec bashCommitAppPublishBuildFlagInfoFilePath ...' + def resultCommitBuildFlag = exec { + commandLine 'bash', '--', "${RootProjectDir}/${bashCommitAppPublishBuildFlagInfoFilePath}", "${RootProjectDir}", "${versionName}", variant.buildType.name , rootProject.name + } + // 检查bash命令的返回值(假设非零表示失败) + assert(resultCommitBuildFlag.getExitValue() == 0) + } + } // if(variant.buildType.name == "release"){ + + // 如果正在调试发布版,就只生成和输出APK文件,不处理 Git 仓库提交与更新问题。 + // + if(variant.flavorName == "stage"&&variant.buildType.name == "debug"){ + // 发布 APK 文件 + // + // 截取版本号的版本字段为短版本名 + String szVersionName = "${versionName}" + String[] szlistTemp = szVersionName.split("-") + String szShortVersionName = szlistTemp[0] + //String szCommonTagAPKName = "${rootProject.name}_" + szShortVersionName + ".apk" + String szCommonTagAPKName = project.rootDir.name + "_" + szShortVersionName + ".apk" + println "CommonTagAPKName is : " + szCommonTagAPKName + + //File outTagDir = new File(fWinBoLLStudioDir, "/${rootProject.name}/tag/") + File outTagDir = new File(fWinBoLLStudioDir, "/" + project.rootDir.name + "/${variant.buildType.name}/") + // 创建目标路径目录 + if(!outTagDir.exists()) { + outTagDir.mkdirs(); + println "Output Folder Created.(Tags) : " + outTagDir.getAbsolutePath() + } + + if(outTagDir.exists()) { + File targetAPK = new File(outTagDir, "${szCommonTagAPKName}") + if(targetAPK.exists()) { + // 标签版本APK文件已经存在,构建拷贝任务停止 + println '如果是在调试 Stage 版应用包构建,请删除(注:在debug目录)现有的 Stage 应用包('+targetAPK.getAbsolutePath()+')。再编译一次。' + assert (!targetAPK.exists()) + // 可选择删除并继续输出APK文件 + //delete targetAPK + } + // 复制一个备份 + copy{ + from file.outputFile + into outTagDir + rename { + String fileName -> "${outputFileName}" + } + println "Output APK (Tags): "+ outTagDir.getAbsolutePath() + "/${outputFileName}" + } + // 复制一个并重命名为短版本名 + copy{ + from file.outputFile + into outTagDir + rename { + String fileName -> "${szCommonTagAPKName}" + } + println "Output APK (Tags): "+ outTagDir.getAbsolutePath() + "/${szCommonTagAPKName}" + } + + //不保存编译标志配置 + } + } + + // 如果配置了APK额外输出路径,就复制一份拷贝到额外路径。 + // + if(winbollProps['ExtraAPKOutputPath'] != null ) { + File apkFile = new File(winbollProps['ExtraAPKOutputPath']) + File outCommonDir = apkFile.getParentFile(); + String commandAPKName = apkFile.getName(); + if(outCommonDir.exists()) { + copy{ + from file.outputFile + into outCommonDir + rename { + String fileName -> "${commandAPKName}" + } + println "Output APK (Common): " + outCommonDir.getAbsolutePath() + "/${commandAPKName}" + } + } + } + + + } + }// End of (variant.getAssembleProvider().get().doLast {) + }/// WINBOLL 主机的 APK 发布和源码管理操作结束 /// + } + + } // End of (android.applicationVariants.all { variant ->) +} + diff --git a/.winboll/winboll_lib_build.gradle b/.winboll/winboll_lib_build.gradle new file mode 100644 index 0000000..f63aa52 --- /dev/null +++ b/.winboll/winboll_lib_build.gradle @@ -0,0 +1,211 @@ +// 本机和 WinBoLL Maven 仓库传输配置。 +// + +def getDefaultVersion(){ + // 检查编译标志位配置 + assert (winbollBuildProps['publishVersion'] != null) + // 返回编译版本号 + return winbollBuildProps['publishVersion'] +} + +def siteUrl = 'https://winboll.cc/?page=studio/details.php&app=${rootProject.name}' // 项目主页 +def gitUrl = 'https://gitea.winboll.cc/WinBoLL/${rootProject.name}' // 项目的git地址 +def DefaultGroupId = 'cc.winboll.studio' // 类库所有者groupId +def DefaultVersion = getDefaultVersion() // 版本号 +def DeveloperId='zhangsken' // 开发者账号 +def DeveloperName='ZhanGSKen' // 开发者名称 +def DeveloperEMail='zhangsken@188.com' // 开发者邮箱地址 +def LicenseName='The Apache Software License, Version 2.0' +def LicenseUrl='http://www.apache.org/licenses/LICENSE-2.0.txt' + +Properties properties = new Properties() + +afterEvaluate { + publishing { + repositories { + if(file("${RootProjectDir}/${winbollFilePath}").exists()) { + properties.load(file("${RootProjectDir}/${winbollFilePath}").newDataInputStream()) + def NexusUserName = properties.getProperty("Nexus.name") + def NexusPassword = properties.getProperty("Nexus.password") + // WinBoLL Release 仓库 + maven{ + //仓库的名字和地址 + name = "WinBoLLRelease" + url="https://nexus.winboll.cc/repository/maven-releases/" + // 仓库用户名密码 + credentials { + username = NexusUserName + password = NexusPassword + } + } + // WinBoLL Snapshot 仓库 + maven{ + //仓库的名字和地址 + name = "WinBoLLSnapshot" + url="https://nexus.winboll.cc/repository/maven-snapshots/" + // 仓库用户名密码 + credentials { + username = NexusUserName + password = NexusPassword + } + } + } + } + publications { + // Local Maven 仓库传输任务 + // + release(MavenPublication) { + groupId = DefaultGroupId + artifactId = project.name + version = DefaultVersion + + //from components.java + // 必须有这个 否则不会上传AAR包 + afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } + // 上传source,这样使用方可以看到方法注释 + //artifact generateSourcesJar + //要上传的aar路径 + //artifact "$buildDir/outputs/aar/${project.getName()}-release.aar" + //artifact "$buildDir/outputs/aar/${project.getName()}-debug.aar" + + //对pom进行的操作 + pom.withXml{ + Node pomNode = asNode() + pomNode.dependencies.'*'.findAll() { + //将所有的默认依赖移除 + //it.parent().remove(it) + } + } + pom { + name = artifactId + url = siteUrl + licenses { + license { //证书说明 + name=LicenseName // 开源协议名称 + url=LicenseUrl // 协议地址 + } + } + developers { + developer { + id=DeveloperId // 开发者账号 + name=DeveloperName // 开发者名称 + email=DeveloperEMail // 开发者邮箱地址 + } + } + //软件配置管理 + scm { + connection=gitUrl + developerConnection=gitUrl + url=siteUrl + } + } + } + + // WinBoLL Maven Release 仓库传输任务 + // + releaseWinBoLL(MavenPublication) { + // 需要使用的变体,假设有free和pay两个变体,可以选择一个 + //from components.free + + groupId = DefaultGroupId // 文件的groupId + artifactId = project.name //文件的名字 + version = DefaultVersion //版本号 + + //from components.java + // 必须有这个 否则不会上传AAR包 + afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } + // 上传source,这样使用方可以看到方法注释 + //artifact generateSourcesJar + //要上传的aar路径 + //artifact "$buildDir/outputs/aar/${project.getName()}-release.aar" + //artifact "$buildDir/outputs/aar/${project.getName()}-debug.aar" + + //对pom进行的操作 + pom.withXml{ + Node pomNode = asNode() + pomNode.dependencies.'*'.findAll() { + //将所有的默认依赖移除 + //it.parent().remove(it) + } + } + pom { + name = artifactId + url = siteUrl + licenses { + license { //证书说明 + name=LicenseName // 开源协议名称 + url=LicenseUrl // 协议地址 + } + } + developers { + developer { + id=DeveloperId // 开发者账号 + name=DeveloperName // 开发者名称 + email=DeveloperEMail // 开发者邮箱地址 + } + } + //软件配置管理 + scm { + connection=gitUrl + developerConnection=gitUrl + url=siteUrl + } + } + + } // 创建名为 release 的任务结束 + + // WinBoLL Maven Snapshot 仓库传输任务 + // + snapshotWinBoLL(MavenPublication) { + // 需要使用的变体,假设有free和pay两个变体,可以选择一个 + //from components.free + + groupId = DefaultGroupId // 文件的groupId + artifactId = project.name //文件的名字 + version = DefaultVersion + "-SNAPSHOT" //版本号 + + //from components.java + // 必须有这个 否则不会上传AAR包 + afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } + // 上传source,这样使用方可以看到方法注释 + //artifact generateSourcesJar + //要上传的aar路径 + //artifact "$buildDir/outputs/aar/${project.getName()}-release.aar" + //artifact "$buildDir/outputs/aar/${project.getName()}-debug.aar" + + //对pom进行的操作 + pom.withXml{ + Node pomNode = asNode() + pomNode.dependencies.'*'.findAll() { + //将所有的默认依赖移除 + //it.parent().remove(it) + } + } + pom { + name = artifactId + url = siteUrl + licenses { + license { //证书说明 + name=LicenseName // 开源协议名称 + url=LicenseUrl // 协议地址 + } + } + developers { + developer { + id=DeveloperId // 开发者账号 + name=DeveloperName // 开发者名称 + email=DeveloperEMail // 开发者邮箱地址 + } + } + //软件配置管理 + scm { + connection=gitUrl + developerConnection=gitUrl + url=siteUrl + } + } + } // 创建名为 snapshot 的任务结束 + } + + } +} diff --git a/.winboll/winboll_lint_build.gradle b/.winboll/winboll_lint_build.gradle new file mode 100644 index 0000000..b2ec440 --- /dev/null +++ b/.winboll/winboll_lint_build.gradle @@ -0,0 +1,50 @@ +android { + lintOptions { + // true--关闭lint报告的分析进度 + //quiet true + // true--错误发生后停止gradle构建 + abortOnError false + // true--只报告error + //ignoreWarnings true + // true--忽略有错误的文件的全/绝对路径(默认是true) + //absolutePaths true + // true--检查所有问题点,包含其他默认关闭项 + checkAllWarnings true + // true--所有warning当做error + //warningsAsErrors true + // 关闭指定问题检查 + //disable 'ExpiredTargetSdkVersion','HardcodedText','UnknownNullness','ButtonStyle','GradleDependency','UnusedResources' + // 打开指定问题检查 + //enable 'RtlHardcoded','RtlCompat', 'RtlEnabled' + // 仅检查指定问题 + //check 'NewApi', 'InlinedApi' + // true--error输出文件不包含源码行号 + //noLines true + // true--显示错误的所有发生位置,不截取 + showAll true + // 回退lint设置(默认规则) + //lintConfig file("default-lint.xml") + // true--生成txt格式报告(默认false) + //textReport true + // 重定向输出;可以是文件或'stdout' + //textOutput 'stdout' + // true--生成XML格式报告 + xmlReport true + // 指定xml报告文档(默认lint-results.xml) + xmlOutput file("${lintXmlReportFilePath}") + // true--生成HTML报告(带问题解释,源码位置,等) + htmlReport true + // html报告可选路径(构建器默认是lint-results.html ) + htmlOutput file("${lintHTMLReportFilePath}") + // true--所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建 + checkReleaseBuilds true + // 在发布版本编译时检查(即使不包含lint目标),指定问题的规则生成崩溃 + //fatal 'NewApi', 'InlineApi' + // 指定问题的规则生成错误 + //error 'Wakelock', 'TextViewEdits' + // 指定问题的规则生成警告 + //warning 'ResourceAsColor' + // 忽略指定问题的规则(同关闭检查) + //ignore 'TypographyQuotes' + } +} diff --git a/GenKeyStore/gen_debug_keystore.sh b/GenKeyStore/gen_debug_keystore.sh new file mode 100644 index 0000000..6ecd6ac --- /dev/null +++ b/GenKeyStore/gen_debug_keystore.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# 应用秘钥创建脚本 +# Linux 命令行创建JKS秘钥,alias和keyAlias可配置,文件名含时间戳 + +# 可配置参数(按需修改) +ALIAS="WinBoLL.CC_Debug" # 别名(与keyAlias一致) +STORE_PASS="androiddebugkey" +KEY_PASS="androiddebugkey" +COUNTRY="CN" # 国家代码 + +# 获取当前时间戳 +TIMESTAMP=$(date +%Y%m%d%H%M%S) +FILENAME="${ALIAS}_${TIMESTAMP}.jks" +STORENAME="${ALIAS}_${TIMESTAMP}.keystore" + +# 生成JKS文件(alias与keyAlias同步) +keytool -genkeypair \ + -alias "${ALIAS}" \ + -keyalg RSA \ + -keysize 2048 \ + -validity 1 \ + -keystore "${FILENAME}" \ + -dname "CN=WBFans, OU=Studio, O=WinBoLL, L=Shanwei, ST=Guangdong, C=${COUNTRY}" \ + -storepass "${STORE_PASS}" \ + -keypass "${KEY_PASS}" + +# 写入配置文件 +cat < ${STORENAME} +keyAlias=${ALIAS} +keyPassword=${KEY_PASS} +storeFile=../appkey.jks +storePassword=${STORE_PASS} +EOF + +echo "已生成秘钥:${FILENAME}" +echo "配置已写入 ${STORENAME}(keyAlias=${ALIAS})" + +# 询问是否复制文件 +read -p "是否需要将文件复制为 appkey.jks 和 appkey.keystore?(y/n): " CONFIRM + +if [[ $CONFIRM =~ ^[Yy]$ ]]; then + # 复制 jks 文件为 appkey.jks + cp -v ${FILENAME} ../appkey.jks + # 复制 keystore 文件为 appkey.keystore + cp -v ${STORENAME} ../appkey.keystore + echo "文件复制完成" +else + echo "已取消文件复制" +fi diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ec445dc --- /dev/null +++ b/README.md @@ -0,0 +1,156 @@ +# OriginMaster +【OriginMaster】WinBoLL 源生态计划。正如话,我需要一个 Point, 去撬动成个地球。 + +######## +## ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ WinBoLL 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ GitHub 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ 码云 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ + +## WinBoLL 提问 +同样是 /sdcard 目录,在开发 Android 应用时, +能否实现手机编译与电脑编译的源码同步。 +☁因而 WinBoLL 项目组诞生了。 + +## WinBoLL 项目组研发计划 +致力于把 WinBoLL-APP 应用在手机端 Android 项目开发。 +也在探索 https://gitea.winboll.cc//APP.git 应用于 WinBoLL-APP APK 分发。 +更想进阶 https://github.com//APP.git 应用于 WinBoLL-APP Beta APK 分发。 + +## WinBoLL-APP 汗下... +#### ☁应用何置如此呢。且观用户云云。 + +#### ☁ 正当下 ☁ ### +#### ☁ 且容傻家叙说 ☁ WinBoLL-APP 应用场景 +### ☁ WinBoLL 设备资源概述 +#### ☁ 1. Raid Disk. +概述:这是一个矩阵存储类设备。 +优点:该设备具有数据容错存储功能, + 数据存储具有特长持久性。 +缺点:设备使用能源消耗比较高, + 设备存取速度一般。 + +#### ☁ 2. Data Disk. +概述:这是一个普通硬盘存储设备 +优点:该设备独立于操作系统, + 数据持久性一般, + 存取能源消耗小于 Raid Disk。 +缺点:数据存储速度一般,存储能源消耗一般。 + +#### ☁ 3. SSD Disk. +概述:这是一个 SSD 硬盘存储设备。 +优点:存取速度快于 Data Disk 与 Raid Disk, + 存取能源消耗小于 Data Disk 与 Raid Disk。 +缺点:数据持久性一般, + 设备位于操作系统内部文件系统。 + 数据持久性与操作系统挂钩。 + +#### ☁ 4. WinBoLL 用户资源概述。 +1> /home/<用户名> 位于 WinBoLL 操作系统目录下。 +2> /rdisk/<用户名> 挂载用户 Raid Disk. +3> /data/<用户名> 挂载用户 Data Disk. +4> /sdcard/<用户名> 挂载用户 SSD Disk. + +#### ☁ 5. WinBoLL-APP 用户资源概述。 +1> /sdcard 挂载用户手机 SD 存储/storage/emulated/0 + +### ☁ 稍稍歇 ☁ ### +### ☁ 急急停 ☁ WinBoLL 应用前置条件 +☁ WinBoLL 主机建立 1Panel MySQL 应用。 +☁ WinBoLL 主机建立 1Panel Gitea 应用。 +☁ WinBoLL 主机设置 WinBoLL 应用为非登录状态。 +☁ WinBoLL 主机建立 WinBoLL 账户与 WinBoLL 用户组。 +☁ WinBoLL 账户 User ID 为: J。 +☁ WinBoLL 用户组 Group ID 为: Studio。 +☁ WinBoLL 主机 WinBoLL 1Panel Gitea 建立 WinBoLL 工作组。 +☁ WinBoLL 主机 WinBoLL 1Panel Gitea 用户项目 APK 编译输出目录为 /sdcard/WinBoLLStudio/<用户名>/APKs/ +☁ WinBoLL 项目配置文件示例为 "/.winboll/winboll.properties-demo"(WinBoLL 项目已设置) +☁ WinBoLL 项目配置文件为 "/.winboll/winboll.properties" +☁ WinBoLL 项目配置文件设定为源码提交时忽略。(WinBoLL 项目已设置) +☁ Gradle 项目配置文件示例为 "/.winboll/local.properties-demo"(WinBoLL 项目已设置) +☁ Gradle 项目配置文件为 "/local.properties"(WinBoLL 项目已设置) +☁ Gradle 项目配置文件设定为源码提交时忽略。(WinBoLL 项目已设置) + +### ☁ 登高处 ☁ WinBoLL 应用需求规划 +☁ WinBoLL 主机建立 WinBoLL 客户端用户数据库为 MySQL winbollclient 数据库。 +☁ WinBoLL 主机设置 WinBoLL 客户端用户信息存储在 winbollclient 数据库中。 +☁ MySQL winbollclient 数据库中 + WinBoLL 客户端用户信息设定为: + <用户名, 验证密码, 验证邮箱, 验证手机, 唯一存储令牌Token, 备用验证邮箱>。 +☁ WinBoLL 项目源码仓库托管在 WinBoLL 1Panel Gitea 目录 /opt/1panel/apps/gitea/gitea/data/git/repositories/studio/app.git中。 +☁ WinBoLL 主机提供 WinBoLL 1Panel Gitea 应用的 WinBoLL 项目源码仓库存取功能。(Gitea 应用已提供) +☁ WinBoLL 主机提供 WinBoLL Gitea 项目仓库存档功能。(Gitea 应用已提供) +☁ 提供 WinBoLL 客户端用户登录功能。(Gitea 应用已提供) + +### ☁ 看远方 ☁ ### +### ☁ 心忧虑 ☁ WinBoLL-APP 应用前置需求 +☁ WinBoLL-APP WinBoLL 项目根目录设定为手机的 /sdcard/WinBoLLStudio/Sources 目录。(需要用户手动建立文件夹) +☁ WinBoLL-APP 具有手机 /sdcard/WinBoLL 目录的存储权限。(需要手机操作系统授权) +☁ WinBoLL-APP WinBoLL 项目仓库源码存储路径为 /sdcard/WinBoLLStudio/Sources/APP.git(需要用户手动建立文件夹) +☁ WinBoLL-APP 项目 APK 编译输出目录为 /sdcard/WinBoLLStudio/APKs/ +☁ WinBoLL-APP 应用签名验证可定制化。(WinBoLL 项目已提供) +☁ WinBoLL-APP 与系列衍生 APP 应用共享 cc.winboll.studio 命名空间资源。(WinBoLL 项目已提供) +☁ WinBoLL-APP 用户客户端信息存储在命名空间为 WinBoLL APP MySQLLite 应用的 winbollappclient 数据库中。 +☁ WinBoLL-APP MySQLLite 应用的 winbollappclient 数据库中, + WinBoLL 用户客户端信息设定为: + <用户名, 唯一存储令牌Token>。 + +### ☁ 云游四方 ☁ ### +### ☁ 呔! ☁ WinBoLL-APP 应用需求规划 +☁ 如要使用 WinBoLL Android 项目的 Gradle 编译功能,则需要设置以下两个文件夹。 +☁ 1. 则需要建立数据存储目录 /sdcard/WinBoLLStudio/APKs。 + WinBoLL 项目源码编译出来的安装包会拷贝一份到 /sdcard/WinBoLLStudio/APKs 目录下。 +☁ 2. 则需要建立数据存储目录 /sdcard/AppProjects。 + WinBoLL 项目源码编译出来的安装包会拷贝一份并命名 "app.apk" 的安装文件为到 /sdcard/AppProjects 目录下。 + + +### ☁ 吁! ☁ WinBoLL-APP 共享计划前景 +☁ WinBoLL-APP 将会实现 https://winboll.cc/api 访问功能。 +☁ WinBoLL-APP 将会实现手机端 Android 应用的开发与管理功能。 + +## ☁ WinBoLL ☁ WinBoLL 主机忧虑 +☁ WinBoLL 将会提供 gitea.winboll.cc 域名用户注册登录功能。 +☁ WinBoLL 将会提供 WinBoLL-APP 及其衍生应用的 Gitea 仓库管理服务。 +☁ WinBoLL 将会提供 winboll.cc 域名 WinBoLL 项目组注册登录功能。 + +# 本项目要实际运用需要注意以下几个步骤: +# 在项目根目录下: +## ★. 项目模块编译环境设置(必须),settings.gradle-demo 要复制为 settings.gradle,并取消相应项目模块的注释。 +## ★. 项目模块编译环境设置(必须) 在根目录拷贝 gradle.properties-androidx-demo 或者 gradle.properties-android-demo 文件为 gradle.properties。 +## ★. 项目 Android SDK 编译环境设置(可选),local.properties-demo 要复制为 local.properties,并按需要设置 Android SDK 目录。 +## ★. 应用签名密钥 keystore 设置问题。一般调试编译只需用【Termux】cd 进 GenKeyStore 目录执行 $ bash gen_debug_keystore.sh 命令即可完成设置。 +## ☆. 应用 WiBoLL 签名密钥配置问题<非必须考虑>。设置时需要 clone 【keystore】模块源码并拷贝模块目录的 appkey.jks 与 appkey.keystore 到项目根目录即可。 +## ☆. 类库型模块编译环境设置(可选),winboll.properties-demo 要复制为 winboll.properties,并按需要设置 WinBoLL Maven 库登录用户信息, 和 APK 文件额外输出路径。 + + +# ☆类库型项目编译方法 +## 先编译类库对应的模块测试项目 +### 修改模块测试项目的 build.properties 文件 +设置属性 libraryProject=<类库项目模块文件夹名称> +### 再编译测试项目 +$ bash .winboll/bashPublishAPKAddTag.sh <应用项目模块文件夹名称> +#### 测试项目编译后,编译器会复制一份 APK 到 路径:"/sdcard/WinBoLLStudio/APKs/<项目根目录名称>/tag/" 文件夹。 +#### 若是 winboll.properties 文件的 [ExtraAPKOutputPath] 属性设置了路径。编译器也会复制一份 APK 到这个路径。 +### 最后编译类库项目 +$ bash .winboll/bashPublishLIBAddTag.sh <类库项目模块文件夹名称> +#### 类库模块编译命令执行后,编译器会发布到 WinBoLL Nexus Maven 库:Maven 库地址可以参阅根项目目录配置 build.gradle 文件。 + +# ☆应用型项目编译方法 +## 直接调用以下命令编译应用型项目 +$ bash .winboll/bashPublishAPKAddTag.sh <应用项目模块文件夹名称> +#### 应用模块编译命令执行后,编译器会复制一份 APK 到 +#### 测试项目编译后,编译器会复制一份 APK 到 路径:"/sdcard/WinBoLLStudio/APKs/<项目根目录名称>/tag/" 文件夹。 +#### 若是 winboll.properties 文件的 [ExtraAPKOutputPath] 属性设置了路径。编译器也会复制一份 APK 到这个路径。 + +## ☆应用调试编译方法 +使用以下命令编译调试: + +### Beta调试使用: +$ bash gradlew assembleBetaDebug + +### Stage调试使用: +$ bash gradlew assembleStageDebug + +### 若是 winboll.properties 文件的 [ExtraAPKOutputPath] 属性设置了路径。编译器也会复制一份 APK 到这个路径。 diff --git a/aes/.gitignore b/aes/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/aes/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/aes/README.md b/aes/README.md new file mode 100644 index 0000000..5598442 --- /dev/null +++ b/aes/README.md @@ -0,0 +1,35 @@ +# AES + +#### 介绍 +WinBoLL 安卓可视化元素类库测试应用。 + +#### 软件架构 +适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。 +也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。 + + +#### Gradle 编译说明 +调试版编译命令 :gradle assembleBetaDebug +阶段版编译命令 :bash .winboll/bashPublishAPKAddTag.sh aes +阶段版类库发布命令 :git pull &&bash .winboll/bashPublishLIBAddTag.sh libaes + +#### 使用说明 + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 : ZhanGSKen(ZhanGSKen) +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) + +#### 参考文档 diff --git a/aes/app_update_description.txt b/aes/app_update_description.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/aes/app_update_description.txt @@ -0,0 +1 @@ + diff --git a/aes/build.gradle b/aes/build.gradle new file mode 100644 index 0000000..dda017d --- /dev/null +++ b/aes/build.gradle @@ -0,0 +1,51 @@ +apply plugin: 'com.android.application' +apply from: '../.winboll/winboll_app_build.gradle' +apply from: '../.winboll/winboll_lint_build.gradle' + +def genVersionName(def versionName){ + // 检查编译标志位配置 + assert (winbollBuildProps['stageCount'] != null) + assert (winbollBuildProps['baseVersion'] != null) + // 保存基础版本号 + winbollBuildProps.setProperty("baseVersion", "${versionName}"); + //保存编译标志配置 + FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) + winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); + fos.close(); + + // 返回编译版本号 + return "${versionName}." + winbollBuildProps['stageCount'] +} + +android { + + // 1. compileSdkVersion:必须 ≥ targetSdkVersion,建议直接等于 targetSdkVersion(30) + compileSdkVersion 30 + + // 2. buildToolsVersion:需匹配 compileSdkVersion,建议使用 30.x.x 最新稳定版(无需高于 compileSdkVersion) + buildToolsVersion "30.0.3" // 这是 30 对应的最新稳定版,避免使用 beta 版 + + defaultConfig { + applicationId "cc.winboll.studio.aes" + minSdkVersion 23 + targetSdkVersion 30 + versionCode 1 + // versionName 更新后需要手动设置 + // 项目模块目录的 build.gradle 文件的 stageCount=0 + // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" + versionName "15.11" + if(true) { + versionName = genVersionName("${versionName}") + } + } + + // 米盟 SDK + packagingOptions { + doNotStrip "*/*/libmimo_1011.so" + } +} + +dependencies { + api project(':libaes') + api fileTree(dir: 'libs', include: ['*.jar']) +} diff --git a/aes/build.properties b/aes/build.properties new file mode 100644 index 0000000..f685fed --- /dev/null +++ b/aes/build.properties @@ -0,0 +1,8 @@ +#Created by .winboll/winboll_app_build.gradle +#Wed Nov 26 15:54:26 GMT 2025 +stageCount=7 +libraryProject=libaes +baseVersion=15.11 +publishVersion=15.11.6 +buildCount=32 +baseBetaVersion=15.11.7 diff --git a/aes/proguard-rules.pro b/aes/proguard-rules.pro new file mode 100644 index 0000000..a18de74 --- /dev/null +++ b/aes/proguard-rules.pro @@ -0,0 +1,137 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# ============================== 基础通用规则 ============================== +# 保留系统组件 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference + +# 保留 WinBoLL 核心包及子类(合并简化规则) +-keep class cc.winboll.studio.** { *; } +-keepclassmembers class cc.winboll.studio.** { *; } + +# 保留所有类中的 public static final String TAG 字段(便于日志定位) +-keepclassmembers class * { + public static final java.lang.String TAG; +} + +# 保留序列化类(避免Parcelable/Gson解析异常) +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +# 保留 R 文件(避免资源ID混淆) +-keepclassmembers class **.R$* { + public static ; +} + +# 保留 native 方法(避免JNI调用失败) +-keepclasseswithmembernames class * { + native ; +} + +# 保留注解和泛型(避免反射/序列化异常) +-keepattributes *Annotation* +-keepattributes Signature + +# 屏蔽 Java 8+ 警告(适配 Java 7 语法) +-dontwarn java.lang.invoke.* +-dontwarn android.support.v8.renderscript.* +-dontwarn java.util.function.** + +# ============================== 第三方框架专项规则 ============================== +# OkHttp 4.4.1(米盟广告请求依赖,完善Lambda兼容) +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-keep class okhttp3.internal.** { *; } +-keep class okio.** { *; } +-dontwarn okhttp3.internal.platform.** +-dontwarn okio.** + +# Glide 4.9.0(米盟广告图片加载依赖) +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType { + **[] $VALUES; + public *; +} +-keepclassmembers class * implements com.bumptech.glide.module.AppGlideModule { + (); +} +-dontwarn com.bumptech.glide.** + +# Gson 2.8.5(米盟广告数据序列化依赖) +-keep class com.google.gson.** { *; } +-keep interface com.google.gson.** { *; } +-keepclassmembers class * { + @com.google.gson.annotations.SerializedName ; +} + +# 米盟 SDK(核心广告组件,完整保留避免加载失败) +-keep class com.miui.zeus.** { *; } +-keep interface com.miui.zeus.** { *; } +# 保留米盟日志字段(便于广告加载失败排查) +-keepclassmembers class com.miui.zeus.mimo.sdk.** { + public static final java.lang.String TAG; +} + +# RecyclerView 1.0.0(米盟广告布局渲染依赖) +-keep class androidx.recyclerview.** { *; } +-keep interface androidx.recyclerview.** { *; } +-keepclassmembers class androidx.recyclerview.widget.RecyclerView$Adapter { + public *; +} + +# 其他第三方框架(按引入依赖保留,无则可删除) +# XXPermissions 18.63 +-keep class com.hjq.permissions.** { *; } +-keep interface com.hjq.permissions.** { *; } + +# ZXing 二维码(核心解析组件) +-keep class com.google.zxing.** { *; } +-keep class com.journeyapps.zxing.** { *; } + +# Jsoup HTML解析 +-keep class org.jsoup.** { *; } + +# Pinyin4j 拼音搜索 +-keep class net.sourceforge.pinyin4j.** { *; } + +# JSch SSH组件 +-keep class com.jcraft.jsch.** { *; } + +# AndroidX 基础组件 +-keep class androidx.appcompat.** { *; } +-keep interface androidx.appcompat.** { *; } + +# ============================== 优化与调试配置 ============================== +# 优化级别(平衡混淆效果与性能) +-optimizationpasses 5 +-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* + +# 调试辅助(保留行号便于崩溃定位) +-verbose +-dontpreverify +-dontusemixedcaseclassnames +-keepattributes SourceFile,LineNumberTable + diff --git a/aes/src/beta/AndroidManifest.xml b/aes/src/beta/AndroidManifest.xml new file mode 100644 index 0000000..ee78d9f --- /dev/null +++ b/aes/src/beta/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/aes/src/beta/res/values/strings.xml b/aes/src/beta/res/values/strings.xml new file mode 100644 index 0000000..6f287f2 --- /dev/null +++ b/aes/src/beta/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + + AES+ + diff --git a/aes/src/main/AndroidManifest.xml b/aes/src/main/AndroidManifest.xml new file mode 100644 index 0000000..40eb674 --- /dev/null +++ b/aes/src/main/AndroidManifest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java b/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java new file mode 100644 index 0000000..39dc20e --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java @@ -0,0 +1,93 @@ +package cc.winboll.studio.aes; + +/** + * @Author ZhanGSKen + * @Date 2025/03/24 23:52:29 + * @Describe AES应用介绍窗口 + */ +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; +import cc.winboll.studio.libaes.models.APPInfo; +import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; +import cc.winboll.studio.libaes.views.AboutView; + +public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity { + + public static final String TAG = "AboutActivity"; + + Context mContext; + Toolbar mToolbar; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mContext = this; + setContentView(R.layout.activity_about); + + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + mToolbar.setSubtitle(TAG); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + AboutView aboutView = CreateAboutView(); + // 在 Activity 的 onCreate 或其他生命周期方法中调用 +// LinearLayout layout = new LinearLayout(this); +// layout.setOrientation(LinearLayout.VERTICAL); +// // 创建布局参数(宽度和高度) +// ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( +// ViewGroup.LayoutParams.MATCH_PARENT, +// ViewGroup.LayoutParams.MATCH_PARENT +// ); +// addContentView(aboutView, params); + + LinearLayout layout = findViewById(R.id.aboutviewroot_ll); + // 创建布局参数(宽度和高度) + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ); + layout.addView(aboutView, params); + + WinBoLLActivityManager.getInstance().add(this); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + WinBoLLActivityManager.getInstance().registeRemove(this); + } + + public AboutView CreateAboutView() { + String szBranchName = "aes"; + APPInfo appInfo = new APPInfo(); + appInfo.setAppName("AES"); + appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll); + appInfo.setAppDescription("AES Description"); + appInfo.setAppGitName("APPBase"); + appInfo.setAppGitOwner("Studio"); + appInfo.setAppGitAPPBranch(szBranchName); + appInfo.setAppGitAPPSubProjectFolder(szBranchName); + appInfo.setAppHomePage("https://www.winboll.cc/apks/index.php?project=AES"); + appInfo.setAppAPKName("AES"); + appInfo.setAppAPKFolderName("AES"); + //appInfo.setIsAddDebugTools(false); + //appInfo.setIsAddDebugTools(BuildConfig.DEBUG); + return new AboutView(mContext, appInfo); + } +} diff --git a/aes/src/main/java/cc/winboll/studio/aes/App.java b/aes/src/main/java/cc/winboll/studio/aes/App.java new file mode 100644 index 0000000..9a6674c --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/App.java @@ -0,0 +1,33 @@ +package cc.winboll.studio.aes; + +/** + * @Author ZhanGSKen + * @Date 2024/06/13 19:03:58 + * @Describe AES应用类 + */ +import android.view.Gravity; +import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.ToastUtils; + + +public class App extends GlobalApplication { + + public static final String TAG = "App"; + + @Override + public void onCreate() { + super.onCreate(); + setIsDebugging(BuildConfig.DEBUG); + WinBoLLActivityManager.init(this); + + // 初始化 Toast 框架 + ToastUtils.init(this); + } + + @Override + public void onTerminate() { + super.onTerminate(); + ToastUtils.release(); + } +} diff --git a/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java b/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java new file mode 100644 index 0000000..0733873 --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java @@ -0,0 +1,201 @@ +package cc.winboll.studio.aes; + +/** + * @Author ZhanGSKen + * @Date 2024/06/13 19:05:52 + * @Describe 应用主窗口 + */ +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Toast; +import cc.winboll.studio.aes.R; +import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity; +import cc.winboll.studio.libaes.dialogs.LocalFileSelectDialog; +import cc.winboll.studio.libaes.dialogs.StoragePathDialog; +import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; +import cc.winboll.studio.libaes.models.DrawerMenuBean; +import cc.winboll.studio.libaes.unittests.SecondaryLibraryActivity; +import cc.winboll.studio.libaes.unittests.TestAButtonFragment; +import cc.winboll.studio.libaes.unittests.TestASupportToolbarActivity; +import cc.winboll.studio.libaes.unittests.TestAToolbarActivity; +import cc.winboll.studio.libaes.unittests.TestDrawerFragmentActivity; +import cc.winboll.studio.libaes.unittests.TestViewPageFragment; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.ToastUtils; +import com.a4455jkjh.colorpicker.ColorPickerDialog; +import java.util.ArrayList; +import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; + +public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActivity { + + + public static final String TAG = "MainActivity"; + + TestAButtonFragment mTestAButtonFragment; + TestViewPageFragment mTestViewPageFragment; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (mTestAButtonFragment == null) { + mTestAButtonFragment = new TestAButtonFragment(); + addFragment(mTestAButtonFragment); + } + showFragment(mTestAButtonFragment); + //setSubtitle(TAG); + //ToastUtils.show("onCreate"); + } + + @Override + public void initDrawerMenuItemList(ArrayList listDrawerMenu) { + super.initDrawerMenuItemList(listDrawerMenu); + LogUtils.d(TAG, "initDrawerMenuItemList"); + //listDrawerMenu.clear(); + // 添加抽屉菜单项 + listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG)); + listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG)); + notifyDrawerMenuDataChanged(); + } + + @Override + public void reinitDrawerMenuItemList(ArrayList listDrawerMenu) { + super.reinitDrawerMenuItemList(listDrawerMenu); + LogUtils.d(TAG, "reinitDrawerMenuItemList"); + //listDrawerMenu.clear(); + // 添加抽屉菜单项 + listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG)); + listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG)); + notifyDrawerMenuDataChanged(); + } + + @Override + public DrawerFragmentActivity.ActivityType initActivityType() { + return DrawerFragmentActivity.ActivityType.Main; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.toolbar_main, menu); + if(App.isDebugging()) { + getMenuInflater().inflate(cc.winboll.studio.libaes.R.menu.toolbar_studio_debug, menu); + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + super.onItemClick(parent, view, position, id); + switch (position) { + case 0 : { + if (mTestAButtonFragment == null) { + mTestAButtonFragment = new TestAButtonFragment(); + addFragment(mTestAButtonFragment); + } + showFragment(mTestAButtonFragment); + break; + } + case 1 : { + if (mTestViewPageFragment == null) { + mTestViewPageFragment = new TestViewPageFragment(); + addFragment(mTestViewPageFragment); + } + showFragment(mTestViewPageFragment); + break; + } + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int nItemId = item.getItemId(); + if (item.getItemId() == R.id.item_testactivitymanager) { + WinBoLLActivityManager.getInstance().startWinBoLLActivity(this, TestActivityManagerActivity.class); + //ToastUtils.show("item_testactivitymanager"); + } else + if (nItemId == R.id.item_atoast) { + Toast.makeText(getApplication(), "item_testatoast", Toast.LENGTH_SHORT).show(); + } else if (nItemId == R.id.item_atoolbar) { + Intent intent = new Intent(this, TestAToolbarActivity.class); + startActivity(intent); + + } else if (nItemId == R.id.item_asupporttoolbar) { + Intent intent = new Intent(this, TestASupportToolbarActivity.class); + startActivity(intent); + + } else if (nItemId == R.id.item_colordialog) { + ColorPickerDialog dlg = new ColorPickerDialog(this, getResources().getColor(R.color.colorPrimary)); + dlg.setOnColorChangedListener(new com.a4455jkjh.colorpicker.view.OnColorChangedListener() { + + @Override + public void beforeColorChanged() { + } + + @Override + public void onColorChanged(int color) { + + } + + @Override + public void afterColorChanged() { + } + + + }); + dlg.show(); + + } else if (nItemId == R.id.item_dialogstoragepath) { + final StoragePathDialog dialog = new StoragePathDialog(this, 0); + dialog.setOnOKClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + } + }); + dialog.show(); + + } else if (nItemId == R.id.item_localfileselectdialog) { + final LocalFileSelectDialog dialog = new LocalFileSelectDialog(this); + dialog.setOnOKClickListener(new LocalFileSelectDialog.OKClickListener() { + @Override + public void onOKClick(String sz) { + Toast.makeText(getApplication(), sz, Toast.LENGTH_SHORT).show(); + //dialog.dismiss(); + } + }); + dialog.open(); + + } else if (nItemId == R.id.item_secondarylibraryactivity) { + Intent intent = new Intent(this, SecondaryLibraryActivity.class); + startActivity(intent); + } else if (nItemId == R.id.item_drawerfragmentactivity) { + Intent intent = new Intent(this, TestDrawerFragmentActivity.class); + startActivity(intent); + } else if (nItemId == R.id.item_settings) { + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); + } else if (nItemId == R.id.item_about) { + Intent intent = new Intent(this, AboutActivity.class); + startActivity(intent); + return true; + } + + return super.onOptionsItemSelected(item); + } + + +} diff --git a/aes/src/main/java/cc/winboll/studio/aes/SettingsActivity.java b/aes/src/main/java/cc/winboll/studio/aes/SettingsActivity.java new file mode 100644 index 0000000..3a9a394 --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/SettingsActivity.java @@ -0,0 +1,38 @@ +package cc.winboll.studio.aes; + +import android.app.Activity; +import android.os.Bundle; +import cc.winboll.studio.libaes.enums.ADsMode; +import cc.winboll.studio.libaes.views.ADsControlView; +import cc.winboll.studio.libappbase.ToastUtils; + +/** + * @Author ZhanGSKen&豆包大模型 + * @Date 2025/11/26 18:01 + * @Describe SettingsActivity + */ +public class SettingsActivity extends Activity { + + public static final String TAG = "SettingsActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + ADsControlView adsControlView = (ADsControlView) findViewById(R.id.ads_control_view); + +// adsControlView.setOnAdsModeSelectedListener(new ADsControlView.OnAdsModeSelectedListener() { +// @Override +// public void onModeSelected(ADsMode selectedMode) { +// if (selectedMode == ADsMode.STANDALONE) { +// // 处理单机模式逻辑(如释放米盟资源) +// ToastUtils.show("STANDALONE"); +// } else if (selectedMode == ADsMode.MIMO_SDK) { +// // 处理米盟SDK模式逻辑(如初始化SDK) +// ToastUtils.show("MIMO_SDK"); +// } +// } +// }); + } + +} diff --git a/aes/src/main/java/cc/winboll/studio/aes/TestActivityManagerActivity.java b/aes/src/main/java/cc/winboll/studio/aes/TestActivityManagerActivity.java new file mode 100644 index 0000000..71d114d --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/TestActivityManagerActivity.java @@ -0,0 +1,33 @@ +package cc.winboll.studio.aes; + +import android.app.Activity; +import android.os.Bundle; +import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; + +/** + * @Author ZhanGSKen&豆包大模型 + * @Date 2025/09/28 21:07 + * @Describe 窗口管理类测试窗口 + */ +public class TestActivityManagerActivity extends WinBoLLActivity implements IWinBoLLActivity { + + public static final String TAG = "TestActivityManagerActivity"; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_testactivitymanager); + + } + +} diff --git a/aes/src/main/java/cc/winboll/studio/aes/WinBoLLActivity.java b/aes/src/main/java/cc/winboll/studio/aes/WinBoLLActivity.java new file mode 100644 index 0000000..76005db --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/WinBoLLActivity.java @@ -0,0 +1,60 @@ +package cc.winboll.studio.aes; + +/** + * @Author ZhanGSKen&豆包大模型 + * @Date 2025/09/29 00:11 + * @Describe WinBoLL 窗口基础类 + */ +import android.app.Activity; +import android.os.Bundle; +import android.view.MenuItem; +import androidx.appcompat.app.AppCompatActivity; +import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; +import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; +import cc.winboll.studio.libappbase.LogUtils; + +public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity { + + public static final String TAG = "WinBoLLActivity"; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + @Override + protected void onResume() { + super.onResume(); + LogUtils.d(TAG, String.format("onResume %s", getTag())); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + /*if (item.getItemId() == R.id.item_log) { + WinBoLLActivityManager.getInstance().startLogActivity(this); + return true; + } else if (item.getItemId() == R.id.item_home) { + startActivity(new Intent(this, MainActivity.class)); + return true; + }*/ + // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 + return super.onOptionsItemSelected(item); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + WinBoLLActivityManager.getInstance().add(this); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + WinBoLLActivityManager.getInstance().registeRemove(this); + } +} diff --git a/aes/src/main/res/layout/activity_about.xml b/aes/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..3de4825 --- /dev/null +++ b/aes/src/main/res/layout/activity_about.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/aes/src/main/res/layout/activity_settings.xml b/aes/src/main/res/layout/activity_settings.xml new file mode 100644 index 0000000..c2df838 --- /dev/null +++ b/aes/src/main/res/layout/activity_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/aes/src/main/res/layout/activity_testactivitymanager.xml b/aes/src/main/res/layout/activity_testactivitymanager.xml new file mode 100644 index 0000000..e030ebb --- /dev/null +++ b/aes/src/main/res/layout/activity_testactivitymanager.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/aes/src/main/res/menu/toolbar_main.xml b/aes/src/main/res/menu/toolbar_main.xml new file mode 100644 index 0000000..7f2f26b --- /dev/null +++ b/aes/src/main/res/menu/toolbar_main.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + diff --git a/aes/src/main/res/values/colors.xml b/aes/src/main/res/values/colors.xml new file mode 100644 index 0000000..87d3836 --- /dev/null +++ b/aes/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #FF00B322 + #FF005C12 + #FF8DFFA2 + #FFFFFB8D + diff --git a/aes/src/main/res/values/strings.xml b/aes/src/main/res/values/strings.xml new file mode 100644 index 0000000..6b856ff --- /dev/null +++ b/aes/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + AES + + diff --git a/aes/src/main/res/values/styles.xml b/aes/src/main/res/values/styles.xml new file mode 100644 index 0000000..1da88ba --- /dev/null +++ b/aes/src/main/res/values/styles.xml @@ -0,0 +1,5 @@ + + + + diff --git a/aes/src/main/res/xml/network_security_config.xml b/aes/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..ee39aa4 --- /dev/null +++ b/aes/src/main/res/xml/network_security_config.xml @@ -0,0 +1,6 @@ + + + + winboll.cc + + diff --git a/aes/src/stage/AndroidManifest.xml b/aes/src/stage/AndroidManifest.xml new file mode 100644 index 0000000..ee78d9f --- /dev/null +++ b/aes/src/stage/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/aes/src/stage/res/values/strings.xml b/aes/src/stage/res/values/strings.xml new file mode 100644 index 0000000..ace0c41 --- /dev/null +++ b/aes/src/stage/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/androiddemo/.gitignore b/androiddemo/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/androiddemo/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/androiddemo/app_update_description.txt b/androiddemo/app_update_description.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/androiddemo/app_update_description.txt @@ -0,0 +1 @@ + diff --git a/androiddemo/build.gradle b/androiddemo/build.gradle new file mode 100644 index 0000000..d32957f --- /dev/null +++ b/androiddemo/build.gradle @@ -0,0 +1,72 @@ +apply plugin: 'com.android.application' +apply from: '../.winboll/winboll_app_build.gradle' +apply from: '../.winboll/winboll_lint_build.gradle' + +def genVersionName(def versionName){ + // 检查编译标志位配置 + assert (winbollBuildProps['stageCount'] != null) + assert (winbollBuildProps['baseVersion'] != null) + // 保存基础版本号 + winbollBuildProps.setProperty("baseVersion", "${versionName}"); + //保存编译标志配置 + FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) + winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); + fos.close(); + + // 返回编译版本号 + return "${versionName}." + winbollBuildProps['stageCount'] +} + +android { + compileSdkVersion 32 + buildToolsVersion "32.0.0" + + defaultConfig { + applicationId "cc.winboll.studio.androiddemo" + minSdkVersion 24 + targetSdkVersion 30 + versionCode 1 + // versionName 更新后需要手动设置 + // .winboll/winbollBuildProps.properties 文件的 stageCount=0 + // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" + versionName "15.0" + if(true) { + versionName = genVersionName("${versionName}") + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + api fileTree(dir: 'libs', include: ['*.jar']) + + // Android 类库 + //api 'com.android.support:appcompat-v7:28.0.0' + api('com.android.support:appcompat-v7:28.0.0'){ + //exclude group: "com.android.support", module: "support-vector-drawable" + exclude group: "com.android.support:animated-vector-drawable:28.0.0" + } + // https://mvnrepository.com/artifact/com.android.support/support-compat + api 'com.android.support:support-compat:28.0.0' // 保留原有依赖(可选) + // https://mvnrepository.com/artifact/com.android.support/support-v4 + api 'com.android.support:support-v4:28.0.0' + // https://mvnrepository.com/artifact/com.android.support/support-media-compat + api 'com.android.support:support-media-compat:28.0.0' + // https://mvnrepository.com/artifact/com.android.support/support-core-utils + api 'com.android.support:support-core-utils:28.0.0' + // https://mvnrepository.com/artifact/com.android.support/support-core-ui + api 'com.android.support:support-core-ui:28.0.0' + // https://mvnrepository.com/artifact/com.android.support/support-fragment + api 'com.android.support:support-fragment:28.0.0' + // https://mvnrepository.com/artifact/com.android.support/recyclerview-v7 + api 'com.android.support:recyclerview-v7:28.0.0' + + api 'cc.winboll.studio:libapputils:15.8.5' + api 'cc.winboll.studio:libappbase:15.9.5' +} diff --git a/androiddemo/build.properties b/androiddemo/build.properties new file mode 100644 index 0000000..5e7cbee --- /dev/null +++ b/androiddemo/build.properties @@ -0,0 +1,8 @@ +#Created by .winboll/winboll_app_build.gradle +#Sun Aug 31 05:11:26 CST 2025 +stageCount=1 +libraryProject= +baseVersion=15.0 +publishVersion=15.0.0 +buildCount=0 +baseBetaVersion=15.0.1 diff --git a/androiddemo/proguard-rules.pro b/androiddemo/proguard-rules.pro new file mode 100644 index 0000000..64b4a05 --- /dev/null +++ b/androiddemo/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/androiddemo/src/beta/AndroidManifest.xml b/androiddemo/src/beta/AndroidManifest.xml new file mode 100644 index 0000000..ee78d9f --- /dev/null +++ b/androiddemo/src/beta/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/androiddemo/src/beta/res/values/strings.xml b/androiddemo/src/beta/res/values/strings.xml new file mode 100644 index 0000000..e0c92e9 --- /dev/null +++ b/androiddemo/src/beta/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + + Android Demo + + + diff --git a/androiddemo/src/main/AndroidManifest.xml b/androiddemo/src/main/AndroidManifest.xml new file mode 100644 index 0000000..57a1145 --- /dev/null +++ b/androiddemo/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/androiddemo/src/main/java/cc/winboll/studio/androiddemo/App.java b/androiddemo/src/main/java/cc/winboll/studio/androiddemo/App.java new file mode 100644 index 0000000..54f102f --- /dev/null +++ b/androiddemo/src/main/java/cc/winboll/studio/androiddemo/App.java @@ -0,0 +1,334 @@ +package cc.winboll.studio.androiddemo; + +import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.res.Resources; +import android.graphics.Typeface; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.text.TextUtils; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.ViewGroup; +import android.widget.HorizontalScrollView; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toast; +import cc.winboll.studio.libappbase.GlobalApplication; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.Thread.UncaughtExceptionHandler; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +public class App extends GlobalApplication { + + private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper()); + + @Override + public void onCreate() { + super.onCreate(); + //CrashHandler.getInstance().registerGlobal(this); + //CrashHandler.getInstance().registerPart(this); + } + + public static void write(InputStream input, OutputStream output) throws IOException { + byte[] buf = new byte[1024 * 8]; + int len; + while ((len = input.read(buf)) != -1) { + output.write(buf, 0, len); + } + } + + public static void write(File file, byte[] data) throws IOException { + File parent = file.getParentFile(); + if (parent != null && !parent.exists()) parent.mkdirs(); + + ByteArrayInputStream input = new ByteArrayInputStream(data); + FileOutputStream output = new FileOutputStream(file); + try { + write(input, output); + } finally { + closeIO(input, output); + } + } + + public static String toString(InputStream input) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + write(input, output); + try { + return output.toString("UTF-8"); + } finally { + closeIO(input, output); + } + } + + public static void closeIO(Closeable... closeables) { + for (Closeable closeable : closeables) { + try { + if (closeable != null) closeable.close(); + } catch (IOException ignored) {} + } + } + + public static class CrashHandler { + + public static final UncaughtExceptionHandler DEFAULT_UNCAUGHT_EXCEPTION_HANDLER = Thread.getDefaultUncaughtExceptionHandler(); + + private static CrashHandler sInstance; + + private PartCrashHandler mPartCrashHandler; + + public static CrashHandler getInstance() { + if (sInstance == null) { + sInstance = new CrashHandler(); + } + return sInstance; + } + + public void registerGlobal(Context context) { + registerGlobal(context, null); + } + + public void registerGlobal(Context context, String crashDir) { + Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandlerImpl(context.getApplicationContext(), crashDir)); + } + + public void unregister() { + Thread.setDefaultUncaughtExceptionHandler(DEFAULT_UNCAUGHT_EXCEPTION_HANDLER); + } + + public void registerPart(Context context) { + unregisterPart(context); + mPartCrashHandler = new PartCrashHandler(context.getApplicationContext()); + MAIN_HANDLER.postAtFrontOfQueue(mPartCrashHandler); + } + + public void unregisterPart(Context context) { + if (mPartCrashHandler != null) { + mPartCrashHandler.isRunning.set(false); + mPartCrashHandler = null; + } + } + + private static class PartCrashHandler implements Runnable { + + private final Context mContext; + + public AtomicBoolean isRunning = new AtomicBoolean(true); + + public PartCrashHandler(Context context) { + this.mContext = context; + } + + @Override + public void run() { + while (isRunning.get()) { + try { + Looper.loop(); + } catch (final Throwable e) { + e.printStackTrace(); + if (isRunning.get()) { + MAIN_HANDLER.post(new Runnable(){ + + @Override + public void run() { + Toast.makeText(mContext, e.toString(), Toast.LENGTH_LONG).show(); + } + }); + } else { + if (e instanceof RuntimeException) { + throw (RuntimeException)e; + } else { + throw new RuntimeException(e); + } + } + } + } + } + } + + private static class UncaughtExceptionHandlerImpl implements UncaughtExceptionHandler { + + private static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy_MM_dd-HH_mm_ss"); + + private final Context mContext; + + private final File mCrashDir; + + public UncaughtExceptionHandlerImpl(Context context, String crashDir) { + this.mContext = context; + this.mCrashDir = TextUtils.isEmpty(crashDir) ? new File(mContext.getExternalCacheDir(), "crash") : new File(crashDir); + } + + @Override + public void uncaughtException(Thread thread, Throwable throwable) { + try { + + String log = buildLog(throwable); + writeLog(log); + + try { + Intent intent = new Intent(mContext, CrashActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(Intent.EXTRA_TEXT, log); + mContext.startActivity(intent); + } catch (Throwable e) { + e.printStackTrace(); + writeLog(e.toString()); + } + + throwable.printStackTrace(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + + } catch (Throwable e) { + if (DEFAULT_UNCAUGHT_EXCEPTION_HANDLER != null) DEFAULT_UNCAUGHT_EXCEPTION_HANDLER.uncaughtException(thread, throwable); + } + } + + private String buildLog(Throwable throwable) { + String time = DATE_FORMAT.format(new Date()); + + String versionName = "unknown"; + long versionCode = 0; + try { + PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); + versionName = packageInfo.versionName; + versionCode = Build.VERSION.SDK_INT >= 28 ? packageInfo.getLongVersionCode() : packageInfo.versionCode; + } catch (Throwable ignored) {} + + LinkedHashMap head = new LinkedHashMap(); + head.put("Time Of Crash", time); + head.put("Device", String.format("%s, %s", Build.MANUFACTURER, Build.MODEL)); + head.put("Android Version", String.format("%s (%d)", Build.VERSION.RELEASE, Build.VERSION.SDK_INT)); + head.put("App Version", String.format("%s (%d)", versionName, versionCode)); + head.put("Kernel", getKernel()); + head.put("Support Abis", Build.VERSION.SDK_INT >= 21 && Build.SUPPORTED_ABIS != null ? Arrays.toString(Build.SUPPORTED_ABIS): "unknown"); + head.put("Fingerprint", Build.FINGERPRINT); + + StringBuilder builder = new StringBuilder(); + + for (String key : head.keySet()) { + if (builder.length() != 0) builder.append("\n"); + builder.append(key); + builder.append(" : "); + builder.append(head.get(key)); + } + + builder.append("\n\n"); + builder.append(Log.getStackTraceString(throwable)); + + return builder.toString(); + } + + private void writeLog(String log) { + String time = DATE_FORMAT.format(new Date()); + File file = new File(mCrashDir, "crash_" + time + ".txt"); + try { + write(file, log.getBytes("UTF-8")); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private static String getKernel() { + try { + return App.toString(new FileInputStream("/proc/version")).trim(); + } catch (Throwable e) { + return e.getMessage(); + } + } + } + } + + public static final class CrashActivity extends Activity { + + private String mLog; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setTheme(android.R.style.Theme_DeviceDefault); + setTitle("App Crash"); + + mLog = getIntent().getStringExtra(Intent.EXTRA_TEXT); + + ScrollView contentView = new ScrollView(this); + contentView.setFillViewport(true); + + HorizontalScrollView horizontalScrollView = new HorizontalScrollView(this); + + TextView textView = new TextView(this); + int padding = dp2px(16); + textView.setPadding(padding, padding, padding, padding); + textView.setText(mLog); + textView.setTextIsSelectable(true); + textView.setTypeface(Typeface.DEFAULT); + textView.setLinksClickable(true); + + horizontalScrollView.addView(textView); + contentView.addView(horizontalScrollView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + + setContentView(contentView); + } + + private void restart() { + Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); + if (intent != null) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + finish(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + } + + private static int dp2px(float dpValue) { + final float scale = Resources.getSystem().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + menu.add(0, android.R.id.copy, 0, android.R.string.copy) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.copy: + ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog)); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onBackPressed() { + restart(); + } + } +} diff --git a/androiddemo/src/main/java/cc/winboll/studio/androiddemo/MainActivity.java b/androiddemo/src/main/java/cc/winboll/studio/androiddemo/MainActivity.java new file mode 100644 index 0000000..cfde770 --- /dev/null +++ b/androiddemo/src/main/java/cc/winboll/studio/androiddemo/MainActivity.java @@ -0,0 +1,25 @@ +package cc.winboll.studio.androiddemo; + +import android.app.Activity; +import android.os.Bundle; +import cc.winboll.studio.libappbase.LogView; + +public class MainActivity extends Activity { + + LogView mLogView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + mLogView = findViewById(R.id.logview); + mLogView.start(); + } + + @Override + protected void onResume() { + super.onResume(); + mLogView.start(); + } +} diff --git a/androiddemo/src/main/res/drawable/ic_launcher.png b/androiddemo/src/main/res/drawable/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b824ebdd48db917eea2e67a82260a100371f8a24 GIT binary patch literal 9250 zcmb`NWmwct^yp`U?k)*IT4_)~WNGO}0fCiVBo&ktmXr`sL8L_*Bn6~lMMAozq!gAe z>AvglfA9NypXa{#=A1b*&&-_9nK?6&dOB)k#LUD105bLa$_BV6=HEq#kGmWEawY(P zYgJuY!N_}RGo8TO$oTXsB$&89>#C*cCdYLmNX~ke#Hv9KA93kET{$`$PbI2&f<=QO zbYEuG&fq#8;U|Hp%+iMX($XltD84sh%`HcA9=yrw*x5Rd?dw|aj_wW|b=kga#C;uk zY)LO?99@%_7kX6dzR(&*!tnq4;>`zco!?9(Az&zTo|L_j^WL&gF7wJuI**)H&y&sO z9l;NhRvPV@eM$C25(Y1oLfTY%Qu06J{1!LY%l6`?e{u8in|(1@!4MJk2$1+uIsPqnf+k()k8h#rg7tMJHVtWaqYT zq|_R>T}xsUyk)<9e2b1o1pB702Pc9ve?7kQpF2}x}2=dBPVaUdm7-ZjF+bUL0vak))KQnKW)qx!vgbJE?)QXqi+7Po!iYjGEI9xeX+3}trhX=ZOA z6m<4$ajUa5?TbuamQOsfYFx!_%v5Pca-z3$eHCN9QVeZN0(`DY*CwYcn=Z{IwS{|W zMVA?tHKL`t<(1kV)n+5idi^{`iXLpvnO=;Rx{T4}wriDGR@79T*3GDl#qU(VPNH?_ z+WNh=8;jQwV zM#imv9eB3r+LQaLX%UgUmS$Q-V|+Ygp>ovUbJ{jiX~_q+go2a38CD$M(o|A(oS*f( zh?L!-@KukR?4c%)OIZBg${L2g5L6Pa=XF(yBP@&9b|agsWh)uYDy{MN@*W9zbE^QG zPZ8wOAg?zDskn|*wf&j@!i7Pbw6fw_Jr}n|+l>O-_8a2*TEQA7y+XU@NUD_gnXUKG z2}$1=_w*$M6~;^rw4#*yT22U!%e#`&t(A(xyf|-T(y3T1sVLvn_}AGKzdo!w)-*Uq z)`#%}qna5)jZjh2p>&4DK;ogEbdo#F?UZ%H>ljUbLLNV;50EQ$-zmX5OZ~Oiu>6ZIQR6g&! zPTyC(E=$qrR?zuYogtRne89+%HynZlT2P=QPE)k~RavpYct9<_leX;S(cUYWmJ%5i zw<#|0L;Epc1diZ!djsOtxXCrexN0iPy+W$%xrf_3!-ktsYsF?BfO_-+rz;1%p|X0Z z`xS4h<)pP{yf5Y2%`K?M%L1lRyQRhGg2R@R1BO$0TUeSMPUR$cJ)j;QyWQ-2SYJ1? z%~^ILTzh8y5rPT)29-&Qo@%PiVei|f)aGz{7xO>5>77{OmMi}>lo?rwpOta_aN2a} zZ_L3$CVhl%C4|)F%yc_!V?s)E@;~94fP)o1CTwgW@3F@BcS<{+x8_h1m|gj-8eT8~ z{P{;v_nE3QwfJ#=Vz7jq`qgMV1n|+2J0HNKgTY17#cGz07^gpi;87-UU+o*XC;A3g zg??@@etFPbu_%d$CSm+feh%;vd6_sgJ6ydmIB8OZ2ObCNBuk-&Tg}J-dX|>uJe}kmEmBH)Q7uAac~6f=i$joy zJK0c6OM9t_Ef1k*Ry3>%RVQV4P_zwS5s^T+u`MbCH zd6?wSSFRIE`|C9((s}H4ZYxc^RT{P)UbYCc^d0IW&aSPITSpqAIQF6g6&D^@VVnrOzTa^&s3buD4Zh79z^>7JLQH+- zqYS8QcLF8+03Y|4eD30R)L9O+_7gvyxH&uXehWGsGF8ox(YPKFj0 zeO}1^(}~=Cb++)WmDI6QeKp!MtupG%f{wZCy1$n!&RIBjUrS~HF0dp*p%w3uW|XYcuU?@&lSpJS-nf;@|F$`Umi_6zQo)P* zAN?|yXKv+GF@wL}{Z@+e2fPCrPyKWP%8JnsD4{x0N4};B4)_O}kwrPV3fK?Wi2^1> z9|==dt|saLUjuoB-9|amKlwXh1UO#${B=k&OyF9&!@HCh^(P1Z!t`T$%9BxBE^)o# zrb+Lsi5i*!ebE*rcxuhl)knhZ#ON)wO$oi@$3X1Yo6{S=udP&GmK4bkq;tb{^J~U4q82PKlFy7~0oQfA>1ZE&nMwI&x>vEc6U6l>WUM9Dh&x=`RU*Gbxx! zkNtRQF;b=RUB91-eD(xJv`D~Lmt+aUbpk*|itL0+z!SP00+|E6y z`uA#y)}Obo8;y%<&n3om?p6xzZJ%th-0j>wzfmi#6_%M|?B;=zSIm6DyAoM_apC>I zXM6D8M09ojEP0;(Tm6=+iv(2Opx(Oj#^^AOYqkBr2bn&rSZqFl_g%UyrartZl7oXX z-sf{fs&@{EPIHwb9qDY_<^%-#3soQ%QDuSy?jsU+(Fip2|+_ zGrN|zd*<~MKX{Lbhj???lU_IhSOdz4)6#L*Ah zm&9^`M`a&%BRsm}7gG3v#DiB;WAYz|2o$)P`>;wKw>@5~1xl# znaLk1Gsg9W+FM2frk6^A_#Vca3W3`Oq!4wV08%sw2(tG4QPdzk%6LE|<#%m44u|qJ zyU?M#nQ?*VpSqw3iYXL4`rl88NPi0HtH8TIb5i9co;}~0@H+On_0OFWps8>3b*XNL zROE5^A`ad4h3;CKVSt1Kz|T<$S=!5XFZ%6Vi5u+l>6fg(<F3On}Towx%MlobtMeV$xN86aA@wyIsb zpySR3MZYr<`22Zdh0P(}B+{cDNL&Y~SPHU}if;!Las3k+eLw;apzg$Cn=31tX!;`8 zY=|5HvpA^g-d!i?nHGr%`~;Flh)u-a91db%jAcig`GW_KWahiTTh z{}^LvD}yhSsCAb|MoLE2G})=@*?##ViZEif4M<3V`i@tM!^>(*Rgr=M9E%|@2gR-B zJV|}j_)t9!JI+t<`3J6z`iNgqpaz#UNv`wl%dOPql&jUOM&>{9=QR^_l&7V4>`hsJ z^G|jS@;l#xw>et_W*DeS$UNv7$Yq?LHspOA%H3LWvgs9kgq*9fx_t)_w4AYf&erE; zoUk${(?)h)eonZuyEw`pl=f#;ELYvr!4*#ks>oM})C*(SuXf}-zfb9s0fYSo3g&C* zV=nfhl#iZHZ8A?c#4g7pM_Rrg?|bjeon~Ou(U2Voz^zl1+IZQ!G&%DZFh62aK+ek- zIo}{Z&X;+Mut%Mj>T@fUL(+){SDfT6!du|ddt5){zl^BJmNK30o-LWDrxIFSRRt+6 z!mYbqyWs;|mm8gb++|aKrJtx9R=#Vi=s69%I$3gH4DJ(vBFLcl7y^(vnPL2npvJ^j?o{T3??tCz0EKI&uu8tndn zkP*E{3i=Q?WeHe^H6*-O16$ApV$=)$Nqz3J%o|%deE091F8ElmB!tV*#0J2#d^I^`4ktA5yK?Q)z|RG`a?V z6vH1jHr#*xxAsihWpi)FEq@|s`QcppDIGpfxROKBu0<7Fy{apE5|3#IrOxK5OZfiT zjAMJ0KGV~$kv@fkjt4!>L}(9#^U%fwjj7Soc36XR)nDkQ3%8O)y;4K2VSi!6N4Mh@ zw62zp(^}TOjuhC^j`!miC0|X$=v@bbB+t5$f4<4>B;>4L-dJnDu>0!J6a6@}jJN&h z5e^#-V!s9Wub&ovQDiBRQH|Uc+sDm4EBsD^hoLp{bH0m|`La@aQ;Ug8XOExRXK|8f z^?z9pD!y^tS<2~MSIn4a7XMfypgzG#m*nQ%dM@^@iK_bUx$*elFco$VW}e6F=)=J* z3o<(tO11GJCk*0owwI(!QK`Ukf9T;Pd{7*GdM=q|Klu8W#Ibn*K754KV1q`FWw!Tu zep>9~)rzk~X|!cCM0wh46KQ1GO>+TU8SrsBIj*FPcmY7D$cXZ;q6s*Vh)z%o(t;vn zx!K|qj$8j0+q9$yyXv#dz}`dy+B*;=H54B~0IEX%s9R#o6}K@lXi@`Zn-ymH++KpSwT zEpq>t59b$ORT?+07%Qzh8*}&0C2m>=7z55P?UqIjx=Nd z5_RT#G>kXWDMf$`cv#^@V6=CmHr$UfeA!pUv;qQtHbiC6i2y8QN z_e#fn4t6ytGgXu;d7vVGdnkco*$$)h)0U9bYF(y!vQMeBp4HNebA$vCuS3f%VZdk< zA0N@-iIRCci*VNggbxTXO(${yjlZp>R|r93&dmU$WQz=7>t!z_gTUtPbjoj2-X{Rs zrTA$5Jtrt~@cao#5|vM$p+l3M_HC0Ykiw9@7935K_wf*-^|GKh$%+opV7&;?rh9&P zh@9}XUqp-`JNnPs3e9~OrZBIJ1eel)hsimyfZSIAKa-_e!~q3^y@G=z;FN<65|y#S zIBWtzFv3n-*Aa|5F3Z9=zMs!RG6&8j!J;3)knD|vHy=yM(L#G}?m=jXNQ08rzG{Q? z03L8v^?3q`cxQdd42Z9RVo{e%Ga$C`=^7nqlxSf^lZhCTfwJB*!vD&M6QLv2g3NcE zlLNNSl;_UR5*{d}Kf!uIIF!i1cJDS7fMI##KSPmi=TR$DWZKb=cLBWJrF7#XGuhG7 zjcL@fyIHYDII3IRrCBTavFc^BM=uYdvN&GWBrcfogytsZ#mNX@9K+}pNp_= zk9AV-B>m?U~{NIbky_m^|J@%P=#HgBe^ zDfz`6g|`gOJpKE@q~4TH!vrHVNVb%n^e@&ALm85qj|xaBT5I90Ycp`;(u*rwGoyp? zo42?p->1XHi@SD&m=D5+6}|bUFWFw^Ue~(Ns1WQdWg=ux{zyH+AM91|XPZ%d*fiP0agmU%;tlV*!A{7y5(|3pSIw`dLqLknHv_PQBq$*|@+K4(r z(nO>@f;?%pkIO4xr70*Nk#eL*y7x+_=)8hsToX389#3w1KYRW> z*jT10YzQG%=Q$~Vd?jE*NFJ3Q_1xC`bl#coS5x4+(w)Pk{J+G z!)n>NlV4dtbN2@K)QdPtA{jC87jPU@hGv_JS3`DM&#QrL5o|v9pZ!u|C7l8Y!06X} zo>&23nPdehmmoN^p|A!0tiUTr`CHa7lrfP~sQnxYB!UG1e(yGzf9ed??k|R+753Jl z7|p%-Z;}uZWB`691Y{;z%fht0EQ5I=Q=xM!$55sB}?14LLaJP!Sh9=o6Ct`HH&OJAVuCgBpm0G_>L zLgPblVMON9`^+|EfPcuK*NO!3l?TlBFPGtQ7{6XmmBfL}Lk{{Mr*gyq842232l)y! z&EGfE9#VdjQO(a$U8DtYD6#;quA5M_q9pjqqG3-3XgR=iH5haYfFOE#7*m*WlW+;p z?*(QB<`&=?VN8b*zDdAXk|0u&ChUKnuK~u}^00YLP@tffpKM40h@>0qAv>J$ zJrJO6LoW6nQ;Lt_8TqG$3|&uIySi8pIQWB_=t1;Ew5BRl7J?W_#P#Q!jsiS1)t)R& zBm=TT1+G!Pc}xbIpGmNXV5B}zM2aE|pbfY#^zg<53DRF@)}T12BMzF0(fIJ0A+3Z) zF(FCSsFO`ljPqMasO-{OJsw6GD$89qiidf9!om$onI10;i?xPp_7Zxa02^=nHJfV2 zo}1Yu%99UK)~|dQR05$flJ_LP@??KD=@6^q3rd&zl=sq`D155z=wL0%C|=Gl`rS`{ zw-3XN{PCKN>`Mx4Uux^yLNOaIrkrs#Bqr1f%w1cG$Fdo;T7H<^$r|;|#mdi$cevZ* zdUc9(`eHt8@K+4=->Qr*HrT(({2Uj)Bl+GPr7ru{us3&!JKUzXmE_(`3UuU4d?;JL zc1X3KSL^U^==r@m)sd2}-$!fwYMO+)%E6|CLIK_ z##nHbe&&rMSDpx}2%+?FJ^shJ8yjE97(vftaucYh>*)KEqRD9|NrLKH=hV$e9A!~^ z4bADay5RL!GXeJ2_zHiwLYIYD#U!gVUX?0lWn6r52N(6LN{Xi9iK=_HO>X!U%Sq@l zh^!p)kHb1d(Ot9To5AfPe}~eD)OZ0MoXW((BIk$hb?gir611I2@D$KJ^VOg zT4fSfiCU#LYYL*CDCFNS4@bFDJa-HD&yA+x-IPQdMe7%+($&f?mC=n) z%&EO|+G#XLeHlo%(5I?7ol`ugo-_s0FL0#nkfTIT>6E9z50T3{?rk#sL>rRnNM~|9 zbq!>`l)R){K{#)v-}J)R27GTgA_f4XfzXn2${0y<*>7Svs39Rgf5ulzf}LmgT3Eqn z8G!%JRL1Gwj7k#Zh=Le=U`Dd4zH#;|o}L#6L-c(Lz=^Dm0-V6?8-?W5q)|w-V8|R@XK0f;$q`9@OmGmQp4JO_0Zgzau^3zjqT)q;CKx|;eNzuf>j1twm zQVhYEF@QgguW{CYFS%U=FfSW|H*CE2A+vuEH66-Q#2iU|Hp8DbO&^njfDi(!U@PIK z7gKGe-eQ+t4rUUtOnfvN87~ND%ab5b!x8Kexv=DeQHV%lmmMLXSRR33V1Aty75xeT&9+VL0)Pz zHpe~F;-a3{`62`|2n#wq#ktiRT;Lh?1diJGf-G(W%QRhQ=!Jr8$ZYk3OReu(4&Gvg zpl?-6>j!|kPL7>&DkSoxD|)&8W{jZ2fm<;ybWp=h-n|lrVTDs2KpsZq8Q@_M%r>_G z6KCrGAXxq8UNzXk`cExGjmaZsNdrw!&Z+iI)D|i}mo;laGQ-M%`}Lv&JJzx${Fd2` zs~^QJGpsDcGk=sm8SeA2z~=GbR9j%8fE@kpnk59Gk8>W2JHBvC&t8y~%f9?sa~*MT zzP9Q8+4`#QlH>2jX$MYd!H45&7r$Jq^`E!@tm|Bu+=?c(yux?!x_X7iET(66!RFDJ zzB?@ffQNcw6D-yOq*Rav4dB9dVs+0RBr5E*p3whI*rE4%-H25JcTOP^)Sh)#sZzJ+ z$IbOD+T^K=`N6CDCpfKHwv%aj}rTaikoks1a4O*+M}j{W)R#K&nzKm zPg7psVmbDEy1VO-r#xCjVwX&}+zKNECBJ!QguJUSSN_kOkv4T&}pz(^z6}X zGCV=1#|a(xlOI`HtWV8dgfuF4s$*LghD`Amxfcq5mblTfRr+m0tzen&#b|xUxLu~H zK~RBt!`&v4%R?`#kjuBJ$opo+D?{Uaa{a2hC;Ka(&ON7#V0K>#_J%#LVtBRt)u}`s z=j4Xe0jY2@p+RHv*#26?%g93kteo0Q@0;`x2ZCw zUn4`&W-e{5P}Q($ccv`W$#ILg_$6+&?B*0cJk#%;d`QzBB`qy)(UxZZ&Ov}Yokd3N zj~ERapEhGwAMEX1`=zw)*qz1io2i_F)DBjWB|*PHvd4MRPX+%d*|}3CF{@tXNmMe6 zAljfg2r$`|z9qsViLaWuOHk$mb2UHh%?~=#HPf2CPQh;AUrYWW~ zvTV9=)lS#UB-`B5)Kb!Ylg0RA){o3e`19Jl&hb@~zS>>vrFR-^youk^@6>0S` zToim7wzkY|Yt*;aGUy!o{yxd8=*L;orYQC!H#=|pjn&hO>o9B$tJu8TBHmxPPsm-) zM#T(;Z9_uvy1xq;yeeWQV6|}+=O;1%) zGZyIq}2>crU3z2ri)(ut%F~+%S>FR4^Xw()Y-+~&Xp*Ns z$?%1aydpzNIz2aN98}oth>3boYSifQ)J81Of>6k)!`WQWrB;xxXccBzrWe5V*>oMh zon)MEw$@-*!>L`CK}u@x^9-4gfvepI0b8q5QYVXr96{4Q#s2ZelHXxHv~G{GymRer zqyj7m)3yn3z5i4koiIJ!-u=p6QeL|BN+pWd>}TOFOVi01q839$NZ&I_quqb(n~9Wk id-{KKnnu*>l46e`&P3zgUlQEeAE2(Hqg<+p4E|raIYd(c literal 0 HcmV?d00001 diff --git a/androiddemo/src/main/res/layout/activity_main.xml b/androiddemo/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..40d2031 --- /dev/null +++ b/androiddemo/src/main/res/layout/activity_main.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + diff --git a/androiddemo/src/main/res/values-v21/styles.xml b/androiddemo/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..0aed032 --- /dev/null +++ b/androiddemo/src/main/res/values-v21/styles.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/androiddemo/src/main/res/values/colors.xml b/androiddemo/src/main/res/values/colors.xml new file mode 100644 index 0000000..294809a --- /dev/null +++ b/androiddemo/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #009688 + #00796B + #FF9800 + \ No newline at end of file diff --git a/androiddemo/src/main/res/values/strings.xml b/androiddemo/src/main/res/values/strings.xml new file mode 100644 index 0000000..21acbbd --- /dev/null +++ b/androiddemo/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Android Demo + diff --git a/androiddemo/src/main/res/values/styles.xml b/androiddemo/src/main/res/values/styles.xml new file mode 100644 index 0000000..6799c28 --- /dev/null +++ b/androiddemo/src/main/res/values/styles.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/androiddemo/src/stage/AndroidManifest.xml b/androiddemo/src/stage/AndroidManifest.xml new file mode 100644 index 0000000..ee78d9f --- /dev/null +++ b/androiddemo/src/stage/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/androiddemo/src/stage/res/values/strings.xml b/androiddemo/src/stage/res/values/strings.xml new file mode 100644 index 0000000..ace0c41 --- /dev/null +++ b/androiddemo/src/stage/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/androidxdemo/.gitignore b/androidxdemo/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/androidxdemo/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/androidxdemo/app_update_description.txt b/androidxdemo/app_update_description.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/androidxdemo/app_update_description.txt @@ -0,0 +1 @@ + diff --git a/androidxdemo/build.gradle b/androidxdemo/build.gradle new file mode 100644 index 0000000..a3c520e --- /dev/null +++ b/androidxdemo/build.gradle @@ -0,0 +1,73 @@ +apply plugin: 'com.android.application' +apply from: '../.winboll/winboll_app_build.gradle' +apply from: '../.winboll/winboll_lint_build.gradle' + +def genVersionName(def versionName){ + // 检查编译标志位配置 + assert (winbollBuildProps['stageCount'] != null) + assert (winbollBuildProps['baseVersion'] != null) + // 保存基础版本号 + winbollBuildProps.setProperty("baseVersion", "${versionName}"); + //保存编译标志配置 + FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) + winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); + fos.close(); + + // 返回编译版本号 + return "${versionName}." + winbollBuildProps['stageCount'] +} + +android { + compileSdkVersion 32 + buildToolsVersion "32.0.0" + + defaultConfig { + applicationId "cc.winboll.studio.androidxdemo" + minSdkVersion 24 + targetSdkVersion 30 + versionCode 1 + // versionName 更新后需要手动设置 + // .winboll/winbollBuildProps.properties 文件的 stageCount=0 + // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" + versionName "15.1" + if(true) { + versionName = genVersionName("${versionName}") + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + api fileTree(dir: 'libs', include: ['*.jar']) + + // SSH + api 'com.jcraft:jsch:0.1.55' + // Html 解析 + api 'org.jsoup:jsoup:1.13.1' + // 二维码类库 + api 'com.google.zxing:core:3.4.1' + api 'com.journeyapps:zxing-android-embedded:3.6.0' + // 应用介绍页类库 + api 'io.github.medyo:android-about-page:2.0.0' + // 吐司类库 + api 'com.github.getActivity:ToastUtils:10.5' + // 网络连接类库 + api 'com.squareup.okhttp3:okhttp:4.4.1' + // AndroidX 类库 + api 'androidx.appcompat:appcompat:1.1.0' + api 'com.google.android.material:material:1.4.0' + //api 'androidx.viewpager:viewpager:1.0.0' + //api 'androidx.vectordrawable:vectordrawable:1.1.0' + //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' + //api 'androidx.fragment:fragment:1.1.0' + + api 'cc.winboll.studio:libaes:15.9.3' + api 'cc.winboll.studio:libapputils:15.8.5' + api 'cc.winboll.studio:libappbase:15.9.5' +} diff --git a/androidxdemo/build.properties b/androidxdemo/build.properties new file mode 100644 index 0000000..ac0d006 --- /dev/null +++ b/androidxdemo/build.properties @@ -0,0 +1,8 @@ +#Created by .winboll/winboll_app_build.gradle +#Sun Aug 31 05:42:50 CST 2025 +stageCount=2 +libraryProject= +baseVersion=15.1 +publishVersion=15.1.1 +buildCount=0 +baseBetaVersion=15.1.2 diff --git a/androidxdemo/proguard-rules.pro b/androidxdemo/proguard-rules.pro new file mode 100644 index 0000000..64b4a05 --- /dev/null +++ b/androidxdemo/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/androidxdemo/src/beta/AndroidManifest.xml b/androidxdemo/src/beta/AndroidManifest.xml new file mode 100644 index 0000000..ee78d9f --- /dev/null +++ b/androidxdemo/src/beta/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/androidxdemo/src/beta/res/values/strings.xml b/androidxdemo/src/beta/res/values/strings.xml new file mode 100644 index 0000000..bf50bcf --- /dev/null +++ b/androidxdemo/src/beta/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + AndroidX Demo + + + diff --git a/androidxdemo/src/main/AndroidManifest.xml b/androidxdemo/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1b70e90 --- /dev/null +++ b/androidxdemo/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/App.java b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/App.java new file mode 100644 index 0000000..825cb09 --- /dev/null +++ b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/App.java @@ -0,0 +1,345 @@ +package cc.winboll.studio.androidxdemo; + +import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.res.Resources; +import android.graphics.Typeface; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.ViewGroup; +import android.widget.HorizontalScrollView; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toast; +import cc.winboll.studio.libappbase.GlobalApplication; +import com.hjq.toast.ToastUtils; +import com.hjq.toast.style.WhiteToastStyle; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.Thread.UncaughtExceptionHandler; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +public class App extends GlobalApplication { + + private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper()); + + @Override + public void onCreate() { + super.onCreate(); + + // 初始化 Toast 框架 + ToastUtils.init(this); + // 设置 Toast 布局样式 + //ToastUtils.setView(R.layout.view_toast); + ToastUtils.setStyle(new WhiteToastStyle()); + ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); + + //CrashHandler.getInstance().registerGlobal(this); + //CrashHandler.getInstance().registerPart(this); + } + + public static void write(InputStream input, OutputStream output) throws IOException { + byte[] buf = new byte[1024 * 8]; + int len; + while ((len = input.read(buf)) != -1) { + output.write(buf, 0, len); + } + } + + public static void write(File file, byte[] data) throws IOException { + File parent = file.getParentFile(); + if (parent != null && !parent.exists()) parent.mkdirs(); + + ByteArrayInputStream input = new ByteArrayInputStream(data); + FileOutputStream output = new FileOutputStream(file); + try { + write(input, output); + } finally { + closeIO(input, output); + } + } + + public static String toString(InputStream input) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + write(input, output); + try { + return output.toString("UTF-8"); + } finally { + closeIO(input, output); + } + } + + public static void closeIO(Closeable... closeables) { + for (Closeable closeable : closeables) { + try { + if (closeable != null) closeable.close(); + } catch (IOException ignored) {} + } + } + + public static class CrashHandler { + + public static final UncaughtExceptionHandler DEFAULT_UNCAUGHT_EXCEPTION_HANDLER = Thread.getDefaultUncaughtExceptionHandler(); + + private static CrashHandler sInstance; + + private PartCrashHandler mPartCrashHandler; + + public static CrashHandler getInstance() { + if (sInstance == null) { + sInstance = new CrashHandler(); + } + return sInstance; + } + + public void registerGlobal(Context context) { + registerGlobal(context, null); + } + + public void registerGlobal(Context context, String crashDir) { + Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandlerImpl(context.getApplicationContext(), crashDir)); + } + + public void unregister() { + Thread.setDefaultUncaughtExceptionHandler(DEFAULT_UNCAUGHT_EXCEPTION_HANDLER); + } + + public void registerPart(Context context) { + unregisterPart(context); + mPartCrashHandler = new PartCrashHandler(context.getApplicationContext()); + MAIN_HANDLER.postAtFrontOfQueue(mPartCrashHandler); + } + + public void unregisterPart(Context context) { + if (mPartCrashHandler != null) { + mPartCrashHandler.isRunning.set(false); + mPartCrashHandler = null; + } + } + + private static class PartCrashHandler implements Runnable { + + private final Context mContext; + + public AtomicBoolean isRunning = new AtomicBoolean(true); + + public PartCrashHandler(Context context) { + this.mContext = context; + } + + @Override + public void run() { + while (isRunning.get()) { + try { + Looper.loop(); + } catch (final Throwable e) { + e.printStackTrace(); + if (isRunning.get()) { + MAIN_HANDLER.post(new Runnable(){ + + @Override + public void run() { + Toast.makeText(mContext, e.toString(), Toast.LENGTH_LONG).show(); + } + }); + } else { + if (e instanceof RuntimeException) { + throw (RuntimeException)e; + } else { + throw new RuntimeException(e); + } + } + } + } + } + } + + private static class UncaughtExceptionHandlerImpl implements UncaughtExceptionHandler { + + private static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy_MM_dd-HH_mm_ss"); + + private final Context mContext; + + private final File mCrashDir; + + public UncaughtExceptionHandlerImpl(Context context, String crashDir) { + this.mContext = context; + this.mCrashDir = TextUtils.isEmpty(crashDir) ? new File(mContext.getExternalCacheDir(), "crash") : new File(crashDir); + } + + @Override + public void uncaughtException(Thread thread, Throwable throwable) { + try { + + String log = buildLog(throwable); + writeLog(log); + + try { + Intent intent = new Intent(mContext, CrashActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(Intent.EXTRA_TEXT, log); + mContext.startActivity(intent); + } catch (Throwable e) { + e.printStackTrace(); + writeLog(e.toString()); + } + + throwable.printStackTrace(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + + } catch (Throwable e) { + if (DEFAULT_UNCAUGHT_EXCEPTION_HANDLER != null) DEFAULT_UNCAUGHT_EXCEPTION_HANDLER.uncaughtException(thread, throwable); + } + } + + private String buildLog(Throwable throwable) { + String time = DATE_FORMAT.format(new Date()); + + String versionName = "unknown"; + long versionCode = 0; + try { + PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); + versionName = packageInfo.versionName; + versionCode = Build.VERSION.SDK_INT >= 28 ? packageInfo.getLongVersionCode() : packageInfo.versionCode; + } catch (Throwable ignored) {} + + LinkedHashMap head = new LinkedHashMap(); + head.put("Time Of Crash", time); + head.put("Device", String.format("%s, %s", Build.MANUFACTURER, Build.MODEL)); + head.put("Android Version", String.format("%s (%d)", Build.VERSION.RELEASE, Build.VERSION.SDK_INT)); + head.put("App Version", String.format("%s (%d)", versionName, versionCode)); + head.put("Kernel", getKernel()); + head.put("Support Abis", Build.VERSION.SDK_INT >= 21 && Build.SUPPORTED_ABIS != null ? Arrays.toString(Build.SUPPORTED_ABIS): "unknown"); + head.put("Fingerprint", Build.FINGERPRINT); + + StringBuilder builder = new StringBuilder(); + + for (String key : head.keySet()) { + if (builder.length() != 0) builder.append("\n"); + builder.append(key); + builder.append(" : "); + builder.append(head.get(key)); + } + + builder.append("\n\n"); + builder.append(Log.getStackTraceString(throwable)); + + return builder.toString(); + } + + private void writeLog(String log) { + String time = DATE_FORMAT.format(new Date()); + File file = new File(mCrashDir, "crash_" + time + ".txt"); + try { + write(file, log.getBytes("UTF-8")); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private static String getKernel() { + try { + return App.toString(new FileInputStream("/proc/version")).trim(); + } catch (Throwable e) { + return e.getMessage(); + } + } + } + } + + public static final class CrashActivity extends Activity { + + private String mLog; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setTheme(android.R.style.Theme_DeviceDefault); + setTitle("App Crash"); + + mLog = getIntent().getStringExtra(Intent.EXTRA_TEXT); + + ScrollView contentView = new ScrollView(this); + contentView.setFillViewport(true); + + HorizontalScrollView horizontalScrollView = new HorizontalScrollView(this); + + TextView textView = new TextView(this); + int padding = dp2px(16); + textView.setPadding(padding, padding, padding, padding); + textView.setText(mLog); + textView.setTextIsSelectable(true); + textView.setTypeface(Typeface.DEFAULT); + textView.setLinksClickable(true); + + horizontalScrollView.addView(textView); + contentView.addView(horizontalScrollView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + + setContentView(contentView); + } + + private void restart() { + Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); + if (intent != null) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + finish(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + } + + private static int dp2px(float dpValue) { + final float scale = Resources.getSystem().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + menu.add(0, android.R.id.copy, 0, android.R.string.copy) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.copy: + ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog)); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onBackPressed() { + restart(); + } + } +} diff --git a/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java new file mode 100644 index 0000000..6755e6f --- /dev/null +++ b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java @@ -0,0 +1,31 @@ +package cc.winboll.studio.androidxdemo; + +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import cc.winboll.studio.libappbase.LogView; +import com.hjq.toast.ToastUtils; + +public class MainActivity extends AppCompatActivity { + + LogView mLogView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + mLogView = findViewById(R.id.logview); + + ToastUtils.show("onCreate"); + } + + @Override + protected void onResume() { + super.onResume(); + mLogView.start(); + } +} diff --git a/androidxdemo/src/main/res/drawable-v24/ic_launcher_foreground.xml b/androidxdemo/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/androidxdemo/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/androidxdemo/src/main/res/drawable/ic_launcher_background.xml b/androidxdemo/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/androidxdemo/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/androidxdemo/src/main/res/layout/activity_main.xml b/androidxdemo/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..12fdc32 --- /dev/null +++ b/androidxdemo/src/main/res/layout/activity_main.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/androidxdemo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/androidxdemo/src/main/res/mipmap-hdpi/ic_launcher.png b/androidxdemo/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f5908281d070150700378b64a84c7db1f97aa1 GIT binary patch literal 3056 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 axPAxe%7rDusX+w*00006jj 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⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* literal 0 HcmV?d00001 diff --git a/androidxdemo/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/androidxdemo/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..459ca609d3ae0d3943ab44cdc27feef9256dc6d7 GIT binary patch literal 7098 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 literal 0 HcmV?d00001 diff --git a/androidxdemo/src/main/res/mipmap-xxhdpi/ic_launcher.png b/androidxdemo/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca12fe024be86e868d14e91120a6902f8e88ac6 GIT binary patch literal 6464 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 B0*L?s literal 0 HcmV?d00001 diff --git a/androidxdemo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/androidxdemo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8e19b410a1b15ff180f3dacac19395fe3046cdec GIT binary patch literal 10676 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 literal 0 HcmV?d00001 diff --git a/androidxdemo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/androidxdemo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4c19a13c239cb67b8a2134ddd5f325db1d2d5bee GIT binary patch literal 15523 zcmZu&byQSev_3Py&@gnDfPjP`DLFJqiULXtibx~fLnvK>bPOP+(%nO&(%r2fA>H-( zz4z~1>*iYL?tRWZ_k8=?-?=ADTT_`3j}{LAK&YyspmTRd|F`47?v6Thw%7njTB|C^ zKKGc}$-p)u@1g1$=G5ziQhGf`pecnFHQK@{)H)R`NQF;K%92o17K-93yUfN21$b29 zQwz1oFs@r6GO|&!sP_4*_5J}y@1EmX38MLHp9O5Oe0Nc6{^^wzO4l(d z;mtZ_YZu`gPyE@_DZic*_^gGkxh<(}XliiFNpj1&`$dYO3scX$PHr^OPt}D-`w9aR z4}a$o1nmaz>bV)|i2j5($CXJ<=V0%{^_5JXJ2~-Q=5u(R41}kRaj^33P50Hg*ot1f z?w;RDqu}t{QQ%88FhO3t>0-Sy@ck7!K1c53XC+HJeY@B0BH+W}BTA1!ueRG49Clr? z+R!2Jlc`n)zZ?XWaZO0BnqvRN#k{$*;dYA4UO&o_-b>h3>@8fgSjOUsv0wVwlxy0h z{E1|}P_3K!kMbGZt_qQIF~jd+Km4P8D0dwO{+jQ1;}@_Weti;`V}a_?BkaNJA?PXD zNGH$uRwng<4o9{nk4gW z3E-`-*MB=(J%0*&SA1UclA>pLfP4H?eSsQV$G$t!uXTEio7TY9E35&?0M-ERfX4he z{_Hb&AE`T%j8hIZEp@yBVycpvW2!bHrfxbuu6>_i<^9@?ak)9gHU*#bS~}$sGY*Fi z=%P&i3aH%N`b;I~s8{&6uGo$>-`ukQ<8ri(6aH6p_F`Fhdi6HuacwfQn10HVL7Om1 z4aZpjatkbgjp$L5Mceab#G#C)Hr{^W|TJX~?B3@2buj0;kfuNTf4c3*Au~O^aj=W2$j^4okeCxh#lwexN@eam-u4dNz zN2NIuIM4566{T&^k%4ftShcPk#=im-zXm>QWqH^0>A@?MqlDZCZ@8Wi*@tvhn5p<} zRwFm@gz|WZp91S5Z{}tB^e9|FBg(~Ik+?&_53J6ye_QQOSJ*846~H%s#LD}|O9v9H z1fLrrgoPo_&bs}eqEr}2en3iqAcP^>YsKiez$5-6m6(#3ZZ$@M5Ck=_Vv`QA>1A*v z3w-nJ_;5Nc(0_%`kG91#sotIlhO!*5#|yg+Gx{V;0ty`*=Y9=jCh$l*=fE(~t}%R# zc}iNpO)OZX`P=leQY^?^DF1w%FJh>Dkp}-o5Ig|2!6^E>|W|zc~W7gF;MtxX7 zV~UjQNsUC$EYXpN?~o{83D2c*0~7;Tm~%FRTAnnt3ln{?DcLZ=NsBY|JxwUA-6K3V zP&#|9t#a}Q4{Sg{6v-OmjJBkCh>m)8vLNm4lStMUT$)FZeJG05A)px&o3H)5oAl9= z31@?HyCriHcCDnt628BFN+T;U69Wl#itfvqIDBydMvOJO0Zl?go$cfG5>TK75CMj3 zakLaH3=&J0e}Xmqlav$S0>E@_Yo_V~3SiiXrw)$&!XhrHCDQ%P1BHPusuKr0LthAB zg)mDrLy>2*yevMMOQe6fZ|)%PEb!lC^*9yaX9UMy7-v!fSICssTR|wML0Ic2BhKAq z3I1X~ z7^_!M&;6Z9?br3#HU_&kfJ~%botXQkC1v<}ZZxN5q-T)|Sb2cW3WYUBbDZ`TH{!*^ zrmAeRM+(QI>D+?}guZ+dH*X)@^!O|oL69&Avbtw2^M3HP(+2kV{O$^3BN1RLfrC8nwz7=VhBR%>!;7WR<~;34B_j3A{>^@e@H+Q! zL=UNr1(JvKAQLKT0b}EMn|QUWtY>!>8-t@fVj_&`~gGd{_aPy5W>0u5L$zrsU^rBO=i$`#Xd*>kh)lPf}A znNXSEl`+HlhXtylgS9(#N02A=zVV?#OF?)Gr>(HszVa+1*2VG@qYttJuXaBlzP`Pb zX)ueu?s&}R>xI#^*r4gR?tMFi!_eeKlIM5g)Nk)Y^h=ZCR**xY>$E5knctRrq!zw? zX{2|hwR9LXTY1)pTlKg7U4_ej{dcj2{!+1sZ6<@9^?mn)=37V)DIAvS(}S`IgFO!6 zn({?nYw`Z-@jvt@!q|5z?TI3(dx^1szSn%azAwp>N#fk^kt|=MejKtacAs@Rdku#zT>9$s z=m7ek)`=O7hO2n+2Uj$QUs&2EIqycF{(L9Y#^IyxXA%R@ z&j`VAprIV~d!pH-7~zA+bjwVn3kOB3;rlg{nr&wHV12N}g^i>Upls~=z`VX>9HQ#= zTu&luVb@_Lkz63&&^_M!6(-2^0?GCAX9XKp{O={pd|AlIMGriX6s_Jy8_q9|{5jLc zxd1aj_ucE7Vcti#$r!s~w~W=XpaLQ}#mX`apR7^n9-d3?O+adJYr*L;{c)x@REewM@vZN0njS3iE$88KHPWAkWt((OUMherUnPm?i&8@!9E@ zUW^$%CpdruZR0ohzUq-XQ$KEIB8Sjgs1+wKSUH&Y;=ee%E&O$X18{&979d~K2uJW` zd*8awHCXb;Q>4z$B|sPNv+Zd__f6&@KmS+L`z3H1x+x|Xs7-N-iw|1C=QiJdU)f~z z{vO4hpP`0MyqmwIHN=l?jSq>OKG6CEC#O`*blP`?>)CUWj5j1cB>%6N7;`kfZ1iQV zam~SDB?{uyp^=vF_u|=8xn3S)L;wF8ZRZV{bezM-EH;MC91JQZ{KcZZ$IWJUy?SJGeGUWm6PeuO8-K2|hD~p;Ls~9Y-4lE+?|bF)XaNKUNX(K7 zBQk0Z{n>hrH-CA`bTr$6z0n@Cn9EL$XZ3=X7NopjcI=;z<(X7-oEmK}BId=PxX*!b7Q6oL@ufd%eEPc`_la(}WkT zKe?-YJWn^6b$^{dhdJZ)I!Kn6c}iw%o5mLDyvM7qJZbkGG?zLU;M|W;Wis|A;SuY3{_X53`+>9g^B%O4b{;^t$^;{oKHbo*CY%u91 zp#2d8Pg=I0&UX{qwr=y=o_^BLdk=KYH$=Z8+k|p8V5`ph~3b^{^NnL4m_+4zx( zeoTt@f<$DmsB1}o%R1Hx`ToPuBl+P6cb-?uF{1!z-2WvdR4+vJ*SYTic5@gwnzu%e zD!HF^X=$ha^#1hi*@~^nDL!HQ;MC&e+6=onaJgm-J-+|>PpmU=SIe?EQE5vJiqziw z*K=Z%bWZz_we!qiFqE`I?#$yozNxIE7Ei;csv>++r*?)0bozFpF&oLh94u z-2c2L`5BarP7l>87|f)vxaT*9(!Q`2xBMZ&^JVj-|1)Tg!6OW=lk=w zLwVlr!*<(l*L$a?ox3+%!~UIj3Ej@KD;W>1E_c)1szDi93BC;0K?drOQ>@$yi|DtT zSir}!Yx>znf&b0KS;Lk7VKPDF@e>(qQr0%SNcGQd(p9StjqJ`QSW&c{ggF?5{d22w zlkX%JTUq`;(3WSH+)WHl%qlF)iNG_?}K?ZM3cS7#u5v zZ!apx4Apv=PWsn}eD%MI#=KA)OlNy0)l@~D^1;NC5k@|OPW3wt>WNYDN+8~+gM%E! z$ z`Olr0;eytiK&~O*ps%KV?2vq+DhuRh*!6Ilzu>A;iMe9 zI?zug9nT9CI_o)O}KF_I_U z_Cswu{)3pCYgw{eOt#E?UCqBwkAugSl>5 zX?G=Ci(Lo+r3suuJezyQyDvw*<1b{rx*&ZaY2HlJ>k{Qc%IZeU43pQXw4mh!4I5>l zZ@4$uxaPY#!*IhL4Hctn#!n#S+SiPcZP_PTd5fXf1exhFi5zf3kl`UcW2RUk)F2oF z_ogN`{03PiseQR;fa#{Uy;jeNlJ0Sle`~;ZYhLjkuy>a^!Z_nR~`$&F?NVuIE3HX;i zD82snwlwPb`7yE)ZA_Ndmq5zuSO1{{1}(d9u4#!Fl_|eOuxKBwOfQ*tG`VjCV$-WF zxi0c&+w}Z)rqz{%f46@`ADPdGm#x)+zpT+gyfDi;_P zR{#Ta`Mzd=putKO@5lQJO*aNy(i?}Ltwy^Z;69f|eqi#UCI1$vL!+(#mi?dK`OL$! z3jQnx$_$+Li2<__CL@Wuk4^J7-!n3j2I4N8e#=qpir+iEQcrn3`B4yNOd1BBLEni<(tdRWE>m0I^ zt(^*Td+S3}$5rOzXy=MW>%#MN_qy%5St!>HrGZ~Fq1WKw-&kv@2TrCcPCPzY%2aO- zN?7@+$4?&qA|uv{QHuV)O9haZpG7Jx2f%D)7J@oWTxJ#E_YSq_6qT1tomOD?02(1otT{Hk8{?g(944>h4f% zOJ8tzjecV{x2uWde&6oAP)*({ zFkW0Q%gdI*9@W)oKO65DgP<3F_BIKvRXLAR?Z61&0g2TR6mEZ7OZK?dP7zukdg?s_tNZeuOsh^e1Tmdlz5rIg?LcK|%aQ1FsSDv#W0EnHd z9M)p;gAL_R~Z5cojTdwy+qDsd6R01Vtxmq&FhfPz{wxmB$${zW~z@{Ro_ zK#y5^KqIp!#@or>GD`c+aZ(PV1=`Eo1?a55p6a*WepFgxvmp!^2518YEU-;{F}fLr zD~)=S0m=+px3TUN8-El}Xb}{2ET*_i3-|WlY@V7vr6#&cOr*+oS9?GF?@)K6op>>o z4af0@%KwaLr`{3P&)474<3rDMsd!IM-bepWfhfuMmJt}#0%PgDSx*q(s0m%ZFgWTj zwwvH%2!(i9{RHX~FVUB5qHvF{+ZF}+(bZVPG1)a*Ph>KV;cYNK^aB@R#dS~&`^60V zn2Z24Y{{djzK33}t@q%!v5k)u7jAXB_H{#4Ut2 z1}0j5$RXcTyfazqL9=^Qe%GL`G)=!lirv7AgVRf^=XyEM&kiOe_%JD!O?sXK&hrDo zF}m9B68im!oGshuZluy2H#T$`XPZQu@zf;(nBCZB-cjQ&w*p@Tm_$pe^MTN3EauI) zJG&G^H-4S|1OCd#@A6jO+IcAXG#5M-d9E!^YNmV7Z(=F^?8bfrYf&mLMnRd_22&Q} z2*msbLsrI!XPeOK@|V?n>`kNC`8eSFmekELLr|!-wQRltxZnuRedup<7VflowJ+gC z)F}P6lUSsh^B41?=~0*68YA6z63lKG`W$@{GV!cC2FCl0s<7yz6!3JWoBbUDTgpg% z4VNUk%xblMy7PjLF2We*3XY7K*N(*9Yx!_M zjU$&JXLiNxaTzoa&k@NSbzbLJTn$6bu6SPWYx)Zc1Li~Lqj($GuWsA#;zg85eH{yx zz3IIOea3A4QFGmJCfn7N_d$8a77j+T^W}Sr%0XdVLFf&zJ$s^D5Vrc!iV&GXyb5*A z6mG8d*6EDN7a;=dgVjYI--~4@Fe{{fcJ4B|;_Qg~&%6#?I(?X_$S4rDw{=>=8iZS=M^I#EF!m zXn%K_xXWwmm7R40LKXPo6ZzNZfN1-$S6RuVU=JlC|3#Xjo-%ebJvvC4n%IM)Q8NDh zGXd)L;ay_JMozc^mU*Uifnp=#+if>LD*O9MV#@wB1l``z|tlu(7PJqS6rm)0@ zJzP50{0Vpa`_?92oB;*i(?i225a6tZgT+9Dg?vTh)N4OKA~(c8{$8-ZKz=mb@$4IT9g8>;k11WIT+Y=%Z})`y#OJ zK-~rlEy!T%0h!Qo+jjPF2RQz2Z^B;dbvYg2JS`+@D~OWH{2-EEs^BdnuJskh>CKeT z1b;%8dU6QU%i@z?^6Q-{XESe^qRiw`ka+k!d-{c%&lXM}vCX^T=|?|;t6r?N*h-W4 z?o4Hy%BWqW+5=+md#5^8|49zjM zon_Do@rhzZ4XAb}-m|bMH$Vg<;^Bo6A8cfhUQ>|wFk~j(`>1NgD3sTg)He1pWrUj9WZ8R(Wn5Rr zhc&dXvv_m%HrwwHo9l_))NgdVUff%d&@4^$Pc=MDZdZ^xHL$KX^ z7W1{3UJ%>9v$W{Y3>vBvflE-soDj8{`>#F|8Z$EF%lN$NylORTn5JsI4mTMHWd*%- z2sD(RO(H-&i8&Ge)5i12slI5VekYCZ)s8rv&_)194;vKY2m8DIC2{4<&xTM3HHxwT zd(42n)gCJ$O4I|8sJq07#0U7Yk7PjPK&bMdy-5b)OdhSsBo^|IB_H43@&F@tpdJR0 z#~)=UJdP|=)O{0(rVZnjbTtwHV^}&kfLJQP@R6rda;K;O>9J9bnW$BgbzOZ8aO{D8 zPuJ%=Nqg~rdzk-IW0ZC5I%cc;ek5~=lDXl4?gMOQQ!KE5Aq$9qeGFM6jFP;Xy6)%N zjg{q(E6fnF02P3L*tutbHRR-gyYK3g^y9H?GMtIs;ojG zY~3*C>qD)(8jz}89w|xfb7L`^d>AG#%D-uq=qz}(o9kzzrx0LSBX90ykr*5oM+YmoTRWe+Cj6aq^xnWRymLmE>krCpoC9K%2LT0aK0Y< zt@kUUrrj1WL9rmBB8B;WXqg-BztOiUZX-!`*a&-75+!WZ!R0OPiZz?w`Of4q#+(;m z`${Ea6GnTCY3`V2R8w*}knf)*`RA@(8k{Lp4VP;<+ z9O_z0_{3=HcVi z5)&QGEB_&$)mu@)(Z8zuw#>Gc6C>^O-FUZEo;TO1@$>-xu%`v`tMS3V-8R1pb5w&zP%&rAP2*5h z$k{jqReFXCJhJ?-{x(2j5gH_zQ>;#Ec*@bUqF0u}XB09+U-K}+jQd>)k#AOkr6M8x zHyhrfJ`99@Vzr_B@*p@`DxeJ#`jimavZ9ZV%v{mO0!%9$TY(f%_}BU~3R%QxmSdD1 z2Bp45R0C=8qtx-~+oULrzCMHMof!&H<~~>BhOu9t%ti7ERzy&MfeFI`yIK^$C)AW3 zNQRoy0G}{Z0U#b~iYF^Jc^xOlG#4#C=;O>}m0(@{S^B2chkhuBA^ur)c`E;iGC9@z z7%fqif|WXh26-3;GTi8YpXUOSVWuR&C%jb}s5V4o;X~?V>XaR)8gBIQvmh3-xs)|E z8CExUnh>Ngjb^6YLgG<K?>j`V4Zp4G4%h8vUG^ouv)P!AnMkAWurg1zX2{E)hFp5ex ziBTDWLl+>ihx>1Um{+p<{v-zS?fx&Ioeu#9;aON_P4|J-J)gPF2-0?yt=+nHsn^1G z2bM#YbR1hHRbR9Or49U3T&x=1c0%dKX4HI!55MQv`3gt5ENVMAhhgEp@kG2k+qT|<5K~u`9G7x z?eB%b2B#mq)&K}m$lwDv|MU~=Y(D2jO{j*Box$GUn=$90z6O^7F?7pn=P;{r4C8qa zv1n*5N7uIvTn`8$>}(74>Oqk=E7){#pHUFd5XRJ5ObMhqODTa}=V0;+a(7JZR-4<3 zBTvsqRwLh?*ZF)JWsWOkEq7*XMQ!G3Rmkdh7ZbM#v1~?jt((e2y}u}Ky>1qa&Y7m@ zveIzH@?5Gexr79*?sbZGkVS;s1U<7D(%~7HjAmzj$aDYv_FGl5JX@LW8>w=HCDl6W z%?rsr0)bErYJ5G1v&zjr{8=lW)ZYcstgZAuL}!0~8HAcgOm@nJ9cvOOtL@)Fpl2Dr z8876Lt<|1eF88Jx#C*XyGI)C5z_o!Os!t=Xy0$Kj^4fG1pb@16%g z+<)zJ1n1QO78g#$3yHj+(Smv`HW5y_-PP{h2A1UXMG-c%hMvHLbF6t}G>KA)H# z`AWL~>8JUT(iq7;zJr!Aj)AS+n{mRbA3aM+Gj}b#PhHdTM_NkwQm330EC9waM$=slPfxR1vmr!vf~t_M?a%`@`&tdE}ipY-p#Q#zhLK zd9eFC;PjIEAKLkRkO94{rTuNFqKbNUGtaNZRRbax9;|%2WbnGu!44#64RriY5u0O} z05G^e&JB?Wb*8^g)aM`yt|}~QJkKCipFNeyex~P~SFPVEafD(73rncKmm)m~&`O*YUyY9z7tO%ec7z@wWcoOr-ebP z1k+|y?d{>1jLC=s4B2tEhiTtu->WVJno&%%6bG46KuU9D`GEN!C!9chM>zd=cl0+- z^k>4rpkq7_iWGHtBvy$Q`dja2;1ZdYmF6cANU6{v>l1=fSKRpsTRonp@alC%p{bhU z>g+(%-)&_nDQ~#bq5;xo^06RggA&uH4RMVb6wt;oQI+`m_zt>SiI5hXkfEnn6@ZNk zh9KUr1jtt6lBg$O#TAoTRvwUtWeMP3EjnGoRPQppiNF(sX%|Q4@kIjas|WZWXSENO zfF#2yOb;%XO*LeOoAwlf{u7_39$x(w3xT~)2BNJ2l5u4n3a0NkNLT4yT);7fA?1Vt zCz*`hbw-doYa09E!05zcfOT0EOORY``E@D z5{v%@F~&|UfNt@>vrj66W5f>jy+G_8&VB9D0*>N!7_Nr=-x6N?A)M8>1~q(X34sXp zpA%@w&c};L7u*G3;(Qe=LFL}NbTF$|aX#A%P(h`-N=ZRxCvlG$>Klv}jo0MS|UR8qKq-1FokBJmrbTJjQ!k#Is0tY+0c)m4Gp80YzYD zEGXd~ihaihk;?xUknXNH?rssjzaF+l6?HnDQjVP$i=q}{lp_WbOTKKg}HPKW)2sW`L#NvgmaY0^b2Ldk|t{P6{L{>ym;Xgao1PrudBgEMRFb^ zkPJ6v0h^tJ>K@;maHk_|6Z>yFzq@YvDOeO6Ob_?P4Ey>kHiJv`Wlh_MX4fBY36f%^ zV#2t;$Rg&}!Kwifm z;TVZXMxw3~$--{&A8-6vnUZ#s4`Z-zQ#+y7UI8#Hgsc|ompLUc zqlAG!Ti>t{JzYF^5pM925*PUWUvDuYDGKhC4FMx45c`L#V7%V+88@|khLj|V=J9Un zJEcP5qVCzR6p{FK!nIY~TXo)tJ!{>CG;~&u;EPlnNrwJ=5)ke@hJosN!siM$8b2mM zmc&weo-rY{n1+%c`c<{AT3i zjF{p253Ul-)s5A+!8Dp7?viXAdH1+qlY%mK5pp?{pS1t!3qmmDOq2TnoV`F3<>(XK z1=gfH39N_~8O+~({MZX~+QHyB>vtgwK0@uqGkX^eaf$UFHiO#>LB*7@=c0o6`0muj zmH00_F#p)s3E*$A-zP+p2bvXARTg3)Lxh`tf~9X>7!Z^kHV`uE%V9+BiBG=mxj*)M zr%3rn=)>GR`{#zmwD)$3ToLMx++uqsCx(+50Uk*5QJp2c6msxLD&P-y{c|XK6zZl3 z_Fgu8kp|gKVWv`GS!c56FWPO)ZrCCtYh#*yp-ssus)ot>_~UB zyGfjTjz#fXod{^KEQK1~@jN|;SZw5OgH#0wK78Oe4#vV3*|&XPQU z$r~5u8ziT0<#ICrX^<1){mvtaqT9OqlW?wiSu4X#rOC(0uL{Ownb%i1F_G&d>=l51 zx!FEO4_LK+)W^N6UF+fAccyyp{t)TE`;vF@1irbNjcXF8b?yFh zl5UEB>@;wO`~gMF!QB;h<``+f(lxAb_8B$;&vT7)(bXG(7x_5f%AZ5;h#3WjHisX{ zLTSguapAADXMwWZ&jsD0+K!+8#*6z7-(T+QUk>(~!Q|0&!d)PgEw8F6RK;LkB;!HXg79$+l*KU&-fRF|$o+kR4mJ36k9p&>*uS~RhCV+*Y$3U-k%~M)jxCFW zl9;bQ-fx4HPy)*(bhrKL!81M6*@6p5W?z*W`jb;@JKMFwmic{gQPv*) z?I{Fh)y)}(-6uh^I52xKo!LRZV0c*1X)Z(g+GVFN{2n%vD*@&IkVI{R_0;M28M z8vu?M+xVF-&<{l@1g{PA#hnyAq(gudz4WKSFL5YOr3q!|qrxa7z~F~rEJ29VQKgNe z1*L^m9&acg2p7&`u&V%oY|AKF(Xpv=)wf&j#n|;2UYEaUIHLJuTQw$SbrNn+)38PlfV^0<6s>)|hT#IAAS*T)_^_q@I} z0S%tV-HrXOjzkvW!YSbDjdH=g;=4A@whsDB zI8^aX6n=|ab(?!Ay!)CxH(wC(iX~Q@%FEx>C{Hmp98f2ku$Bsw%lk6v50(U@; zu68Z9U&za}O#-Mv^+!V=eyj6S)5oS{My`1MVs)nlnYl_$xU^QId1_jMf7&K8ij)jQ zJ|+~@l)xpV%~Y{P()$`+nBihkjE|3t3t8PoKU3wZ_Eg%0P<>%(A@oW#*8i$X!nfG& z;&&2ZIKlD~*Gff+p3A7QB!}Ei>RGhUUz^UoEpeJ{`2ov>wH!O@1$VW>A#D#{i2z9l z{d)FK9OYxRY#(6NUMO=q^5Ve7R|72%f}ZDlsm0BN&LzyaSHurXV4p5HGf7|Z)}8)g z5J#S6h{-+_U0m$k#+|N{6_8MYactWzWb+1~ea8wX3zX<@O0>pU*q($J{=R&7)P&jg z6Kb)o=HAnC_MP;cIeBq}{gG^0CZzOUJZ|7C-VjE}!?*UtKTcwwF33v^BYC&}Rq)C* zpAJ07-!{`flYX1@n;ZK-=x4)!o(%(1UqulVmes(D z^`_HNfM#umEYy~=zh$9&+?8$4!l(4rr?d#8hS4iks@9w%E4l`BKmhUtvsm1X-mKC3 z>4(u4yS45OgZIOQ;EQ6s`sjNelo!~mLe7gS69TW2WnFwEKcAwioq2mLXV<9CIa#(0`sQpl>vwW`A$D?!2%nt*HEb;Ga=o?92 zHAOICmXHEQ%Cc{m2>dLjPU1J}^w7zilFIxy9nG(OZbYPtW?3KJyv@A7|1A*NiD_v! zTLC}%E4kI*d?$lQBRL==MPsD#FyN0ZSr`;aeQ4C6a2INH9klU~_gCH;G2%8R4EuHb z44Ej^6301>?c06FP3X~xyP{77p`-3td;HKAGf4mZw1qRd6Z^^L#?qaiAKv~px)*jAV^re~beps9m{kJzb6n(oS8uCt#Lnjofg;Rl z=apY)JsV;^dVkzCW)jDrii_WTT`3iKri(xmCC1^AO}Vqt-1B*wwIlBAmE1AmdRtMc zD!fB@mtwHPHyV-^VIVU??*~*{olz-Ub)NCX941BDj_CKZ+QYQ?+``tyhy_7WFXF}_ z?~CVO#LsDYD!&}cph22{PZ*TK?$K^u`E7%{^na89Rm%!jSZs7vI-D zL1POD!1cu56G)*p1gui3-i^JZPX3tI*_Fq&JRwbz*#8LUSiMRWjuu`zD|uk;+X&d@ zuxF5C2{Zp#O?GtOB+R2~tF>MDI(}%p-W=M>1tEY}8E=b_l*WbOO zY9tCPgL3vMEqz)_eWeqmN{qobq_4)XdXJSe6Hj;Eie0??2ZZ?p;*_K8@(&v~1evu- zxQCA2YYvv@qhzamqdi`?{Z{c*7$arCdz4-4G(`O5It%y&8>d{#Y9Vax^FZ99ZK zUdIPpkNhp8uP3T+W4lhvUIYaoY##y6KtxBFoj3&5^@Q(^{677%C#3YJh$p-Ee2M6F ztJAoQv1N0L!|N8XBD(eAYcB#gRaIX7T8U5xXbx~cJSon~YnC zaJYE%zOj9y?E==_B$*9NiAm{~)2Z}t1$$l?qOYct5Ep5HvqFKvuSE7A5YF$K@2>UE zbQOdTNzjD#zS(L>wa2$K-WK!Pc%pY^8To58;^JaXZ}F30wuYl;WWs~rCoo&vrEtUh zTBLMU??yx1#;-weCPZyOJ%Yeb?14z+OXW0L_E+<)(q=;xz74U-Q~R~n*oC;MxyrJo(74r$y2t;x`D~{nhUw`N{Bbc zo`l5kb`Yy;L=&@MTQ~Ml_%V%){mCIj4WC}5q=A_ACx2^by!4w1rVX6H0ifayJsw;; z=+}5kjC?RG*q)^FA;udd?fK$7vU1x>y0w;A-)YbE%l$J%nRRjAIlrItFPgQvJ7Ytb z%HSFnjF2||X&L_g-Q>1{(mholW_-EJmSzsO%*VVVB4)#OAv<(kOIx2H!f)I9#e_Nyjdb$&*1KN^gM}yFIhi%%BWB}7Ke0M{0WY>CxJQUuL<9GW$I>S z8~;QmE{^wS?I`=DyV^l+MozMPWLoFz=uSLu99tiVHdCN>7jRs~vd13`&Gey!!7_+< z6o@25%!eN~+Eki#7iq@#{Hxl7pF0^`N;~p~#tc6HXJP0g5xvK|AuLSwNHVI2_Y-!& z4hemc%vOM5!ySDypyEGe=lAeFbIp`w8FIUcTqUwens>sTIV-jDhrcKGX7XHFXyazb z^DO8=ZgefY6R6&+)c1_i*WoenjtR5@_JU#Ph;4M8fpmznxE9R`=r@-#_y zkD?Muq|*gg7f*BQeI|Np#}Q|NXLJHM6GE{;SJn8ce`V1Gehym~{8c+M<2~=HcCRuk z-v&$8dc8YG+tK}NYVhwdm1iZ&A#r+T<>Ez88)Eq9j+G5h5D(_u{WQdUTOs+QbA(=? z{F6n6UV8D2*lvb)0vDrca$729KG$xO2aH$jWoWl0drlmefYsTswh)`GjMtmR=vEkJ zN$aTp_@@KL%KQ-VDB2ppbZK@X`6cJA5n`g>sbCTvU_xdid!{9gWA|>Mfs6rtHx6s` z_wMt*FgUTBZ@I2C62&zbs?pPvK9TpatkXzqDqe4YTr^nnQg8gWxjKt*s&eOMEp!Qc zG~PT`>xg76Xqh^dKI-Eu#K*VnvEf9qT{L0yNpVj)eVD#kQzGgVRbTB!5nWY=?t!cggiEGBAcWM2xNtW&9 zZB_6RZ}|a87CuEYRYCRJ`Sg+_gBK$_J@*zoWcJJw>eBw?G9WY(Jw~qN|A3MBR^~jm?>k5oGv7z+0jWOox(co@%nya|* zE-2peyX)#@svgwwDMPJ89dT=iO>}@wtNR@NUQ|cJZ};sX(w2uWP4AE5)@A ziJgy_TIZ+T&vG&xPh@Jmt!OJ|zA6C0ZxfF2 z7>aIZqecbmM$lyvDMwg2?Ipo9b)-WL6K_7(X_rmJgdd$-Qc^ywEw4SThChz6*_yu= z{v~a4V|RJtH-GThc2C0Z|JHPl{II-!?B~7cWnRz&dgP*UqoY!iCo&i-xeM}kl?ID* zKTX`w+;z0+MCdGcl{N?xb|tYb%Id=k++k_@(V%bTS&n09`0{S0)|>IH_F;V@_zrxS-dKDDc7+i`nHN8J z;38w69lzAS*WWa+dnVvk(0-KD3%*)TerLH zSCc}Tjc-mR5|1HAL$C1}oue|Qp&M!hmyDUcg)Cz>GXPEyeYf}+s48kIl*pL{{treP BIP(Ai literal 0 HcmV?d00001 diff --git a/androidxdemo/src/main/res/values/colors.xml b/androidxdemo/src/main/res/values/colors.xml new file mode 100644 index 0000000..479769a --- /dev/null +++ b/androidxdemo/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #009688 + #00796B + #FF9800 + \ No newline at end of file diff --git a/androidxdemo/src/main/res/values/strings.xml b/androidxdemo/src/main/res/values/strings.xml new file mode 100644 index 0000000..6aea12c --- /dev/null +++ b/androidxdemo/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + AndroidX Demo + + diff --git a/androidxdemo/src/main/res/values/styles.xml b/androidxdemo/src/main/res/values/styles.xml new file mode 100644 index 0000000..a70e242 --- /dev/null +++ b/androidxdemo/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/androidxdemo/src/stage/AndroidManifest.xml b/androidxdemo/src/stage/AndroidManifest.xml new file mode 100644 index 0000000..ee78d9f --- /dev/null +++ b/androidxdemo/src/stage/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/androidxdemo/src/stage/res/values/strings.xml b/androidxdemo/src/stage/res/values/strings.xml new file mode 100644 index 0000000..ace0c41 --- /dev/null +++ b/androidxdemo/src/stage/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/appbase/.gitignore b/appbase/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/appbase/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/appbase/app_update_description.txt b/appbase/app_update_description.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/appbase/app_update_description.txt @@ -0,0 +1 @@ + diff --git a/appbase/build.gradle b/appbase/build.gradle new file mode 100644 index 0000000..0d5af49 --- /dev/null +++ b/appbase/build.gradle @@ -0,0 +1,52 @@ +apply plugin: 'com.android.application' +apply from: '../.winboll/winboll_app_build.gradle' +apply from: '../.winboll/winboll_lint_build.gradle' + +def genVersionName(def versionName){ + // 检查编译标志位配置 + assert (winbollBuildProps['stageCount'] != null) + assert (winbollBuildProps['baseVersion'] != null) + // 保存基础版本号 + winbollBuildProps.setProperty("baseVersion", "${versionName}"); + //保存编译标志配置 + FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) + winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); + fos.close(); + + // 返回编译版本号 + return "${versionName}." + winbollBuildProps['stageCount'] +} + +android { + + // 1. compileSdkVersion:必须 ≥ targetSdkVersion,建议直接等于 targetSdkVersion(30) + compileSdkVersion 30 + + // 2. buildToolsVersion:需匹配 compileSdkVersion,建议使用 30.x.x 最新稳定版(无需高于 compileSdkVersion) + buildToolsVersion "30.0.3" // 这是 30 对应的最新稳定版,避免使用 beta 版 + + defaultConfig { + applicationId "cc.winboll.studio.appbase" + minSdkVersion 23 + targetSdkVersion 30 + versionCode 1 + // versionName 更新后需要手动设置 + // .winboll/winbollBuildProps.properties 文件的 stageCount=0 + // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" + versionName "15.11" + if(true) { + versionName = genVersionName("${versionName}") + } + } + + // 确保 Java 7 兼容性(已适配项目技术栈) + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } +} + +dependencies { + api project(':libappbase') + api fileTree(dir: 'libs', include: ['*.jar']) +} diff --git a/appbase/build.properties b/appbase/build.properties new file mode 100644 index 0000000..ca3c782 --- /dev/null +++ b/appbase/build.properties @@ -0,0 +1,8 @@ +#Created by .winboll/winboll_app_build.gradle +#Fri Nov 21 11:41:04 HKT 2025 +stageCount=2 +libraryProject=libappbase +baseVersion=15.11 +publishVersion=15.11.1 +buildCount=0 +baseBetaVersion=15.11.2 diff --git a/appbase/proguard-rules.pro b/appbase/proguard-rules.pro new file mode 100644 index 0000000..574eeec --- /dev/null +++ b/appbase/proguard-rules.pro @@ -0,0 +1,126 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# 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 *; +#} + +# ============================== 基础通用规则 ============================== +# 保留系统组件 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference + +# 保留 WinBoLL 核心包及子类(适配你的两个包名) +#-keep public class * extends com.winboll.WinBoLLActivity +#-keep public class * extends com.winboll.WinBoLLFragment +# 主包名 +-keep class cc.winboll.studio.*.** { *; } +# beta包名 +-keep class cc.winboll.studio.*.beta.** { *; } +-keepclassmembers class cc.winboll.studio.*.** { *; } +-keepclassmembers class cc.winboll.studio.*.beta.** { *; } + +# 保留所有类中的 public static final String TAG 字段 +-keepclassmembers class * { + public static final java.lang.String TAG; +} + +# 保留序列化类 +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +# 保留 R 文件 +-keepclassmembers class **.R$* { + public static ; +} + +# 保留 native 方法 +-keepclasseswithmembernames class * { + native ; +} + +# 保留注解和泛型 +-keepattributes *Annotation* +-keepattributes Signature + +# 屏蔽 Java 8+ 警告(适配 Java 7) +-dontwarn java.lang.invoke.* +-dontwarn android.support.v8.renderscript.* +-dontwarn java.util.function.** + +# ============================== 第三方框架规则 ============================== +# Retrofit + OkHttp +-keep class retrofit2.** { *; } +-keep interface retrofit2.** { *; } +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-keep class okio.** { *; } +-keepclasseswithmembers class * { + @retrofit2.http.* ; +} + +# Glide 4.x +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType { + **[] $VALUES; + public *; +} +-dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder + +# GreenDAO 3.x +-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { + public static java.lang.String TABLENAME; +} +-keep class **$Properties +# 实体类包名(按实际调整) +#-keep class cc.winboll.studio.appbase.model.** { *; } + +# ButterKnife 8.x +-keep class butterknife.** { *; } +-dontwarn butterknife.internal.** +-keep class **$$ViewBinder { *; } +-keepclasseswithmembernames class * { + @butterknife.BindView ; + @butterknife.OnClick ; +} + +# EventBus 3.x +-keepclassmembers class ** { + @org.greenrobot.eventbus.Subscribe ; +} +-keep enum org.greenrobot.eventbus.ThreadMode { *; } + +# ============================== 优化与调试 ============================== +-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* +-optimizationpasses 5 +-verbose +-dontpreverify +-dontusemixedcaseclassnames +# 保留行号(便于崩溃定位) +-keepattributes SourceFile,LineNumberTable + diff --git a/appbase/src/beta/AndroidManifest.xml b/appbase/src/beta/AndroidManifest.xml new file mode 100644 index 0000000..105d636 --- /dev/null +++ b/appbase/src/beta/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/appbase/src/beta/res/values/strings.xml b/appbase/src/beta/res/values/strings.xml new file mode 100644 index 0000000..024cdd2 --- /dev/null +++ b/appbase/src/beta/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + AppBase+ + + diff --git a/appbase/src/main/AndroidManifest.xml b/appbase/src/main/AndroidManifest.xml new file mode 100644 index 0000000..284d7af --- /dev/null +++ b/appbase/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/App.java b/appbase/src/main/java/cc/winboll/studio/appbase/App.java new file mode 100644 index 0000000..888d581 --- /dev/null +++ b/appbase/src/main/java/cc/winboll/studio/appbase/App.java @@ -0,0 +1,40 @@ +package cc.winboll.studio.appbase; + +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.ToastUtils; + +/** + * @Author ZhanGSKen + * @Date 2025/01/05 09:54:42 + * @Describe 应用全局入口类(继承基础库 GlobalApplication) + * 负责应用初始化、全局资源管理与生命周期回调处理,是整个应用的核心入口 + */ +public class App extends GlobalApplication { + + /** 当前应用类的日志 TAG(用于调试输出,标识日志来源) */ + public static final String TAG = "App"; + + /** + * 应用创建时回调(全局初始化入口) + * 在应用进程启动时执行,仅调用一次,用于初始化全局工具类、第三方库等 + */ + @Override + public void onCreate() { + super.onCreate(); // 调用父类初始化逻辑(如基础库配置、全局上下文设置) + // 初始化 Toast 工具类(传入应用全局上下文,确保 Toast 可在任意地方调用) + ToastUtils.init(getApplicationContext()); + } + + /** + * 应用终止时回调(资源释放入口) + * 仅在模拟环境(如 Android Studio 模拟器)中可靠触发,真机上可能因系统回收进程不执行 + * 用于释放全局资源,避免内存泄漏 + */ + @Override + public void onTerminate() { + super.onTerminate(); // 调用父类终止逻辑(如基础库资源释放) + // 释放 Toast 工具类资源(销毁全局 Toast 实例,避免内存泄漏) + ToastUtils.release(); + } +} + diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java new file mode 100644 index 0000000..387fab3 --- /dev/null +++ b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java @@ -0,0 +1,140 @@ +package cc.winboll.studio.appbase; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Toolbar; +import cc.winboll.studio.appbase.R; +import cc.winboll.studio.libappbase.LogActivity; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.ToastUtils; + +/** + * @Author ZhanGSKen + * @Date 未标注(建议补充创建日期) + * @Describe 应用主界面 Activity(入口界面) + * 包含功能测试按钮(崩溃测试、日志查看、Toast测试)、顶部工具栏(菜单功能),是应用交互的核心入口 + */ +public class MainActivity extends Activity { + + /** 当前 Activity 的日志 TAG(用于调试输出,标识日志来源) */ + public static final String TAG = "MainActivity"; + + /** 顶部工具栏(用于展示标题、菜单,绑定布局中的 Toolbar 控件) */ + private Toolbar mToolbar; + + /** + * Activity 创建时回调(初始化界面) + * 在 Activity 首次创建时执行,用于加载布局、初始化控件、设置事件监听 + * @param savedInstanceState 保存 Activity 状态的 Bundle(如屏幕旋转时的数据恢复) + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ToastUtils.show("onCreate"); // 显示 Activity 创建提示(调试用) + setContentView(R.layout.activity_main); // 加载主界面布局 + + // 初始化 Toolbar 并设置为 ActionBar + mToolbar = findViewById(R.id.toolbar); + setActionBar(mToolbar); // 将 Toolbar 替代系统默认 ActionBar + } + + /** + * 创建菜单时回调(加载工具栏菜单) + * 初始化 ActionBar 菜单,加载自定义菜单布局 + * @param menu 菜单对象(用于承载菜单项) + * @return true:显示菜单;false:不显示菜单 + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // 加载菜单布局(R.menu.toolbar_main 为自定义菜单文件) + getMenuInflater().inflate(R.menu.toolbar_main, menu); + return super.onCreateOptionsMenu(menu); + } + + /** + * 菜单 item 点击时回调(处理菜单事件) + * 响应 Toolbar 菜单项的点击事件,执行对应业务逻辑 + * @param item 被点击的菜单项 + * @return true:消费点击事件;false:不消费(传递给父类) + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.item_home: + // 点击 "首页/官网" 菜单项,唤起浏览器打开指定网站 + openWebsiteInBrowser(this); + break; + // 可扩展其他菜单项(如设置、关于等)的处理逻辑 + } + return super.onOptionsItemSelected(item); + } + + /** + * 崩溃测试按钮点击事件(触发应用崩溃,用于调试异常捕获) + * 故意执行非法操作(循环获取不存在的字符串资源),强制应用崩溃 + * @param view 触发事件的 View(对应布局中的崩溃测试按钮) + */ + public void onCrashTest(View view) { + // 循环从 Integer.MIN_VALUE 到 Integer.MAX_VALUE,获取不存在的字符串资源 ID,触发崩溃 + for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { + getString(i); // i 超出资源 ID 范围,抛出 Resources.NotFoundException 导致崩溃 + } + } + + /** + * 日志测试按钮点击事件(打开日志查看界面) + * 启动 LogActivity,用于查看应用运行日志 + * @param view 触发事件的 View(对应布局中的日志测试按钮) + */ + public void onLogTest(View view) { + // 启动日志查看 Activity(通过静态方法传入上下文,简化跳转逻辑) + LogActivity.startLogActivity(this); + } + + /** + * Toast 工具测试按钮点击事件(测试全局 Toast 功能) + * 测试主线程、子线程中 Toast 的显示效果,验证 ToastUtils 的可用性 + * @param view 触发事件的 View(对应布局中的 Toast 测试按钮) + */ + public void onToastUtilsTest(View view) { + LogUtils.d(TAG, "onToastUtilsTest"); // 打印调试日志,标识进入 Toast 测试 + ToastUtils.show("Hello, WinBoLL!"); // 主线程显示 Toast + + // 开启子线程,延迟 2 秒后显示 Toast(测试子线程 Toast 兼容性) + new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(2000); // 线程休眠 2 秒 + // 若 ToastUtils 已处理主线程切换,此处可直接调用;否则需通过 Handler 切换到主线程 + ToastUtils.show("Thread.sleep(2000);ToastUtils.show..."); + } catch (InterruptedException e) { + // 捕获线程中断异常(如线程被销毁时),不做处理(测试场景) + e.printStackTrace(); + } + } + }).start(); + } + + /** + * 唤起系统默认浏览器打开指定网站(跳转至应用官网) + * 通过 Intent.ACTION_VIEW 隐式意图,触发浏览器打开目标 URL + * @param context 上下文对象(如 Activity、Application,此处为 MainActivity) + */ + public void openWebsiteInBrowser(Context context) { + String url = "https://www.winboll.cc"; // 目标网站 URL(应用官网) + // 构建隐式意图:ACTION_VIEW 表示查看指定数据(Uri 为网站地址) + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + // 设置标志:在新的任务栈中启动 Activity(避免与当前应用任务栈混淆) + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // 启动意图(唤起浏览器) + context.startActivity(intent); + } +} + diff --git a/appbase/src/main/res/drawable/btn_light_blue.xml b/appbase/src/main/res/drawable/btn_light_blue.xml new file mode 100644 index 0000000..58415fd --- /dev/null +++ b/appbase/src/main/res/drawable/btn_light_blue.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/appbase/src/main/res/layout/activity_main.xml b/appbase/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..5ba647d --- /dev/null +++ b/appbase/src/main/res/layout/activity_main.xml @@ -0,0 +1,67 @@ + + + + + + + + + +