From ec8289d0f5c76343c57d74993e0314cd87c7ec0c Mon Sep 17 00:00:00 2001 From: BBIT-Kai <2911862937@qq.com> Date: Mon, 25 May 2026 15:27:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 17 + build.gradle.kts | 6 + gradle.properties | 23 + gradle/libs.versions.toml | 45 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++ gradlew.bat | 89 +++ phone/.gitignore | 1 + phone/build.gradle.kts | 68 +++ phone/proguard-rules.pro | 21 + .../bbitcn/phone/ExampleInstrumentedTest.kt | 24 + phone/src/main/AndroidManifest.xml | 28 + phone/src/main/java/com/bbitcn/phone/MyApp.kt | 34 ++ .../bbitcn/phone/base/BaseListTempDataBase.kt | 75 +++ .../com/bbitcn/phone/base/BaseViewModel.kt | 194 +++++++ .../bbitcn/phone/base/MyAnimatedVisibility.kt | 30 + .../com/bbitcn/phone/base/MyBottomSheet.kt | 110 ++++ .../phone/base/ParameterizedTypeImpl.kt | 18 + .../phone/base/noVisualFeedbackClickable.kt | 21 + .../main/java/com/bbitcn/phone/model/Page.kt | 10 + .../main/java/com/bbitcn/phone/model/Plan.kt | 13 + .../java/com/bbitcn/phone/ui/PhoneActivity.kt | 157 ++++++ .../com/bbitcn/phone/ui/PhoneViewModel.kt | 525 ++++++++++++++++++ .../bbitcn/phone/ui/compose/ConnectScreen.kt | 101 ++++ .../bbitcn/phone/ui/compose/ControlScreen.kt | 92 +++ .../com/bbitcn/phone/ui/compose/SetScreen.kt | 45 ++ .../java/com/bbitcn/phone/ui/theme/Color.kt | 11 + .../java/com/bbitcn/phone/ui/theme/Theme.kt | 58 ++ .../java/com/bbitcn/phone/ui/theme/Type.kt | 34 ++ .../java/com/bbitcn/phone/utls/MMKVUtil.java | 107 ++++ .../com/bbitcn/phone/utls/PlanTempDatabase.kt | 19 + .../java/com/bbitcn/phone/utls/PollingTask.kt | 160 ++++++ phone/src/main/res/mipmap-hdpi/logo.png | Bin 0 -> 99105 bytes phone/src/main/res/values/colors.xml | 10 + phone/src/main/res/values/strings.xml | 3 + phone/src/main/res/values/themes.xml | 5 + .../java/com/bbitcn/phone/ExampleUnitTest.kt | 17 + settings.gradle.kts | 27 + tv/.gitignore | 1 + tv/MyApp.kt | 67 +++ tv/build.gradle.kts | 77 +++ tv/proguard-rules.pro | 21 + tv/src/main/AndroidManifest.xml | 40 ++ .../java/com/bbitcn/bbitshow/BaseViewModel.kt | 199 +++++++ tv/src/main/java/com/bbitcn/bbitshow/MyApp.kt | 29 + .../com/bbitcn/bbitshow/MyWebSocketServer.kt | 34 ++ .../java/com/bbitcn/bbitshow/PollingTask.kt | 160 ++++++ .../java/com/bbitcn/bbitshow/TvActivity.kt | 188 +++++++ .../java/com/bbitcn/bbitshow/TvViewModel.kt | 176 ++++++ .../bbitcn/bbitshow/base/BaseTempDataBase.kt | 39 ++ .../bbitshow/base/ParameterizedTypeImpl.kt | 18 + .../com/bbitcn/bbitshow/model/GeckoPage.kt | 9 + .../java/com/bbitcn/bbitshow/model/Page.kt | 10 + .../java/com/bbitcn/bbitshow/model/Plan.kt | 13 + .../com/bbitcn/bbitshow/ui/theme/Color.kt | 11 + .../com/bbitcn/bbitshow/ui/theme/Theme.kt | 34 ++ .../java/com/bbitcn/bbitshow/ui/theme/Type.kt | 36 ++ .../java/com/bbitcn/bbitshow/utls/MyUtils.kt | 16 + .../com/bbitcn/bbitshow/utls/PlanTempDB.kt | 33 ++ .../java/com/bbitcn/bbitshow/utls/SPUtils.kt | 28 + tv/src/main/res/mipmap-hdpi/logo.png | Bin 0 -> 99105 bytes tv/src/main/res/values/strings.xml | 3 + tv/src/main/res/values/themes.xml | 4 + 64 files changed, 3635 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 phone/.gitignore create mode 100644 phone/build.gradle.kts create mode 100644 phone/proguard-rules.pro create mode 100644 phone/src/androidTest/java/com/bbitcn/phone/ExampleInstrumentedTest.kt create mode 100644 phone/src/main/AndroidManifest.xml create mode 100644 phone/src/main/java/com/bbitcn/phone/MyApp.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/base/BaseListTempDataBase.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/base/BaseViewModel.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/base/MyAnimatedVisibility.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/base/MyBottomSheet.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/base/ParameterizedTypeImpl.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/base/noVisualFeedbackClickable.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/model/Page.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/model/Plan.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/PhoneActivity.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/PhoneViewModel.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/compose/ConnectScreen.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/compose/ControlScreen.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/compose/SetScreen.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/theme/Color.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/theme/Theme.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/ui/theme/Type.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/utls/MMKVUtil.java create mode 100644 phone/src/main/java/com/bbitcn/phone/utls/PlanTempDatabase.kt create mode 100644 phone/src/main/java/com/bbitcn/phone/utls/PollingTask.kt create mode 100644 phone/src/main/res/mipmap-hdpi/logo.png create mode 100644 phone/src/main/res/values/colors.xml create mode 100644 phone/src/main/res/values/strings.xml create mode 100644 phone/src/main/res/values/themes.xml create mode 100644 phone/src/test/java/com/bbitcn/phone/ExampleUnitTest.kt create mode 100644 settings.gradle.kts create mode 100644 tv/.gitignore create mode 100644 tv/MyApp.kt create mode 100644 tv/build.gradle.kts create mode 100644 tv/proguard-rules.pro create mode 100644 tv/src/main/AndroidManifest.xml create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/BaseViewModel.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/MyApp.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/MyWebSocketServer.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/PollingTask.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/TvActivity.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/TvViewModel.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/base/BaseTempDataBase.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/base/ParameterizedTypeImpl.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/model/GeckoPage.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/model/Page.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/model/Plan.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/ui/theme/Color.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/ui/theme/Theme.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/ui/theme/Type.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/utls/MyUtils.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/utls/PlanTempDB.kt create mode 100644 tv/src/main/java/com/bbitcn/bbitshow/utls/SPUtils.kt create mode 100644 tv/src/main/res/mipmap-hdpi/logo.png create mode 100644 tv/src/main/res/values/strings.xml create mode 100644 tv/src/main/res/values/themes.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11e6be0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +.kotlin/ +.idea/ diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..952b930 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,6 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.compose) apply false +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..20e2a01 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..55d8458 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,45 @@ +[versions] +agp = "8.10.1" +kotlin = "2.0.21" +coreKtx = "1.10.1" +junit = "4.13.2" +junitVersion = "1.1.5" +espressoCore = "3.5.1" +appcompat = "1.6.1" +material = "1.10.0" +activity = "1.8.0" +constraintlayout = "2.1.4" +composeBom = "2024.09.00" +tvFoundation = "1.0.0-alpha07" +tvMaterial = "1.0.1" +lifecycleRuntimeKtx = "2.6.1" +activityCompose = "1.8.0" + +[libraries] +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } +androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } +androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +androidx-tv-foundation = { group = "androidx.tv", name = "tv-foundation", version.ref = "tvFoundation" } +androidx-tv-material = { group = "androidx.tv", name = "tv-material", version.ref = "tvMaterial" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } + +androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3d3fa12 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Aug 18 14:55:29 CST 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/phone/.gitignore b/phone/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/phone/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/phone/build.gradle.kts b/phone/build.gradle.kts new file mode 100644 index 0000000..51fe9c6 --- /dev/null +++ b/phone/build.gradle.kts @@ -0,0 +1,68 @@ +import org.gradle.kotlin.dsl.implementation + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) +} + +android { + namespace = "com.bbitcn.phone" + compileSdk = 35 + + defaultConfig { + applicationId = "com.bbitcn.phone" + minSdk = 24 + targetSdk = 35 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } + buildFeatures { + compose = true + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) + implementation( "org.java-websocket:Java-WebSocket:1.6.0") + //lifecycle-viewmodel-compose + implementation(libs.androidx.lifecycle.viewmodel.compose) + //MMKV + implementation("com.tencent:mmkv:2.2.2") + implementation("com.google.code.gson:gson:2.13.1") + +} \ No newline at end of file diff --git a/phone/proguard-rules.pro b/phone/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/phone/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/phone/src/androidTest/java/com/bbitcn/phone/ExampleInstrumentedTest.kt b/phone/src/androidTest/java/com/bbitcn/phone/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..98ee1e9 --- /dev/null +++ b/phone/src/androidTest/java/com/bbitcn/phone/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.bbitcn.phone + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.bbitcn.phone", appContext.packageName) + } +} \ No newline at end of file diff --git a/phone/src/main/AndroidManifest.xml b/phone/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b2cf34f --- /dev/null +++ b/phone/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/MyApp.kt b/phone/src/main/java/com/bbitcn/phone/MyApp.kt new file mode 100644 index 0000000..3d2b01a --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/MyApp.kt @@ -0,0 +1,34 @@ +package com.bbitcn.phone + +import android.app.Application +import android.content.Context +import android.provider.Settings +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.spring +import androidx.compose.ui.Modifier +import com.bbitcn.phone.utls.MMKVUtil + + +/** + * @Description APPLICATION类 + * @Author DuanKaiji + * @CreateTime 2024年03月27日 13:43 + */ +val M = Modifier +val MD = Modifier + .animateContentSize( + animationSpec = spring( + dampingRatio = Spring.DampingRatioLowBouncy, + stiffness = Spring.StiffnessLow + ) + ) + + +class MyApp : Application() { + override fun onCreate() { + super.onCreate() + // 初始化MMKV + MMKVUtil.init(applicationContext) + } +} diff --git a/phone/src/main/java/com/bbitcn/phone/base/BaseListTempDataBase.kt b/phone/src/main/java/com/bbitcn/phone/base/BaseListTempDataBase.kt new file mode 100644 index 0000000..68475cb --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/base/BaseListTempDataBase.kt @@ -0,0 +1,75 @@ +package com.bbitcn.sericulture.base + +import com.bbitcn.phone.utls.MMKVUtil +import com.google.gson.Gson +import java.lang.reflect.Type + +/** + * + * @Description 列表临时存储库 + * @Author DuanKaiji + * @CreateTime 2024年08月06日 11:39:31 + */ +abstract class BaseListTempDataBase { + protected val gson: Gson = Gson() + + abstract fun getKey(): String + + abstract fun getType(): Type + + fun getAll(): MutableList { + val json = MMKVUtil.get(getKey(), "[]") + return Gson().fromJson(json, getType()) + } + + suspend fun init(data: List) { + MMKVUtil.put(getKey(), gson.toJson(data)) + } + + suspend fun insert(t: T, afterInsert: (T) -> Unit = {}): Boolean { +// val type: Type = ParameterizedTypeImpl(T::class.java) + val temp: MutableList = getAll() + if (temp.contains(t)) { + return false + } + temp.add(t) + MMKVUtil.put(getKey(), gson.toJson(temp)) + afterInsert(t) + return true + } + + /** + * 更新 + */ + fun update(predicate: (T) -> Boolean, update: (T) -> Unit = {}, afterUpdate: () -> Unit = {}): Boolean { + val temp: MutableList = getAll() + for (mode in temp) { + if (predicate(mode)) { + update(mode) + MMKVUtil.put(getKey(), gson.toJson(temp)) + afterUpdate() + return true + } + } + return false + } + + fun delete(predicate: (T) -> Boolean,afterDel: (T) -> Unit = { }): Boolean { + val temp: MutableList = getAll() + val iterator = temp.iterator() + while (iterator.hasNext()) { + val mode = iterator.next() + if (predicate(mode)) { + iterator.remove() + MMKVUtil.put(getKey(), gson.toJson(temp)) + afterDel(mode) + return true + } + } + return false + } + fun clear(): Boolean { + MMKVUtil.put(getKey(), "[]") + return true + } +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/base/BaseViewModel.kt b/phone/src/main/java/com/bbitcn/phone/base/BaseViewModel.kt new file mode 100644 index 0000000..d5562cd --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/base/BaseViewModel.kt @@ -0,0 +1,194 @@ +package com.bbitcn.phone.base + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.bbitcn.phone.utls.PollingTask +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.withContext +import java.net.SocketException +import kotlin.coroutines.cancellation.CancellationException + +open class BaseViewModel : ViewModel() { + + + protected var pollingTask: PollingTask = + PollingTask.Companion.getInstance(javaClass.simpleName) // 使用类名作为ID + + protected fun doInUIThread(task: () -> Unit) { + viewModelScope.launch { + withContext(Dispatchers.Main) { + task() + } + } + } + + protected fun doInIoThreadThenUI( + loadingTips: String = "正在加载中", + showDialog: Boolean = true, + onError: (Throwable) -> Unit = { }, + onIO: suspend () -> T, + onFinish: () -> Unit = { }, + onUI: (T) -> Unit, + ) { + viewModelScope.launch { + val result = runCatching { + withContext(Dispatchers.IO) { + if (showDialog) { +// Toasty.showLoadingDialog(loadingTips) + } + onIO() + } + } + + if (showDialog) { +// hideLoadingDialog() + } + + withContext(Dispatchers.Main) { + result.onSuccess { data -> + onUI(data) + }.onFailure { exception -> + // ✅ 如果是协程取消,不处理,只记录日志 + if (exception is CancellationException || exception.cause is SocketException && exception.cause?.message?.contains( + "Socket closed" + ) == true + ) { + return@onFailure + } + // 其他异常继续处理 + exception.printStackTrace() + onError(exception) + exception.message?.let { +// Toasty.error(it) + } + }.also { + // ✅ 最终执行的操作 + onFinish() + } + } + } + } + + + fun doInIoThread( + loadingTips: String = "正在加载中", + showDialog: Boolean = true, + onError: (Throwable) -> Unit = { }, + onFinish: () -> Unit = { }, + doInIO: suspend () -> T, + ) { + doInIoThreadThenUI(loadingTips, showDialog, onError, doInIO, onFinish) { } + } + + fun doInIoThreadNoDialog( + onError: (Throwable) -> Unit = { }, + task: suspend () -> T, + ) { + doInIoThread(showDialog = false, doInIO = task, onError = onError) + } + + /** + * 在IO线程中执行任务,可选择是否显示加载对话框 + */ + fun doInIoThreadWith(showLoading: Boolean, loadingTips: String, function: suspend () -> Unit) { + if (showLoading) { + doInIoThread(loadingTips) { function() } + } else { + doInIoThreadNoDialog { function() } + } + } + + /** + * 启动一个无限轮询任务 + * + * @param pollingInterval 轮询间隔时间(单位:秒) + * @param pollingTask 轮询任务的挂起函数 + */ + fun polling(intervalSeconds: Long, task: suspend () -> Unit) { + viewModelScope.launch { + withContext(Dispatchers.IO) { + while (true) { + task() + delay(intervalSeconds * 1000L) // 转换秒为毫秒 + } + } + } + } + + /** + * 延迟开始轮询任务 + */ + suspend fun delayPolling(delaySeconds: Long, intervalSeconds: Long, task: suspend () -> Unit) { + delay(delaySeconds * 1000L) + polling(intervalSeconds, task) + } + + private val taskMap = mutableMapOf() + + /** + * 放弃旧任务,执行新任务 + * + * @param key 任务的唯一标识符 + * @param block 任务的挂起函数,必须使用协程,不能开启新的协程,否则无法取消任务 + */ + fun launchTaskNewFirst( + key: String, + block: suspend () -> Unit + ) { + taskMap[key]?.cancel() // 取消旧任务 + taskMap[key] = viewModelScope.launch { + withContext(Dispatchers.IO) { + try { + block() + } catch (e: Exception) { + e.printStackTrace() + } + } + } + } + + /** + * 有新任务时,取消。优先执行旧任务直到完成 + * + * @param key 任务的唯一标识符 + * @param block 任务函数,可以自由新建协程,但一定要在任务完成时调用 onFinished 回调,否则会导致后续任务永远无法执行 + */ + fun launchTaskOldFirst( + key: String, + block: (onFinished: () -> Unit) -> Unit + ) { + val existing = taskMap[key] + if (existing?.isActive == true) { + return + } + val job = viewModelScope.launch { + try { + suspendCancellableCoroutine { continuation -> + block { + if (continuation.isActive) { +// continuation.resume(Unit) { cause, _, _ -> +// println("resume 后任务被取消: $cause") +// } + } + taskMap.remove(key) + } + } + } catch (e: Exception) { + e.printStackTrace() + taskMap.remove(key) + } + } + taskMap[key] = job + } + + override fun onCleared() { + super.onCleared() + taskMap.values.forEach { it.cancel() } + taskMap.clear() + } + +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/base/MyAnimatedVisibility.kt b/phone/src/main/java/com/bbitcn/phone/base/MyAnimatedVisibility.kt new file mode 100644 index 0000000..023c5ef --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/base/MyAnimatedVisibility.kt @@ -0,0 +1,30 @@ +package com.bbitcn.phone.base + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.AnimatedVisibilityScope +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.bbitcn.phone.M + +@Composable +fun MyAnimatedVisibility( + visible: Boolean, + modifier: Modifier = M, + enter: EnterTransition = fadeIn(), + exit: ExitTransition = fadeOut(), + label: String = "AnimatedVisibility", + content: @Composable AnimatedVisibilityScope.() -> Unit +) { + AnimatedVisibility( + visible = visible, + modifier = modifier, + enter = enter, + exit = exit, + label = label, + content = content + ) +} diff --git a/phone/src/main/java/com/bbitcn/phone/base/MyBottomSheet.kt b/phone/src/main/java/com/bbitcn/phone/base/MyBottomSheet.kt new file mode 100644 index 0000000..26c9c67 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/base/MyBottomSheet.kt @@ -0,0 +1,110 @@ +package com.bbitcn.phone.base + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.bbitcn.phone.M +import kotlinx.coroutines.delay +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.padding + +@Composable +fun MyBottomSheet( + showBottomSheet: Boolean, + onDismissRequest: () -> Unit, + modifier: Modifier = Modifier, + sheetHeight: Dp = 500.dp, + content: @Composable ColumnScope.() -> Unit +) { + var showSheet by remember { mutableStateOf(false) } + + // 拦截返回键 + if (showBottomSheet) { + BackHandler { + onDismissRequest() + } + } + + LaunchedEffect(showBottomSheet) { + if (showBottomSheet) { + showSheet = true + } else { + showSheet = false + } + } + + if (showBottomSheet || showSheet) { + Box(modifier = Modifier.fillMaxSize().padding(bottom = 100.dp)) { + AnimatedVisibility( + visible = showBottomSheet, + enter = fadeIn(animationSpec = tween(200)), + exit = fadeOut(animationSpec = tween(200)) + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color(0x99000000)) + .noVisualFeedbackClickable { onDismissRequest() } + ) + } + + AnimatedVisibility( + visible = showSheet, + enter = slideInVertically( + initialOffsetY = { it }, + animationSpec = tween(250, easing = FastOutSlowInEasing) + ), + exit = slideOutVertically( + targetOffsetY = { it }, + animationSpec = tween(200, easing = FastOutSlowInEasing) + ), + modifier = Modifier.align(Alignment.BottomCenter) + ) { + Box( + modifier = modifier + .fillMaxWidth() + .height(sheetHeight) + .background( + Color.White, + shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp) + ) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) {} + ) { + Column( + modifier = Modifier.fillMaxSize(), + content = content + ) + } + } + } + } +} diff --git a/phone/src/main/java/com/bbitcn/phone/base/ParameterizedTypeImpl.kt b/phone/src/main/java/com/bbitcn/phone/base/ParameterizedTypeImpl.kt new file mode 100644 index 0000000..c13ba54 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/base/ParameterizedTypeImpl.kt @@ -0,0 +1,18 @@ +package com.bbitcn.phone.base + +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type + +class ParameterizedTypeImpl(private var clazz: Class<*>) : ParameterizedType { + override fun getActualTypeArguments(): Array { + return arrayOf(clazz) + } + + override fun getRawType(): Type { + return MutableList::class.java + } + + override fun getOwnerType(): Type? { + return null + } +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/base/noVisualFeedbackClickable.kt b/phone/src/main/java/com/bbitcn/phone/base/noVisualFeedbackClickable.kt new file mode 100644 index 0000000..1db9356 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/base/noVisualFeedbackClickable.kt @@ -0,0 +1,21 @@ +package com.bbitcn.phone.base + +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput + +/** + * 自定义点击事件 + * 不使用clickable的点击效果 + */ +fun Modifier.noVisualFeedbackClickable( + onClick: () -> Unit +): Modifier { + return this.pointerInput(Unit) { + detectTapGestures( + onTap = { + onClick() + } + ) + } +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/model/Page.kt b/phone/src/main/java/com/bbitcn/phone/model/Page.kt new file mode 100644 index 0000000..1ac5268 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/model/Page.kt @@ -0,0 +1,10 @@ +package com.bbitcn.phone.model + +import java.util.UUID + +data class Page( + var id: UUID, + var sort: Int, + var name: String, + var url: String +) \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/model/Plan.kt b/phone/src/main/java/com/bbitcn/phone/model/Plan.kt new file mode 100644 index 0000000..0e0d3be --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/model/Plan.kt @@ -0,0 +1,13 @@ +package com.bbitcn.phone.model + +import java.util.Date +import java.util.UUID + +data class Plan( + val id: UUID, + var name: String, + val createTime: Date, + var cycleRefreshTime :Int, + var pages: List + +) diff --git a/phone/src/main/java/com/bbitcn/phone/ui/PhoneActivity.kt b/phone/src/main/java/com/bbitcn/phone/ui/PhoneActivity.kt new file mode 100644 index 0000000..6cc9d8c --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/PhoneActivity.kt @@ -0,0 +1,157 @@ +package com.bbitcn.phone.ui + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Phone +import androidx.compose.material.icons.filled.PlayArrow +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarDefaults +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.bbitcn.phone.M +import com.bbitcn.phone.base.MyBottomSheet +import com.bbitcn.phone.ui.compose.ConnectScreen +import com.bbitcn.phone.ui.compose.ControlScreen +import com.bbitcn.phone.ui.compose.SetScreen +import kotlinx.coroutines.launch + + +class PhoneActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + val viewModel = viewModel() + viewModel.startDiscovery(this) + val pagerState = rememberPagerState { 10 } + val scope = rememberCoroutineScope() + val showBottomSheet by viewModel.isDrawerOpen.collectAsState() + + // 连接、控制、设置 + val navList = listOf( + "连接" to Icons.Default.Phone, + "控制" to Icons.Default.PlayArrow, + "设置" to Icons.Default.Settings + ) + Scaffold( + modifier = M + .fillMaxSize(), + floatingActionButton = { + if( pagerState.currentPage == 2 && !showBottomSheet) { + FloatingActionButton(onClick = { + // 新增计划 + viewModel.addPlan() + }) { + Icon(Icons.Default.Add, contentDescription = null) + } + } + }, + bottomBar = { + NavigationBar(windowInsets = NavigationBarDefaults.windowInsets) { + navList.forEachIndexed { index, item -> + NavigationBarItem( + selected = pagerState.currentPage == index, + onClick = { + scope.launch { + pagerState.animateScrollToPage(index) + } + }, + icon = { + Icon( + item.second, + contentDescription = null + ) + }, + label = { Text(item.first) } + ) + } + } + } + ) { contentPadding -> + HorizontalPager(state = pagerState, contentPadding = contentPadding) { + Column(modifier = M.fillMaxSize()) { + when (it) { + 0 -> ConnectScreen(viewModel) + 1 -> ControlScreen(viewModel) + 2 -> SetScreen(viewModel) + } + } + } + MyBottomSheet( + showBottomSheet = showBottomSheet, + onDismissRequest = { + viewModel.closeDrawer() + } + ) { + Box( + modifier = M.fillMaxSize() + ) { + // 底部抽屉 + viewModel.drawerContent.value() + } + } + } + } + } +} + +@Composable +fun FunctionModel(name: String, content: @Composable () -> Unit) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(5.dp) + ) { + Text( + name, + fontSize = MaterialTheme.typography.headlineMedium.fontSize, + modifier = Modifier + ) + Column( + modifier = Modifier + .fillMaxWidth() + .padding(5.dp) + ) { + content() + } + } +} + +@Composable +fun MyFuncButtonRow(content: @Composable () -> Unit) { + LazyRow { + item { + Row(horizontalArrangement = Arrangement.spacedBy(5.dp)) { + content() + } + } + } +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/ui/PhoneViewModel.kt b/phone/src/main/java/com/bbitcn/phone/ui/PhoneViewModel.kt new file mode 100644 index 0000000..5108cf6 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/PhoneViewModel.kt @@ -0,0 +1,525 @@ +package com.bbitcn.phone.ui + +import android.content.Context +import android.net.nsd.NsdManager +import android.net.nsd.NsdServiceInfo +import android.util.Log +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import com.bbitcn.phone.M +import com.bbitcn.phone.base.BaseViewModel +import com.bbitcn.phone.model.Page +import com.bbitcn.phone.model.Plan +import com.bbitcn.phone.utls.PlanTempDatabase +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.google.gson.reflect.TypeToken +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.java_websocket.client.WebSocketClient +import org.java_websocket.handshake.ServerHandshake +import org.json.JSONObject +import java.io.IOException +import java.net.InetAddress +import java.net.InetSocketAddress +import java.net.Socket +import java.net.URI +import java.util.Date +import java.util.UUID + +class PhoneViewModel : BaseViewModel() { + // 控制 Drawer 内容的 MutableStateFlow + private val _drawerContent = MutableStateFlow<@Composable () -> Unit> { } + val drawerContent: StateFlow<@Composable () -> Unit> = _drawerContent.asStateFlow() + + /** + * 控制 Drawer 状态的 Boolean Flow + */ + private val _isDrawerOpen = MutableStateFlow(false) + val isDrawerOpen: StateFlow = _isDrawerOpen.asStateFlow() + + /** + * 扫描到的所有设备 + */ + private val _devices = MutableStateFlow>(emptyList()) + val devices = _devices.asStateFlow() + + /** + * 设备当前页面列表 + */ + private val _devicePagesList = MutableStateFlow(null) + val devicePagesList = _devicePagesList.asStateFlow() + + /** + * 自己的计划列表 + */ + private val _plans = MutableStateFlow>(emptyList()) + val plans = _plans.asStateFlow() + + /** + * 当前连接的设备信息 + */ + private val _device = MutableStateFlow(null) + val device = _device.asStateFlow() + + /** + * 自动刷新状态 + */ + private val _autoSearching = MutableStateFlow(true) + val autoSearching = _autoSearching.asStateFlow() + + /** + * 发现监听器 + */ + private var discoveryListener: NsdManager.DiscoveryListener? = null + private var client: WebSocketClient? = null + lateinit var nsdManager: NsdManager + val port = 8080 + + + init { + // 刷新个人配置 + _plans.value = PlanTempDatabase.getAll() + } + + fun connectToTv(nsdServiceInfo: NsdServiceInfo) { + connectToTvByIp(nsdServiceInfo.host.hostAddress, nsdServiceInfo) + } + + fun connectToTvByIp(tvIp: String, nsdServiceInfo: NsdServiceInfo? = null) { + doInIoThread { + val uri = URI("ws://$tvIp:$port") + client = object : WebSocketClient(uri) { + override fun onOpen(handshakedata: ServerHandshake?) { + _device.value = nsdServiceInfo + ?: NsdServiceInfo().apply { + serviceName = "手动连接设备" + host = + URI("http://$tvIp").host?.let { InetAddress.getByName(it) } + port = port + } + } + + override fun onMessage(message: String?) { + message?.let { + try { + val json = JSONObject(it) + if (json["type"] == "tv") { + val listType = object : TypeToken() {}.type + val plan: Plan = Gson().fromJson(json["data"].toString(), listType) + plan.pages.sortedBy { it.id } + _devicePagesList.value = plan + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + override fun onClose(code: Int, reason: String?, remote: Boolean) { + initConnectedDeviceData() + client?.close() + client = null + } + + override fun onError(ex: Exception?) { + ex?.printStackTrace() + } + } + client?.connect() + } + } + + // 开始发现服务 + fun startDiscovery(context: Context) { + nsdManager = context.getSystemService(Context.NSD_SERVICE) as NsdManager + discoveryListener = object : NsdManager.DiscoveryListener { + override fun onServiceFound(service: NsdServiceInfo) { + // 异步解析服务 + nsdManager.resolveService(service, object : NsdManager.ResolveListener { + override fun onServiceResolved(nsdServiceInfo: NsdServiceInfo) { + val host = nsdServiceInfo.host.hostAddress + val port = nsdServiceInfo.port + if (isServiceAvailable(host, port)) { + _devices.value = + (_devices.value + nsdServiceInfo).distinctBy { it.serviceName } + connectToTv(nsdServiceInfo) + } else { + Log.w("NSD", "服务不可达: $host:$port") + } + } + + override fun onResolveFailed(serviceInfo: NsdServiceInfo?, errorCode: Int) {} + }) + } + + override fun onServiceLost(service: NsdServiceInfo) { + _devices.value = _devices.value.filter { it.serviceName != service.serviceName } + } + + override fun onDiscoveryStarted(serviceType: String) {} + override fun onDiscoveryStopped(serviceType: String) {} + override fun onStartDiscoveryFailed(serviceType: String, errorCode: Int) {} + override fun onStopDiscoveryFailed(serviceType: String, errorCode: Int) {} + } + + nsdManager.discoverServices( + "_bbit_show._tcp.", + NsdManager.PROTOCOL_DNS_SD, + discoveryListener + ) + _autoSearching.value = true + } + + fun isServiceAvailable(ip: String, port: Int, timeout: Int = 1000): Boolean { + return try { + Socket().use { socket -> + socket.connect(InetSocketAddress(ip, port), timeout) + } + true + } catch (e: IOException) { + e.printStackTrace() + false + } + } + + /** + * 手动断开连接 + */ + fun disconnect() { + client?.close() + client = null + initConnectedDeviceData() + } + + // 停止发现 + fun stopDiscovery() { + discoveryListener?.let { + nsdManager.stopServiceDiscovery(it) + discoveryListener = null + } + _autoSearching.value = false + } + + /** + * 基础控制 + */ + fun next() = sendAction("next") + fun prev() = sendAction("prev") + fun reload() = sendAction("reload") + fun stop() = sendAction("stop") + + /** + * 多页控制 + */ + fun nextPage() = sendAction("nextPage") + fun prevPage() = sendAction("prevPage") + fun reloadAll() = sendAction("reload_all") + fun switchPage(id: UUID) = sendAction("switchPage", id.toString()) + fun loadList(content: String) = sendAction("load_list", content) + + private fun sendAction(action: String, data: String? = null) { + val json = JSONObject() + json.put("action", action) + if (data != null) json.put("data", data) + client?.send(json.toString()) + Log.d("WebSocket", "发送消息: $json") + } + + + fun closeDrawer() { + _isDrawerOpen.value = false + } + + fun public() { + doInIoThread { + _drawerContent.value = { + LazyColumn { + item { + Text( + text = "选择方案", + modifier = M + .padding(horizontal = 16.dp, vertical = 8.dp) + .fillMaxWidth(), + fontSize = MaterialTheme.typography.headlineLarge.fontSize, + fontWeight = FontWeight.Bold + ) + } + items(items = _plans.value) { plan -> + Button( + modifier = M.fillMaxWidth(), + onClick = { + // 发送方案数据 + val gson = GsonBuilder() + .setDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") + .create() + + val jsonString = gson.toJson(plan) + loadList(jsonString) + _isDrawerOpen.value = false + } + ) { + Text(plan.name) + } + } + } + } + _isDrawerOpen.value = true + } + } + + fun addPlan() { + doInIoThread { + _drawerContent.value = { + var name by remember { mutableStateOf("") } + var autoRefreshTimes by remember { mutableStateOf("0") } + Column { + Text( + text = "新建方案", + modifier = M + .padding(horizontal = 16.dp, vertical = 8.dp) + .fillMaxWidth(), + fontSize = MaterialTheme.typography.headlineLarge.fontSize, + fontWeight = FontWeight.Bold + ) + Column(modifier = M.padding(horizontal = 16.dp)) { + TextField( + modifier = M.fillMaxWidth(), + value = name, + onValueChange = { name = it }, + label = { Text("方案名称") }, + singleLine = true + ) + TextField( + modifier = M.fillMaxWidth(), + value = autoRefreshTimes, + onValueChange = { autoRefreshTimes = it }, + label = { Text("自动刷新时间(0为不刷新)") }, + singleLine = true, + // 限制为数字输入 + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + ) + Button(modifier = M.fillMaxWidth(), onClick = { + doInIoThread { + PlanTempDatabase.insert( + Plan( + id = UUID.randomUUID(), + name = name, + createTime = Date(), + cycleRefreshTime = autoRefreshTimes.toIntOrNull() ?: 0, + pages = emptyList() + ) + ) + _plans.value = PlanTempDatabase.getAll() + _isDrawerOpen.value = false + } + }) { Text("新建") } + } + } + } + _isDrawerOpen.value = true + } + } + + fun editPlan(plan: Plan) { + doInIoThread { + _drawerContent.value = { + var name by remember { mutableStateOf(plan.name) } + var autoRefreshTimes by remember { mutableStateOf(plan.cycleRefreshTime.toString()) } + Column { + Text( + text = "编辑方案", + modifier = M + .padding(horizontal = 16.dp, vertical = 8.dp) + .fillMaxWidth(), + fontSize = MaterialTheme.typography.headlineLarge.fontSize, + fontWeight = FontWeight.Bold + ) + Column(modifier = M.padding(horizontal = 16.dp)) { + TextField( + modifier = M.fillMaxWidth(), + value = name, + onValueChange = { name = it }, + label = { Text("方案名称") }, + singleLine = true + ) + TextField( + modifier = M.fillMaxWidth(), + value = autoRefreshTimes, + onValueChange = { autoRefreshTimes = it }, + label = { Text("自动刷新时间(0为不刷新)") }, + singleLine = true, + // 限制为数字输入 + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + ) + Row( + modifier = M.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Button(modifier = M.weight(1f), onClick = { + doInIoThread { + PlanTempDatabase.update({ it.id == plan.id }, update = { + it.name = name + it.cycleRefreshTime = autoRefreshTimes.toIntOrNull() ?: 0 + }) { + _plans.value = PlanTempDatabase.getAll() + _isDrawerOpen.value = false + } + } + }) { Text("确定") } + Button(modifier = M.weight(1f), onClick = { + PlanTempDatabase.delete({ + it.id == plan.id + }) { + _plans.value = PlanTempDatabase.getAll() + _isDrawerOpen.value = false + } + }) { Text("删除") } + } + } + } + } + _isDrawerOpen.value = true + } + } + + fun editPage(plan: Plan) { + doInIoThread {_drawerContent.value = { + // 保存原始快照用于比较 + val originalList = remember { plan.pages.map { it.copy() } } + var list by remember { mutableStateOf(plan.pages.map { it.copy() }) } + + // 判断列表是否被修改 + val isModified by remember(list) { + derivedStateOf { + if (list.size != originalList.size) return@derivedStateOf true + list.zip(originalList).any { (cur, orig) -> + cur.id != orig.id || cur.name != orig.name || cur.url != orig.url || cur.sort != orig.sort + } + } + } + + Column(modifier = M.fillMaxSize()) { + Text( + text = "方案细则 - ${plan.name}", + modifier = M.padding(horizontal = 16.dp, vertical = 8.dp), + fontSize = MaterialTheme.typography.headlineLarge.fontSize, + fontWeight = FontWeight.Bold + ) + + Button(modifier = M.fillMaxWidth(), onClick = { + list = list + Page( + id = UUID.randomUUID(), + sort = list.size + 1, + name = "新页面", + url = "" + ) + }) { Text("新增") } + + LazyColumn(modifier = M.weight(1f)) { + itemsIndexed(items = list) { index, page -> + var pageSort by remember { mutableStateOf(page.sort.toString()) } + var pageName by remember { mutableStateOf(page.name) } + var pageUrl by remember { mutableStateOf(page.url) } + + Row(modifier = M.fillMaxWidth().padding(vertical = 5.dp)) { + TextField( + modifier = M.weight(2f).padding(horizontal = 4.dp), + value = pageSort, + onValueChange = { newSort -> + pageSort = newSort + list = list.toMutableList().also { l -> + l[index] = l[index].copy(sort = newSort.toIntOrNull() ?: 0) + } + }, + label = { Text("序号") }, + singleLine = true + ) + TextField( + modifier = M.weight(3f).padding(horizontal = 4.dp), + value = pageName, + onValueChange = { newName -> + pageName = newName + list = list.toMutableList().also { l -> + l[index] = l[index].copy(name = newName) + } + }, + label = { Text("名称") }, + singleLine = true + ) + } + + Row(modifier = M.fillMaxWidth().padding(vertical = 5.dp)) { + TextField( + modifier = M.weight(4f).padding(horizontal = 4.dp), + value = pageUrl, + onValueChange = { newUrl -> + pageUrl = newUrl + list = list.toMutableList().also { l -> + l[index] = l[index].copy(url = newUrl) + } + }, + label = { Text("网址") }, + singleLine = true, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri) + ) + Button( + modifier = M.padding(horizontal = 4.dp), + onClick = { + list = list.filter { it.id != page.id } + } + ) { Text("删除") } + } + } + } + + if (isModified) { + Button(modifier = M.fillMaxWidth(), onClick = { + doInIoThread { + PlanTempDatabase.update({ it.id == plan.id }, update = { + it.pages = list.sortedBy { it.sort } + }) { + _plans.value = PlanTempDatabase.getAll() + _isDrawerOpen.value = false + } + } + }) { Text("保存") } + } + } + } + + _isDrawerOpen.value = true + } + } + + fun initConnectedDeviceData() { + _devicePagesList.value = null + _device.value = null + _plans.value = PlanTempDatabase.getAll() + + } +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/ui/compose/ConnectScreen.kt b/phone/src/main/java/com/bbitcn/phone/ui/compose/ConnectScreen.kt new file mode 100644 index 0000000..6801cc6 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/compose/ConnectScreen.kt @@ -0,0 +1,101 @@ +package com.bbitcn.phone.ui.compose + +import android.R.attr.port +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.selection.selectableGroup +import androidx.compose.material3.Button +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.bbitcn.phone.ui.FunctionModel +import com.bbitcn.phone.ui.MyFuncButtonRow +import com.bbitcn.phone.ui.PhoneViewModel + +@Composable +fun ConnectScreen(viewModel: PhoneViewModel) { + var ip by remember { mutableStateOf("10.0.4.74") } + val device by viewModel.device.collectAsState() + val autoSearching by viewModel.autoSearching.collectAsState() + + FunctionModel("状态信息") { + Column { + Text( + "连接状态:" + if (device == null) "未连接" else "已连接到设备<${device?.serviceName}>", + fontSize = MaterialTheme.typography.bodyLarge.fontSize + ) + Text( + "扫描状态:" + if (autoSearching) "正在自动搜索中" else "", + fontSize = MaterialTheme.typography.bodyLarge.fontSize + ) + } + } + FunctionModel("自动连接") { + Column { + val devicesList by viewModel.devices.collectAsState() + LazyRow { + items(items = devicesList) { + Button(onClick = { + viewModel.connectToTv(it) + }) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text( + it.serviceName, + fontSize = MaterialTheme.typography.bodyLarge.fontSize + ) + Text( + it.host.hostAddress + ":" + it.port, + fontSize = MaterialTheme.typography.bodyMedium.fontSize + ) + } + } + } + } + val context = LocalContext.current + MyFuncButtonRow { + Button(enabled = !autoSearching, onClick = { + viewModel.startDiscovery(context) + }) { + Text("开始搜索") + } + Button(enabled = autoSearching, onClick = { + viewModel.stopDiscovery() + }) { + Text("停止搜索") + } + } + } + } + FunctionModel("手动连接") { + Column { + TextField( + value = ip, + onValueChange = { ip = it }, + label = { Text("设备IP地址(可通过点击电视菜单键查看)") }) + MyFuncButtonRow { + Button(onClick = { + viewModel.connectToTvByIp(ip) + }) { Text("连接") } + Button(onClick = { viewModel.disconnect() }) { + Text("断开") + } + } + } + } +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/ui/compose/ControlScreen.kt b/phone/src/main/java/com/bbitcn/phone/ui/compose/ControlScreen.kt new file mode 100644 index 0000000..03b26fb --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/compose/ControlScreen.kt @@ -0,0 +1,92 @@ +package com.bbitcn.phone.ui.compose + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.bbitcn.phone.M +import com.bbitcn.phone.ui.FunctionModel +import com.bbitcn.phone.ui.MyFuncButtonRow +import com.bbitcn.phone.ui.PhoneViewModel + +@Composable +fun ControlScreen(viewModel: PhoneViewModel) { + FunctionModel("设备状态") { + val device by viewModel.device.collectAsState() + if (device == null) { + Text("连接已断开") + } else { + Column { + Text("设备名称:${device?.serviceName}") + Text("设备地址:${device?.host?.hostAddress}") + } + } + } + FunctionModel("基础控制") { + MyFuncButtonRow { + Button(onClick = { + viewModel.prev() + }) { Text("后退") } + Button(onClick = { + viewModel.next() + }) { Text("前进") } + Button(onClick = { + viewModel.reload() + }) { Text("刷新") } + Button(onClick = { + viewModel.stop() + }) { Text("停止") } + } + } + FunctionModel("多页控制") { + Column { + MyFuncButtonRow { + Button(onClick = { + viewModel.prevPage() + }) { Text("上一页") } + Button(onClick = { + viewModel.nextPage() + }) { Text("下一页") } + Button(onClick = { + viewModel.reloadAll() + }) { Text("刷新") } + Button(onClick = { + viewModel.public() + }) { Text("发布") } + } + } + } + val devicePagesList by viewModel.devicePagesList.collectAsState() + devicePagesList?.let { + FunctionModel("当前设备页面") { + LazyColumn { + items(items = it.pages) { + Button(modifier = M.fillMaxWidth(), onClick = { + viewModel.switchPage(it.id) + }) { + Text( + modifier = M + .fillMaxWidth(), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + text = "${it.sort}.${it.name} - ${it.url}", + textAlign = TextAlign.Left + ) + } + } + } + } + } +} diff --git a/phone/src/main/java/com/bbitcn/phone/ui/compose/SetScreen.kt b/phone/src/main/java/com/bbitcn/phone/ui/compose/SetScreen.kt new file mode 100644 index 0000000..bc26d7f --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/compose/SetScreen.kt @@ -0,0 +1,45 @@ +package com.bbitcn.phone.ui.compose + +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Button +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.input.pointer.pointerInput +import com.bbitcn.phone.M +import com.bbitcn.phone.ui.FunctionModel +import com.bbitcn.phone.ui.PhoneViewModel + +@Composable +fun SetScreen(viewModel: PhoneViewModel) { + FunctionModel("页面配置") { + val plans by viewModel.plans.collectAsState() + LazyColumn { + items(items = plans) { plan -> + Row(modifier = M.fillMaxWidth()) { + Button( + modifier = M.weight(1f), onClick = { + // 编辑计划 + viewModel.editPlan(plan) + }) { Text(modifier = M.fillMaxWidth(), text = plan.name) } + Button(onClick = { + viewModel.editPage(plan) + }) { Text("编辑细则") } + } + } + } + } +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/ui/theme/Color.kt b/phone/src/main/java/com/bbitcn/phone/ui/theme/Color.kt new file mode 100644 index 0000000..051e705 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package com.bbitcn.phone.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/ui/theme/Theme.kt b/phone/src/main/java/com/bbitcn/phone/ui/theme/Theme.kt new file mode 100644 index 0000000..9b35784 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/theme/Theme.kt @@ -0,0 +1,58 @@ +package com.bbitcn.phone.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun BBITShowTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/ui/theme/Type.kt b/phone/src/main/java/com/bbitcn/phone/ui/theme/Type.kt new file mode 100644 index 0000000..4275b32 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.bbitcn.phone.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/utls/MMKVUtil.java b/phone/src/main/java/com/bbitcn/phone/utls/MMKVUtil.java new file mode 100644 index 0000000..8851557 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/utls/MMKVUtil.java @@ -0,0 +1,107 @@ +package com.bbitcn.phone.utls; + + +import android.content.Context; +import android.os.Parcelable; + +import com.tencent.mmkv.MMKV; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * MMKV工具类 + */ +public class MMKVUtil { + private static MMKV mmkvInstance; + + private MMKVUtil() { + } + + /** + * 初始化MMKV,只能在Application中初始化一次 + */ + public static void init(Context applicationContext) { + MMKV.initialize(applicationContext); + mmkvInstance = MMKV.defaultMMKV(); + } + + /** + * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 + */ + public static void put(String key, T object) { + if (object instanceof String) { + mmkvInstance.encode(key, (String) object); + } else if (object instanceof Integer) { + mmkvInstance.encode(key, (Integer) object); + } else if (object instanceof Boolean) { + mmkvInstance.encode(key, (Boolean) object); + } else if (object instanceof Float) { + mmkvInstance.encode(key, (Float) object); + } else if (object instanceof Long) { + mmkvInstance.encode(key, (Long) object); + } else if (object instanceof Double) { + mmkvInstance.encode(key, (Double) object); + } else if (object instanceof Set) { + mmkvInstance.encode(key, (Set) object); + } else if (object instanceof Parcelable) { + mmkvInstance.encode(key, (Parcelable) object); + } else { + mmkvInstance.encode(key, object == null ? "" : object.toString()); + } + } + + /** + * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 + */ + public static T get(String key, T defaultObject) { + if (defaultObject instanceof String || defaultObject == null) { + return (T) mmkvInstance.decodeString(key, (String) defaultObject); + } else if (defaultObject instanceof Integer) { + return (T) Integer.valueOf(mmkvInstance.decodeInt(key, (Integer) defaultObject)); + } else if (defaultObject instanceof Boolean) { + return (T) Boolean.valueOf(mmkvInstance.decodeBool(key, (Boolean) defaultObject)); + } else if (defaultObject instanceof Float) { + return (T) Float.valueOf(mmkvInstance.decodeFloat(key, (Float) defaultObject)); + } else if (defaultObject instanceof Long) { + return (T) Long.valueOf(mmkvInstance.decodeLong(key, (Long) defaultObject)); + } else if (defaultObject instanceof Double) { + return (T) Double.valueOf(mmkvInstance.decodeDouble(key, (Double) defaultObject)); + } else if (defaultObject instanceof Parcelable) { + Parcelable p = (Parcelable) defaultObject; + return (T) mmkvInstance.decodeParcelable(key, p.getClass()); + } else { + return null; + } + } + + /** + * 获得字符串 + */ + public static String get(String key) { + return mmkvInstance.decodeString(key, ""); + } + + /** + * 移除某个key值已经对应的值 + */ + public static void remove(String key) { + mmkvInstance.remove(key); + } + + /** + * 查询某个key是否已经存在 + */ + public boolean contains(String key) { + return mmkvInstance.contains(key); + } + + /** + * 清除所有数据 + */ + public static void clear() { + mmkvInstance.clear(); + } + +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/utls/PlanTempDatabase.kt b/phone/src/main/java/com/bbitcn/phone/utls/PlanTempDatabase.kt new file mode 100644 index 0000000..90d7332 --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/utls/PlanTempDatabase.kt @@ -0,0 +1,19 @@ +package com.bbitcn.phone.utls + +import com.bbitcn.phone.base.ParameterizedTypeImpl +import com.bbitcn.phone.model.Plan +import com.bbitcn.sericulture.base.BaseListTempDataBase +import kotlin.jvm.java +import java.lang.reflect.Type + +object PlanTempDatabase : BaseListTempDataBase() { + + override fun getKey(): String { + return "MENU_PERMISSION_LIST2" + } + + override fun getType(): Type { + return ParameterizedTypeImpl(Plan::class.java) + } + +} \ No newline at end of file diff --git a/phone/src/main/java/com/bbitcn/phone/utls/PollingTask.kt b/phone/src/main/java/com/bbitcn/phone/utls/PollingTask.kt new file mode 100644 index 0000000..3a3dd4a --- /dev/null +++ b/phone/src/main/java/com/bbitcn/phone/utls/PollingTask.kt @@ -0,0 +1,160 @@ +package com.bbitcn.phone.utls + +import android.os.Handler +import android.os.Looper +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService +import java.util.concurrent.ScheduledFuture +import java.util.concurrent.TimeUnit + +class PollingTask private constructor() { + private var scheduler: ScheduledExecutorService? = null + private var taskMap: MutableMap>? = null + + // 私有化构造函数,确保外部不能直接实例化 + init { + createNewScheduler() + } + + // 创建新的 ScheduledExecutorService 实例 + private fun createNewScheduler() { + if (scheduler != null && !scheduler!!.isShutdown) { + scheduler!!.shutdown() + } + scheduler = Executors.newScheduledThreadPool(3) + taskMap = HashMap() + } + + /** + * 启动延迟任务 + * + * @param taskId 任务ID,用于唯一标识该任务 + * @param delaySeconds 延迟时间(以秒为单位) + * @param task 需要执行的任务 + */ + fun startDelayedTask(taskId: String, delaySeconds: Long, task: Runnable) { + stopTask(taskId) // 如果已有相同ID的任务,先停止 + + val future = scheduler!!.schedule({ + task.run() // 执行任务 + }, delaySeconds, TimeUnit.SECONDS) + taskMap!![taskId] = future // 保存任务的ScheduledFuture + } + + /** + * 启动IO线程的轮询任务 + * + * @param taskId 任务ID,用于唯一标识该任务 + * @param intervalSeconds 轮询间隔时间(以秒为单位) + * @param task 需要在IO线程中执行的任务 + */ + fun startPollingTaskOnIOThread(taskId: String, intervalSeconds: Long, task: Runnable) { + startPollingTask(taskId, intervalSeconds) { + task.run() + } + } + + /** + * 启动UI线程的轮询任务 + * + * @param taskId 任务ID,用于唯一标识该任务 + * @param intervalSeconds 轮询间隔时间(以秒为单位) + * @param task 需要在UI线程中执行的任务 + */ + fun startPollingTaskOnUIThread(taskId: String, intervalSeconds: Long, task: Runnable) { + startPollingTask(taskId, intervalSeconds) { + // 执行UI线程任务(需要在UI线程中执行) + Handler(Looper.getMainLooper()).post(task) + } + } + + /** + * 启动IO线程任务并在UI线程中处理结果的轮询任务 + * + * @param taskId 任务ID,用于唯一标识该任务 + * @param intervalSeconds 轮询间隔时间(以秒为单位) + * @param ioTask 需要在IO线程中执行的任务 + * @param uiTask 需要在UI线程中执行的任务 + * @param IO任务返回结果的类型 + */ + fun startPollingTask( + taskId: String, + intervalSeconds: Long, + ioTask: IRxIOTask, + uiTask: IRxUITask + ) { + startPollingTask(taskId, intervalSeconds) { + // 执行IO线程任务 + val result = ioTask.doInIOThread() + // 将结果传递给UI线程任务 + Handler(Looper.getMainLooper()).post { uiTask.doInUIThread(result) } + } + } + + /** + * 启动基础轮询任务,供内部使用 + * + * @param taskId 任务ID,用于唯一标识该任务 + * @param intervalSeconds 轮询间隔时间(以秒为单位) + * @param task 需要执行的任务 + */ + private fun startPollingTask(taskId: String, intervalSeconds: Long, task: Runnable) { + stopTask(taskId) // 如果已有相同ID的任务,先停止 + val future = scheduler!!.scheduleWithFixedDelay(task, 0, intervalSeconds, TimeUnit.SECONDS) + +// val future = scheduler!!.scheduleAtFixedRate(task, 0, intervalSeconds, TimeUnit.SECONDS) + taskMap!![taskId] = future // 保存任务的ScheduledFuture + } + + // 停止所有任务 + fun stopAllTasks() { + for (taskId in taskMap!!.keys) { +// test("关闭轮询任务$taskId") + } + if (scheduler != null && !scheduler!!.isShutdown) { + scheduler!!.shutdownNow() // 超时后强制停止 + taskMap!!.clear() // 清空任务映射 + } + // 从实例映射中移除当前实例 + instances.values.remove(this) + } + + /** + * 停止轮询任务 + * + * @param taskId 任务ID + */ + fun stopTask(taskId: String) { + val future = taskMap!![taskId] + if (future != null) { + future.cancel(true) // 取消任务,中断正在执行的任务 + taskMap!!.remove(taskId) // 从任务列表中移除 + } + } + + // 定义IO任务接口 + interface IRxIOTask { + fun doInIOThread(): T + } + + // 定义UI任务接口 + interface IRxUITask { + fun doInUIThread(t: T) + } + + companion object { + private val instances: MutableMap = HashMap() + + @Synchronized + fun getInstance(): PollingTask = getInstance("MAIN") + + // 获取基于ID的单例实例 + @Synchronized + fun getInstance(id: String): PollingTask { + if (!instances.containsKey(id)) { + instances[id] = PollingTask() + } + return instances[id]!! + } + } +} \ No newline at end of file diff --git a/phone/src/main/res/mipmap-hdpi/logo.png b/phone/src/main/res/mipmap-hdpi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..de4102afad8723ac4d053a0a4a075aac434da9ec GIT binary patch literal 99105 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

  • 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 + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/phone/src/main/res/values/strings.xml b/phone/src/main/res/values/strings.xml new file mode 100644 index 0000000..d4e99e0 --- /dev/null +++ b/phone/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + BBIT展示屏控制工具 + \ No newline at end of file diff --git a/phone/src/main/res/values/themes.xml b/phone/src/main/res/values/themes.xml new file mode 100644 index 0000000..6db3f5f --- /dev/null +++ b/phone/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +