From 28dc6d062a4ce27441b7923e921a1e7ee7abc154 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期三, 26 三月 2025 14:22:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 app/src/main/res/values-v23/themes.xml                                              |    9 +
 app/src/main/res/values/styles.xml                                                  |    9 +
 app/src/main/res/drawable/ic_back.xml                                               |   10 +
 app/src/main/res/values/strings.xml                                                 |   44 ++++++++
 app/src/main/res/values/themes.xml                                                  |    5 +
 app/src/main/res/xml/network_security_config.xml                                    |    2 
 app/src/main/java/com/example/firstapp/database/service/ApiService.kt               |    6 +
 app/src/main/java/com/example/firstapp/pay/PayResult.kt                             |    7 +
 app/src/main/res/layout/fragment_notifications.xml                                  |   44 ++++++++
 app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt                          |   35 +++++++
 app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt |    7 +
 app/src/main/java/com/example/firstapp/pay/PayAbility.kt                            |   16 +++
 app/src/main/res/values-night/themes.xml                                            |    5 +
 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt    |   45 ++++++++
 app/build.gradle                                                                    |    7 +
 15 files changed, 242 insertions(+), 9 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 6ae6903..3257afb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -38,6 +38,7 @@
     }
     buildFeatures {
         viewBinding true
+        dataBinding true
     }
 }
 
@@ -279,4 +280,10 @@
 
     implementation 'com.squareup.okhttp3:okhttp:4.9.0'
 
+    // 支付宝支付SDK
+    api 'com.alipay.sdk:alipaysdk-android:+@aar'
+
+    implementation 'com.google.android.material:material:1.4.0'
+
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt b/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt
new file mode 100644
index 0000000..0872566
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt
@@ -0,0 +1,7 @@
+package com.example.firstapp.database.response
+
+data class AlipayOrderInfoResponse(
+    val code: Int,
+    val msg: String,
+    val data: String
+)
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 691f7ab..d38137e 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
@@ -2,6 +2,7 @@
 
 import com.example.firstapp.database.entity.ApiResponse
 import com.example.firstapp.database.entity.KeywordConfig
+import com.example.firstapp.database.response.AlipayOrderInfoResponse
 import com.example.firstapp.database.response.ContentResponse
 import com.example.firstapp.database.response.DictResponse
 import com.example.firstapp.database.response.LoginResponse
@@ -41,6 +42,9 @@
     @GET("config-security/enable-list-all")
     suspend fun getSecurityList(): SecurityResponse
 
+    @GET("alipay/pay-order-info")
+    suspend fun getPayOrderInfo(): AlipayOrderInfoResponse
+
     @GET("flower/api/supplier/info/{phone}")
     suspend fun getUserInfo(@Path("phone") phone: String): ApiResponse<UserInfo>
 
