From 1e3175db83ef06c09e15c5fc317fa4d157a71059 Mon Sep 17 00:00:00 2001 From: moreoronce Date: Sat, 5 Oct 2024 12:35:47 +0800 Subject: [PATCH] init --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/appInsightsSettings.xml | 26 +++ .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 10 + .idea/gradle.xml | 18 ++ .idea/kotlinc.xml | 6 + .idea/migrations.xml | 10 + .idea/misc.xml | 10 + .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle.kts | 77 ++++++++ app/proguard-rules.pro | 21 ++ .../lobchat/ExampleInstrumentedTest.kt | 24 +++ app/src/main/AndroidManifest.xml | 26 +++ .../java/com/example/lobchat/MainActivity.kt | 113 +++++++++++ .../com/example/lobchat/ui/theme/Color.kt | 11 ++ .../com/example/lobchat/ui/theme/Theme.kt | 58 ++++++ .../java/com/example/lobchat/ui/theme/Type.kt | 34 ++++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++ app/src/main/res/layout/activity_main.xml | 11 ++ app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 10141 bytes app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/styles.xml | 7 + app/src/main/res/values/themes.xml | 5 + app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../com/example/lobchat/ExampleUnitTest.kt | 17 ++ build.gradle.kts | 5 + gradle.properties | 23 +++ gradle/libs.versions.toml | 37 ++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle.kts | 24 +++ 38 files changed, 1129 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/appInsightsSettings.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/lobchat/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/example/lobchat/MainActivity.kt create mode 100644 app/src/main/java/com/example/lobchat/ui/theme/Color.kt create mode 100644 app/src/main/java/com/example/lobchat/ui/theme/Theme.kt create mode 100644 app/src/main/java/com/example/lobchat/ui/theme/Type.kt create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/example/lobchat/ExampleUnitTest.kt 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 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.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 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/appInsightsSettings.xml b/.idea/appInsightsSettings.xml new file mode 100644 index 0000000..371f2e2 --- /dev/null +++ b/.idea/appInsightsSettings.xml @@ -0,0 +1,26 @@ + + + + + + \ 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/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..32522c1 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..fdf8d99 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ 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/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..dbe16d1 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,77 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} + +android { + namespace = "com.example.lobchat" // 使用 namespace 代替 package 声明 + compileSdk = 34 + + defaultConfig { + applicationId = "com.example.lobchat" + minSdk = 30 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = "1.8" + } + + buildFeatures { + compose = true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.5.1" + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + implementation(libs.okhttp) + implementation(libs.okhttp.logging) + 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) + implementation(libs.androidx.appcompat) + + 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) +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/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/app/src/androidTest/java/com/example/lobchat/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/lobchat/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..669deb6 --- /dev/null +++ b/app/src/androidTest/java/com/example/lobchat/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.lobchat + +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.example.lobchat", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a2f806f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/example/lobchat/MainActivity.kt b/app/src/main/java/com/example/lobchat/MainActivity.kt new file mode 100644 index 0000000..77fe764 --- /dev/null +++ b/app/src/main/java/com/example/lobchat/MainActivity.kt @@ -0,0 +1,113 @@ +package com.example.lobchat + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.webkit.* +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import android.content.pm.PackageManager +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import android.widget.Toast + +class MainActivity : AppCompatActivity() { + + private lateinit var webView: WebView + private var filePathCallback: ValueCallback>? = null + + // 用于替代 startActivityForResult 的新文件选择器启动器 + private lateinit var fileChooserLauncher: ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + // 检查并请求读取权限 + if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1) + } + + // 设置状态栏为透明,使系统自动使用默认的颜色 + window.statusBarColor = resources.getColor(android.R.color.transparent, theme) + + // 初始化 WebView + webView = findViewById(R.id.webview) + + // 启用 JavaScript + val webSettings: WebSettings = webView.settings + webSettings.javaScriptEnabled = true + webSettings.domStorageEnabled = true + + // 初始化文件选择器启动器 + fileChooserLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK && result.data != null) { + val resultUri = result.data?.data + if (filePathCallback != null) { + filePathCallback?.onReceiveValue(resultUri?.let { arrayOf(it) }) + filePathCallback = null + } + } else { + filePathCallback?.onReceiveValue(null) + filePathCallback = null + } + } + + // 确保链接在 WebView 内部打开,而不是在默认浏览器中打开 + webView.webViewClient = object : WebViewClient() { + override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) { + Toast.makeText(this@MainActivity, "Network error, please try again later.", Toast.LENGTH_SHORT).show() + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + // 注入 JavaScript 来禁用 PWA 安装提示 + view?.evaluateJavascript( + """ + window.addEventListener('beforeinstallprompt', function(e) { + e.preventDefault(); + console.log('Install prompt blocked by WebView'); + }); + """.trimIndent(), null + ) + } + } + + // 设置 WebChromeClient 以处理文件选择 + webView.webChromeClient = object : WebChromeClient() { + override fun onShowFileChooser( + webView: WebView?, + filePathCallback: ValueCallback>, + fileChooserParams: FileChooserParams? + ): Boolean { + // 处理新的文件选择请求 + this@MainActivity.filePathCallback?.onReceiveValue(null) + this@MainActivity.filePathCallback = filePathCallback + + val intent = Intent(Intent.ACTION_GET_CONTENT) + intent.addCategory(Intent.CATEGORY_OPENABLE) + intent.type = "image/*" + + // 使用新的 ActivityResultLauncher 启动文件选择器 + fileChooserLauncher.launch(Intent.createChooser(intent, "Select Picture")) + return true + } + } + + // 加载您的网站 + webView.loadUrl("https://chat.dolingou.com") // 替换为您的 URL + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == 1) { + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + Toast.makeText(this, "Read permission granted", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this, "Read permission denied", Toast.LENGTH_SHORT).show() + } + } + } +} diff --git a/app/src/main/java/com/example/lobchat/ui/theme/Color.kt b/app/src/main/java/com/example/lobchat/ui/theme/Color.kt new file mode 100644 index 0000000..71c753e --- /dev/null +++ b/app/src/main/java/com/example/lobchat/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package com.example.lobchat.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/app/src/main/java/com/example/lobchat/ui/theme/Theme.kt b/app/src/main/java/com/example/lobchat/ui/theme/Theme.kt new file mode 100644 index 0000000..9958057 --- /dev/null +++ b/app/src/main/java/com/example/lobchat/ui/theme/Theme.kt @@ -0,0 +1,58 @@ +package com.example.lobchat.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 LobchatTheme( + 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/app/src/main/java/com/example/lobchat/ui/theme/Type.kt b/app/src/main/java/com/example/lobchat/ui/theme/Type.kt new file mode 100644 index 0000000..9397c0f --- /dev/null +++ b/app/src/main/java/com/example/lobchat/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.example.lobchat.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/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..c725d70 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0ecce379f4c5c5fa24b0918bc3b2d08e250a3fbd GIT binary patch literal 10141 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 + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..83ac948 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + lobchat + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..58bc6fa --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..dae0348 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +