From 2b446a5fd5d8f9b8c0f1e3acef1eef7ad9adb6f9 Mon Sep 17 00:00:00 2001 From: tj <1378534974@qq.com> Date: 星期三, 09 四月 2025 10:25:27 +0800 Subject: [PATCH] 1.1 --- app/src/main/res/values-v23/themes.xml | 19 .gitignore | 2 app/src/main/res/values/styles.xml | 8 app/src/main/res/layout/activity_wxpay_entry.xml | 10 app/src/main/res/values/themes.xml | 6 keystore/sms-manager.jks | 0 app/src/main/java/com/example/firstapp/activity/VipActivity.kt | 22 + gradle/libs.versions.toml | 2 app/src/main/res/values/colors.xml | 3 app/src/main/res/layout/activity_setting.xml | 61 ++++ app/src/main/res/values-night/themes.xml | 12 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 16 + app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt | 32 ++ app/src/main/java/com/example/firstapp/activity/LoginActivity.kt | 116 ++++++++ keystore/keystore.jks | 0 app/build.gradle | 32 ++ app/src/main/java/com/example/firstapp/activity/SettingActivity.kt | 141 ++++++++++ app/src/main/res/layout/fragment_member_info_card.xml | 17 + app/src/main/res/values/strings.xml | 1 app/src/main/AndroidManifest.xml | 24 + app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt | 3 app/src/main/res/layout/login_protocol_dialog_custom.xml | 89 ++++++ app/src/main/res/mipmap/setting.png | 0 app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 6 app/src/main/java/com/example/firstapp/pay/alipay/PayResult.kt | 0 app/src/main/res/navigation/nav_graph2.xml | 28 ++ app/src/main/java/com/example/firstapp/pay/alipay/AliPayHelper.kt | 0 app/src/main/res/layout/fragment_notifications.xml | 21 + README.md | 5 app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt | 35 ++ app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt | 42 +++ gradle.properties | 5 /dev/null | 0 app/src/main/java/com/example/firstapp/utils/AppGlobals.kt | 29 ++ app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java | 44 +++ 35 files changed, 802 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 8654057..cc3f079 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ .externalNativeBuild .cxx local.properties + +.idea/ diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 7643783..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,123 +0,0 @@ -<component name="ProjectCodeStyleConfiguration"> - <code_scheme name="Project" version="173"> - <JetCodeStyleSettings> - <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> - </JetCodeStyleSettings> - <codeStyleSettings language="XML"> - <option name="FORCE_REARRANGE_MODE" value="1" /> - <indentOptions> - <option name="CONTINUATION_INDENT_SIZE" value="4" /> - </indentOptions> - <arrangement> - <rules> - <section> - <rule> - <match> - <AND> - <NAME>xmlns:android</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>xmlns:.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - <order>BY_NAME</order> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*:id</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*:name</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>name</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>style</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - <order>BY_NAME</order> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> - </AND> - </match> - <order>ANDROID_ATTRIBUTE_ORDER</order> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>.*</XML_NAMESPACE> - </AND> - </match> - <order>BY_NAME</order> - </rule> - </section> - </rules> - </arrangement> - </codeStyleSettings> - <codeStyleSettings language="kotlin"> - <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> - </codeStyleSettings> - </code_scheme> -</component> \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ -<component name="ProjectCodeStyleConfiguration"> - <state> - <option name="USE_PER_PROJECT_SETTINGS" value="true" /> - </state> -</component> \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index b589d56..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="CompilerConfiguration"> - <bytecodeTargetLevel target="17" /> - </component> -</project> \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml deleted file mode 100644 index e918287..0000000 --- a/.idea/deploymentTargetSelector.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="deploymentTargetSelector"> - <selectionStates> - <SelectionState runConfigName="app"> - <option name="selectionMode" value="DROPDOWN" /> - <DropdownSelection timestamp="2025-03-28T01:17:48.834725500Z"> - <Target type="DEFAULT_BOOT"> - <handle> - <DeviceId pluginId="PhysicalDevice" identifier="serial=HMQNW19A24001406" /> - </handle> - </Target> - </DropdownSelection> - <DialogSelection /> - </SelectionState> - </selectionStates> - </component> -</project> \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index cb865f6..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="GradleMigrationSettings" migrationVersion="1" /> - <component name="GradleSettings"> - <option name="linkedExternalProjectsSettings"> - <GradleProjectSettings> - <option name="externalProjectPath" value="$PROJECT_DIR$" /> - <option name="gradleJvm" value="jbr-17" /> - <option name="modules"> - <set> - <option value="$PROJECT_DIR$" /> - <option value="$PROJECT_DIR$/app" /> - </set> - </option> - <option name="resolveExternalAnnotations" value="false" /> - </GradleProjectSettings> - </option> - </component> -</project> \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml deleted file mode 100644 index fdf8d99..0000000 --- a/.idea/kotlinc.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="KotlinJpsPluginSettings"> - <option name="version" value="1.9.0" /> - </component> -</project> \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml deleted file mode 100644 index f8051a6..0000000 --- a/.idea/migrations.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectMigrations"> - <option name="MigrateToGradleLocalJavaHome"> - <set> - <option value="$PROJECT_DIR$" /> - </set> - </option> - </component> -</project> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 8978d23..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<project version="4"> - <component name="ExternalStorageConfigurationManager" enabled="true" /> - <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> - <output url="file://$PROJECT_DIR$/build/classes" /> - </component> - <component name="ProjectType"> - <option name="id" value="Android" /> - </component> -</project> \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 16660f1..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="RunConfigurationProducerService"> - <option name="ignoredProducers"> - <set> - <option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" /> - <option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" /> - <option value="com.intellij.execution.junit.PatternConfigurationProducer" /> - <option value="com.intellij.execution.junit.TestInClassConfigurationProducer" /> - <option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" /> - <option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" /> - <option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" /> - <option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" /> - </set> - </option> - </component> -</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$" vcs="Git" /> - </component> -</project> \ No newline at end of file diff --git a/README.md b/README.md index 2c07e83..eef1159 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ ## FirstApp2 -短信平台 +# 短信平台 + +# 密码 + # md5 ADC67C7C8E0BE3829D34E976D8EFCC9B diff --git a/app/build.gradle b/app/build.gradle index 3afa1de..efce529 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,8 @@ compileSdk 34 defaultConfig { - applicationId "com.example.firstapp" +// applicationId "com.example.firstapp" + applicationId "net.sourceforge.simcpux" minSdk 24 targetSdk 34 versionCode 1 @@ -27,7 +28,15 @@ release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug } + debug { + minifyEnabled false + debuggable true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug + } + } compileOptions { sourceCompatibility JavaVersion.VERSION_17 @@ -109,6 +118,23 @@ excludes += ["META-INF/*.kotlin_module", "META-INF/*.version", "kotlin/**", "DebugProbesKt.bin"] } } + + signingConfigs { + release { + storeFile file('../keystore/sms-manager.jks') + storePassword 'Cloudroam!@#123' + keyAlias 'sm' + keyPassword 'Cloudroam!@#123' + } + + debug { + storeFile file('../keystore/keystore.jks') + storePassword 'android' + keyAlias 'android' + } + } + + } dependencies { @@ -123,6 +149,7 @@ implementation libs.androidx.navigation.ui.ktx implementation libs.androidx.legacy.support.v4 implementation libs.androidx.recyclerview + implementation libs.androidx.activity testImplementation libs.junit androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.espresso.core @@ -294,4 +321,7 @@ implementation 'de.hdodenhof:circleimageview:3.1.0' implementation 'com.github.castorflex:SmoothProgressBar:1.1.0' + + api 'com.tencent.mm.opensdk:wechat-sdk-android:+' + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5e9d88c..cae52af 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -83,16 +83,29 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.FirstApp" - tools:targetApi="31" android:usesCleartextTraffic="true" - > + tools:targetApi="31"> + <activity + android:name=".activity.SettingActivity" + android:configChanges="orientation|keyboardHidden|screenSize" + android:exported="false" + android:label="@string/title_activity_setting" + android:theme="@style/Theme.FirstApp.Fullscreen" /> + <activity + android:name=".pay.wxpay.WXPayEntryActivity" + android:exported="true" + android:launchMode="singleTop" /> <!-- 微信支付回调组件别名 --> + <activity-alias + android:name="${applicationId}.wxapi.WXPayEntryActivity" + android:exported="true" + android:targetActivity=".pay.wxpay.WXPayEntryActivity" + android:theme="@android:style/Theme.NoDisplay" /> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="remove" /> - <activity android:name=".activity.VipActivity" @@ -127,11 +140,10 @@ android:theme="@style/Theme.ContentDetail" /> <activity android:name=".ui.profile.EditProfileActivity" - android:exported="false"/> + android:exported="false" /> <activity android:name=".ui.invitation.InvitationActivity" - android:exported="false"/> - + android:exported="false" /> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt b/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt index 3516e12..36ac653 100644 --- a/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt +++ b/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt @@ -1,9 +1,24 @@ package com.example.firstapp.activity +import android.app.AlertDialog import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import android.content.Intent +import android.graphics.Color +import android.text.SpannableString +import android.text.Spanned +import android.text.TextPaint +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.view.LayoutInflater +import android.view.View +import android.widget.Button +import android.widget.CheckBox +import android.widget.TextView +import com.example.firstapp.R import com.example.firstapp.databinding.ActivityLoginBinding +import com.example.firstapp.utils.PreferencesManager +import kotlin.system.exitProcess class LoginActivity : AppCompatActivity() { private lateinit var binding: ActivityLoginBinding @@ -13,6 +28,12 @@ binding = ActivityLoginBinding.inflate(layoutInflater) setContentView(binding.root) setupViews() + + val phone=PreferencesManager.getLastLoginPhone() + // 如果phone不存在则展示弹框 + if (phone.isNullOrEmpty()) { + showConfirmDialog() + } } private fun setupViews() { @@ -41,4 +62,99 @@ } } + private fun showConfirmDialog() { + val dialogView = LayoutInflater.from(this).inflate(R.layout.login_protocol_dialog_custom, null) + + val dialog = AlertDialog.Builder(this) + .setView(dialogView) + .create() + + dialog.window?.setBackgroundDrawableResource(R.drawable.dialog_background) + + val btnConfirm = dialogView.findViewById<Button>(R.id.btnConfirm) + btnConfirm.setOnClickListener { + dialog.dismiss() + } + val btnCancel = dialogView.findViewById<Button>(R.id.btnCancel) + btnCancel.setOnClickListener { + dialog.dismiss() + // 退出整个应用 + finishAffinity() // 关闭当前Activity和它之上的所有Activity + exitProcess(0) // 终止应用进程(需要引入 kotlin.system.exitProcess) + } + + // 👇 设置可点击文字逻辑 + val textView = dialogView.findViewById<TextView>(R.id.dialogMessage2) + val content = "您可以阅读「服务使用协议」和「隐私保护政策」了解相关信息。如果您同意,请点击同意,开始使用我们的服务。" + val spannableString = SpannableString(content) + + val serviceStart = content.indexOf("「服务使用协议」") + val serviceEnd = serviceStart + "「服务使用协议」".length + val privacyStart = content.indexOf("「隐私保护政策」") + val privacyEnd = privacyStart + "「隐私保护政策」".length + + spannableString.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + startContentActivity("用户协议", "服务使用协议") +// Toast.makeText(this@LoginActivity, "点击了服务使用协议", Toast.LENGTH_SHORT).show() + // 可跳转 WebViewActivity 或打开链接 + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = Color.parseColor("#1E88E5") + ds.isUnderlineText = false + } + }, serviceStart, serviceEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + + spannableString.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + startContentActivity("隐私协议", "隐私保护政策") +// Toast.makeText(this@LoginActivity, "点击了隐私保护政策", Toast.LENGTH_SHORT).show() + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = Color.parseColor("#1E88E5") + ds.isUnderlineText = false + } + }, privacyStart, privacyEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + + textView.text = spannableString + textView.movementMethod = LinkMovementMethod.getInstance() + + dialog.show() + } + + + /* private fun showConfirmDialog() { + + val dialogView = LayoutInflater.from(this).inflate(R.layout.login_protocol_dialog_custom, null) + + val dialog = AlertDialog.Builder(this) + .setView(dialogView) + .create() + + // 设置自定义背景 + dialog.window?.setBackgroundDrawableResource(R.drawable.dialog_background) + + // 获取按钮并设置点击事件 + val btnConfirm = dialogView.findViewById<Button>(R.id.btnConfirm) + btnConfirm.setOnClickListener { + // 将协议勾选上 + dialog.dismiss() + } + + // 显示对话框 + dialog.show() + }*/ + + private fun startContentActivity(id: String, title: String) { + val intent = Intent(this, ContentDetailActivity::class.java).apply { + putExtra(ContentDetailActivity.ID, id) + putExtra(ContentDetailActivity.EXTRA_TITLE, title) + } + startActivity(intent) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt new file mode 100644 index 0000000..017f581 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt @@ -0,0 +1,141 @@ +package com.example.firstapp.activity + +import androidx.appcompat.app.AppCompatActivity +import android.annotation.SuppressLint +import android.app.AlertDialog +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.Gravity +import android.view.MenuItem +import android.view.MotionEvent +import android.view.View +import android.view.WindowInsets +import android.widget.LinearLayout +import android.widget.TextView +import androidx.appcompat.widget.Toolbar +import androidx.lifecycle.ViewModelProvider +import com.example.firstapp.databinding.ActivitySettingBinding +import com.example.firstapp.R +import com.example.firstapp.ui.home.HomeViewModel + +/** + * An example full-screen activity that shows and hides the system UI (i.e. + * status bar and navigation/system bar) with user interaction. + */ +class SettingActivity : AppCompatActivity() { + + private lateinit var binding: ActivitySettingBinding + private val homeViewModel: HomeViewModel by lazy { + ViewModelProvider(this).get(HomeViewModel::class.java) + } + private var isFullscreen: Boolean = false + + @SuppressLint("ClickableViewAccessibility") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivitySettingBinding.inflate(layoutInflater) + setContentView(binding.root) + + var toolbar=binding.settingToolbar + + // 获取 Toolbar 并设置为 ActionBar + setSupportActionBar(toolbar) + + // 显示返回按钮 + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowHomeEnabled(true) + + // 设置标题(如果没有在 XML 中设置标题,可以在代码中动态设置) + supportActionBar?.title = "" + + + + + +// binding.settingExit.setOnClickListener(View.OnClickListener { +// +// homeViewModel.logout() +// // 跳转到vipActivity +// val intent = Intent(this, LoginActivity::class.java) +// intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK +// startActivity(intent) +// +// }) + + binding.settingExit.setOnClickListener { + // 弹出确认退出的对话框 + val alertDialog = AlertDialog.Builder(this) + .setTitle("确认退出") + .setMessage("您确定要退出吗?") + .setPositiveButton("确认") { dialog, _ -> + // 确认退出 + homeViewModel.logout() + + // 跳转到 LoginActivity 并清除之前的任务栈 + val intent = Intent(this, LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + + // 关闭当前页面 + finish() + } + .setNegativeButton("取消") { dialog, _ -> + // 取消退出操作 + dialog.dismiss() + } + .create() + + // 显示对话框 + alertDialog.show() + } + + + + } + + // 点击返回按钮时调用 + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == android.R.id.home) { + onBackPressed() + return true + } + return super.onOptionsItemSelected(item) + } + + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + + // Trigger the initial hide() shortly after the activity has been + // created, to briefly hint to the user that UI controls + // are available. + delayedHide(100) + } + + private fun toggle() { + if (isFullscreen) { + hide() + } else { + show() + } + } + + private fun hide() { + // Hide UI first + supportActionBar?.hide() + + } + + private fun show() { + + + } + + private fun delayedHide(delayMillis: Int) { + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/activity/VipActivity.kt b/app/src/main/java/com/example/firstapp/activity/VipActivity.kt index 9cf1f11..34a255c 100644 --- a/app/src/main/java/com/example/firstapp/activity/VipActivity.kt +++ b/app/src/main/java/com/example/firstapp/activity/VipActivity.kt @@ -252,8 +252,9 @@ Toast.makeText(this@VipActivity, "请勾选协议", Toast.LENGTH_LONG).show() return@launch // 直接 return,不往下执行 } - Toast.makeText(this@VipActivity, "功能暂未开放", Toast.LENGTH_LONG).show() - return@launch +// Toast.makeText(this@VipActivity, "功能暂未开放", Toast.LENGTH_LONG).show() +// return@launch + doWechatPay() } catch (e: Exception) { @@ -266,6 +267,23 @@ } + private fun doWechatPay() { + val map=HashMap<String,String>() + map["appId"]="wxb4ba3c02aa476ea1" + map["partnerid"]="1900006771" + map["package"]="Sign=WXPay" + map["noncestr"]="2ac6c60ebfe7e549fbbc922ac54269bb" + map["timeStamp"]="1606317975" + map["prepayid"]="wx25232614962974fb29d1227819cc3e000g" + map["sign"]="wx25232614962974fb29d1227819cc3e000g" + PayAbility.wxPay(this, map, Observer { success -> + if (success == 0) { + Toast.makeText(this@VipActivity, "支付失败", Toast.LENGTH_LONG).show() + } else { + Toast.makeText(this@VipActivity, "支付成功", Toast.LENGTH_LONG).show() + } + }) + } private fun vipCardInit() { val recyclerView = findViewById<RecyclerView>(R.id.recycler_view) diff --git a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt index 6be57ba..3da71cb 100644 --- a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt +++ b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt @@ -62,7 +62,7 @@ suspend fun getUserInfo(@Path("phone") phone: String): ApiResponse<UserInfo> @Multipart - @POST("flower/api/supplier/operation/update") + @POST("api/supplier/operation/update") suspend fun updateProfile( @Part("nickname") nickname: RequestBody, @Part avatar: MultipartBody.Part? @@ -78,8 +78,8 @@ // 创建Retrofit实例(单例) object RetrofitClient{ -// private const val BASE_URL ="http://192.168.1.198:8080/flower/" - private const val BASE_URL ="http://14.103.144.28:8080/flower/" + private const val BASE_URL ="http://192.168.1.198:8080/flower/" +// private const val BASE_URL ="http://14.103.144.28:8080/flower/" // 创建OkHttpClient,配置拦截器和超时时间 diff --git a/app/src/main/java/com/example/firstapp/pay/PayAbility.kt b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt deleted file mode 100644 index 5f2b35e..0000000 --- a/app/src/main/java/com/example/firstapp/pay/PayAbility.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.firstapp.pay - -import android.app.Activity -import androidx.lifecycle.Observer - -object PayAbility { - - - /** - * 支付宝支付方法 - */ - fun aliPay(activity: Activity, orderInfo: String, observer: Observer<PayResult>) { - AliPayHelper.pay(activity, orderInfo, observer) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt b/app/src/main/java/com/example/firstapp/pay/alipay/AliPayHelper.kt similarity index 100% rename from app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt rename to app/src/main/java/com/example/firstapp/pay/alipay/AliPayHelper.kt diff --git a/app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt b/app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt new file mode 100644 index 0000000..af84965 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt @@ -0,0 +1,35 @@ +package com.example.firstapp.pay + +import android.app.Activity +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Observer + +object PayAbility { + + + private val wxPayResultLiveData = MutableLiveData<Int?>() + /** + * 支付宝支付方法 + */ + fun aliPay(activity: Activity, orderInfo: String, observer: Observer<PayResult>) { + AliPayHelper.pay(activity, orderInfo, observer) + } + + /** + * 微信支付方法 + */ + fun wxPay(activity: Activity, orderInfo: Map<String,String>, observer: Observer<Int?>) { + if(activity is FragmentActivity){ + wxPayResultLiveData.observe(activity, observer) + } + WxPayHelper.pay(activity, orderInfo, observer) + } + + internal fun postWXPayResult(result: Int) { + wxPayResultLiveData.postValue(result) + wxPayResultLiveData.value= null + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/pay/PayResult.kt b/app/src/main/java/com/example/firstapp/pay/alipay/PayResult.kt similarity index 100% rename from app/src/main/java/com/example/firstapp/pay/PayResult.kt rename to app/src/main/java/com/example/firstapp/pay/alipay/PayResult.kt diff --git a/app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java b/app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java new file mode 100644 index 0000000..de25a1b --- /dev/null +++ b/app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java @@ -0,0 +1,44 @@ +package com.example.firstapp.pay.wxpay; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; + +import com.tencent.mm.opensdk.constants.ConstantsAPI; +import com.tencent.mm.opensdk.modelbase.BaseReq; +import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { + + private static final String TAG = "WXPayEntryActivity"; + + private IWXAPI api; + @Override + protected void onCreate(Bundle savedInstanceState) { + getWindow().setBackgroundDrawable(null); + super.onCreate(savedInstanceState); + + api= WXAPIFactory.createWXAPI(this,"wxb4ba302aa476ea1"); + api.handleIntent(getIntent(),this); + + } + + @Override + public void onReq(BaseReq baseReq) { + + } + + @Override + public void onResp(BaseResp baseResp) { + Log.d(TAG,"onPayFinish,errCode="+baseResp.errCode); + + if(baseResp.getType()== ConstantsAPI.COMMAND_PAY_BY_WX){ + finish(); + } + + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt b/app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt new file mode 100644 index 0000000..0b96082 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt @@ -0,0 +1,42 @@ +package com.example.firstapp.pay + +import android.app.Activity +import android.text.TextUtils +import androidx.lifecycle.Observer +import com.alipay.sdk.app.PayTask +import com.example.firstapp.utils.AppGlobals +import com.example.firstapp.utils.Log +import com.tencent.mm.opensdk.modelpay.PayReq +import com.tencent.mm.opensdk.openapi.WXAPIFactory + + +object WxPayHelper { + + private val api=WXAPIFactory.createWXAPI(AppGlobals.get(), "wx4f794c0f0f0f0f0f",true) + init { + api.registerApp("wx4f794c0f0f0f0f0f") + } + fun pay(activity: Activity, params:Map<String,String>,observer:Observer<Int?>) { + + // 开启线程 + Thread { + try { + val req=PayReq() + req.appId=params["appid"] + req.partnerId=params["partnerid"] + req.prepayId=params["prepayid"] + req.nonceStr=params["noncestr"] + req.timeStamp=params["timestamp"] + req.packageValue=params["package"] + req.sign=params["sign"] + req.signType=params["signType"] + req.extData=params["extData"] + + api.sendReq(req) + + } catch (e: Exception) { + e.printStackTrace() + } + }.start() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt index 91fcafb..1eea5ce 100644 --- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt @@ -31,6 +31,7 @@ import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.launch import com.bumptech.glide.Glide +import com.example.firstapp.activity.SettingActivity import com.example.firstapp.activity.VipActivity import com.example.firstapp.database.response.UserInfo import com.example.firstapp.ui.invitation.InvitationActivity @@ -95,6 +96,14 @@ } return binding.root + } + + override fun onResume() { + super.onResume() + // 加载用户信息 + lifecycleScope.launch { + loadUserInfo() + } } private suspend fun loadConfigurations() { @@ -217,6 +226,13 @@ startActivity(intent) } + // 设置按钮点击 + binding.ivSetting.setOnClickListener { + // 跳转到 + val intent = Intent(requireContext(), SettingActivity::class.java) + startActivity(intent) + } + } diff --git a/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt b/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt index 49d435c..a7f4af1 100644 --- a/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt +++ b/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt @@ -18,8 +18,11 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide +import com.example.firstapp.database.response.UserInfo import com.example.firstapp.databinding.ActivityEditProfileBinding import com.example.firstapp.database.service.ApiService +import com.example.firstapp.database.service.RetrofitClient +import com.example.firstapp.utils.PreferencesManager import kotlinx.coroutines.launch import java.io.File import okhttp3.MediaType.Companion.toMediaType @@ -31,7 +34,6 @@ class EditProfileActivity : AppCompatActivity() { private lateinit var binding: ActivityEditProfileBinding private var selectedImageUri: Uri? = null - private lateinit var apiService: ApiService private var loadingDialog: AlertDialog? = null private val pickImage = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> @@ -114,12 +116,38 @@ } // 调用更新接口 - apiService.updateProfile( + RetrofitClient.apiService.updateProfile( nickname = nicknameBody, avatar = avatarPart ) Toast.makeText(this@EditProfileActivity, "保存成功", Toast.LENGTH_SHORT).show() + // 更新用户信息 + // 从本地获取保存的手机号 + val savedPhone = PreferencesManager.getPhone() + if (savedPhone.isNullOrEmpty()) { + Toast.makeText(this@EditProfileActivity, "用户未登录", Toast.LENGTH_SHORT).show() + return@launch + } + val response = RetrofitClient.apiService.getUserInfo(savedPhone) + if (response.code == "0" && response.data != null) { + // 保存用户信息 + val userInfo:UserInfo = response.data + // 获取传入的数据 + val currentNickname = userInfo.name + val currentAvatarUrl = userInfo.cover + + // 设置当前数据 + binding.etNickname.setText(currentNickname) + if (!currentAvatarUrl.isNullOrEmpty()) { + Glide.with(this@EditProfileActivity) + .load(currentAvatarUrl) + .circleCrop() + .into(binding.ivAvatar) + } + + } + finish() } catch (e: Exception) { diff --git a/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt b/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt index 405783d..2166148 100644 --- a/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt +++ b/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt @@ -53,6 +53,7 @@ Glide.with(this) .load(viewModel.cover) + .circleCrop() .transform(RoundedCorners(100)) // 设置圆角 // .error(R.drawable.error_placeholder) // 如果加载失败,显示占位图 .error(R.mipmap.avatar_default) @@ -118,6 +119,7 @@ viewModel.cover.collect { coverUrl -> Glide.with(this@MemberInfoCardFragment) .load(coverUrl) + .circleCrop() .transform(RoundedCorners(100)) .error(R.drawable.error_placeholder) .into(binding.memberAvatarView) @@ -132,6 +134,7 @@ .transform(RoundedCorners(100)) .error(R.drawable.error_placeholder) .into(binding.memberImageView) + } } diff --git a/app/src/main/java/com/example/firstapp/utils/AppGlobals.kt b/app/src/main/java/com/example/firstapp/utils/AppGlobals.kt new file mode 100644 index 0000000..0ca5f39 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/utils/AppGlobals.kt @@ -0,0 +1,29 @@ +package com.example.firstapp.utils + +import android.app.Application +import java.lang.Exception + +/** + * 这种方式获取全局的Application 是一种拓展思路。 + * + * + * 对于组件化项目,不可能把项目实际的Application下沉到Base,而且各个module也不需要知道Application真实名字 + * + * + * 这种一次反射就能获取全局Application对象的方式相比于在Application#OnCreate保存一份的方式显示更加通用了 + */ +object AppGlobals { + private var application: Application? = null + fun get(): Application? { + if (application == null) { + try { + application = Class.forName("android.app.ActivityThread") + .getMethod("currentApplication") + .invoke(null) as Application + } catch (ex: Exception) { + ex.printStackTrace() + } + } + return application + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml new file mode 100644 index 0000000..a0ccc5f --- /dev/null +++ b/app/src/main/res/layout/activity_setting.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="#F0F2F5" + tools:context=".activity.SettingActivity"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <!-- Toolbar (标题栏) --> + <androidx.appcompat.widget.Toolbar + android:id="@+id/setting_toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="#F9F9F9" + android:elevation="4dp" + android:layout_gravity="center" + android:gravity="center"> + + <!-- 自定义标题 TextView --> + <TextView + android:id="@+id/toolbar_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="设置" + android:textColor="@android:color/black" + android:textSize="18sp" + android:layout_gravity="center" + android:gravity="center" /> <!-- 确保标题居中 --> + + </androidx.appcompat.widget.Toolbar> + + + <LinearLayout + android:id="@+id/setting_exit" + android:layout_width="match_parent" + android:layout_height="50dp" + android:gravity="center" + android:orientation="vertical" + android:background="#F9F9F9" + android:layout_marginTop="20dp" + > + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dp" + android:text="退出登录" + android:textColor="#E23C2F" /> + </LinearLayout> + + + + </LinearLayout> + + +</FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_wxpay_entry.xml b/app/src/main/res/layout/activity_wxpay_entry.xml new file mode 100644 index 0000000..877caaf --- /dev/null +++ b/app/src/main/res/layout/activity_wxpay_entry.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/main" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".pay.wxpay.WXPayEntryActivity"> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_member_info_card.xml b/app/src/main/res/layout/fragment_member_info_card.xml index 46571a7..96585ae 100644 --- a/app/src/main/res/layout/fragment_member_info_card.xml +++ b/app/src/main/res/layout/fragment_member_info_card.xml @@ -36,15 +36,26 @@ android:background="@android:color/transparent" > - <ImageView +<!-- <ImageView--> +<!-- android:id="@+id/memberAvatarView"--> +<!-- android:layout_width="25dp"--> +<!-- android:layout_height="27dp"--> +<!-- android:layout_marginLeft="10dp"--> +<!-- android:scaleType="centerCrop"--> +<!-- app:layout_constraintStart_toStartOf="parent"--> +<!-- app:layout_constraintTop_toTopOf="parent"--> + +<!-- />--> + <com.google.android.material.imageview.ShapeableImageView android:id="@+id/memberAvatarView" android:layout_width="40dp" android:layout_height="40dp" android:layout_marginLeft="10dp" - android:layout_marginRight="10dp" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:shapeAppearanceOverlay="@style/CircleImageView" /> + <TextView android:id="@+id/phoneNumberText" diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_notifications.xml index e176684..82ad433 100644 --- a/app/src/main/res/layout/fragment_notifications.xml +++ b/app/src/main/res/layout/fragment_notifications.xml @@ -19,6 +19,27 @@ android:layout_height="32dp" android:scaleType="centerCrop" /> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="25dp" + android:gravity="center_vertical" + android:orientation="horizontal"> + + <View + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" /> + + <ImageView + android:id="@+id/iv_setting" + android:layout_width="28dp" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:contentDescription="设置" + android:src="@mipmap/setting" /> + </LinearLayout> + + <!-- 用户信息区域 - 减小padding --> <RelativeLayout android:id="@+id/layout_user_info" diff --git a/app/src/main/res/layout/login_protocol_dialog_custom.xml b/app/src/main/res/layout/login_protocol_dialog_custom.xml new file mode 100644 index 0000000..8e97cf1 --- /dev/null +++ b/app/src/main/res/layout/login_protocol_dialog_custom.xml @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:background="@drawable/dialog_background" + android:padding="20dp" + android:gravity="center" + + > + + <!-- 标题 --> + <TextView + android:id="@+id/dialogTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="服务协议和隐私政策" + android:textSize="20sp" + android:textColor="#000000" + android:gravity="center" + android:paddingBottom="10dp" /> + + <View + android:id="@+id/divider" + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="#E2E2E2" + android:layout_marginTop="5dp" + android:layout_marginHorizontal="0dp" /> + + + + <!-- 内容 --> + <TextView + android:id="@+id/dialogMessage" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="请您务必阅读、理解「服务协议】和「隐私政策」,我们仅会收集提供服务必要的信息:未经您同意,我们不会与第三方共享与披露您的个人隐私信息。" + android:textSize="16sp" + android:textColor="#000000" + android:gravity="left" + android:layout_marginTop="5dp" + android:paddingBottom="20dp" /> + + + <TextView + android:id="@+id/dialogMessage2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="您可以阅读「服务使用协议」和「隐私保护政策」了解相关信息。如果您同意,请点击「同意,开始使用我们的服务。" + android:textSize="16sp" + android:textColor="#000000" + android:gravity="left" + android:paddingBottom="20dp" /> + + + <!-- 按钮 --> + <Button + android:id="@+id/btnConfirm" + android:layout_width="200dp" + android:layout_height="wrap_content" + android:text="同意" + android:textColor="@android:color/white" + android:backgroundTint="#000000" + android:gravity="center" /> + +<!-- <Button--> +<!-- android:id="@+id/btnCancel"--> +<!-- android:layout_width="200dp"--> +<!-- android:layout_height="wrap_content"--> +<!-- android:text="不同意"--> +<!-- android:textColor="@android:color/white"--> + +<!-- android:backgroundTint="#000000"--> +<!-- android:gravity="center" />--> + <Button + android:id="@+id/btnCancel" + android:layout_width="200dp" + android:layout_height="wrap_content" + android:text="不同意" + android:textColor="#999999" + android:background="@android:color/transparent" + android:gravity="center" + android:elevation="0dp" + android:stateListAnimator="@null" /> + +</LinearLayout> diff --git a/app/src/main/res/mipmap/setting.png b/app/src/main/res/mipmap/setting.png new file mode 100644 index 0000000..e28bb84 --- /dev/null +++ b/app/src/main/res/mipmap/setting.png Binary files differ diff --git a/app/src/main/res/navigation/nav_graph2.xml b/app/src/main/res/navigation/nav_graph2.xml new file mode 100644 index 0000000..0a273d3 --- /dev/null +++ b/app/src/main/res/navigation/nav_graph2.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<navigation xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/nav_graph2" + app:startDestination="@id/First2Fragment"> + + <fragment + android:id="@+id/First2Fragment" + android:name="com.example.firstapp.pay.wxpay.First2Fragment" + android:label="@string/first_fragment_label" + tools:layout="@layout/fragment_first2"> + + <action + android:id="@+id/action_First2Fragment_to_Second2Fragment" + app:destination="@id/Second2Fragment" /> + </fragment> + <fragment + android:id="@+id/Second2Fragment" + android:name="com.example.firstapp.pay.wxpay.Second2Fragment" + android:label="@string/second_fragment_label" + tools:layout="@layout/fragment_second2"> + + <action + android:id="@+id/action_Second2Fragment_to_First2Fragment" + app:destination="@id/First2Fragment" /> + </fragment> +</navigation> \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..f242c89 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,12 @@ +<resources xmlns:tools="http://schemas.android.com/tools"> + <!-- Base application theme. --> + <style name="Base.Theme.FirstApp" parent="Theme.Material3.DayNight.NoActionBar"> + <!-- Customize your dark theme here. --> + <!-- <item name="colorPrimary">@color/my_dark_primary</item> --> + </style> + + <style name="ThemeOverlay.FirstApp.FullscreenContainer" parent=""> + <item name="fullscreenBackgroundColor">@color/light_blue_900</item> + <item name="fullscreenTextColor">@color/light_blue_A400</item> + </style> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml index 940849b..1553ce1 100644 --- a/app/src/main/res/values-v23/themes.xml +++ b/app/src/main/res/values-v23/themes.xml @@ -1,9 +1,16 @@ <resources xmlns:tools="http://schemas.android.com/tools"> -<!-- <style name="Theme.FirstApp" parent="Base.Theme.FirstApp">--> -<!-- <!– Transparent system bars for edge-to-edge. –>--> -<!-- <item name="android:navigationBarColor">@android:color/transparent</item>--> -<!-- <item name="android:statusBarColor">@android:color/transparent</item>--> -<!-- <item name="android:windowLightStatusBar">?attr/isLightTheme</item>--> -<!-- </style>--> + <!-- <style name="Theme.FirstApp" parent="Base.Theme.FirstApp">--> + <!-- <!– Transparent system bars for edge-to-edge. –>--> + <!-- <item name="android:navigationBarColor">@android:color/transparent</item>--> + <!-- <item name="android:statusBarColor">@android:color/transparent</item>--> + <!-- <item name="android:windowLightStatusBar">?attr/isLightTheme</item>--> + <!-- </style>--> + + <style name="Theme.FirstApp" parent="Base.Theme.FirstApp"> + <!-- Transparent system bars for edge-to-edge. --> + <item name="android:navigationBarColor">@android:color/transparent</item> + <item name="android:statusBarColor">@android:color/transparent</item> + <item name="android:windowLightStatusBar">?attr/isLightTheme</item> + </style> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2a680b2..9404fac 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -16,5 +16,6 @@ <color name="light_blue_50">#E1F5FE</color> <color name="tab_selected">#FF039BE5</color> <color name="light_blue_new">#02A7F0</color> - <color name="light_grey">#F6F7FB </color> 灰色主题 + <color name="light_grey">#F6F7FB</color> + 灰色主题 </resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d4e14b0..484f157 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,5 +94,6 @@ <string name="invite_reward_text"><![CDATA[ 每邀请1位新用户<font color="#FF0000"><b><i><u>可得</u></i></b></font> ]]></string> + <string name="title_activity_setting">SettingActivity</string> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 2d7a78f..7611b17 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -55,4 +55,12 @@ <item name="cornerFamily">rounded</item> <item name="cornerSize">50%</item> </style> + + <!-- 自定义标题样式 --> + <style name="ToolbarTitleStyle"> + <item name="android:textSize">18sp</item> <!-- 设置标题字体大小 --> + <item name="android:gravity">center</item> <!-- 设置标题居中 --> + <item name="android:textColor">#000000</item> <!-- 设置标题颜色 --> + </style> + </resources> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 37db13c..8c8308b 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -23,9 +23,9 @@ </style> <style name="Theme.FirstApp.Fullscreen" parent="Theme.FirstApp"> -<!-- <item name="android:actionBarStyle">@style/Widget.Theme.FirstApp.ActionBar.Fullscreen</item>--> -<!-- <item name="android:windowActionBarOverlay">true</item>--> -<!-- <item name="android:windowBackground">@null</item>--> + <!-- <item name="android:actionBarStyle">@style/Widget.Theme.FirstApp.ActionBar.Fullscreen</item>--> + <!-- <item name="android:windowActionBarOverlay">true</item>--> + <!-- <item name="android:windowBackground">@null</item>--> </style> <style name="ThemeOverlay.FirstApp.FullscreenContainer" parent=""> diff --git a/gradle.properties b/gradle.properties index 15a3aae..f0b87a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,5 +35,8 @@ android.precompileDependenciesResources=false android.enableJetifier=true #android.enableD8=true -org.gradle.java.home=D\:\\tanjiyaun\\jdk\\jdk1.8\\jdk-17.0.12 +org.gradle.java.home=D\:\\devInstall\\java\\jdk-17.0.12 + +# ?????? +WX_PAY_APP_ID=wxb4ba302aa476ea1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cf13be6..654127e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ legacySupportV4 = "1.0.0" fragmentKtx = "1.5.6" recyclerview = "1.3.0" +activity = "1.8.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -31,6 +32,7 @@ androidx-legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacySupportV4" } androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" } androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } +androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/keystore/keystore.jks b/keystore/keystore.jks new file mode 100644 index 0000000..bd1fd7f --- /dev/null +++ b/keystore/keystore.jks Binary files differ diff --git a/sms-manager.jks b/keystore/sms-manager.jks similarity index 100% rename from sms-manager.jks rename to keystore/sms-manager.jks Binary files differ diff --git a/keytool b/keytool deleted file mode 100644 index e69de29..0000000 --- a/keytool +++ /dev/null -- Gitblit v1.9.3