@@ -55,7 +59,7 @@
 // 创建Retrofit实例(单例)
 object RetrofitClient{
 
-    private const val BASE_URL ="http://192.168.1.213:8080/"
+    private const val BASE_URL ="http://192.168.1.198:8888/jshERP-boot/"
 
     //添加Gson解析器,用于自动将JSON响应转换为Kotlin/Java对象
     private val retrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build()
diff --git a/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt b/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt
new file mode 100644
index 0000000..0e5bcc3
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt
@@ -0,0 +1,35 @@
+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.Log
+
+object AliPayHelper {
+    fun pay(activity: Activity, orderInfo: String,observer:Observer<PayResult>) {
+
+        // 开启线程
+        Thread {
+            try {
+                var alipayTask = PayTask(activity)
+                var payV2 = alipayTask.payV2(orderInfo, true)
+                Log.d("AliPayHelper", "payV2: $payV2")
+                val payResult = PayResult(payV2)
+
+                var result = payV2.get("result") // 支付结果信息
+                var resultStatus = payV2.get("resultStatus")  // 支付结果状态码
+                var memo = payV2.get("memo") // 错误信息提示
+
+                Log.d("AliPayHelper", "result: $result")
+                Log.d("AliPayHelper", "resultStatus: $resultStatus")
+                Log.d("AliPayHelper", "memo: $memo")
+
+                observer.onChanged(payResult)
+
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }.start()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/pay/PayAbility.kt b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt
new file mode 100644
index 0000000..5f2b35e
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt
@@ -0,0 +1,16 @@
+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/PayResult.kt b/app/src/main/java/com/example/firstapp/pay/PayResult.kt
new file mode 100644
index 0000000..9f4d941
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/PayResult.kt
@@ -0,0 +1,7 @@
+package com.example.firstapp.pay
+
+class PayResult constructor(payV2: Map<String,String>) {
+    val result = payV2.get("result") // 支付结果信息
+    val resultStatus = payV2.get("resultStatus")  // 支付结果状态码
+    val memo = payV2.get("memo") // 错误信息提示
+}
\ 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 ea75a47..ef69523 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
@@ -15,6 +15,7 @@
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
+import androidx.lifecycle.Observer
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.fragment.findNavController
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -22,9 +23,12 @@
 import com.example.firstapp.activity.ContentDetailActivity
 import com.example.firstapp.database.service.RetrofitClient
 import com.example.firstapp.databinding.FragmentNotificationsBinding
+import com.example.firstapp.pay.PayAbility
 import com.example.firstapp.ui.reminderOther.ReminderOtherAddActivity2
 import com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther
 import com.example.firstapp.ui.profile.EditProfileActivity
+import com.example.firstapp.utils.Log
+import com.google.android.material.snackbar.Snackbar
 import kotlinx.coroutines.launch
 import com.bumptech.glide.Glide
 import com.example.firstapp.database.response.UserInfo
@@ -124,6 +128,41 @@
     }
 
     private fun setupClickListeners() {
+
+        // 支付插件
+        binding.payPlugin.setOnClickListener {
+            // 跳转到支付插件页面
+            lifecycleScope.launch {
+                try {
+                    val response = RetrofitClient.apiService.getPayOrderInfo()
+                    var orderInfo=response.data
+                    Log.d("AliPayHelper","获取订单信息时: ${response}")
+                    // 这里调用支付宝
+                    PayAbility.aliPay(requireActivity(), orderInfo, Observer {
+                        when (it.resultStatus) {
+                            "9000" -> {
+//                                Snackbar.make(binding.root, "支付成功", Snackbar.LENGTH_LONG).show()
+                                requireActivity().runOnUiThread {
+                                    Toast.makeText(requireContext(), "支付成功", Toast.LENGTH_LONG).show()
+                                }
+                            }
+                            else -> {
+//                                Snackbar.make(binding.root, "支付失败", Snackbar.LENGTH_LONG).show()
+                                requireActivity().runOnUiThread {
+                                    Toast.makeText(requireContext(), "支付失败", Toast.LENGTH_LONG).show()
+                                }
+
+                            }
+                        }
+                    })
+
+                } catch (e: Exception) {
+                    Log.d("AliPayHelper","获取订单信息时发生错误: ${e.message}")
+                }
+            }
+        }
+
+
         // 设置提醒
         binding.layoutReminder.setOnClickListener {
             findNavController().navigate(R.id.action_navigation_notifications_to_reminderSettingsFragment)
@@ -270,11 +309,11 @@
                     .load(userInfo.cover)
                     .placeholder(R.drawable.default_avatar)
                     .into(binding.ivAvatar)
-                
+
                 // 设置昵称和账号
                 binding.tvNickname.text = userInfo.name
                 binding.tvUserId.text = "个人账号:${userInfo.contactTel}"
-                
+
                 // 设置VIP信息
                 if (userInfo.showed) {
                     binding.ivVip.visibility = View.VISIBLE
@@ -295,7 +334,7 @@
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        
+
         // 加载用户信息
         lifecycleScope.launch {
             loadUserInfo()
diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml
index b0ce776..af91489 100644
--- a/app/src/main/res/drawable/ic_back.xml
+++ b/app/src/main/res/drawable/ic_back.xml
@@ -1,9 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="24dp"
     android:height="24dp"
     android:viewportWidth="24"
     android:viewportHeight="24">
+
     <path
-        android:fillColor="#000000"
-        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
-</vector> 
\ No newline at end of file
+        android:strokeColor="#FFFFFF"
+        android:strokeWidth="2"
+        android:fillColor="@android:color/transparent"
+        android:pathData="M15,19l-7-7 7-7" />
+</vector>
diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_notifications.xml
index d0b76ad..6e60a3b 100644
--- a/app/src/main/res/layout/fragment_notifications.xml
+++ b/app/src/main/res/layout/fragment_notifications.xml
@@ -156,6 +156,50 @@
             android:paddingHorizontal="8dp"
             android:paddingVertical="4dp">
 
+            <!-- 会员 -->
+            <RelativeLayout
+                android:id="@+id/memberVip"
+                style="@style/PluginPay"
+                android:padding="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_centerVertical="true"
+                    android:text="会员"
+                    android:textColor="@android:color/black"
+                    android:textSize="16sp" />
+
+                <ImageView
+                    android:layout_width="24dp"
+                    android:layout_height="24dp"
+                    android:layout_alignParentEnd="true"
+                    android:layout_centerVertical="true"
+                    android:src="@drawable/right_forward" />
+            </RelativeLayout>
+
+            <!-- 支付 -->
+            <RelativeLayout
+                android:id="@+id/payPlugin"
+                style="@style/PluginPay"
+                android:padding="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_centerVertical="true"
+                    android:text="支付"
+                    android:textColor="@android:color/black"
+                    android:textSize="16sp" />
+
+                <ImageView
+                    android:layout_width="24dp"
+                    android:layout_height="24dp"
+                    android:layout_alignParentEnd="true"
+                    android:layout_centerVertical="true"
+                    android:src="@drawable/right_forward" />
+            </RelativeLayout>
+
             <!-- 设置提醒 -->
             <LinearLayout
                 android:id="@+id/layout_reminder"
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index 39e726f..4925b55 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -21,4 +21,9 @@
         <item name="fullscreenBackgroundColor">@color/light_blue_900</item>
         <item name="fullscreenTextColor">@color/light_blue_A400</item>
     </style>
+    <!-- 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>
 </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
new file mode 100644
index 0000000..b806642
--- /dev/null
+++ b/app/src/main/res/values-v23/themes.xml
@@ -0,0 +1,9 @@
+<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>
+</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 feb8be6..f507e55 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -12,7 +12,6 @@
     <string name="title_activity_reminder_other_add2">添加纪念日</string>
 
 
-
     <string-array name="day_types">
         <item>纪念日</item>
         <item>生日</item>
@@ -48,8 +47,49 @@
         <item>月</item>
         <item>年</item>
     </string-array>
+    <string name="title_activity_member">MemberActivity</string>
+    <!-- Strings used for fragments for navigation -->
+    <string name="first_fragment_label">First Fragment</string>
+    <string name="second_fragment_label">Second Fragment</string>
+    <string name="next">Next</string>
+    <string name="previous">Previous</string>
 
-
+    <string name="lorem_ipsum">
+        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
+        volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
+        dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
+        litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
+        diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
+        ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
+        Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
+        egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
+        neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
+        fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
+        molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
+        bibendum, vel congue leo egestas.\n\n
+        Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
+        amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
+        molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
+        interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
+        lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
+        in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
+        est.\n\n
+        Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
+        Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
+        non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
+        eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
+        quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
+        ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
+        placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
+        convallis.\n\n
+        Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
+        malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
+        gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
+        libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
+        sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
+        libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
+        vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
+    </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 b325d99..2d7a78f 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -9,6 +9,15 @@
         <item name="android:focusable">true</item>
     </style>
 
+    <style name="PluginPay">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:padding">16dp</item>
+        <item name="android:background">?android:attr/selectableItemBackground</item>
+        <item name="android:clickable">true</item>
+        <item name="android:focusable">true</item>
+    </style>
+
     <style name="Widget.Theme.FirstApp.ActionBar.Fullscreen" parent="Widget.AppCompat.ActionBar">
         <item name="android:background">@color/black_overlay</item>
     </style>
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index b8ebbff..02c10a9 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -34,4 +34,9 @@
         <item name="windowActionBar">false</item>
         <item name="windowNoTitle">true</item>
     </style>
+    <!-- Base application theme. -->
+    <style name="Base.Theme.FirstApp" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your light theme here. -->
+        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
+    </style>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
index f0f1944..d1689af 100644
--- a/app/src/main/res/xml/network_security_config.xml
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -3,6 +3,8 @@
     <domain-config cleartextTrafficPermitted="true">
         <domain includeSubdomains="true">47.96.225.205</domain>
         <domain includeSubdomains="true">192.168.1.213</domain>
+        <domain includeSubdomains="true">192.168.1.198</domain>
+        <domain includeSubdomains="true">192.168.1.199</domain>
         <!-- 可添加其他域名或IP(如192.168.0.101) -->
 <!--        如果本地服务使用自签名证书,需在 network_security_config.xml 中信任该证书:-->
 <!--        <trust-anchors>-->

--
Gitblit v1.9.3